From 77337c66373ed5dc94d4869cdac3dfd5d6944a83 Mon Sep 17 00:00:00 2001 From: Kocproz Date: Sat, 1 Feb 2025 01:50:21 +0100 Subject: [PATCH 01/12] Replace h2 with testcontainers Replace mariadb with postgresql Move config files to yaml --- spring-app/build.gradle.kts | 8 +- .../EmbeddedMariadbConfiguration.kt | 34 ----- .../pl/starchasers/up/data/model/User.kt | 4 +- .../main/resources/application-h2.properties | 6 - .../src/main/resources/application-h2.yaml | 11 ++ .../resources/application-localdb.properties | 4 - .../src/main/resources/application.properties | 27 ---- .../src/main/resources/application.yaml | 40 ++++++ .../main/resources/db/migration/V1__Init.sql | 127 +++++++----------- .../db/migration/V2__file_owners.sql | 8 -- .../up/PostgresContainerConfiguration.kt | 40 ++++++ .../src/test/resources/application.properties | 15 --- .../src/test/resources/application.yaml | 17 +++ 13 files changed, 165 insertions(+), 176 deletions(-) delete mode 100644 spring-app/src/main/kotlin/pl/starchasers/up/configuration/EmbeddedMariadbConfiguration.kt delete mode 100644 spring-app/src/main/resources/application-h2.properties create mode 100644 spring-app/src/main/resources/application-h2.yaml delete mode 100644 spring-app/src/main/resources/application-localdb.properties delete mode 100644 spring-app/src/main/resources/application.properties create mode 100644 spring-app/src/main/resources/application.yaml delete mode 100644 spring-app/src/main/resources/db/migration/V2__file_owners.sql create mode 100644 spring-app/src/test/kotlin/pl/starchasers/up/PostgresContainerConfiguration.kt delete mode 100644 spring-app/src/test/resources/application.properties create mode 100644 spring-app/src/test/resources/application.yaml diff --git a/spring-app/build.gradle.kts b/spring-app/build.gradle.kts index efdf363c..dfe10601 100644 --- a/spring-app/build.gradle.kts +++ b/spring-app/build.gradle.kts @@ -1,7 +1,7 @@ import org.jetbrains.kotlin.gradle.dsl.JvmTarget plugins { - id("org.springframework.boot") version "3.0.1" + id("org.springframework.boot") version "3.1.4" id("io.spring.dependency-management") version "1.1.0" id("org.asciidoctor.jvm.convert") version "3.2.0" id("org.flywaydb.flyway") version "7.5.2" @@ -39,11 +39,13 @@ dependencies { implementation("org.springdoc:springdoc-openapi-starter-webmvc-ui:2.0.2") implementation("com.github.therapi:therapi-runtime-javadoc:0.15.0") kapt("com.github.therapi:therapi-runtime-javadoc-scribe:0.15.0") - runtimeOnly("com.h2database:h2:1.4.200") - runtimeOnly("mysql:mysql-connector-java") runtimeOnly("org.mariadb.jdbc:mariadb-java-client") runtimeOnly(files("../next-app/next-app.jar")) + runtimeOnly("org.postgresql:postgresql:42.7.5") + + testImplementation("org.postgresql:postgresql:42.7.5") + testImplementation("org.testcontainers:postgresql:1.20.4") testImplementation("org.springframework.boot:spring-boot-starter-test") { exclude(group = "org.junit.vintage", module = "junit-vintage-engine") } diff --git a/spring-app/src/main/kotlin/pl/starchasers/up/configuration/EmbeddedMariadbConfiguration.kt b/spring-app/src/main/kotlin/pl/starchasers/up/configuration/EmbeddedMariadbConfiguration.kt deleted file mode 100644 index 7c1c0701..00000000 --- a/spring-app/src/main/kotlin/pl/starchasers/up/configuration/EmbeddedMariadbConfiguration.kt +++ /dev/null @@ -1,34 +0,0 @@ -package pl.starchasers.up.configuration - -import ch.vorburger.mariadb4j.springframework.MariaDB4jSpringService -import org.springframework.beans.factory.annotation.Value -import org.springframework.boot.jdbc.DataSourceBuilder -import org.springframework.context.annotation.Bean -import org.springframework.context.annotation.Configuration -import org.springframework.context.annotation.Profile -import javax.sql.DataSource - -@Configuration -@Profile("test", "localdb") -class EmbeddedMariadbConfiguration { - - @Bean - fun mariaDB4jSpringService() = MariaDB4jSpringService() - - @Bean - fun dataSource( - mariaDB4jSpringService: MariaDB4jSpringService, - @Value("\${app.mariaDB4j.databaseName}") databaseName: String, - @Value("\${spring.datasource.driver-class-name}") datasourceDriver: String - ): DataSource { - mariaDB4jSpringService.db.createDB(databaseName) - - val config = mariaDB4jSpringService.configuration - - return DataSourceBuilder - .create() - .url(config.getURL(databaseName)) - .driverClassName(datasourceDriver) - .build() - } -} diff --git a/spring-app/src/main/kotlin/pl/starchasers/up/data/model/User.kt b/spring-app/src/main/kotlin/pl/starchasers/up/data/model/User.kt index 38411976..c347a986 100644 --- a/spring-app/src/main/kotlin/pl/starchasers/up/data/model/User.kt +++ b/spring-app/src/main/kotlin/pl/starchasers/up/data/model/User.kt @@ -4,9 +4,10 @@ import jakarta.persistence.* import pl.starchasers.up.data.value.* import pl.starchasers.up.security.Role -@Entity +@Entity(name = "application_user") class User( @Id + @Column(nullable = false, updatable = false, name = "id") @GeneratedValue(strategy = GenerationType.IDENTITY) val id: Long, @@ -19,6 +20,7 @@ class User( @Embedded var email: Email?, + @Enumerated(EnumType.STRING) @Column(nullable = false, unique = false) var role: Role, diff --git a/spring-app/src/main/resources/application-h2.properties b/spring-app/src/main/resources/application-h2.properties deleted file mode 100644 index 17ba9066..00000000 --- a/spring-app/src/main/resources/application-h2.properties +++ /dev/null @@ -1,6 +0,0 @@ -spring.datasource.url=jdbc:h2:mem:db;DB_CLOSE_DELAY=-1 -spring.datasource.username=sa -spring.datasource.password=sa -spring.datasource.driver-class-name=org.h2.Driver -spring.flyway.enabled=false -spring.jpa.hibernate.ddl-auto=create diff --git a/spring-app/src/main/resources/application-h2.yaml b/spring-app/src/main/resources/application-h2.yaml new file mode 100644 index 00000000..fb28dd60 --- /dev/null +++ b/spring-app/src/main/resources/application-h2.yaml @@ -0,0 +1,11 @@ +spring: + datasource: + url: jdbc:h2:mem:db;DB_CLOSE_DELAY=-1 + username: sa + password: sa + driver-class-name: org.h2.Driver + flyway: + enabled: false + jpa: + hibernate: + ddl-auto: create diff --git a/spring-app/src/main/resources/application-localdb.properties b/spring-app/src/main/resources/application-localdb.properties deleted file mode 100644 index 6ecd3abe..00000000 --- a/spring-app/src/main/resources/application-localdb.properties +++ /dev/null @@ -1,4 +0,0 @@ -spring.datasource.driver-class-name=org.mariadb.jdbc.Driver -app.mariaDB4j.databaseName=up_dev -mariaDB4j.port=3308 -mariaDB4j.dataDir=./database diff --git a/spring-app/src/main/resources/application.properties b/spring-app/src/main/resources/application.properties deleted file mode 100644 index bfac2742..00000000 --- a/spring-app/src/main/resources/application.properties +++ /dev/null @@ -1,27 +0,0 @@ -spring.jpa.hibernate.ddl-auto=${UP_DDL_AUTO:validate} -spring.datasource.url=${UP_JDBC_STRING} -spring.datasource.username=${UP_DB_USER} -spring.datasource.password=${UP_DB_PASS} -spring.datasource.driver-class-name=${UP_JDBC_DRIVER} -server.port=${UP_PORT:8080} -spring.servlet.multipart.enabled=true -spring.servlet.multipart.resolve-lazily=true -spring.servlet.multipart.max-file-size=${UP_MAX_FILE_SIZE:10GB} -spring.servlet.multipart.max-request-size=${UP_MAX_REQUEST_SIZE:10GB} - -springdoc.api-docs.enabled=${UP_SWAGGER_ENABLED:false} -springdoc.swagger-ui.enabled=${UP_SWAGGER_ENABLED:false} - -up.datastore=${UP_DATASTORE_PATH:uploads} - -#in bytes. Default 4 * 1024 * 1024 (4MB) -up.chunk-size=${UP_CHUNK_SIZE:4194304} - -#in milliseconds. Default 1h -up.cleanup-interval=${UP_CLEANUP_INTERVAL:3600000} - -#Secret will be randomly generated at runtime if UP_JWT_BASE64_SECRET variable is not set. -#Warning: sessions will be invalidated during application restart -up.jwt.base64-secret=${UP_JWT_BASE64_SECRET:} -up.domain=${UP_DOMAIN:http://localhost:8080} -up.dev.cors=${UP_DEV_CORS:false} diff --git a/spring-app/src/main/resources/application.yaml b/spring-app/src/main/resources/application.yaml new file mode 100644 index 00000000..a8d9f304 --- /dev/null +++ b/spring-app/src/main/resources/application.yaml @@ -0,0 +1,40 @@ +spring: + jpa: + hibernate: + ddl-auto: validate + datasource: + url: ${UP_JDBC_STRING} + username: ${UP_DB_USER} + password: ${UP_DB_PASS} + driver-class-name: org.postgresql.Driver + servlet: + multipart: + enabled: true + resolve-lazily: true + max-file-size: ${UP_MAX_FILE_SIZE:10GB} + max-request-size: ${UP_MAX_REQUEST_SIZE:10GB} + flyway: + enabled: true + +server: + port: ${UP_PORT:8080} + +springdoc: + api-docs: + enabled: ${UP_SWAGGER_ENABLED:false} + swagger-ui: + enabled: ${UP_SWAGGER_ENABLED:false} + +up: + datastore: ${UP_DATASTORE_PATH:uploads} + #in bytes. Default 4 * 1024 * 1024 (4MB) + chunk-size: ${UP_CHUNK_SIZE:4194304} + #in milliseconds. Default 1h + cleanup-interval: ${UP_CLEANUP_INTERVAL:3600000} + domain: ${UP_DOMAIN:http://localhost:8080} + dev: + cors: ${UP_DEV_CORS:false} + #Secret will be randomly generated at runtime if UP_JWT_BASE64_SECRET variable is not set. + #Warning: sessions will be invalidated during application restart + jwt: + base64-secret: ${UP_JWT_BASE64_SECRET:} diff --git a/spring-app/src/main/resources/db/migration/V1__Init.sql b/spring-app/src/main/resources/db/migration/V1__Init.sql index 0c86dfe6..6a2f300c 100644 --- a/spring-app/src/main/resources/db/migration/V1__Init.sql +++ b/spring-app/src/main/resources/db/migration/V1__Init.sql @@ -1,84 +1,55 @@ -START TRANSACTION; - -CREATE TABLE `configuration_entry` +CREATE TABLE configuration_entry ( - `id` bigint(20) NOT NULL, - `configuration_key` varchar(255) NOT NULL, - `configuration_value` varchar(255) NOT NULL -) ENGINE = InnoDB - DEFAULT CHARSET = utf8mb4; + id bigserial NOT NULL, + configuration_key text NOT NULL, + configuration_value text NOT NULL, + CONSTRAINT pk_configuration_entry PRIMARY KEY (id) +); -CREATE TABLE `file_entry` +CREATE TABLE file_entry ( - `id` bigint(20) NOT NULL, - `file_access_token` varchar(128) DEFAULT NULL, - `content_type` varchar(256) NOT NULL, - `created_date` datetime(6) NOT NULL, - `encrypted` bit(1) NOT NULL, - `filename` varchar(1024) NOT NULL, - `file_key` varchar(32) NOT NULL, - `file_password` varchar(255) DEFAULT NULL, - `permanent` bit(1) NOT NULL, - `file_size` bigint(20) DEFAULT NULL, - `to_delete_date` datetime(6) DEFAULT NULL -) ENGINE = InnoDB - DEFAULT CHARSET = utf8mb4; - -CREATE TABLE `refresh_token` + id bigserial NOT NULL, + owner_id bigint DEFAULT NULL, + file_access_token text DEFAULT NULL, + content_type text NOT NULL, + created_date timestamp NOT NULL, + encrypted bool NOT NULL, + filename text NOT NULL, + file_key text NOT NULL, + file_password text DEFAULT NULL, + permanent bool NOT NULL, + file_size bigint DEFAULT NULL, + to_delete_date timestamp DEFAULT NULL, + CONSTRAINT pk_file_entry PRIMARY KEY (id) +); + +CREATE TABLE refresh_token ( - `id` bigint(20) NOT NULL, - `creation_date` datetime(6) NOT NULL, - `expiration_date` datetime(6) NOT NULL, - `refresh_token` varchar(255) NOT NULL, - `user_id` bigint(20) DEFAULT NULL -) ENGINE = InnoDB - DEFAULT CHARSET = utf8mb4; - -CREATE TABLE `user` + id bigint NOT NULL, + creation_date timestamp NOT NULL, + expiration_date timestamp NOT NULL, + refresh_token text NOT NULL, + user_id bigint DEFAULT NULL, + CONSTRAINT pk_refresh_token PRIMARY KEY (id) +); + +CREATE TABLE application_user ( - `id` bigint(20) NOT NULL, - `default_file_lifetime` bigint(20) DEFAULT NULL, - `email` varchar(64) DEFAULT NULL, - `max_file_lifetime` bigint(20) DEFAULT NULL, - `max_permanent_file_size` bigint(20) DEFAULT NULL, - `max_temporary_file_size` bigint(20) DEFAULT NULL, - `password` varchar(160) NOT NULL, - `role` int(11) NOT NULL, - `username` varchar(32) NOT NULL -) ENGINE = InnoDB - DEFAULT CHARSET = utf8mb4; - -ALTER TABLE `configuration_entry` - ADD PRIMARY KEY (`id`), - ADD UNIQUE KEY `uq_configuration_entry__configuration_key` (`configuration_key`); - -ALTER TABLE `file_entry` - ADD PRIMARY KEY (`id`); - -ALTER TABLE `refresh_token` - ADD PRIMARY KEY (`id`), - ADD UNIQUE KEY `uq_refresh_token__refresh_token` (`refresh_token`), - ADD KEY `ix_refresh_token__user_id` (`user_id`); - -ALTER TABLE `user` - ADD PRIMARY KEY (`id`), - ADD UNIQUE KEY `uq_user__username` (`username`); - -ALTER TABLE `configuration_entry` - MODIFY `id` bigint(20) NOT NULL AUTO_INCREMENT, - AUTO_INCREMENT = 8; - -ALTER TABLE `file_entry` - MODIFY `id` bigint(20) NOT NULL AUTO_INCREMENT; - -ALTER TABLE `refresh_token` - MODIFY `id` bigint(20) NOT NULL AUTO_INCREMENT; - -ALTER TABLE `user` - MODIFY `id` bigint(20) NOT NULL AUTO_INCREMENT, - AUTO_INCREMENT = 2; - -ALTER TABLE `refresh_token` - ADD CONSTRAINT `fk_user__refresh_token` FOREIGN KEY (`user_id`) REFERENCES `user` (`id`); -COMMIT; + id bigserial NOT NULL, + default_file_lifetime bigint DEFAULT NULL, + email text DEFAULT NULL, + max_file_lifetime bigint DEFAULT NULL, + max_permanent_file_size bigint DEFAULT NULL, + max_temporary_file_size bigint DEFAULT NULL, + password text NOT NULL, + role text NOT NULL, + username text NOT NULL, + CONSTRAINT pk_user PRIMARY KEY (id) +); + +ALTER TABLE refresh_token + ADD CONSTRAINT fk_user__refresh_token FOREIGN KEY (user_id) REFERENCES application_user (id); + +ALTER TABLE file_entry + ADD CONSTRAINT fk_user__file_entry FOREIGN KEY (owner_id) REFERENCES application_user (id); diff --git a/spring-app/src/main/resources/db/migration/V2__file_owners.sql b/spring-app/src/main/resources/db/migration/V2__file_owners.sql deleted file mode 100644 index 5904916b..00000000 --- a/spring-app/src/main/resources/db/migration/V2__file_owners.sql +++ /dev/null @@ -1,8 +0,0 @@ -start transaction; - -alter table file_entry - add column owner_id bigint(20) default null, - add key `ix_file_entry__owner_id` (owner_id), - add constraint `fk_user__file_entry` foreign key (owner_id) references `user` (`id`); - -commit; diff --git a/spring-app/src/test/kotlin/pl/starchasers/up/PostgresContainerConfiguration.kt b/spring-app/src/test/kotlin/pl/starchasers/up/PostgresContainerConfiguration.kt new file mode 100644 index 00000000..6671009b --- /dev/null +++ b/spring-app/src/test/kotlin/pl/starchasers/up/PostgresContainerConfiguration.kt @@ -0,0 +1,40 @@ +package pl.starchasers.up + +import org.springframework.context.annotation.Bean +import org.springframework.context.annotation.Configuration +import org.springframework.jdbc.datasource.DriverManagerDataSource +import org.testcontainers.containers.PostgreSQLContainer +import javax.sql.DataSource + +@Configuration +class PostgresContainerConfiguration { + + @Bean + fun dataSource(): DataSource { + val ds = DriverManagerDataSource() + MyPostgresContainer.instance.start() + ds.setDriverClassName(MyPostgresContainer.instance.driverClassName) + ds.url = MyPostgresContainer.instance.jdbcUrl + ds.username = MyPostgresContainer.instance.username + ds.password = MyPostgresContainer.instance.password + return ds + } + +} + +@Configuration +class MyPostgresContainer : PostgreSQLContainer(IMAGE) { + + companion object { + private const val IMAGE = "postgres:17" + val instance by lazy { MyPostgresContainer() } + } + + override fun start() { + super.start() + System.setProperty("DATASOURCE_URL", this.jdbcUrl) + System.setProperty("DATASOURCE_USERNAME", this.username) + System.setProperty("DATASOURCE_PASSWORD", this.password) + } + +} diff --git a/spring-app/src/test/resources/application.properties b/spring-app/src/test/resources/application.properties deleted file mode 100644 index f5a55c27..00000000 --- a/spring-app/src/test/resources/application.properties +++ /dev/null @@ -1,15 +0,0 @@ -spring.datasource.driver-class-name=org.h2.Driver -spring.datasource.url=jdbc:h2:mem:db;DB_CLOSE_DELAY=-1 -spring.datasource.username=sa -spring.datasource.password=sa -spring.jpa.hibernate.ddl-auto=create-drop -spring.servlet.multipart.enabled=false -spring.flyway.enabled=false - -up.datastore=${DATASTORE_PATH:uploads} -up.max-file-size=100 -up.cleanup-interval=${UP_CLEANUP_INTERVAL:3600000} -up.jwt-secret=verySecret -up.domain=${UP_DOMAIN:http://localhost:8080} -up.dev.cors=${UP_DEV_CORS:false} -up.chunk-size=4194304 diff --git a/spring-app/src/test/resources/application.yaml b/spring-app/src/test/resources/application.yaml new file mode 100644 index 00000000..6b57a4bf --- /dev/null +++ b/spring-app/src/test/resources/application.yaml @@ -0,0 +1,17 @@ +spring: + jpa: + hibernate: + ddl-auto: validate + servlet: + multipart: + enabled: false + +up: + datastore: ${DATASTORE_PATH:uploads} + max-file-size: 100 + cleanup-interval: ${UP_CLEANUP_INTERVAL:3600000} + jwt-secret: verySecret + domain: ${UP_DOMAIN:http://localhost:8080} + chunk-size: 4194304 + dev: + cors: ${UP_DEV_CORS:false} From 5ac6911ae6e89de0d7c8f19c79c4c1d670058016 Mon Sep 17 00:00:00 2001 From: KocproZ Date: Mon, 10 Feb 2025 16:53:58 +0100 Subject: [PATCH 02/12] Replaced mariadb with postgres Replaced h2 with postgres in testcontainers Replaced hibernate with ktorm Removed the concept of user --- spring-app/build.gradle.kts | 15 +- .../up/configuration/DatabaseConfiguration.kt | 22 ++ .../ObjectMapperConfiguration.kt | 8 +- .../configuration/WebSecurityConfiguration.kt | 10 +- .../up/controller/AuthenticationController.kt | 49 --- .../up/controller/ConfigurationController.kt | 21 +- .../up/controller/UploadController.kt | 47 +-- .../up/controller/UserController.kt | 40 -- .../controller/admin/UserAdminController.kt | 69 ---- .../up/data/dto/upload/FileDetailsDTO.kt | 4 +- .../dto/upload/UploadCompleteResponseDTO.kt | 4 +- .../data/dto/upload/UploadHistoryEntryDTO.kt | 6 +- .../starchasers/up/data/dto/users/UserDTO.kt | 26 -- .../up/data/model/ConfigurationEntry.kt | 67 ++-- .../starchasers/up/data/model/FileContent.kt | 3 +- .../pl/starchasers/up/data/model/FileEntry.kt | 73 ++-- .../starchasers/up/data/model/RefreshToken.kt | 26 -- .../pl/starchasers/up/data/model/User.kt | 45 --- .../pl/starchasers/up/data/value/Email.kt | 20 - .../pl/starchasers/up/data/value/FileKey.kt | 19 - .../pl/starchasers/up/data/value/FileSize.kt | 23 -- .../pl/starchasers/up/data/value/Filename.kt | 18 - .../starchasers/up/data/value/RawPassword.kt | 13 - .../starchasers/up/data/value/UserPassword.kt | 18 - .../pl/starchasers/up/data/value/Username.kt | 21 -- .../up/repository/ConfigurationRepository.kt | 23 +- .../up/repository/FileEntryRepository.kt | 43 ++- .../up/repository/QueryResultContainer.kt | 16 + .../up/repository/RefreshTokenRepository.kt | 16 - .../up/repository/StandardRepository.kt | 90 +++++ .../up/repository/UploadRepository.kt | 27 +- .../up/repository/UserRepository.kt | 13 - .../up/security/JwtConfiguration.kt | 32 -- .../starchasers/up/security/JwtProperties.kt | 10 - .../starchasers/up/security/JwtTokenFilter.kt | 37 -- .../up/service/AutomaticCleanupService.kt | 2 +- .../up/service/ConfigurationService.kt | 78 +--- .../pl/starchasers/up/service/FileService.kt | 109 +++--- .../up/service/FileStorageService.kt | 14 +- .../starchasers/up/service/JwtTokenService.kt | 133 ------- .../pl/starchasers/up/service/UserService.kt | 136 ------- .../up/util/PasswordEncoderExtensions.kt | 10 - .../up/util/initializer/AccountInitializer.kt | 34 -- .../main/resources/db/migration/V1__Init.sql | 39 +- .../pl/starchasers/up/DatabaseCleaner.kt | 21 +- .../kotlin/pl/starchasers/up/JpaTestBase.kt | 15 - .../pl/starchasers/up/MockMvcTestBase.kt | 22 -- .../test/kotlin/pl/starchasers/up/TestUtil.kt | 3 +- .../AuthenticationControllerTest.kt | 166 --------- .../controller/ConfigurationControllerTest.kt | 58 --- .../up/controller/UploadControllerTest.kt | 119 +++--- .../up/controller/UserControllerTest.kt | 67 ---- .../admin/ConfigurationAdminControllerTest.kt | 148 -------- .../admin/UserAdminControllerTest.kt | 348 ------------------ .../starchasers/up/data/value/UsernameTest.kt | 30 -- .../starchasers/up/testdata/UserTestData.kt | 28 -- 56 files changed, 407 insertions(+), 2147 deletions(-) create mode 100644 spring-app/src/main/kotlin/pl/starchasers/up/configuration/DatabaseConfiguration.kt delete mode 100644 spring-app/src/main/kotlin/pl/starchasers/up/controller/AuthenticationController.kt delete mode 100644 spring-app/src/main/kotlin/pl/starchasers/up/controller/UserController.kt delete mode 100644 spring-app/src/main/kotlin/pl/starchasers/up/controller/admin/UserAdminController.kt delete mode 100644 spring-app/src/main/kotlin/pl/starchasers/up/data/dto/users/UserDTO.kt delete mode 100644 spring-app/src/main/kotlin/pl/starchasers/up/data/model/RefreshToken.kt delete mode 100644 spring-app/src/main/kotlin/pl/starchasers/up/data/model/User.kt delete mode 100644 spring-app/src/main/kotlin/pl/starchasers/up/data/value/Email.kt delete mode 100644 spring-app/src/main/kotlin/pl/starchasers/up/data/value/FileKey.kt delete mode 100644 spring-app/src/main/kotlin/pl/starchasers/up/data/value/FileSize.kt delete mode 100644 spring-app/src/main/kotlin/pl/starchasers/up/data/value/Filename.kt delete mode 100644 spring-app/src/main/kotlin/pl/starchasers/up/data/value/RawPassword.kt delete mode 100644 spring-app/src/main/kotlin/pl/starchasers/up/data/value/UserPassword.kt delete mode 100644 spring-app/src/main/kotlin/pl/starchasers/up/data/value/Username.kt create mode 100644 spring-app/src/main/kotlin/pl/starchasers/up/repository/QueryResultContainer.kt delete mode 100644 spring-app/src/main/kotlin/pl/starchasers/up/repository/RefreshTokenRepository.kt create mode 100644 spring-app/src/main/kotlin/pl/starchasers/up/repository/StandardRepository.kt delete mode 100644 spring-app/src/main/kotlin/pl/starchasers/up/repository/UserRepository.kt delete mode 100644 spring-app/src/main/kotlin/pl/starchasers/up/security/JwtConfiguration.kt delete mode 100644 spring-app/src/main/kotlin/pl/starchasers/up/security/JwtProperties.kt delete mode 100644 spring-app/src/main/kotlin/pl/starchasers/up/security/JwtTokenFilter.kt delete mode 100644 spring-app/src/main/kotlin/pl/starchasers/up/service/JwtTokenService.kt delete mode 100644 spring-app/src/main/kotlin/pl/starchasers/up/service/UserService.kt delete mode 100644 spring-app/src/main/kotlin/pl/starchasers/up/util/PasswordEncoderExtensions.kt delete mode 100644 spring-app/src/main/kotlin/pl/starchasers/up/util/initializer/AccountInitializer.kt delete mode 100644 spring-app/src/test/kotlin/pl/starchasers/up/controller/AuthenticationControllerTest.kt delete mode 100644 spring-app/src/test/kotlin/pl/starchasers/up/controller/ConfigurationControllerTest.kt delete mode 100644 spring-app/src/test/kotlin/pl/starchasers/up/controller/UserControllerTest.kt delete mode 100644 spring-app/src/test/kotlin/pl/starchasers/up/controller/admin/ConfigurationAdminControllerTest.kt delete mode 100644 spring-app/src/test/kotlin/pl/starchasers/up/controller/admin/UserAdminControllerTest.kt delete mode 100644 spring-app/src/test/kotlin/pl/starchasers/up/data/value/UsernameTest.kt delete mode 100644 spring-app/src/test/kotlin/pl/starchasers/up/testdata/UserTestData.kt diff --git a/spring-app/build.gradle.kts b/spring-app/build.gradle.kts index dfe10601..5b706824 100644 --- a/spring-app/build.gradle.kts +++ b/spring-app/build.gradle.kts @@ -1,10 +1,9 @@ import org.jetbrains.kotlin.gradle.dsl.JvmTarget plugins { - id("org.springframework.boot") version "3.1.4" + id("org.springframework.boot") version "3.1.6" id("io.spring.dependency-management") version "1.1.0" id("org.asciidoctor.jvm.convert") version "3.2.0" - id("org.flywaydb.flyway") version "7.5.2" id("org.jlleitschuh.gradle.ktlint") version "12.1.2" kotlin("jvm") version "2.1.0" @@ -27,21 +26,20 @@ dependencies { implementation("org.springframework.boot:spring-boot-starter-web") implementation("org.springframework.boot:spring-boot-starter-validation") implementation("com.fasterxml.jackson.module:jackson-module-kotlin") + implementation("com.fasterxml.jackson.datatype:jackson-datatype-jsr310") implementation("org.jetbrains.kotlin:kotlin-reflect") implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk8") implementation("commons-fileupload:commons-fileupload:1.5") - implementation("io.jsonwebtoken:jjwt-impl:0.11.5") - implementation("io.jsonwebtoken:jjwt-gson:0.11.5") - implementation("org.flywaydb:flyway-core:9.10.2") - implementation("org.flywaydb:flyway-mysql:9.10.2") - implementation("ch.vorburger.mariaDB4j:mariaDB4j:2.4.0") + implementation("org.flywaydb:flyway-core:11.3.1") + implementation("org.flywaydb:flyway-database-postgresql:11.3.1") implementation("com.ibm.icu:icu4j:72.1") implementation("org.springdoc:springdoc-openapi-starter-webmvc-ui:2.0.2") implementation("com.github.therapi:therapi-runtime-javadoc:0.15.0") kapt("com.github.therapi:therapi-runtime-javadoc-scribe:0.15.0") - runtimeOnly("org.mariadb.jdbc:mariadb-java-client") runtimeOnly(files("../next-app/next-app.jar")) + implementation("org.ktorm:ktorm-support-postgresql:4.1.1") + implementation("org.ktorm:ktorm-core:4.1.1") runtimeOnly("org.postgresql:postgresql:42.7.5") testImplementation("org.postgresql:postgresql:42.7.5") @@ -69,7 +67,6 @@ ext { ktlint { version.set("1.4.1") ignoreFailures.set(true) - disabledRules.set(setOf("no-wildcard-imports")) } tasks { diff --git a/spring-app/src/main/kotlin/pl/starchasers/up/configuration/DatabaseConfiguration.kt b/spring-app/src/main/kotlin/pl/starchasers/up/configuration/DatabaseConfiguration.kt new file mode 100644 index 00000000..fe243e1b --- /dev/null +++ b/spring-app/src/main/kotlin/pl/starchasers/up/configuration/DatabaseConfiguration.kt @@ -0,0 +1,22 @@ +package pl.starchasers.up.configuration + +import org.ktorm.database.Database +import org.ktorm.logging.Slf4jLoggerAdapter +import org.springframework.context.annotation.Bean +import org.springframework.context.annotation.Configuration +import javax.sql.DataSource +import kotlin.reflect.jvm.jvmName + +@Configuration +class DatabaseConfiguration( + private val dataSource: DataSource +) { + + @Bean + fun database(): Database = Database.connect( + dataSource = dataSource, + alwaysQuoteIdentifiers = true, + logger = Slf4jLoggerAdapter(this::class.jvmName) + ) + +} diff --git a/spring-app/src/main/kotlin/pl/starchasers/up/configuration/ObjectMapperConfiguration.kt b/spring-app/src/main/kotlin/pl/starchasers/up/configuration/ObjectMapperConfiguration.kt index 4e765378..34626d9c 100644 --- a/spring-app/src/main/kotlin/pl/starchasers/up/configuration/ObjectMapperConfiguration.kt +++ b/spring-app/src/main/kotlin/pl/starchasers/up/configuration/ObjectMapperConfiguration.kt @@ -1,11 +1,17 @@ package pl.starchasers.up.configuration import com.fasterxml.jackson.databind.ObjectMapper +import com.fasterxml.jackson.databind.SerializationFeature +import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule +import com.fasterxml.jackson.module.kotlin.jacksonObjectMapper import org.springframework.context.annotation.Bean import org.springframework.context.annotation.Configuration @Configuration class ObjectMapperConfiguration { @Bean - fun getObjectMapper(): ObjectMapper = ObjectMapper().findAndRegisterModules() + fun getObjectMapper(): ObjectMapper = + jacksonObjectMapper() + .registerModule(JavaTimeModule()) + .disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS) } diff --git a/spring-app/src/main/kotlin/pl/starchasers/up/configuration/WebSecurityConfiguration.kt b/spring-app/src/main/kotlin/pl/starchasers/up/configuration/WebSecurityConfiguration.kt index 59d9709f..d71c554b 100644 --- a/spring-app/src/main/kotlin/pl/starchasers/up/configuration/WebSecurityConfiguration.kt +++ b/spring-app/src/main/kotlin/pl/starchasers/up/configuration/WebSecurityConfiguration.kt @@ -8,18 +8,13 @@ import org.springframework.security.config.annotation.web.builders.HttpSecurity import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity import org.springframework.security.config.http.SessionCreationPolicy import org.springframework.security.web.SecurityFilterChain -import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter import org.springframework.web.cors.CorsConfiguration import org.springframework.web.cors.CorsConfigurationSource import org.springframework.web.cors.UrlBasedCorsConfigurationSource -import pl.starchasers.up.security.JwtTokenFilter -import pl.starchasers.up.service.JwtTokenService @Configuration @EnableWebSecurity -class WebSecurityConfiguration( - private val jwtTokenService: JwtTokenService -) { +class WebSecurityConfiguration() { private val logger = LoggerFactory.getLogger(this::class.java) @@ -30,12 +25,11 @@ class WebSecurityConfiguration( fun filterChain(http: HttpSecurity): SecurityFilterChain = http .csrf { it.disable() } .sessionManagement { it.sessionCreationPolicy(SessionCreationPolicy.STATELESS) } - .addFilterBefore(JwtTokenFilter(jwtTokenService), UsernamePasswordAuthenticationFilter::class.java) .also { if (devCors) { logger.info("Development environment set. Enabling CORS for all origins.") + it.cors {} } - it.cors() } .build() diff --git a/spring-app/src/main/kotlin/pl/starchasers/up/controller/AuthenticationController.kt b/spring-app/src/main/kotlin/pl/starchasers/up/controller/AuthenticationController.kt deleted file mode 100644 index 0ac00cbd..00000000 --- a/spring-app/src/main/kotlin/pl/starchasers/up/controller/AuthenticationController.kt +++ /dev/null @@ -1,49 +0,0 @@ -package pl.starchasers.up.controller - -import org.springframework.validation.annotation.Validated -import org.springframework.web.bind.annotation.PostMapping -import org.springframework.web.bind.annotation.RequestBody -import org.springframework.web.bind.annotation.RequestMapping -import org.springframework.web.bind.annotation.RestController -import pl.starchasers.up.data.dto.authentication.LoginDTO -import pl.starchasers.up.data.dto.authentication.TokenDTO -import pl.starchasers.up.data.value.RawPassword -import pl.starchasers.up.data.value.Username -import pl.starchasers.up.security.IsUser -import pl.starchasers.up.service.JwtTokenService -import pl.starchasers.up.service.UserService -import java.security.Principal - -@RestController -@RequestMapping("/api/auth") -class AuthenticationController( - private val userService: UserService, - private val jwtTokenService: JwtTokenService -) { - - @PostMapping("/login") - fun login(@RequestBody @Validated loginDTO: LoginDTO): TokenDTO { - return TokenDTO( - jwtTokenService.issueRefreshToken( - userService.getUserFromCredentials( - Username(loginDTO.username), - RawPassword(loginDTO.password) - ) - ) - ) - } - - @IsUser - @PostMapping("/logout") - fun logout(principal: Principal) { - jwtTokenService.invalidateUser(userService.getUser(principal.name.toLong())) - } - - @PostMapping("/getAccessToken") - fun getAccessToken(@Validated @RequestBody tokenDTO: TokenDTO): TokenDTO = - TokenDTO(jwtTokenService.issueAccessToken(tokenDTO.token)) - - @PostMapping("/refreshToken") - fun refreshToken(@Validated @RequestBody tokenDTO: TokenDTO): TokenDTO = - TokenDTO(jwtTokenService.refreshRefreshToken(tokenDTO.token)) -} diff --git a/spring-app/src/main/kotlin/pl/starchasers/up/controller/ConfigurationController.kt b/spring-app/src/main/kotlin/pl/starchasers/up/controller/ConfigurationController.kt index 134dea64..896b8feb 100644 --- a/spring-app/src/main/kotlin/pl/starchasers/up/controller/ConfigurationController.kt +++ b/spring-app/src/main/kotlin/pl/starchasers/up/controller/ConfigurationController.kt @@ -4,29 +4,24 @@ import org.springframework.web.bind.annotation.GetMapping import org.springframework.web.bind.annotation.RestController import pl.starchasers.up.data.dto.configuration.UserConfigurationDTO import pl.starchasers.up.service.ConfigurationService -import pl.starchasers.up.service.UserService -import java.security.Principal @RestController class ConfigurationController( - private val configurationService: ConfigurationService, - private val userService: UserService + private val configurationService: ConfigurationService ) { /** * Returns configuration for anonymous or logged in user, if Authorization header is provided */ @GetMapping("/api/configuration") - fun getConfiguration(principal: Principal?): UserConfigurationDTO { - val user = userService.fromPrincipal(principal) - + fun getConfiguration(): UserConfigurationDTO { return UserConfigurationDTO( - user?.maxTemporaryFileSize?.value ?: configurationService.getAnonymousMaxFileSize().value, - user?.maxFileLifetime?.value ?: configurationService.getAnonymousMaxFileLifetime().value, - user?.defaultFileLifetime?.value ?: configurationService.getAnonymousDefaultFileLifetime().value, - if (user != null) user.maxFileLifetime.value == 0L else configurationService.getAnonymousDefaultFileLifetime().value == 0L, - user?.maxPermanentFileSize?.value ?: if (configurationService.getAnonymousMaxFileLifetime().value == 0L) { - configurationService.getAnonymousMaxFileSize().value + configurationService.getAnonymousMaxFileSize(), + configurationService.getAnonymousMaxFileLifetime(), + configurationService.getAnonymousDefaultFileLifetime(), + configurationService.getAnonymousDefaultFileLifetime() == 0L, + if (configurationService.getAnonymousMaxFileLifetime() == 0L) { + configurationService.getAnonymousMaxFileSize() } else 0 ) } diff --git a/spring-app/src/main/kotlin/pl/starchasers/up/controller/UploadController.kt b/spring-app/src/main/kotlin/pl/starchasers/up/controller/UploadController.kt index 861d6b6a..573d69e7 100644 --- a/spring-app/src/main/kotlin/pl/starchasers/up/controller/UploadController.kt +++ b/spring-app/src/main/kotlin/pl/starchasers/up/controller/UploadController.kt @@ -13,25 +13,21 @@ import org.springframework.web.multipart.MultipartFile import pl.starchasers.up.data.dto.upload.AuthorizedOperationDTO import pl.starchasers.up.data.dto.upload.FileDetailsDTO import pl.starchasers.up.data.dto.upload.UploadCompleteResponseDTO -import pl.starchasers.up.data.value.* import pl.starchasers.up.exception.AccessDeniedException import pl.starchasers.up.exception.NotFoundException import pl.starchasers.up.service.FileService import pl.starchasers.up.service.FileStorageService -import pl.starchasers.up.service.UserService import pl.starchasers.up.util.BasicResponseDTO import pl.starchasers.up.util.RequestRangeParser import java.io.BufferedInputStream import java.io.IOException import java.nio.charset.Charset -import java.security.Principal @RestController class UploadController( private val fileStorageService: FileStorageService, private val fileService: FileService, - private val requestRangeParser: RequestRangeParser, - private val userService: UserService + private val requestRangeParser: RequestRangeParser ) { private val logger = LoggerFactory.getLogger(this::class.java) @@ -41,19 +37,16 @@ class UploadController( * @param file Uploaded file content */ @PostMapping("/api/upload") - fun anonymousUpload(@RequestParam file: MultipartFile, principal: Principal?): UploadCompleteResponseDTO { - val user = userService.fromPrincipal(principal) - val contentType = ContentType( + fun anonymousUpload(@RequestParam file: MultipartFile): UploadCompleteResponseDTO { + val contentType = if (file.contentType == null || file.contentType!!.isBlank()) "application/octet-stream" else file.contentType!! - ) return fileService.createFile( BufferedInputStream(file.inputStream), - Filename(file.originalFilename ?: "file"), + file.originalFilename ?: "file", contentType, - FileSize(file.size), - user + file.size ) } @@ -63,8 +56,8 @@ class UploadController( */ @GetMapping("/u/{fileKey}") fun getAnonymousUpload(@PathVariable fileKey: String, request: HttpServletRequest, response: HttpServletResponse) { - val (fileEntry, stream) = fileStorageService.getStoredFileRaw(FileKey(fileKey)) - response.contentType = fileEntry.contentType.value + val (fileEntry, stream) = fileStorageService.getStoredFileRaw(fileKey) + response.contentType = fileEntry.contentType response.addHeader( HttpHeaders.ACCEPT_RANGES, @@ -74,20 +67,20 @@ class UploadController( HttpHeaders.CONTENT_DISPOSITION, ContentDisposition .builder("inline") - .filename(fileEntry.filename.value.ifBlank { "file" }, Charset.forName("UTF-8")) + .filename(fileEntry.filename.ifBlank { "file" }, Charset.forName("UTF-8")) .build() .toString() ) try { - val range = requestRangeParser(request.getHeader("Range"), fileEntry.size.value) + val range = requestRangeParser(request.getHeader("Range"), fileEntry.size) if (range.partial) { - response.addHeader(HttpHeaders.CONTENT_RANGE, "bytes ${range.from}-${range.to}/${fileEntry.size.value}") + response.addHeader(HttpHeaders.CONTENT_RANGE, "bytes ${range.from}-${range.to}/${fileEntry.size}") response.addHeader(HttpHeaders.CONTENT_LENGTH, range.responseSize.toString()) response.status = HttpStatus.PARTIAL_CONTENT.value() IOUtils.copyLarge(stream, response.outputStream, range.from, range.responseSize) } else { - response.addHeader(HttpHeaders.CONTENT_LENGTH, fileEntry.size.value.toString()) + response.addHeader(HttpHeaders.CONTENT_LENGTH, fileEntry.size.toString()) IOUtils.copyLarge(stream, response.outputStream) } response.outputStream.flush() @@ -105,13 +98,11 @@ class UploadController( fun verifyFileAccess( @PathVariable fileKey: String, @Validated @RequestBody - operationDto: AuthorizedOperationDTO?, - principal: Principal? + operationDto: AuthorizedOperationDTO? ): BasicResponseDTO { - val fileEntry = fileService.findFileEntry(FileKey(fileKey)) ?: throw NotFoundException() + val fileEntry = fileService.findFileEntry(fileKey) ?: throw NotFoundException() - val user = userService.fromPrincipal(principal) - if (!fileService.verifyFileAccess(fileEntry, operationDto?.accessToken?.let { FileAccessToken(it) }, user)) { + if (!fileService.verifyFileAccess(fileEntry, operationDto?.accessToken)) { throw AccessDeniedException() } return BasicResponseDTO() @@ -121,13 +112,11 @@ class UploadController( fun deleteFile( @PathVariable fileKey: String, @Validated @RequestBody - operationDto: AuthorizedOperationDTO?, - principal: Principal? + operationDto: AuthorizedOperationDTO? ) { - val fileEntry = fileService.findFileEntry(FileKey(fileKey)) ?: throw NotFoundException() - val user = userService.fromPrincipal(principal) + val fileEntry = fileService.findFileEntry(fileKey) ?: throw NotFoundException() - if (!fileService.verifyFileAccess(fileEntry, operationDto?.accessToken?.let { FileAccessToken(it) }, user)) { + if (!fileService.verifyFileAccess(fileEntry, operationDto?.accessToken)) { throw AccessDeniedException() } @@ -138,5 +127,5 @@ class UploadController( * @return Uploaded file metadata */ @GetMapping("/api/u/{fileKey}/details") - fun getFileDetails(@PathVariable fileKey: String): FileDetailsDTO = fileService.getFileDetails(FileKey(fileKey)) + fun getFileDetails(@PathVariable fileKey: String): FileDetailsDTO = fileService.getFileDetails(fileKey) } diff --git a/spring-app/src/main/kotlin/pl/starchasers/up/controller/UserController.kt b/spring-app/src/main/kotlin/pl/starchasers/up/controller/UserController.kt deleted file mode 100644 index c331756f..00000000 --- a/spring-app/src/main/kotlin/pl/starchasers/up/controller/UserController.kt +++ /dev/null @@ -1,40 +0,0 @@ -package pl.starchasers.up.controller - -import org.springframework.data.domain.Page -import org.springframework.data.domain.Pageable -import org.springframework.web.bind.annotation.GetMapping -import org.springframework.web.bind.annotation.RequestMapping -import org.springframework.web.bind.annotation.RestController -import pl.starchasers.up.data.dto.upload.UploadHistoryEntryDTO -import pl.starchasers.up.exception.AccessDeniedException -import pl.starchasers.up.security.IsUser -import pl.starchasers.up.service.FileService -import pl.starchasers.up.service.UserService -import java.security.Principal - -@RestController -@RequestMapping("/api/user") -class UserController( - val fileService: FileService, - val userService: UserService -) { - - @GetMapping("/history") - @IsUser - fun listUserUploadHistory(principal: Principal, pageable: Pageable): Page { - return fileService.getUploadHistory( - userService.fromPrincipal(principal) ?: throw AccessDeniedException(), - pageable - ).map { - UploadHistoryEntryDTO( - it.filename.value, - it.createdDate, - it.permanent, - it.toDeleteDate, - it.size.value, - it.contentType.value, - it.key.value - ) - } - } -} diff --git a/spring-app/src/main/kotlin/pl/starchasers/up/controller/admin/UserAdminController.kt b/spring-app/src/main/kotlin/pl/starchasers/up/controller/admin/UserAdminController.kt deleted file mode 100644 index 97f285c9..00000000 --- a/spring-app/src/main/kotlin/pl/starchasers/up/controller/admin/UserAdminController.kt +++ /dev/null @@ -1,69 +0,0 @@ -package pl.starchasers.up.controller.admin - -import org.springframework.data.domain.Page -import org.springframework.data.domain.Pageable -import org.springframework.validation.annotation.Validated -import org.springframework.web.bind.annotation.* -import pl.starchasers.up.data.dto.users.CreateUserDTO -import pl.starchasers.up.data.dto.users.UpdateUserDTO -import pl.starchasers.up.data.dto.users.UserDTO -import pl.starchasers.up.data.dto.users.toUserDTO -import pl.starchasers.up.data.value.* -import pl.starchasers.up.exception.AccessDeniedException -import pl.starchasers.up.exception.NotFoundException -import pl.starchasers.up.security.IsAdmin -import pl.starchasers.up.service.UserService -import java.security.Principal - -@RestController -@RequestMapping("/api/admin/users") -class UserAdminController( - private val userService: UserService -) { - - @IsAdmin - @GetMapping("/{userId}") - fun getOne(@PathVariable userId: Long): UserDTO { - return userService.findUser(userId)?.toUserDTO() - ?: throw NotFoundException() - } - - @IsAdmin - @GetMapping("") - fun list(pageable: Pageable): Page { - return userService.listUsers(pageable).map { it.toUserDTO() } - } - - @IsAdmin - @PostMapping("") - fun create(@Validated @RequestBody createUserDTO: CreateUserDTO): UserDTO { - return userService.createUser( - Username(createUserDTO.username), - RawPassword(createUserDTO.password), - if (!createUserDTO.email.isNullOrBlank()) Email(createUserDTO.email) else null, - createUserDTO.role - ).toUserDTO() - } - - @IsAdmin - @PatchMapping("/{userId}") - fun update(@PathVariable userId: Long, @RequestBody userDTO: UpdateUserDTO) { - userService.updateUser( - userId, - userDTO.username?.toUsername(), - if (userDTO.email.isNullOrBlank()) null else Email(userDTO.email), - if (userDTO.password.isNullOrBlank()) null else RawPassword(userDTO.password), - userDTO.role, - userDTO.maxTemporaryFileSize.toFileSize(), - userDTO.maxPermanentFileSize.toFileSize(), - userDTO.defaultFileLifetime.toMilliseconds(), - userDTO.maxFileLifetime.toMilliseconds() - ) - } - - @IsAdmin - @DeleteMapping("/{userId}") - fun delete(@PathVariable userId: Long, principal: Principal) { - userService.deleteUser(userId, principal.name.toLongOrNull() ?: throw AccessDeniedException()) - } -} diff --git a/spring-app/src/main/kotlin/pl/starchasers/up/data/dto/upload/FileDetailsDTO.kt b/spring-app/src/main/kotlin/pl/starchasers/up/data/dto/upload/FileDetailsDTO.kt index 3998c034..8312e284 100644 --- a/spring-app/src/main/kotlin/pl/starchasers/up/data/dto/upload/FileDetailsDTO.kt +++ b/spring-app/src/main/kotlin/pl/starchasers/up/data/dto/upload/FileDetailsDTO.kt @@ -1,6 +1,6 @@ package pl.starchasers.up.data.dto.upload -import java.sql.Timestamp +import java.time.Instant data class FileDetailsDTO( @@ -19,7 +19,7 @@ data class FileDetailsDTO( /** * File will expire at this date and download link will no longer work. Can be null, if file is permanent */ - val expirationDate: Timestamp?, + val expirationDate: Instant?, /** * File size in bytes */ diff --git a/spring-app/src/main/kotlin/pl/starchasers/up/data/dto/upload/UploadCompleteResponseDTO.kt b/spring-app/src/main/kotlin/pl/starchasers/up/data/dto/upload/UploadCompleteResponseDTO.kt index 231d4171..f617e78c 100644 --- a/spring-app/src/main/kotlin/pl/starchasers/up/data/dto/upload/UploadCompleteResponseDTO.kt +++ b/spring-app/src/main/kotlin/pl/starchasers/up/data/dto/upload/UploadCompleteResponseDTO.kt @@ -1,6 +1,6 @@ package pl.starchasers.up.data.dto.upload -import java.sql.Timestamp +import java.time.Instant data class UploadCompleteResponseDTO( /** @@ -16,5 +16,5 @@ data class UploadCompleteResponseDTO( /** * Date and time after which file will be deleted */ - val toDelete: Timestamp + val toDelete: Instant ) diff --git a/spring-app/src/main/kotlin/pl/starchasers/up/data/dto/upload/UploadHistoryEntryDTO.kt b/spring-app/src/main/kotlin/pl/starchasers/up/data/dto/upload/UploadHistoryEntryDTO.kt index a94bb1df..bb94f962 100644 --- a/spring-app/src/main/kotlin/pl/starchasers/up/data/dto/upload/UploadHistoryEntryDTO.kt +++ b/spring-app/src/main/kotlin/pl/starchasers/up/data/dto/upload/UploadHistoryEntryDTO.kt @@ -1,6 +1,6 @@ package pl.starchasers.up.data.dto.upload -import java.sql.Timestamp +import java.time.Instant data class UploadHistoryEntryDTO( /** @@ -10,7 +10,7 @@ data class UploadHistoryEntryDTO( /** * When was this file uploaded */ - val uploadDate: Timestamp, + val uploadDate: Instant, /** * Whether this file will be automatically deleted */ @@ -18,7 +18,7 @@ data class UploadHistoryEntryDTO( /** * When will this file be automatically deleted. Null if temporary == false */ - val deleteDate: Timestamp?, + val deleteDate: Instant?, /** * File size in bytes */ diff --git a/spring-app/src/main/kotlin/pl/starchasers/up/data/dto/users/UserDTO.kt b/spring-app/src/main/kotlin/pl/starchasers/up/data/dto/users/UserDTO.kt deleted file mode 100644 index 5dfc5150..00000000 --- a/spring-app/src/main/kotlin/pl/starchasers/up/data/dto/users/UserDTO.kt +++ /dev/null @@ -1,26 +0,0 @@ -package pl.starchasers.up.data.dto.users - -import pl.starchasers.up.data.model.User -import pl.starchasers.up.security.Role - -data class UserDTO( - val id: Long, - val username: String, - val email: String?, - val role: Role, - val maxTemporaryFileSize: Long, - val maxPermanentFileSize: Long, - val defaultFileLifetime: Long, - val maxFileLifetime: Long -) - -fun User.toUserDTO() = UserDTO( - id, - username.value, - email?.value ?: "", - role, - maxTemporaryFileSize.value, - maxPermanentFileSize.value, - defaultFileLifetime.value, - maxFileLifetime.value -) diff --git a/spring-app/src/main/kotlin/pl/starchasers/up/data/model/ConfigurationEntry.kt b/spring-app/src/main/kotlin/pl/starchasers/up/data/model/ConfigurationEntry.kt index c48ca0b6..ce1fd370 100644 --- a/spring-app/src/main/kotlin/pl/starchasers/up/data/model/ConfigurationEntry.kt +++ b/spring-app/src/main/kotlin/pl/starchasers/up/data/model/ConfigurationEntry.kt @@ -1,25 +1,30 @@ package pl.starchasers.up.data.model -import jakarta.persistence.* - -@Entity -class ConfigurationEntry( - @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) - val id: Long, - - @Column(name = "configuration_key", unique = true, nullable = false) - @Enumerated(EnumType.STRING) - val key: ConfigurationKey, - - @Column(name = "configuration_value", nullable = false) +import org.ktorm.entity.Entity +import org.ktorm.schema.Table +import org.ktorm.schema.enum +import org.ktorm.schema.long +import org.ktorm.schema.text +import java.time.Duration +import java.time.temporal.ChronoUnit + +interface ConfigurationEntry : Entity { + companion object : Entity.Factory() + val id: Long + var key: ConfigurationKey var value: String -) +} + +object ConfigurationEntries : Table("configuration_entry") { + val id = long("id").primaryKey().bindTo { it.id } + val key = enum("configuration_key").bindTo { it.key } + val value = text("configuration_value").bindTo { it.value } +} enum class ConfigurationKey(val defaultValue: String) { /** * Maximum allowed file size in bytes for anonymous uploads. - * Default value: 1GB + * Default value: 1GiB */ ANONYMOUS_MAX_FILE_SIZE("${1L * 1024 * 1024 * 1024}"), @@ -27,39 +32,11 @@ enum class ConfigurationKey(val defaultValue: String) { * Default time in milliseconds, after which uploaded anonymous file will be deleted * Default value: 1 day */ - ANONYMOUS_DEFAULT_FILE_LIFETIME("${1L * 24 * 60 * 60 * 1000}"), + ANONYMOUS_DEFAULT_FILE_LIFETIME(Duration.of(1, ChronoUnit.DAYS).toMillis().toString()), /** * Maximum configurable by user time in milliseconds, after which uploaded anonymous file will be deleted. * Default value: 1 day */ - ANONYMOUS_MAX_FILE_LIFETIME("${1L * 24 * 60 * 60 * 1000}"), - - /** - * Maximum allowed temporary file size in bytes for logged in users. - * New users will be initialized with this configuration. - * Default value: 5GB - */ - DEFAULT_USER_MAX_TEMPORARY_FILE_SIZE("${5L * 1024 * 1024 * 1024}"), - - /** - * Maximum allowed file size in bytes for permanent uploads for logged in users. - * new users will be initialized with this configuration - * Default value: 512MB - */ - DEFAULT_USER_MAX_PERMANENT_FILE_SIZE("${512L * 1024 * 1024}"), - - /** - * Default time in milliseconds, after which file uploaded by a logged in user will be deleted. - * New users will be initialized with this configuration. - * Default value: 1 day - */ - DEFAULT_USER_DEFAULT_FILE_LIFETIME("${1L * 24 * 60 * 60 * 1000}"), - - /** - * Maximum configurable by user time in milliseconds, after which uploaded file will be deleted. - * New users will be initialized with this configuration - * Default value: 0 (no limit) - */ - DEFAULT_USER_MAX_FILE_LIFETIME("0") + ANONYMOUS_MAX_FILE_LIFETIME(Duration.of(1, ChronoUnit.DAYS).toMillis().toString()), } diff --git a/spring-app/src/main/kotlin/pl/starchasers/up/data/model/FileContent.kt b/spring-app/src/main/kotlin/pl/starchasers/up/data/model/FileContent.kt index 95d3db7a..71f5d3c2 100644 --- a/spring-app/src/main/kotlin/pl/starchasers/up/data/model/FileContent.kt +++ b/spring-app/src/main/kotlin/pl/starchasers/up/data/model/FileContent.kt @@ -1,9 +1,8 @@ package pl.starchasers.up.data.model -import pl.starchasers.up.data.value.FileKey import java.io.InputStream class FileContent( - val key: FileKey, + val key: String, val data: InputStream ) diff --git a/spring-app/src/main/kotlin/pl/starchasers/up/data/model/FileEntry.kt b/spring-app/src/main/kotlin/pl/starchasers/up/data/model/FileEntry.kt index 9963c714..712885b6 100644 --- a/spring-app/src/main/kotlin/pl/starchasers/up/data/model/FileEntry.kt +++ b/spring-app/src/main/kotlin/pl/starchasers/up/data/model/FileEntry.kt @@ -1,45 +1,32 @@ package pl.starchasers.up.data.model -import jakarta.persistence.* -import pl.starchasers.up.data.value.* -import java.sql.Timestamp - -@Entity -class FileEntry( - @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) - val id: Long, - - @Embedded - val key: FileKey, - - @Embedded - val filename: Filename, - - @Embedded - val contentType: ContentType, - - @Embedded - val password: FilePassword?, - - @Column(nullable = false, unique = false) - val encrypted: Boolean, - - @Column(nullable = false, unique = false) - val createdDate: Timestamp, - - @Column(nullable = true, unique = false) - val toDeleteDate: Timestamp?, - - @Column(nullable = false, unique = false) - val permanent: Boolean, - - @Embedded - val accessToken: FileAccessToken, - - @Embedded - val size: FileSize, - - @ManyToOne(fetch = FetchType.LAZY) - val owner: User? -) +import org.ktorm.entity.Entity +import org.ktorm.schema.* +import java.time.Instant + +interface FileEntry : Entity { + companion object : Entity.Factory() + val id: Long + var accessToken: String? + var contentType: String + var createdAt: Instant + var encrypted: Boolean + var filename: String + var key: String + var password: String? + var size: Long + var toDeleteAt: Instant? +} + +object FileEntries : Table("file_entry") { + val id = long("id").primaryKey().bindTo { it.id } + val accessToken = text("file_access_token").bindTo { it.accessToken } + val contentType = text("content_type").bindTo { it.contentType } + val createdAt = timestamp("created_at").bindTo { it.createdAt } + val encrypted = boolean("encrypted").bindTo { it.encrypted } + val filename = text("filename").bindTo { it.filename } + val key = text("file_key").bindTo { it.key } + val password = text("file_password").bindTo { it.password } + val size = long("file_size").bindTo { it.size } + val deleteAt = timestamp("to_delete_at").bindTo { it.toDeleteAt } +} diff --git a/spring-app/src/main/kotlin/pl/starchasers/up/data/model/RefreshToken.kt b/spring-app/src/main/kotlin/pl/starchasers/up/data/model/RefreshToken.kt deleted file mode 100644 index 794638b9..00000000 --- a/spring-app/src/main/kotlin/pl/starchasers/up/data/model/RefreshToken.kt +++ /dev/null @@ -1,26 +0,0 @@ -package pl.starchasers.up.data.model - -import jakarta.persistence.* -import jakarta.validation.constraints.NotNull -import pl.starchasers.up.data.value.RefreshTokenId -import java.sql.Timestamp - -@Entity -class RefreshToken( - @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) - val id: Long, - - @NotNull - @ManyToOne(targetEntity = User::class, fetch = FetchType.LAZY) - val user: User, - - @Embedded - val token: RefreshTokenId, - - @Column(nullable = false, updatable = false) - val creationDate: Timestamp, - - @Column(nullable = false, updatable = false) - val expirationDate: Timestamp -) diff --git a/spring-app/src/main/kotlin/pl/starchasers/up/data/model/User.kt b/spring-app/src/main/kotlin/pl/starchasers/up/data/model/User.kt deleted file mode 100644 index c347a986..00000000 --- a/spring-app/src/main/kotlin/pl/starchasers/up/data/model/User.kt +++ /dev/null @@ -1,45 +0,0 @@ -package pl.starchasers.up.data.model - -import jakarta.persistence.* -import pl.starchasers.up.data.value.* -import pl.starchasers.up.security.Role - -@Entity(name = "application_user") -class User( - @Id - @Column(nullable = false, updatable = false, name = "id") - @GeneratedValue(strategy = GenerationType.IDENTITY) - val id: Long, - - @Embedded - var username: Username, - - @Embedded - var password: UserPassword, - - @Embedded - var email: Email?, - - @Enumerated(EnumType.STRING) - @Column(nullable = false, unique = false) - var role: Role, - - @Embedded - @AttributeOverride(name = "value", column = Column(name = "maxTemporaryFileSize")) - var maxTemporaryFileSize: FileSize = FileSize(0), - - @Embedded - @AttributeOverride(name = "value", column = Column(name = "maxPermanentFileSize")) - var maxPermanentFileSize: FileSize = FileSize(0), - - @Embedded - @AttributeOverride(name = "value", column = Column(name = "defaultFileLifetime")) - var defaultFileLifetime: Milliseconds = Milliseconds(0), - - @Embedded - @AttributeOverride(name = "value", column = Column(name = "maxFileLifetime")) - var maxFileLifetime: Milliseconds = Milliseconds(0), - - @OneToMany(fetch = FetchType.LAZY, mappedBy = "owner") - val files: MutableSet = mutableSetOf() -) diff --git a/spring-app/src/main/kotlin/pl/starchasers/up/data/value/Email.kt b/spring-app/src/main/kotlin/pl/starchasers/up/data/value/Email.kt deleted file mode 100644 index 6fd7e206..00000000 --- a/spring-app/src/main/kotlin/pl/starchasers/up/data/value/Email.kt +++ /dev/null @@ -1,20 +0,0 @@ -package pl.starchasers.up.data.value - -import jakarta.persistence.Column -import jakarta.persistence.Embeddable -import pl.starchasers.up.util.validate - -@Embeddable -data class Email( - @Column(name = "email", length = 64) - val value: String -) { - init { - validate(this, Email::value) { - check { it.isNotBlank() } - check { it.length <= 64 } - } - } -} - -fun String?.toEmail(): Email? = this?.let { Email(it) } diff --git a/spring-app/src/main/kotlin/pl/starchasers/up/data/value/FileKey.kt b/spring-app/src/main/kotlin/pl/starchasers/up/data/value/FileKey.kt deleted file mode 100644 index 4d3632f4..00000000 --- a/spring-app/src/main/kotlin/pl/starchasers/up/data/value/FileKey.kt +++ /dev/null @@ -1,19 +0,0 @@ -package pl.starchasers.up.data.value - -import jakarta.persistence.Column -import jakarta.persistence.Embeddable -import pl.starchasers.up.util.validate - -@Embeddable -data class FileKey( - @Column(name = "fileKey", nullable = false, length = 32) - val value: String -) { - init { - validate(this, FileKey::value) { - check { it.isNotEmpty() } - check { it.all { character -> character.isLetterOrDigit() } } - check { it.length <= 32 } - } - } -} diff --git a/spring-app/src/main/kotlin/pl/starchasers/up/data/value/FileSize.kt b/spring-app/src/main/kotlin/pl/starchasers/up/data/value/FileSize.kt deleted file mode 100644 index 3298601f..00000000 --- a/spring-app/src/main/kotlin/pl/starchasers/up/data/value/FileSize.kt +++ /dev/null @@ -1,23 +0,0 @@ -package pl.starchasers.up.data.value - -import jakarta.persistence.Column -import jakarta.persistence.Embeddable -import pl.starchasers.up.util.validate - -@Embeddable -data class FileSize( - @Column(name = "fileSize") - val value: Long -) { - init { - validate(this, FileSize::value) { - check { it >= 0 } - } - } - - operator fun compareTo(fileSize: FileSize): Int { - return (this.value - fileSize.value).toInt() - } -} - -fun Long?.toFileSize(): FileSize? = this?.let { FileSize(it) } diff --git a/spring-app/src/main/kotlin/pl/starchasers/up/data/value/Filename.kt b/spring-app/src/main/kotlin/pl/starchasers/up/data/value/Filename.kt deleted file mode 100644 index 8851012f..00000000 --- a/spring-app/src/main/kotlin/pl/starchasers/up/data/value/Filename.kt +++ /dev/null @@ -1,18 +0,0 @@ -package pl.starchasers.up.data.value - -import jakarta.persistence.Column -import jakarta.persistence.Embeddable -import pl.starchasers.up.util.validate - -@Embeddable -data class Filename( - @Column(name = "filename", nullable = false, length = 1024) - val value: String -) { - init { - validate(this, Filename::value) { - check { it.length <= 1024 } - check { it.isNotBlank() } - } - } -} diff --git a/spring-app/src/main/kotlin/pl/starchasers/up/data/value/RawPassword.kt b/spring-app/src/main/kotlin/pl/starchasers/up/data/value/RawPassword.kt deleted file mode 100644 index db935ac7..00000000 --- a/spring-app/src/main/kotlin/pl/starchasers/up/data/value/RawPassword.kt +++ /dev/null @@ -1,13 +0,0 @@ -package pl.starchasers.up.data.value - -import pl.starchasers.up.util.validate - -data class RawPassword( - val value: String -) { - init { - validate(this, RawPassword::value) { - check { it.isNotEmpty() } - } - } -} diff --git a/spring-app/src/main/kotlin/pl/starchasers/up/data/value/UserPassword.kt b/spring-app/src/main/kotlin/pl/starchasers/up/data/value/UserPassword.kt deleted file mode 100644 index 067be546..00000000 --- a/spring-app/src/main/kotlin/pl/starchasers/up/data/value/UserPassword.kt +++ /dev/null @@ -1,18 +0,0 @@ -package pl.starchasers.up.data.value - -import jakarta.persistence.Column -import jakarta.persistence.Embeddable -import pl.starchasers.up.util.validate - -@Embeddable -data class UserPassword( - @Column(name = "password", length = 160, nullable = false) - val value: String -) { - init { - validate(this, UserPassword::value) { - check { it.isNotBlank() } - check { it.length < 160 } - } - } -} diff --git a/spring-app/src/main/kotlin/pl/starchasers/up/data/value/Username.kt b/spring-app/src/main/kotlin/pl/starchasers/up/data/value/Username.kt deleted file mode 100644 index d8638e11..00000000 --- a/spring-app/src/main/kotlin/pl/starchasers/up/data/value/Username.kt +++ /dev/null @@ -1,21 +0,0 @@ -package pl.starchasers.up.data.value - -import jakarta.persistence.Column -import jakarta.persistence.Embeddable -import pl.starchasers.up.util.validate - -@Embeddable -data class Username( - @Column(name = "username", length = 32, unique = true, updatable = true, nullable = false) - val value: String -) { - init { - validate(this, Username::value) { - check { it.isNotBlank() } - check { it.length < 32 } - check { it.all { character -> character.isLetterOrDigit() } } - } - } -} - -fun String.toUsername(): Username = Username(this) diff --git a/spring-app/src/main/kotlin/pl/starchasers/up/repository/ConfigurationRepository.kt b/spring-app/src/main/kotlin/pl/starchasers/up/repository/ConfigurationRepository.kt index 20e9d8b6..eebda1e1 100644 --- a/spring-app/src/main/kotlin/pl/starchasers/up/repository/ConfigurationRepository.kt +++ b/spring-app/src/main/kotlin/pl/starchasers/up/repository/ConfigurationRepository.kt @@ -1,12 +1,25 @@ package pl.starchasers.up.repository -import org.springframework.data.jpa.repository.JpaRepository -import org.springframework.stereotype.Repository +import org.ktorm.database.Database +import org.ktorm.dsl.* +import org.springframework.stereotype.Service +import pl.starchasers.up.data.model.ConfigurationEntries import pl.starchasers.up.data.model.ConfigurationEntry import pl.starchasers.up.data.model.ConfigurationKey -@Repository -interface ConfigurationRepository : JpaRepository { +@Service +class ConfigurationRepository( + database: Database +) : StandardRepository(ConfigurationEntries, database) { - fun findFirstByKey(key: ConfigurationKey): ConfigurationEntry? + fun findFirstByKey(key: ConfigurationKey): ConfigurationEntry? { + return database + .from(table) + .select() + .where(table.key eq key) + .limit(1) + .map { row -> table.createEntity(row) } + .firstOrNull() + } } + diff --git a/spring-app/src/main/kotlin/pl/starchasers/up/repository/FileEntryRepository.kt b/spring-app/src/main/kotlin/pl/starchasers/up/repository/FileEntryRepository.kt index 6638778b..bded308f 100644 --- a/spring-app/src/main/kotlin/pl/starchasers/up/repository/FileEntryRepository.kt +++ b/spring-app/src/main/kotlin/pl/starchasers/up/repository/FileEntryRepository.kt @@ -1,30 +1,29 @@ package pl.starchasers.up.repository -import org.springframework.data.domain.Page -import org.springframework.data.domain.Pageable -import org.springframework.data.jpa.repository.JpaRepository -import org.springframework.data.jpa.repository.Query +import org.ktorm.database.Database +import org.ktorm.dsl.* +import org.springframework.stereotype.Service +import pl.starchasers.up.data.model.FileEntries import pl.starchasers.up.data.model.FileEntry -import pl.starchasers.up.data.model.User -import pl.starchasers.up.data.value.FileKey +import java.time.Instant -interface FileEntryRepository : JpaRepository { +@Service +class FileEntryRepository( + database: Database +) : StandardRepository(FileEntries, database) { - @Query( - """ - from FileEntry f where f.key=:key - """ - ) - fun findExistingFileByKey(key: FileKey): FileEntry? + fun findExistingFileByKey(key: String): FileEntry? = + database.from(table) + .select() + .where { table.key eq key } + .map { table.createEntity(it) } + .firstOrNull() - @Query( - """ - from FileEntry f - where f.permanent = false - and f.toDeleteDate < current_timestamp - """ - ) - fun findExpiredFiles(): Set + fun findExpiredFiles(): Set = + database.from(table) + .select() + .where { table.deleteAt.isNotNull() and table.deleteAt.less(Instant.now()) } + .map { table.createEntity(it) } + .toSet() - fun findAllByOwner(owner: User, pageable: Pageable): Page } diff --git a/spring-app/src/main/kotlin/pl/starchasers/up/repository/QueryResultContainer.kt b/spring-app/src/main/kotlin/pl/starchasers/up/repository/QueryResultContainer.kt new file mode 100644 index 00000000..532ad3df --- /dev/null +++ b/spring-app/src/main/kotlin/pl/starchasers/up/repository/QueryResultContainer.kt @@ -0,0 +1,16 @@ +package pl.starchasers.up.repository + +import org.ktorm.dsl.Query +import org.ktorm.dsl.QueryRowSet +import org.ktorm.dsl.asIterable + +data class QueryResultContainer( + val result: List, + val totalRecords: Int +) + +fun Query.transform(how: Iterable.() -> List) = + QueryResultContainer( + how.invoke(this.asIterable()), + this.totalRecordsInAllPages + ) diff --git a/spring-app/src/main/kotlin/pl/starchasers/up/repository/RefreshTokenRepository.kt b/spring-app/src/main/kotlin/pl/starchasers/up/repository/RefreshTokenRepository.kt deleted file mode 100644 index 573c8c9f..00000000 --- a/spring-app/src/main/kotlin/pl/starchasers/up/repository/RefreshTokenRepository.kt +++ /dev/null @@ -1,16 +0,0 @@ -package pl.starchasers.up.repository - -import org.springframework.data.jpa.repository.JpaRepository -import pl.starchasers.up.data.model.RefreshToken -import pl.starchasers.up.data.model.User -import pl.starchasers.up.data.value.RefreshTokenId - -interface RefreshTokenRepository : JpaRepository { - fun findFirstByTokenAndUser(token: RefreshTokenId, user: User): RefreshToken? - - fun findAllByUser(user: User): List - - fun deleteAllByUser(user: User) - - fun deleteAllByToken(token: RefreshTokenId) -} diff --git a/spring-app/src/main/kotlin/pl/starchasers/up/repository/StandardRepository.kt b/spring-app/src/main/kotlin/pl/starchasers/up/repository/StandardRepository.kt new file mode 100644 index 00000000..2597904b --- /dev/null +++ b/spring-app/src/main/kotlin/pl/starchasers/up/repository/StandardRepository.kt @@ -0,0 +1,90 @@ +package pl.starchasers.up.repository + +import jakarta.persistence.EntityNotFoundException +import org.ktorm.database.Database +import org.ktorm.dsl.* +import org.ktorm.entity.* +import org.ktorm.schema.ColumnDeclaring +import org.ktorm.schema.Table +import org.ktorm.support.postgresql.BulkInsertStatementBuilder +import org.ktorm.support.postgresql.bulkInsert +import org.slf4j.Logger +import org.slf4j.LoggerFactory +import org.springframework.data.domain.Page +import org.springframework.data.domain.PageImpl +import org.springframework.data.domain.Pageable + +open class StandardRepository, T : Table>( + internal open val table: T, + open val database: Database +) { + + private val logger: Logger = LoggerFactory.getLogger(this::class.java) + + fun update(record: E): E = + database + .sequenceOf(table) + .update(record) + .let { + if (it == 0) throw EntityNotFoundException() + record + } + + fun insert(record: E) = + database + .sequenceOf(table) + .add(record) + .let { + // Not safe, WILL CRASH if entity doesn't have column "id" of type Long + record["id"] as Long + } + + /** + * Slower version, see [bulkInsert] for faster version + */ + fun saveAll(records: Iterable) = + database + .sequenceOf(table) + .let { sequence -> + records.map { record -> + sequence.add(record) + } + } + + fun bulkInsert(records: BulkInsertStatementBuilder.(T) -> Unit) = + database.bulkInsert(table, records) + + fun deleteAll(): Int { + logger.warn("Deleting everything from ${table.tableName}") + return database.deleteAll(table) + } + + fun findByPredicate(predicate: () -> ColumnDeclaring): List = + findByPredicate(predicate.invoke()) + + fun deleteByPredicate(predicate: (T) -> ColumnDeclaring): Int = + database.delete(table, predicate).let { + if (it == 0) throw EntityNotFoundException() + logger.warn("Deleted $it rows") + return it + } + + fun findAll() = database.from(table).select().map { table.createEntity(it) } + + fun findByPredicate(predicate: ColumnDeclaring): List = + database.from(table).select().where(predicate).map { table.createEntity(it) } + + fun findAll(pageable: Pageable): Page = + database.from(table) + .select() + .limit(pageable.pageSize) + .offset(pageable.offset.toInt()) + .map { table.createEntity(it) } + .let { + PageImpl(it, pageable, it.size.toLong()) + } + + fun count(): Int = database.sequenceOf(table).count() + +} + diff --git a/spring-app/src/main/kotlin/pl/starchasers/up/repository/UploadRepository.kt b/spring-app/src/main/kotlin/pl/starchasers/up/repository/UploadRepository.kt index 6a9c3eb2..1b94448a 100644 --- a/spring-app/src/main/kotlin/pl/starchasers/up/repository/UploadRepository.kt +++ b/spring-app/src/main/kotlin/pl/starchasers/up/repository/UploadRepository.kt @@ -5,7 +5,6 @@ import org.apache.commons.io.IOUtils import org.springframework.beans.factory.annotation.Value import org.springframework.stereotype.Repository import pl.starchasers.up.data.model.FileContent -import pl.starchasers.up.data.value.FileKey import java.io.File import java.io.FileInputStream import java.io.FileOutputStream @@ -14,11 +13,11 @@ import java.nio.file.Paths interface UploadRepository { fun save(fileContent: FileContent) - fun find(key: FileKey): FileContent? + fun find(key: String): FileContent? - fun delete(key: FileKey) + fun delete(key: String) - fun exists(key: FileKey): Boolean + fun exists(key: String): Boolean } @Repository @@ -57,8 +56,8 @@ class UploadRepositoryImpl() : UploadRepository { IOUtils.closeQuietly(outputStream) } - override fun find(key: FileKey): FileContent? { - if (key.value.length < 4) throw IllegalArgumentException("Malformed file key") + override fun find(key: String): FileContent? { + if (key.length < 4) throw IllegalArgumentException("Malformed file key") val file = getFileFromKey(key) @@ -69,7 +68,7 @@ class UploadRepositoryImpl() : UploadRepository { return FileContent(key, FileInputStream(file)) } - override fun delete(key: FileKey) { + override fun delete(key: String) { val file = getFileFromKey(key) if (!file.exists()) return @@ -81,7 +80,7 @@ class UploadRepositoryImpl() : UploadRepository { deleteDirIfEmpty(file.parentFile.parentFile) } - override fun exists(key: FileKey): Boolean { + override fun exists(key: String): Boolean { val file = getFileFromKey(key) if (file.isDirectory || !file.isFile) throwExceptionDataStoreCorrupted(key) @@ -89,15 +88,15 @@ class UploadRepositoryImpl() : UploadRepository { return file.exists() } - private fun getFileFromKey(key: FileKey): File = Paths.get( + private fun getFileFromKey(key: String): File = Paths.get( dataStorePath, - key.value.substring(0, 2), - key.value.substring(2, 4), - key.value + key.substring(0, 2), + key.substring(2, 4), + key ).toFile() - private fun throwExceptionDataStoreCorrupted(key: FileKey): Nothing = - throw IllegalStateException("Requested file ${key.value} is not a regular file - datastore corrupted!") + private fun throwExceptionDataStoreCorrupted(key: String): Nothing = + throw IllegalStateException("Requested file $key is not a regular file - datastore corrupted!") private fun deleteDirIfEmpty(file: File) { if (file.listFiles()?.isEmpty() ?: throw IllegalArgumentException("Not a directory!")) { diff --git a/spring-app/src/main/kotlin/pl/starchasers/up/repository/UserRepository.kt b/spring-app/src/main/kotlin/pl/starchasers/up/repository/UserRepository.kt deleted file mode 100644 index 8efa072f..00000000 --- a/spring-app/src/main/kotlin/pl/starchasers/up/repository/UserRepository.kt +++ /dev/null @@ -1,13 +0,0 @@ -package pl.starchasers.up.repository - -import org.springframework.data.jpa.repository.JpaRepository -import org.springframework.stereotype.Repository -import pl.starchasers.up.data.model.User -import pl.starchasers.up.data.value.Username - -@Repository -interface UserRepository : JpaRepository { - fun findFirstByUsername(username: Username): User? - - fun findFirstById(id: Long): User? -} diff --git a/spring-app/src/main/kotlin/pl/starchasers/up/security/JwtConfiguration.kt b/spring-app/src/main/kotlin/pl/starchasers/up/security/JwtConfiguration.kt deleted file mode 100644 index 26cb9aea..00000000 --- a/spring-app/src/main/kotlin/pl/starchasers/up/security/JwtConfiguration.kt +++ /dev/null @@ -1,32 +0,0 @@ -package pl.starchasers.up.security - -import io.jsonwebtoken.SignatureAlgorithm -import org.slf4j.LoggerFactory -import org.springframework.context.annotation.Bean -import org.springframework.context.annotation.Configuration -import java.security.SecureRandom -import java.util.* -import javax.crypto.SecretKey -import javax.crypto.spec.SecretKeySpec - -@Configuration -class JwtConfiguration { - - private val logger = LoggerFactory.getLogger(this::class.java) - - @Bean - fun jwtSigningKey(jwtProperties: JwtProperties): JwtSigningKey { - val secretBytes = if (jwtProperties.base64Secret.isNotBlank()) { - Base64.getDecoder().decode(jwtProperties.base64Secret) - } else { - logger.info("JWT secret not defined. Generating random secret...") - ByteArray(256) - .apply { SecureRandom().nextBytes(this) } - } - return JwtSigningKey(SecretKeySpec(secretBytes, SignatureAlgorithm.HS256.jcaName)) - } -} - -data class JwtSigningKey( - val key: SecretKey -) diff --git a/spring-app/src/main/kotlin/pl/starchasers/up/security/JwtProperties.kt b/spring-app/src/main/kotlin/pl/starchasers/up/security/JwtProperties.kt deleted file mode 100644 index 2d728160..00000000 --- a/spring-app/src/main/kotlin/pl/starchasers/up/security/JwtProperties.kt +++ /dev/null @@ -1,10 +0,0 @@ -package pl.starchasers.up.security - -import org.springframework.boot.context.properties.ConfigurationProperties -import org.springframework.validation.annotation.Validated - -@ConfigurationProperties("up.jwt") -@Validated -data class JwtProperties constructor( - val base64Secret: String = "" -) diff --git a/spring-app/src/main/kotlin/pl/starchasers/up/security/JwtTokenFilter.kt b/spring-app/src/main/kotlin/pl/starchasers/up/security/JwtTokenFilter.kt deleted file mode 100644 index c48f4402..00000000 --- a/spring-app/src/main/kotlin/pl/starchasers/up/security/JwtTokenFilter.kt +++ /dev/null @@ -1,37 +0,0 @@ -package pl.starchasers.up.security - -import jakarta.servlet.FilterChain -import jakarta.servlet.ServletRequest -import jakarta.servlet.ServletResponse -import jakarta.servlet.http.HttpServletRequest -import org.springframework.security.authentication.UsernamePasswordAuthenticationToken -import org.springframework.security.core.GrantedAuthority -import org.springframework.security.core.authority.SimpleGrantedAuthority -import org.springframework.security.core.context.SecurityContextHolder -import org.springframework.web.filter.GenericFilterBean -import pl.starchasers.up.service.JwtTokenService -import pl.starchasers.up.service.ROLE_KEY - -class JwtTokenFilter( - private val tokenService: JwtTokenService -) : GenericFilterBean() { - - override fun doFilter(request: ServletRequest?, response: ServletResponse?, chain: FilterChain) { - val token = (request as HttpServletRequest).getHeader("Authorization") - - try { - val claims = tokenService.parseToken(token.removePrefix("Bearer ")) - - val authorities = mutableListOf() - authorities.add(SimpleGrantedAuthority(Role.USER.roleString())) - if (Role.valueOf(claims[ROLE_KEY] as String) == Role.ADMIN) authorities.add(SimpleGrantedAuthority(Role.ADMIN.roleString())) - - SecurityContextHolder.getContext().authentication = - UsernamePasswordAuthenticationToken(claims.subject, null, authorities) - } catch (e: Exception) { - SecurityContextHolder.clearContext() - } - - chain.doFilter(request, response) - } -} diff --git a/spring-app/src/main/kotlin/pl/starchasers/up/service/AutomaticCleanupService.kt b/spring-app/src/main/kotlin/pl/starchasers/up/service/AutomaticCleanupService.kt index af8c8b98..e64d64f7 100644 --- a/spring-app/src/main/kotlin/pl/starchasers/up/service/AutomaticCleanupService.kt +++ b/spring-app/src/main/kotlin/pl/starchasers/up/service/AutomaticCleanupService.kt @@ -29,7 +29,7 @@ class AutomaticCleanupService( if (uploadRepository.exists(it.key)) { uploadRepository.delete(it.key) } - fileEntryRepository.delete(it) + it.delete() } catch (e: IOException) { val sw = StringWriter() val pw = PrintWriter(sw) diff --git a/spring-app/src/main/kotlin/pl/starchasers/up/service/ConfigurationService.kt b/spring-app/src/main/kotlin/pl/starchasers/up/service/ConfigurationService.kt index f8cf00f1..4d5d231b 100644 --- a/spring-app/src/main/kotlin/pl/starchasers/up/service/ConfigurationService.kt +++ b/spring-app/src/main/kotlin/pl/starchasers/up/service/ConfigurationService.kt @@ -2,21 +2,12 @@ package pl.starchasers.up.service import jakarta.annotation.PostConstruct import org.springframework.stereotype.Service -import pl.starchasers.up.data.dto.configuration.UpdateUserConfigurationDTO import pl.starchasers.up.data.model.ConfigurationEntry import pl.starchasers.up.data.model.ConfigurationKey -import pl.starchasers.up.data.model.User -import pl.starchasers.up.data.value.FileSize -import pl.starchasers.up.data.value.Milliseconds import pl.starchasers.up.exception.BadRequestException import pl.starchasers.up.repository.ConfigurationRepository -import pl.starchasers.up.repository.UserRepository interface ConfigurationService { - fun applyDefaultConfiguration(user: User) - - fun updateUserConfiguration(user: User, configuration: UpdateUserConfigurationDTO) - fun setConfigurationOption(key: ConfigurationKey, value: String) fun getConfigurationOption(key: ConfigurationKey): String @@ -25,59 +16,22 @@ interface ConfigurationService { fun updateGlobalConfiguration(configuration: Map) - fun getAnonymousMaxFileSize(): FileSize + fun getAnonymousMaxFileSize(): Long - fun getAnonymousDefaultFileLifetime(): Milliseconds + fun getAnonymousDefaultFileLifetime(): Long - fun getAnonymousMaxFileLifetime(): Milliseconds + fun getAnonymousMaxFileLifetime(): Long } @Service class ConfigurationServiceImpl( - private val configurationRepository: ConfigurationRepository, - private val userRepository: UserRepository + private val configurationRepository: ConfigurationRepository ) : ConfigurationService { - override fun applyDefaultConfiguration(user: User) { - user.apply { - maxTemporaryFileSize = FileSize( - getConfigurationOption( - ConfigurationKey.DEFAULT_USER_MAX_TEMPORARY_FILE_SIZE - ).toLong() - ) - maxPermanentFileSize = FileSize( - getConfigurationOption( - ConfigurationKey.DEFAULT_USER_MAX_PERMANENT_FILE_SIZE - ).toLong() - ) - defaultFileLifetime = Milliseconds( - getConfigurationOption( - ConfigurationKey.DEFAULT_USER_DEFAULT_FILE_LIFETIME - ).toLong() - ) - maxFileLifetime = Milliseconds( - getConfigurationOption( - ConfigurationKey.DEFAULT_USER_MAX_FILE_LIFETIME - ).toLong() - ) - } - } - - override fun updateUserConfiguration(user: User, configuration: UpdateUserConfigurationDTO) { - user.apply { - maxTemporaryFileSize = FileSize(configuration.maxTemporaryFileSize) - maxPermanentFileSize = FileSize(configuration.maxPermanentFileSize) - defaultFileLifetime = Milliseconds(configuration.defaultFileLifetime) - maxFileLifetime = Milliseconds(configuration.maxFileLifetime) - } - userRepository.save(user) - } - override fun setConfigurationOption(key: ConfigurationKey, value: String) { if (value.toLongOrNull() == null) throw BadRequestException("Value must be of type Long.") // TODO change if more data types are required - val entry = configurationRepository.findFirstByKey(key) ?: ConfigurationEntry(0, key, value) - entry.value = value - configurationRepository.save(entry) + configurationRepository.findFirstByKey(key)?.apply { this.value = value }?.flushChanges() + ?: configurationRepository.insert(ConfigurationEntry { this.key = key; this.value = value }) } override fun getConfigurationOption(key: ConfigurationKey): String { @@ -86,7 +40,7 @@ class ConfigurationServiceImpl( override fun getGlobalConfiguration(): Map = mapOf( - *ConfigurationKey.values().map { + *ConfigurationKey.entries.map { Pair(it, configurationRepository.findFirstByKey(it)?.value ?: it.defaultValue) }.toTypedArray() ) @@ -97,23 +51,23 @@ class ConfigurationServiceImpl( configuration.forEach { setConfigurationOption(it.key, it.value) } } - override fun getAnonymousMaxFileSize(): FileSize = - FileSize(getConfigurationOption(ConfigurationKey.ANONYMOUS_MAX_FILE_SIZE).toLong()) + override fun getAnonymousMaxFileSize(): Long = + getConfigurationOption(ConfigurationKey.ANONYMOUS_MAX_FILE_SIZE).toLong() - override fun getAnonymousDefaultFileLifetime(): Milliseconds = - Milliseconds(getConfigurationOption(ConfigurationKey.ANONYMOUS_DEFAULT_FILE_LIFETIME).toLong()) + override fun getAnonymousDefaultFileLifetime(): Long = + getConfigurationOption(ConfigurationKey.ANONYMOUS_DEFAULT_FILE_LIFETIME).toLong() - override fun getAnonymousMaxFileLifetime(): Milliseconds = - Milliseconds(getConfigurationOption(ConfigurationKey.ANONYMOUS_MAX_FILE_LIFETIME).toLong()) + override fun getAnonymousMaxFileLifetime(): Long = + getConfigurationOption(ConfigurationKey.ANONYMOUS_MAX_FILE_LIFETIME).toLong() @PostConstruct private fun initialize() { - ConfigurationKey.values().forEach { key -> + ConfigurationKey.entries.forEach { key -> val entry = configurationRepository.findFirstByKey(key) if (entry == null) { - val defaultEntry = ConfigurationEntry(0, key, key.defaultValue) - configurationRepository.save(defaultEntry) + val defaultEntry = ConfigurationEntry { this.key = key; this.value = key.defaultValue } + configurationRepository.insert(defaultEntry) } } } diff --git a/spring-app/src/main/kotlin/pl/starchasers/up/service/FileService.kt b/spring-app/src/main/kotlin/pl/starchasers/up/service/FileService.kt index 261bda3a..a12dd43e 100644 --- a/spring-app/src/main/kotlin/pl/starchasers/up/service/FileService.kt +++ b/spring-app/src/main/kotlin/pl/starchasers/up/service/FileService.kt @@ -8,37 +8,34 @@ import pl.starchasers.up.data.dto.upload.FileDetailsDTO import pl.starchasers.up.data.dto.upload.UploadCompleteResponseDTO import pl.starchasers.up.data.model.ConfigurationKey.ANONYMOUS_MAX_FILE_SIZE import pl.starchasers.up.data.model.FileEntry -import pl.starchasers.up.data.model.User -import pl.starchasers.up.data.value.* import pl.starchasers.up.exception.FileTooLargeException import pl.starchasers.up.exception.NotFoundException import pl.starchasers.up.repository.FileEntryRepository import pl.starchasers.up.util.Util import java.io.InputStream -import java.sql.Timestamp -import java.time.LocalDateTime +import java.time.Instant +import java.time.temporal.ChronoUnit interface FileService { fun createFile( tmpFile: InputStream, - filename: Filename, - contentType: ContentType, - size: FileSize, - user: User? + filename: String, + contentType: String, + size: Long ): UploadCompleteResponseDTO - fun verifyFileAccess(fileEntry: FileEntry, accessToken: FileAccessToken?, user: User?): Boolean + fun verifyFileAccess(fileEntry: FileEntry, accessToken: String?): Boolean - fun verifyFileAccess(fileKey: FileKey, accessToken: FileAccessToken?, user: User?): Boolean + fun verifyFileAccess(fileKey: String, accessToken: String?): Boolean - fun findFileEntry(fileKey: FileKey): FileEntry? + fun findFileEntry(fileKey: String): FileEntry? - fun getFileDetails(fileKey: FileKey): FileDetailsDTO + fun getFileDetails(fileKey: String): FileDetailsDTO fun deleteFile(fileEntry: FileEntry) - fun getUploadHistory(user: User, pageable: Pageable): Page + fun getUploadHistory(pageable: Pageable): Page } @Service @@ -54,71 +51,61 @@ class FileServiceImpl( @Transactional override fun createFile( tmpFile: InputStream, - filename: Filename, - contentType: ContentType, - size: FileSize, - user: User? + filename: String, + contentType: String, + size: Long ): UploadCompleteResponseDTO { val actualContentType = when { - contentType.value.isBlank() -> ContentType("application/octet-stream") - contentType.value == "text/plain" -> ContentType( - "text/plain; charset=" + charsetDetectionService.detect( - tmpFile - ) - ) + contentType.isBlank() -> "application/octet-stream" + contentType == "text/plain" -> "text/plain; charset=" + charsetDetectionService.detect(tmpFile) else -> contentType } - val personalLimit: FileSize = user?.maxTemporaryFileSize - ?: FileSize(configurationService.getConfigurationOption(ANONYMOUS_MAX_FILE_SIZE).toLong()) + val personalLimit: Long = configurationService.getConfigurationOption(ANONYMOUS_MAX_FILE_SIZE).toLong() if (size > personalLimit) throw FileTooLargeException() val key = fileStorageService.storeNonPermanentFile(tmpFile, filename) // TODO check key already used val accessToken = generateFileAccessToken() - val toDeleteDate = Timestamp.valueOf(LocalDateTime.now().plusDays(1)) - val fileEntry = FileEntry( - 0, - key, - filename, - actualContentType, - null, - false, - Timestamp.valueOf(LocalDateTime.now()), - toDeleteDate, - false, - accessToken, - size, - user - ) - - fileEntryRepository.save(fileEntry) - - return UploadCompleteResponseDTO(key.value, accessToken.value, toDeleteDate) + val toDeleteAt = Instant.now().plus(1, ChronoUnit.DAYS) + + val fileEntry = FileEntry { + this.accessToken = accessToken + this.contentType = actualContentType + this.createdAt = Instant.now() + this.encrypted = false + this.filename = filename + this.key = key + this.password = null + this.size = size + this.toDeleteAt = toDeleteAt + } + + fileEntryRepository.insert(fileEntry) + + return UploadCompleteResponseDTO(key, accessToken, toDeleteAt) } - override fun verifyFileAccess(fileEntry: FileEntry, accessToken: FileAccessToken?, user: User?): Boolean { - return (user != null && fileEntry.owner == user) || fileEntry.accessToken == accessToken + override fun verifyFileAccess(fileEntry: FileEntry, accessToken: String?): Boolean { + return (fileEntry.accessToken != null) && fileEntry.accessToken == accessToken } - override fun verifyFileAccess(fileKey: FileKey, accessToken: FileAccessToken?, user: User?): Boolean = + override fun verifyFileAccess(fileKey: String, accessToken: String?): Boolean = fileEntryRepository .findExistingFileByKey(fileKey) - ?.let { verifyFileAccess(it, accessToken, user) } ?: false + ?.let { verifyFileAccess(it, accessToken) } == true - override fun findFileEntry(fileKey: FileKey): FileEntry? = fileEntryRepository.findExistingFileByKey(fileKey) + override fun findFileEntry(fileKey: String): FileEntry? = fileEntryRepository.findExistingFileByKey(fileKey) - override fun getFileDetails(fileKey: FileKey): FileDetailsDTO = + override fun getFileDetails(fileKey: String): FileDetailsDTO = fileEntryRepository.findExistingFileByKey(fileKey)?.let { FileDetailsDTO( - it.key.value, - it.filename.value, - it.permanent, - if (!it.permanent) it.toDeleteDate - ?: throw IllegalStateException("Temporary file without delete date! FileKey: ${it.key}") - else null, - it.size.value, - it.contentType.value + it.key, + it.filename, + it.toDeleteAt == null, + it.toDeleteAt, + it.size, + it.contentType ) } ?: throw NotFoundException() @@ -126,9 +113,9 @@ class FileServiceImpl( fileStorageService.deleteFile(fileEntry) } - override fun getUploadHistory(user: User, pageable: Pageable): Page { - return fileEntryRepository.findAllByOwner(user, pageable) + override fun getUploadHistory(pageable: Pageable): Page { + return fileEntryRepository.findAll(pageable) } - private fun generateFileAccessToken(): FileAccessToken = FileAccessToken(util.secureAlphanumericRandomString(128)) + private fun generateFileAccessToken(): String = util.secureAlphanumericRandomString(128) } diff --git a/spring-app/src/main/kotlin/pl/starchasers/up/service/FileStorageService.kt b/spring-app/src/main/kotlin/pl/starchasers/up/service/FileStorageService.kt index 2ffdb2be..245fc087 100644 --- a/spring-app/src/main/kotlin/pl/starchasers/up/service/FileStorageService.kt +++ b/spring-app/src/main/kotlin/pl/starchasers/up/service/FileStorageService.kt @@ -4,8 +4,6 @@ import org.springframework.stereotype.Service import org.springframework.transaction.annotation.Transactional import pl.starchasers.up.data.model.FileContent import pl.starchasers.up.data.model.FileEntry -import pl.starchasers.up.data.value.FileKey -import pl.starchasers.up.data.value.Filename import pl.starchasers.up.exception.NotFoundException import pl.starchasers.up.repository.FileEntryRepository import pl.starchasers.up.repository.UploadRepository @@ -13,9 +11,9 @@ import pl.starchasers.up.util.Util import java.io.InputStream interface FileStorageService { - fun storeNonPermanentFile(tmpFile: InputStream, filename: Filename): FileKey + fun storeNonPermanentFile(tmpFile: InputStream, filename: String): String - fun getStoredFileRaw(key: FileKey): Pair + fun getStoredFileRaw(key: String): Pair fun deleteFile(fileEntry: FileEntry) } @@ -33,15 +31,15 @@ class FileStorageServiceImpl( private val util = Util() @Transactional - override fun storeNonPermanentFile(tmpFile: InputStream, filename: Filename): FileKey { - val key = FileKey(util.secureReadableRandomString(NON_PERMANENT_FILE_KEY_LENGTH)) + override fun storeNonPermanentFile(tmpFile: InputStream, filename: String): String { + val key = util.secureReadableRandomString(NON_PERMANENT_FILE_KEY_LENGTH) val fileContent = FileContent(key, tmpFile) uploadRepository.save(fileContent) return key } - override fun getStoredFileRaw(key: FileKey): Pair { + override fun getStoredFileRaw(key: String): Pair { val fileEntry = fileEntryRepository.findExistingFileByKey(key) ?: throw NotFoundException() val upload = uploadRepository.find(key) ?: throw NotFoundException() // TODO handle possible data inconsistency @@ -51,6 +49,6 @@ class FileStorageServiceImpl( override fun deleteFile(fileEntry: FileEntry) { uploadRepository.delete(fileEntry.key) - fileEntryRepository.delete(fileEntry) + fileEntry.delete() } } diff --git a/spring-app/src/main/kotlin/pl/starchasers/up/service/JwtTokenService.kt b/spring-app/src/main/kotlin/pl/starchasers/up/service/JwtTokenService.kt deleted file mode 100644 index 09a2bff7..00000000 --- a/spring-app/src/main/kotlin/pl/starchasers/up/service/JwtTokenService.kt +++ /dev/null @@ -1,133 +0,0 @@ -package pl.starchasers.up.service - -import io.jsonwebtoken.Claims -import io.jsonwebtoken.Jwts -import org.slf4j.LoggerFactory -import org.springframework.stereotype.Service -import org.springframework.transaction.annotation.Transactional -import pl.starchasers.up.data.model.RefreshToken -import pl.starchasers.up.data.model.User -import pl.starchasers.up.data.value.RefreshTokenId -import pl.starchasers.up.exception.JwtTokenException -import pl.starchasers.up.repository.RefreshTokenRepository -import pl.starchasers.up.security.JwtSigningKey -import java.sql.Timestamp -import java.time.LocalDateTime -import java.util.* - -const val TOKEN_ID_KEY = "tokenId" -const val ROLE_KEY = "role" - -interface JwtTokenService { - fun issueRefreshToken(user: User): String - - fun refreshRefreshToken(oldRefreshToken: String): String - - fun issueAccessToken(refreshToken: String): String - - fun verifyRefreshToken(token: RefreshTokenId, user: User) - - fun parseToken(token: String): Claims - - fun invalidateUser(user: User) - - fun invalidateRefreshToken(refreshToken: String) -} - -@Service -class JwtTokenServiceImpl( - private val refreshTokenRepository: RefreshTokenRepository, - private val userService: UserService, - private val jwtSigningKey: JwtSigningKey -) : JwtTokenService { - - private val refreshTokenValidTime: Long = 7 * 24 * 60 * 60 * 1000 - private val accessTokenValidTime: Long = 15 * 60 * 1000 - private val logger = LoggerFactory.getLogger(this::class.java) - - override fun issueRefreshToken(user: User): String { - val claims = Jwts.claims().setSubject(user.id.toString()) - val now = Date() - val tokenId = RefreshTokenId(UUID.randomUUID().toString()) - - claims[TOKEN_ID_KEY] = tokenId.value - val refreshToken = RefreshToken( - 0, - user, - tokenId, - Timestamp.valueOf(LocalDateTime.now()), - Timestamp.valueOf(LocalDateTime.now().plusNanos(refreshTokenValidTime * 1000)) - ) - - refreshTokenRepository.save(refreshToken) - - return Jwts.builder() - .setClaims(claims) - .setIssuedAt(now) - .setExpiration(Date(now.time + refreshTokenValidTime)) - .signWith(jwtSigningKey.key) - .compact() - } - - override fun refreshRefreshToken(oldRefreshToken: String): String { - val oldClaims = parseToken(oldRefreshToken) - val user = userService.getUser(oldClaims.subject.toLong()) - - verifyRefreshToken(oldClaims.getTokenId(), user) - - return issueRefreshToken(user) - } - - override fun issueAccessToken(refreshToken: String): String { - val refreshTokenClaims = parseToken(refreshToken) - val user = userService.getUser(refreshTokenClaims.subject.toLong()) - - val claims = Jwts.claims().setSubject(user.id.toString()) - claims[ROLE_KEY] = user.role - - verifyRefreshToken(RefreshTokenId(refreshTokenClaims[TOKEN_ID_KEY] as String), user) - - val now = Date() - - return Jwts.builder() - .setClaims(claims) - .setIssuedAt(now) - .setExpiration(Date(now.time + accessTokenValidTime)) - .signWith(jwtSigningKey.key) - .compact() - } - - override fun verifyRefreshToken(token: RefreshTokenId, user: User) { - refreshTokenRepository.findFirstByTokenAndUser(token, user) ?: throw JwtTokenException("Invalid refresh token.") - } - - override fun parseToken(token: String): Claims { - try { - return Jwts.parserBuilder() - .setSigningKey(jwtSigningKey.key) - .build() - .parseClaimsJws(token) - .body - } catch (e: Exception) { - logger.warn("error parsing jwt token", e) - throw JwtTokenException("Invalid or corrupted token.") - } - } - - @Transactional - override fun invalidateUser(user: User) { - refreshTokenRepository.deleteAllByUser(user) - } - - @Transactional - override fun invalidateRefreshToken(refreshToken: String) { - val claims = parseToken(refreshToken) - refreshTokenRepository.deleteAllByToken(claims.getTokenId()) - } -} - -fun Claims.getTokenId(): RefreshTokenId { - val idString = this[TOKEN_ID_KEY] - if (idString !is String) throw JwtTokenException("Invalid refresh token") - return RefreshTokenId(idString) -} diff --git a/spring-app/src/main/kotlin/pl/starchasers/up/service/UserService.kt b/spring-app/src/main/kotlin/pl/starchasers/up/service/UserService.kt deleted file mode 100644 index 09cb83b9..00000000 --- a/spring-app/src/main/kotlin/pl/starchasers/up/service/UserService.kt +++ /dev/null @@ -1,136 +0,0 @@ -package pl.starchasers.up.service - -import org.springframework.data.domain.Page -import org.springframework.data.domain.Pageable -import org.springframework.security.crypto.password.PasswordEncoder -import org.springframework.stereotype.Service -import pl.starchasers.up.data.model.User -import pl.starchasers.up.data.value.* -import pl.starchasers.up.exception.AccessDeniedException -import pl.starchasers.up.exception.BadRequestException -import pl.starchasers.up.exception.UserException -import pl.starchasers.up.repository.UserRepository -import pl.starchasers.up.security.Role -import pl.starchasers.up.util.encode -import pl.starchasers.up.util.matches -import java.security.Principal - -const val ROOT_USER_NAME = "root" - -interface UserService { - fun getUser(id: Long): User - - fun getUser(username: Username): User - - fun findUser(id: Long): User? - - fun findUser(username: Username): User? - - fun fromPrincipal(principal: Principal?): User? - - fun createUser(username: Username, rawPassword: RawPassword, email: Email?, role: Role): User - - fun getUserFromCredentials(username: Username, password: RawPassword): User - - fun listUsers(pageable: Pageable): Page - - fun updateUser( - userId: Long, - username: Username?, - email: Email?, - password: RawPassword?, - role: Role?, - maxTemporaryFileSize: FileSize?, - maxPermanentFileSize: FileSize?, - defaultFileLifetime: Milliseconds?, - maxFileLifetime: Milliseconds? - ) - - fun deleteUser(user: User) - - fun deleteUser(userId: Long, thisUserId: Long) -} - -@Service -class UserServiceImpl( - private val userRepository: UserRepository, - private val passwordEncoder: PasswordEncoder, - private val configurationService: ConfigurationService -) : UserService { - override fun getUser(id: Long): User = userRepository.findFirstById(id) - ?: throw UserException("User with ID `$id` doesn't exist") - - override fun getUser(username: Username): User = userRepository.findFirstByUsername(username) - ?: throw UserException("User with username '$username' doesn't exist") - - override fun findUser(id: Long): User? = userRepository.findFirstById(id) - - override fun findUser(username: Username): User? = userRepository.findFirstByUsername(username) - - override fun fromPrincipal(principal: Principal?): User? { - if (principal == null) return null - return findUser(principal.name.toLong()) - } - - override fun createUser(username: Username, rawPassword: RawPassword, email: Email?, role: Role): User { - val oldUser = findUser(username) - if (oldUser != null) throw BadRequestException("Username already taken.") - val user = User( - 0, - username, - passwordEncoder.encode(rawPassword), - email, - role - ) - configurationService.applyDefaultConfiguration(user) - userRepository.save(user) - return user - } - - override fun getUserFromCredentials(username: Username, password: RawPassword): User = - findUser(username)?.takeIf { passwordEncoder.matches(password, it.password) } - ?: throw AccessDeniedException("Incorrect username or password") - - override fun listUsers(pageable: Pageable): Page = userRepository.findAll(pageable) - - override fun updateUser( - userId: Long, - username: Username?, - email: Email?, - password: RawPassword?, - role: Role?, - maxTemporaryFileSize: FileSize?, - maxPermanentFileSize: FileSize?, - defaultFileLifetime: Milliseconds?, - maxFileLifetime: Milliseconds? - ) { - val user = findUser(userId) ?: throw BadRequestException("User does not exist.") - - if (username != null && user.username != username) { - if (findUser(username) != null) throw BadRequestException("Username already taken") - user.username = username - } - - user.email = email - password?.let { user.password = passwordEncoder.encode(it) } - role?.let { user.role = it } - maxTemporaryFileSize?.let { user.maxTemporaryFileSize = it } - maxPermanentFileSize?.let { user.maxPermanentFileSize = it } - defaultFileLifetime?.let { user.defaultFileLifetime = it } - maxFileLifetime?.let { user.maxFileLifetime = it } - - userRepository.save(user) - } - - override fun deleteUser(user: User) { - userRepository.delete(user) - } - - override fun deleteUser(userId: Long, thisUserId: Long) { - if (userId == thisUserId) throw BadRequestException("Cannot delete current user.") - if (findUser(userId)?.username?.value == ROOT_USER_NAME) throw AccessDeniedException() - - val toDelete = findUser(userId) ?: throw BadRequestException("User does not exist") - userRepository.delete(toDelete) - } -} diff --git a/spring-app/src/main/kotlin/pl/starchasers/up/util/PasswordEncoderExtensions.kt b/spring-app/src/main/kotlin/pl/starchasers/up/util/PasswordEncoderExtensions.kt deleted file mode 100644 index d080a7db..00000000 --- a/spring-app/src/main/kotlin/pl/starchasers/up/util/PasswordEncoderExtensions.kt +++ /dev/null @@ -1,10 +0,0 @@ -package pl.starchasers.up.util - -import org.springframework.security.crypto.password.PasswordEncoder -import pl.starchasers.up.data.value.RawPassword -import pl.starchasers.up.data.value.UserPassword - -fun PasswordEncoder.encode(password: RawPassword): UserPassword = UserPassword(this.encode(password.value)) - -fun PasswordEncoder.matches(password: RawPassword, actualPassword: UserPassword) = - this.matches(password.value, actualPassword.value) diff --git a/spring-app/src/main/kotlin/pl/starchasers/up/util/initializer/AccountInitializer.kt b/spring-app/src/main/kotlin/pl/starchasers/up/util/initializer/AccountInitializer.kt deleted file mode 100644 index 86b64396..00000000 --- a/spring-app/src/main/kotlin/pl/starchasers/up/util/initializer/AccountInitializer.kt +++ /dev/null @@ -1,34 +0,0 @@ -package pl.starchasers.up.util.initializer - -import jakarta.annotation.PostConstruct -import org.slf4j.LoggerFactory -import org.springframework.stereotype.Component -import pl.starchasers.up.data.value.RawPassword -import pl.starchasers.up.data.value.Username -import pl.starchasers.up.security.Role -import pl.starchasers.up.service.UserService -import pl.starchasers.up.util.Util - -@Component -class AccountInitializer( - private val userService: UserService -) : Initializer() { - - private val util = Util() - private val logger = LoggerFactory.getLogger(AccountInitializer::class.java) - - @PostConstruct - override fun initialize() { - ensureRootAccount() - } - - private fun ensureRootAccount() { - val user = userService.findUser(Username("root")) - - if (user == null) { - val password = util.secureAlphanumericRandomString(16) - userService.createUser(Username("root"), RawPassword(password), null, Role.ADMIN) - logger.info("Root account not found. Creating new one.\n\nUsername: root Password: $password\n") - } - } -} diff --git a/spring-app/src/main/resources/db/migration/V1__Init.sql b/spring-app/src/main/resources/db/migration/V1__Init.sql index 6a2f300c..7322a249 100644 --- a/spring-app/src/main/resources/db/migration/V1__Init.sql +++ b/spring-app/src/main/resources/db/migration/V1__Init.sql @@ -9,47 +9,14 @@ CREATE TABLE configuration_entry CREATE TABLE file_entry ( id bigserial NOT NULL, - owner_id bigint DEFAULT NULL, file_access_token text DEFAULT NULL, content_type text NOT NULL, - created_date timestamp NOT NULL, + created_at timestamp NOT NULL DEFAULT now(), encrypted bool NOT NULL, filename text NOT NULL, file_key text NOT NULL, file_password text DEFAULT NULL, - permanent bool NOT NULL, - file_size bigint DEFAULT NULL, - to_delete_date timestamp DEFAULT NULL, + file_size bigint NOT NULL, + to_delete_at timestamp DEFAULT NULL, CONSTRAINT pk_file_entry PRIMARY KEY (id) ); - -CREATE TABLE refresh_token -( - id bigint NOT NULL, - creation_date timestamp NOT NULL, - expiration_date timestamp NOT NULL, - refresh_token text NOT NULL, - user_id bigint DEFAULT NULL, - CONSTRAINT pk_refresh_token PRIMARY KEY (id) -); - -CREATE TABLE application_user -( - id bigserial NOT NULL, - default_file_lifetime bigint DEFAULT NULL, - email text DEFAULT NULL, - max_file_lifetime bigint DEFAULT NULL, - max_permanent_file_size bigint DEFAULT NULL, - max_temporary_file_size bigint DEFAULT NULL, - password text NOT NULL, - role text NOT NULL, - username text NOT NULL, - CONSTRAINT pk_user PRIMARY KEY (id) -); - -ALTER TABLE refresh_token - ADD CONSTRAINT fk_user__refresh_token FOREIGN KEY (user_id) REFERENCES application_user (id); - -ALTER TABLE file_entry - ADD CONSTRAINT fk_user__file_entry FOREIGN KEY (owner_id) REFERENCES application_user (id); - diff --git a/spring-app/src/test/kotlin/pl/starchasers/up/DatabaseCleaner.kt b/spring-app/src/test/kotlin/pl/starchasers/up/DatabaseCleaner.kt index 59d3e03c..222f0f38 100644 --- a/spring-app/src/test/kotlin/pl/starchasers/up/DatabaseCleaner.kt +++ b/spring-app/src/test/kotlin/pl/starchasers/up/DatabaseCleaner.kt @@ -2,16 +2,16 @@ package pl.starchasers.up import org.junit.jupiter.api.extension.BeforeTestExecutionCallback import org.junit.jupiter.api.extension.ExtensionContext -import org.springframework.data.jpa.repository.JpaRepository +import org.ktorm.database.Database import org.springframework.stereotype.Component +import pl.starchasers.up.repository.StandardRepository import pl.starchasers.up.util.initializer.Initializer -import javax.sql.DataSource @Component class DatabaseCleaner( - private val repositories: List>, - private val initializers: List, - private val dataSource: DataSource + private val database: Database, + private val repositories: List>, + private val initializers: List ) : BeforeTestExecutionCallback { fun reset() { @@ -20,14 +20,11 @@ class DatabaseCleaner( } private fun clean() { - val connection = dataSource.connection - - connection.prepareStatement("set foreign_key_checks = 0").execute() - repositories.forEach { - it.deleteAllInBatch() + database.useTransaction { + repositories.forEach { + it.deleteAll() + } } - connection.prepareStatement("set foreign_key_checks = 1").execute() - connection.close() } private fun initialize() { diff --git a/spring-app/src/test/kotlin/pl/starchasers/up/JpaTestBase.kt b/spring-app/src/test/kotlin/pl/starchasers/up/JpaTestBase.kt index 769649da..60982e08 100644 --- a/spring-app/src/test/kotlin/pl/starchasers/up/JpaTestBase.kt +++ b/spring-app/src/test/kotlin/pl/starchasers/up/JpaTestBase.kt @@ -4,10 +4,6 @@ import org.junit.jupiter.api.AfterEach import org.junit.jupiter.api.TestInstance import org.springframework.beans.factory.annotation.Autowired import org.springframework.boot.test.context.SpringBootTest -import org.springframework.http.HttpHeaders -import org.springframework.test.web.servlet.MockHttpServletRequestDsl -import pl.starchasers.up.data.model.User -import pl.starchasers.up.service.JwtTokenService @SpringBootTest @TestInstance(TestInstance.Lifecycle.PER_CLASS) @@ -16,20 +12,9 @@ class JpaTestBase { @Autowired private lateinit var databaseCleaner: DatabaseCleaner - @Autowired - private lateinit var jwtTokenService: JwtTokenService - @AfterEach fun cleanup() { databaseCleaner.reset() } - private fun getUserAccessToken(user: User): String { - val refreshToken = jwtTokenService.issueRefreshToken(user) - return jwtTokenService.issueAccessToken(refreshToken) - } - - fun MockHttpServletRequestDsl.authorizeAsUser(user: User) { - header(HttpHeaders.AUTHORIZATION, "Bearer ${getUserAccessToken(user)}") - } } diff --git a/spring-app/src/test/kotlin/pl/starchasers/up/MockMvcTestBase.kt b/spring-app/src/test/kotlin/pl/starchasers/up/MockMvcTestBase.kt index 94f156d7..985b3c1f 100644 --- a/spring-app/src/test/kotlin/pl/starchasers/up/MockMvcTestBase.kt +++ b/spring-app/src/test/kotlin/pl/starchasers/up/MockMvcTestBase.kt @@ -1,38 +1,16 @@ package pl.starchasers.up -import com.fasterxml.jackson.databind.ObjectMapper import org.springframework.beans.factory.annotation.Autowired import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc import org.springframework.boot.test.context.SpringBootTest -import org.springframework.http.HttpHeaders import org.springframework.test.context.web.WebAppConfiguration -import org.springframework.test.web.servlet.MockHttpServletRequestDsl import org.springframework.test.web.servlet.MockMvc -import pl.starchasers.up.data.value.Username -import pl.starchasers.up.service.JwtTokenService -import pl.starchasers.up.service.UserService @SpringBootTest @WebAppConfiguration @AutoConfigureMockMvc abstract class MockMvcTestBase { - @Autowired - protected lateinit var mapper: ObjectMapper - @Autowired protected lateinit var mockMvc: MockMvc - @Autowired - private lateinit var jwtTokenService: JwtTokenService - - @Autowired - private lateinit var userService: UserService - - final fun getAdminAccessToken(): String { - return jwtTokenService.issueAccessToken(jwtTokenService.issueRefreshToken(userService.getUser(Username("root")))) - } - - fun MockHttpServletRequestDsl.authorizeAsAdmin() { - header(HttpHeaders.AUTHORIZATION, "Bearer ${getAdminAccessToken()}") - } } diff --git a/spring-app/src/test/kotlin/pl/starchasers/up/TestUtil.kt b/spring-app/src/test/kotlin/pl/starchasers/up/TestUtil.kt index 648c49d9..0bf90754 100644 --- a/spring-app/src/test/kotlin/pl/starchasers/up/TestUtil.kt +++ b/spring-app/src/test/kotlin/pl/starchasers/up/TestUtil.kt @@ -1,13 +1,14 @@ package pl.starchasers.up import com.fasterxml.jackson.databind.ObjectMapper +import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule import com.fasterxml.jackson.module.kotlin.jacksonObjectMapper import com.fasterxml.jackson.module.kotlin.readValue import org.springframework.http.MediaType import org.springframework.test.web.servlet.* object DefaultObjectMapper { - val objectMapper: ObjectMapper = jacksonObjectMapper() + val objectMapper: ObjectMapper = jacksonObjectMapper().registerModule(JavaTimeModule()) } var MockHttpServletRequestDsl.jsonContent: Any? diff --git a/spring-app/src/test/kotlin/pl/starchasers/up/controller/AuthenticationControllerTest.kt b/spring-app/src/test/kotlin/pl/starchasers/up/controller/AuthenticationControllerTest.kt deleted file mode 100644 index 16febf85..00000000 --- a/spring-app/src/test/kotlin/pl/starchasers/up/controller/AuthenticationControllerTest.kt +++ /dev/null @@ -1,166 +0,0 @@ -package pl.starchasers.up.controller - -import io.kotest.matchers.string.shouldNotBeEmpty -import org.junit.jupiter.api.Assertions.assertEquals -import org.junit.jupiter.api.Assertions.assertTrue -import org.junit.jupiter.api.BeforeEach -import org.junit.jupiter.api.Nested -import org.junit.jupiter.api.Test -import org.springframework.beans.factory.annotation.Autowired -import org.springframework.http.HttpHeaders -import org.springframework.test.web.servlet.post -import pl.starchasers.up.* -import pl.starchasers.up.data.dto.authentication.LoginDTO -import pl.starchasers.up.data.dto.authentication.TokenDTO -import pl.starchasers.up.data.model.User -import pl.starchasers.up.repository.RefreshTokenRepository -import pl.starchasers.up.service.JwtTokenService -import pl.starchasers.up.testdata.UserTestData - -internal class AuthenticationControllerTest( - @Autowired private val jwtTokenService: JwtTokenService, - @Autowired private val userTestData: UserTestData -) : JpaTestBase() { - - private lateinit var testUser: User - - @BeforeEach - fun createTestUser() { - testUser = userTestData.createTestUser() - } - - @Nested - inner class LogIn : MockMvcTestBase() { - private val requestPath = "/api/auth/login" - - @Test - fun `Given valid data, should return refresh token`() { - val response: TokenDTO = mockMvc.postJson(requestPath) { - jsonContent = LoginDTO(UserTestData.DEFAULT_USERNAME, UserTestData.DEFAULT_PASSWORD) - }.andExpect { - status { isOk() } - }.andReturn().parse() - - response.token.shouldNotBeEmpty() - } - - @Test - fun `Given incorrect password, should return 403`() { - mockMvc.postJson(requestPath) { - jsonContent = LoginDTO(UserTestData.DEFAULT_USERNAME, UserTestData.DEFAULT_PASSWORD + "qwe") - }.andExpect { - status { isForbidden() } - } - } - - @Test - fun `Given incorrect username, should return 403`() { - mockMvc.postJson(requestPath) { - jsonContent = LoginDTO(UserTestData.DEFAULT_USERNAME + "qwe", UserTestData.DEFAULT_PASSWORD) - }.andExpect { - status { isForbidden() } - } - } - } - - @Nested - inner class LogOut( - @Autowired private val refreshTokenRepository: RefreshTokenRepository - ) : MockMvcTestBase() { - - private lateinit var refreshToken: String - private lateinit var accessToken: String - - private val requestPath = "/api/auth/logout" - - @BeforeEach - fun createSessions() { - refreshToken = jwtTokenService.issueRefreshToken(testUser) - jwtTokenService.issueRefreshToken(testUser) - jwtTokenService.issueRefreshToken(testUser) - accessToken = jwtTokenService.issueAccessToken(refreshToken) - } - - @Test - fun `Given correct access token, should invalidate all refresh tokens`() { - mockMvc.post(requestPath) { - header(HttpHeaders.AUTHORIZATION, "Bearer $accessToken") - }.andExpect { - status { isOk() } - } - - assertTrue(refreshTokenRepository.findAllByUser(testUser).isEmpty()) - } - - @Test - fun `Given incorrect access token or logged out user, should return 403`() { - mockMvc.post(requestPath) - .andExpect { - status { isForbidden() } - } - - assertEquals(3, refreshTokenRepository.findAllByUser(testUser).size) - } - } - - @Nested - inner class GetAccessToken : MockMvcTestBase() { - private val requestPath = "/api/auth/getAccessToken" - - @Test - fun `Given valid refresh token, should return access token`() { - val refreshToken = jwtTokenService.issueRefreshToken(testUser) - - val response: TokenDTO = mockMvc.postJson(requestPath) { - jsonContent = TokenDTO(refreshToken) - }.andExpect { - status { isOk() } - }.andReturn().parse() - - response.token.shouldNotBeEmpty() - } - - @Test - fun `Given invalid refresh token, should return 403`() { - val refreshToken = jwtTokenService.issueRefreshToken(testUser) - jwtTokenService.invalidateRefreshToken(refreshToken) - - mockMvc.postJson(requestPath) { - jsonContent = TokenDTO(refreshToken) - }.andExpect { - status { isForbidden() } - } - } - } - - @Nested - inner class RefreshRefreshToken : MockMvcTestBase() { - - private val requestPath = "/api/auth/refreshToken" - - @Test - fun `Given valid refresh token, should return new refresh token`() { - val refreshToken = jwtTokenService.issueRefreshToken(testUser) - - val response: TokenDTO = mockMvc.postJson(requestPath) { - jsonContent = TokenDTO(refreshToken) - }.andExpect { - status { isOk() } - }.andReturn().parse() - - response.token.shouldNotBeEmpty() - } - - @Test - fun `Given invalid refresh token, should return 403`() { - val refreshToken = jwtTokenService.issueRefreshToken(testUser) - jwtTokenService.invalidateRefreshToken(refreshToken) - - mockMvc.postJson(requestPath) { - jsonContent = TokenDTO(refreshToken) - }.andExpect { - status { isForbidden() } - } - } - } -} diff --git a/spring-app/src/test/kotlin/pl/starchasers/up/controller/ConfigurationControllerTest.kt b/spring-app/src/test/kotlin/pl/starchasers/up/controller/ConfigurationControllerTest.kt deleted file mode 100644 index d608ac2f..00000000 --- a/spring-app/src/test/kotlin/pl/starchasers/up/controller/ConfigurationControllerTest.kt +++ /dev/null @@ -1,58 +0,0 @@ -package pl.starchasers.up.controller - -import io.kotest.matchers.shouldBe -import org.junit.jupiter.api.Nested -import org.junit.jupiter.api.Test -import org.springframework.beans.factory.annotation.Autowired -import org.springframework.test.web.servlet.get -import pl.starchasers.up.* -import pl.starchasers.up.data.dto.configuration.UserConfigurationDTO -import pl.starchasers.up.data.model.ConfigurationKey -import pl.starchasers.up.data.value.Username -import pl.starchasers.up.service.UserService - -internal class ConfigurationControllerTest( - @Autowired private val userService: UserService -) : JpaTestBase() { - - @Nested - inner class GetConfiguration : MockMvcTestBase() { - - private val requestPath = "/api/configuration" - - @Test - fun `Given unauthorized request, should return anonymous configuration`() { - val response: UserConfigurationDTO = mockMvc.get(requestPath) - .andExpect { - status { isOk() } - }.andReturn().parse() - - with(response) { - maxTemporaryFileSize shouldBe ConfigurationKey.ANONYMOUS_MAX_FILE_SIZE.defaultValue.toLong() - maxFileLifetime shouldBe ConfigurationKey.ANONYMOUS_MAX_FILE_LIFETIME.defaultValue.toLong() - defaultFileLifetime shouldBe ConfigurationKey.ANONYMOUS_DEFAULT_FILE_LIFETIME.defaultValue.toLong() - permanentAllowed shouldBe false - maxPermanentFileSize shouldBe 0 - } - } - - @Test - fun `Given authorized request, should return user-specific details`() { - val user = requireNotNull(userService.findUser(Username("root"))) - - val response: UserConfigurationDTO = mockMvc.get(requestPath) { - authorizeAsUser(user) - }.andExpect { - status { isOk() } - }.andReturn().parse() - - with(response) { - maxTemporaryFileSize shouldBe ConfigurationKey.DEFAULT_USER_MAX_TEMPORARY_FILE_SIZE.defaultValue.toLong() - maxFileLifetime shouldBe ConfigurationKey.DEFAULT_USER_MAX_FILE_LIFETIME.defaultValue.toLong() - defaultFileLifetime shouldBe ConfigurationKey.DEFAULT_USER_DEFAULT_FILE_LIFETIME.defaultValue.toLong() - permanentAllowed shouldBe true - maxPermanentFileSize shouldBe ConfigurationKey.DEFAULT_USER_MAX_PERMANENT_FILE_SIZE.defaultValue.toLong() - } - } - } -} diff --git a/spring-app/src/test/kotlin/pl/starchasers/up/controller/UploadControllerTest.kt b/spring-app/src/test/kotlin/pl/starchasers/up/controller/UploadControllerTest.kt index 81f59f76..36b5f35c 100644 --- a/spring-app/src/test/kotlin/pl/starchasers/up/controller/UploadControllerTest.kt +++ b/spring-app/src/test/kotlin/pl/starchasers/up/controller/UploadControllerTest.kt @@ -15,17 +15,14 @@ import org.springframework.mock.web.MockMultipartFile import org.springframework.test.web.servlet.get import org.springframework.test.web.servlet.multipart import pl.starchasers.up.* -import pl.starchasers.up.data.dto.configuration.UpdateUserConfigurationDTO import pl.starchasers.up.data.dto.upload.FileDetailsDTO import pl.starchasers.up.data.dto.upload.UploadCompleteResponseDTO -import pl.starchasers.up.data.value.* +import pl.starchasers.up.data.model.ConfigurationKey import pl.starchasers.up.repository.FileEntryRepository import pl.starchasers.up.repository.UploadRepository -import pl.starchasers.up.security.Role import pl.starchasers.up.service.ConfigurationService import pl.starchasers.up.service.FileService -import pl.starchasers.up.service.UserService -import java.time.LocalDateTime +import java.time.Instant internal class UploadControllerTest : JpaTestBase() { @@ -33,7 +30,6 @@ internal class UploadControllerTest : JpaTestBase() { inner class AnonymousUpload( @Autowired private val fileEntryRepository: FileEntryRepository, @Autowired private val uploadRepository: UploadRepository, - @Autowired private val userService: UserService, @Autowired private val configurationService: ConfigurationService ) : MockMvcTestBase() { @@ -56,21 +52,21 @@ internal class UploadControllerTest : JpaTestBase() { status { isOk() } }.andReturn().parse() + assertEquals(1, fileEntryRepository.count()) val fileEntry = fileEntryRepository.findAll()[0] with(response) { - key shouldBe fileEntry.key.value - accessToken shouldBe fileEntry.accessToken.value + key shouldBe fileEntry.key + accessToken shouldBe fileEntry.accessToken toDelete.shouldNotBeNull() } with(fileEntry) { - contentType.value shouldBe "text/plain; charset=UTF-8" + contentType shouldBe "text/plain; charset=UTF-8" encrypted shouldBe false - filename.value shouldBe "exampleTextFile.txt" + filename shouldBe "exampleTextFile.txt" password.shouldBeNull() - permanent shouldBe false - toDeleteDate.shouldNotBeNull() - fileEntry.toDeleteDate!!.toLocalDateTime().isAfter(LocalDateTime.now()) shouldBe true + toDeleteAt.shouldNotBeNull() + fileEntry.toDeleteAt!!.isAfter(Instant.now()) shouldBe true } uploadRepository.find(fileEntry.key)?.let { fileContent -> @@ -103,19 +99,18 @@ internal class UploadControllerTest : JpaTestBase() { val fileEntry = fileEntryRepository.findAll()[0] with(response) { - key shouldBe fileEntry.key.value - accessToken shouldBe fileEntry.accessToken.value + key shouldBe fileEntry.key + accessToken shouldBe fileEntry.accessToken toDelete.shouldNotBeNull() } with(fileEntry) { - fileEntry.contentType.value shouldBe "application/octet-stream" + fileEntry.contentType shouldBe "application/octet-stream" encrypted shouldBe false - filename.value shouldBe "exampleTextFile.txt" + filename shouldBe "exampleTextFile.txt" password.shouldBeNull() - permanent shouldBe false - toDeleteDate.shouldNotBeNull() - toDeleteDate!!.toLocalDateTime().isAfter(LocalDateTime.now()) shouldBe true + toDeleteAt.shouldNotBeNull() + toDeleteAt!!.isAfter(Instant.now()) shouldBe true } uploadRepository.find(fileEntry.key)?.let { fileContent -> @@ -125,23 +120,17 @@ internal class UploadControllerTest : JpaTestBase() { @Test fun `Given too large file, should return 413`() { - val testUser = userService.createUser(Username("testUser"), RawPassword("password"), null, Role.USER) - configurationService.updateUserConfiguration( - testUser, - UpdateUserConfigurationDTO( - 10, - testUser.maxFileLifetime.value, - testUser.defaultFileLifetime.value, - testUser.maxPermanentFileSize.value - ) + configurationService.updateGlobalConfiguration( + mapOf(ConfigurationKey.ANONYMOUS_MAX_FILE_SIZE to "8") ) - mockMvc.multipart(requestPath) { - authorizeAsUser(testUser) file(getExampleTextFile()) }.andExpect { status { isPayloadTooLarge() } } + configurationService.updateGlobalConfiguration( + mapOf(ConfigurationKey.ANONYMOUS_MAX_FILE_SIZE to "10485760") + ) } } @@ -155,10 +144,9 @@ internal class UploadControllerTest : JpaTestBase() { private fun createFile(contentType: String, fileContent: String = content): String = fileService.createFile( fileContent.byteInputStream(), - Filename("fileName.txt"), - ContentType(contentType), - FileSize(fileContent.byteInputStream().readAllBytes().size.toLong()), - null + "fileName.txt", + contentType, + fileContent.byteInputStream().readAllBytes().size.toLong() ).key @Test @@ -248,8 +236,7 @@ internal class UploadControllerTest : JpaTestBase() { @TestInstance(TestInstance.Lifecycle.PER_CLASS) inner class VerifyFileAccess( @Autowired val fileService: FileService, - @Autowired val fileEntryRepository: FileEntryRepository, - @Autowired val userService: UserService + @Autowired val fileEntryRepository: FileEntryRepository ) : MockMvcTestBase() { private val requestPath = "/api/u/{key}/verify" private val content = "example content" @@ -261,13 +248,12 @@ internal class UploadControllerTest : JpaTestBase() { fun setup() { fileKey = fileService.createFile( content.byteInputStream(), - Filename("filename.txt"), - ContentType("text/plain"), - FileSize(content.byteInputStream().readAllBytes().size.toLong()), - userService.getUser(Username("root")) + "filename.txt", + "text/plain", + content.byteInputStream().readAllBytes().size.toLong() ).key - fileAccessToken = fileEntryRepository.findExistingFileByKey(FileKey(fileKey))?.accessToken?.value + fileAccessToken = fileEntryRepository.findExistingFileByKey(fileKey)?.accessToken ?: throw IllegalStateException() } @@ -282,15 +268,6 @@ internal class UploadControllerTest : JpaTestBase() { } } - @Test - fun `Given valid owner and no token, should return 200`() { - mockMvc.postJson(requestPath, fileKey) { - authorizeAsAdmin() - }.andExpect { - status { isOk() } - } - } - @Test fun `Given invalid owner and valid token, should return 200`() { mockMvc.postJson(requestPath, fileKey) { @@ -349,10 +326,9 @@ internal class UploadControllerTest : JpaTestBase() { fun setup() { fileKey = fileService.createFile( content.byteInputStream(), - Filename(filename), - ContentType(contentType), - FileSize(content.byteInputStream().readAllBytes().size.toLong()), - null + filename, + contentType, + content.byteInputStream().readAllBytes().size.toLong() ).key } @@ -386,8 +362,7 @@ internal class UploadControllerTest : JpaTestBase() { inner class DeleteFile( @Autowired val fileService: FileService, @Autowired val uploadRepository: UploadRepository, - @Autowired val fileEntryRepository: FileEntryRepository, - @Autowired val userService: UserService + @Autowired val fileEntryRepository: FileEntryRepository ) : MockMvcTestBase() { private val requestPath = "/api/u/{key}" @@ -396,10 +371,9 @@ internal class UploadControllerTest : JpaTestBase() { val fileContent = "fileContent" return fileService.createFile( fileContent.byteInputStream(), - Filename("file"), - ContentType("text/plain"), - FileSize(fileContent.length.toLong()), - userService.getUser(Username("root")) + "file", + "text/plain", + fileContent.length.toLong() ) } @@ -414,19 +388,8 @@ internal class UploadControllerTest : JpaTestBase() { status { isOk() } } - assertNull(uploadRepository.find(FileKey(response.key))) - assertNull(fileEntryRepository.findExistingFileByKey(FileKey(response.key))) - } - - @Test - fun `Given valid owner, should delete file`() { - val response = createTestFile() - - mockMvc.deleteJson(requestPath, response.key) { - authorizeAsAdmin() - }.andExpect { - status { isOk() } - } + assertNull(uploadRepository.find(response.key)) + assertNull(fileEntryRepository.findExistingFileByKey(response.key)) } @Test @@ -441,8 +404,8 @@ internal class UploadControllerTest : JpaTestBase() { status { isForbidden() } } - assertNotNull(uploadRepository.find(FileKey(response.key))) - assertNotNull(fileEntryRepository.findExistingFileByKey(FileKey(response.key))) + assertNotNull(uploadRepository.find(response.key)) + assertNotNull(fileEntryRepository.findExistingFileByKey(response.key)) } @Test @@ -457,8 +420,8 @@ internal class UploadControllerTest : JpaTestBase() { status { isNotFound() } } - assertNotNull(uploadRepository.find(FileKey(response.key))) - assertNotNull(fileEntryRepository.findExistingFileByKey(FileKey(response.key))) + assertNotNull(uploadRepository.find(response.key)) + assertNotNull(fileEntryRepository.findExistingFileByKey(response.key)) } } } diff --git a/spring-app/src/test/kotlin/pl/starchasers/up/controller/UserControllerTest.kt b/spring-app/src/test/kotlin/pl/starchasers/up/controller/UserControllerTest.kt deleted file mode 100644 index f1a5f3cf..00000000 --- a/spring-app/src/test/kotlin/pl/starchasers/up/controller/UserControllerTest.kt +++ /dev/null @@ -1,67 +0,0 @@ -package pl.starchasers.up.controller - -import io.kotest.matchers.shouldBe -import org.junit.jupiter.api.Nested -import org.junit.jupiter.api.Test -import org.junit.jupiter.api.TestInstance -import org.springframework.beans.factory.annotation.Autowired -import org.springframework.data.domain.Page -import org.springframework.test.annotation.DirtiesContext -import org.springframework.test.web.servlet.get -import org.springframework.transaction.annotation.Transactional -import pl.starchasers.up.* -import pl.starchasers.up.data.dto.upload.UploadHistoryEntryDTO -import pl.starchasers.up.data.value.* -import pl.starchasers.up.service.FileService -import pl.starchasers.up.service.UserService -import java.lang.IllegalStateException - -@TestInstance(TestInstance.Lifecycle.PER_CLASS) -@DirtiesContext(classMode = DirtiesContext.ClassMode.AFTER_CLASS) -class UserControllerTest : MockMvcTestBase() { - - @Transactional - @Nested - inner class ListUserUploadHistory( - @Autowired private val userService: UserService, - @Autowired private val fileService: FileService - ) : MockMvcTestBase() { - - private val requestPath = "/api/user/history" - - // TODO enable test after migration to postgres #212 - // @Test - fun `Given valid request, should return upload history`() { - val file = fileService.createFile( - "content".byteInputStream(), - Filename("file"), - ContentType("text/html"), - FileSize(7), - userService.getUser(Username("root")) - ) - val fileEntry = fileService.findFileEntry(FileKey(file.key)) ?: throw IllegalStateException() - - val response: Page = mockMvc.get(requestPath) { - authorizeAsAdmin() - }.andExpect { - status { isOk() } - }.andReturn().parse() - - with(response.content[0]) { - filename shouldBe fileEntry.filename.value - permanent shouldBe fileEntry.permanent - size shouldBe fileEntry.size.value - mimeType shouldBe fileEntry.contentType.value - key shouldBe fileEntry.key.value - } - } - - @Test - fun `Given unauthenticated request, should return 403`() { - mockMvc.get(requestPath) - .andExpect { - status { isForbidden() } - } - } - } -} diff --git a/spring-app/src/test/kotlin/pl/starchasers/up/controller/admin/ConfigurationAdminControllerTest.kt b/spring-app/src/test/kotlin/pl/starchasers/up/controller/admin/ConfigurationAdminControllerTest.kt deleted file mode 100644 index c3ccbdbe..00000000 --- a/spring-app/src/test/kotlin/pl/starchasers/up/controller/admin/ConfigurationAdminControllerTest.kt +++ /dev/null @@ -1,148 +0,0 @@ -package pl.starchasers.up.controller.admin - -import io.kotest.matchers.shouldBe -import org.junit.jupiter.api.BeforeEach -import org.junit.jupiter.api.Nested -import org.junit.jupiter.api.Test -import org.springframework.beans.factory.annotation.Autowired -import org.springframework.test.web.servlet.get -import pl.starchasers.up.* -import pl.starchasers.up.data.dto.configuration.ConfigurationDTO -import pl.starchasers.up.data.model.ConfigurationKey -import pl.starchasers.up.data.model.User -import pl.starchasers.up.data.value.RawPassword -import pl.starchasers.up.data.value.Username -import pl.starchasers.up.security.Role -import pl.starchasers.up.service.ConfigurationService -import pl.starchasers.up.service.UserService - -internal class ConfigurationAdminControllerTest( - @Autowired private val userService: UserService, - @Autowired private val configurationService: ConfigurationService -) : JpaTestBase() { - - private lateinit var testUser: User - - @BeforeEach - fun createTestUser() { - testUser = userService.createUser( - Username("unauthorizedUser"), - RawPassword("password"), - null, - Role.USER - ) - } - - @Nested - inner class UpdateConfiguration : MockMvcTestBase() { - - private val requestPath = "/api/admin/config" - - private val key1 = ConfigurationKey.DEFAULT_USER_MAX_PERMANENT_FILE_SIZE - private val value1 = "123456789" - private val key2 = ConfigurationKey.DEFAULT_USER_MAX_FILE_LIFETIME - private val value2 = "987654321" - - @Test - fun `Given valid request, should update all configuration values`() { - mockMvc.patchJson(requestPath) { - jsonContent = ConfigurationDTO( - mapOf(Pair(key1, value1), Pair(key2, value2)) - ) - authorizeAsAdmin() - }.andExpect { - status { isOk() } - } - - configurationService.getConfigurationOption(key1) shouldBe value1 - configurationService.getConfigurationOption(key2) shouldBe value2 - } - - @Test - fun `Given incorrect key, should return 400 and update nothing`() { - val incorrectKey = "incorrectKey" - - mockMvc.patchJson(requestPath) { - jsonContent = object { - val options = mapOf(Pair(key1.toString(), value1), Pair(incorrectKey, value2)) - } - authorizeAsAdmin() - }.andExpect { - status { isBadRequest() } - } - - configurationService.getConfigurationOption(key1) shouldBe key1.defaultValue - } - - @Test - fun `Given empty map, should update nothing`() { - mockMvc.patchJson(requestPath) { - jsonContent = ConfigurationDTO(mapOf()) - authorizeAsAdmin() - }.andExpect { - status { isOk() } - } - } - - @Test - fun `Given incorrect data type, should return 400 and update nothing`() { - val incorrectValue = "qwe" - mockMvc.patchJson(requestPath) { - jsonContent = ConfigurationDTO( - mapOf(Pair(key1, value1), Pair(key2, incorrectValue)) - ) - authorizeAsAdmin() - }.andExpect { - status { isBadRequest() } - } - - configurationService.getConfigurationOption(key1) shouldBe key1.defaultValue - configurationService.getConfigurationOption(key2) shouldBe key2.defaultValue - } - - @Test - fun `Given unauthorized request, should return 403`() { - mockMvc.patchJson(requestPath) { - jsonContent = ConfigurationDTO( - mapOf(Pair(key1, value1), Pair(key2, value2)) - ) - }.andExpect { - status { isForbidden() } - } - } - } - - @Nested - inner class GetAppConfiguration : MockMvcTestBase() { - - private val requestPath = "/api/admin/config" - - @Test - fun `Given valid request, should return entire global configuration`() { - val response: ConfigurationDTO = mockMvc.get(requestPath) { - authorizeAsAdmin() - }.andExpect { - status { isOk() } - }.andReturn().parse() - - with(response) { - options[ConfigurationKey.ANONYMOUS_MAX_FILE_SIZE] shouldBe ConfigurationKey.ANONYMOUS_MAX_FILE_SIZE.defaultValue - options[ConfigurationKey.ANONYMOUS_DEFAULT_FILE_LIFETIME] shouldBe ConfigurationKey.ANONYMOUS_DEFAULT_FILE_LIFETIME.defaultValue - options[ConfigurationKey.ANONYMOUS_MAX_FILE_LIFETIME] shouldBe ConfigurationKey.ANONYMOUS_MAX_FILE_LIFETIME.defaultValue - options[ConfigurationKey.DEFAULT_USER_MAX_TEMPORARY_FILE_SIZE] shouldBe ConfigurationKey.DEFAULT_USER_MAX_TEMPORARY_FILE_SIZE.defaultValue - options[ConfigurationKey.DEFAULT_USER_MAX_PERMANENT_FILE_SIZE] shouldBe ConfigurationKey.DEFAULT_USER_MAX_PERMANENT_FILE_SIZE.defaultValue - options[ConfigurationKey.DEFAULT_USER_DEFAULT_FILE_LIFETIME] shouldBe ConfigurationKey.DEFAULT_USER_DEFAULT_FILE_LIFETIME.defaultValue - options[ConfigurationKey.DEFAULT_USER_MAX_FILE_LIFETIME] shouldBe ConfigurationKey.DEFAULT_USER_MAX_FILE_LIFETIME.defaultValue - } - } - - @Test - fun `Given unauthorized request, should return 403`() { - mockMvc.get(requestPath) { - authorizeAsUser(testUser) - }.andExpect { - status { isForbidden() } - } - } - } -} diff --git a/spring-app/src/test/kotlin/pl/starchasers/up/controller/admin/UserAdminControllerTest.kt b/spring-app/src/test/kotlin/pl/starchasers/up/controller/admin/UserAdminControllerTest.kt deleted file mode 100644 index 853bd76e..00000000 --- a/spring-app/src/test/kotlin/pl/starchasers/up/controller/admin/UserAdminControllerTest.kt +++ /dev/null @@ -1,348 +0,0 @@ -package pl.starchasers.up.controller.admin - -import io.kotest.matchers.shouldBe -import org.junit.jupiter.api.Assertions.* -import org.junit.jupiter.api.BeforeEach -import org.junit.jupiter.api.Nested -import org.junit.jupiter.api.Test -import org.junit.jupiter.api.TestInstance -import org.springframework.beans.factory.annotation.Autowired -import org.springframework.security.crypto.password.Pbkdf2PasswordEncoder -import org.springframework.test.web.servlet.delete -import org.springframework.test.web.servlet.get -import pl.starchasers.up.* -import pl.starchasers.up.data.dto.users.CreateUserDTO -import pl.starchasers.up.data.dto.users.UpdateUserDTO -import pl.starchasers.up.data.dto.users.UserDTO -import pl.starchasers.up.data.model.ConfigurationKey -import pl.starchasers.up.data.model.User -import pl.starchasers.up.data.value.Email -import pl.starchasers.up.data.value.RawPassword -import pl.starchasers.up.data.value.Username -import pl.starchasers.up.data.value.toUsername -import pl.starchasers.up.security.Role -import pl.starchasers.up.service.UserService -import pl.starchasers.up.testdata.UserTestData - -internal class UserAdminControllerTest : JpaTestBase() { - - @TestInstance(TestInstance.Lifecycle.PER_CLASS) - @Nested - inner class UsersGetOne : MockMvcTestBase() { - @Autowired - private lateinit var userService: UserService - private lateinit var adminUser: User - private lateinit var user: User - - @BeforeEach - fun createUsers() { - adminUser = userService.createUser( - Username("username"), - RawPassword("password"), - Email("email@gmail.com"), - Role.ADMIN - ) - user = userService.createUser( - Username("username2"), - RawPassword("password2"), - Email("email2@gmail.com"), - Role.USER - ) - } - - private val requestPath = "/api/admin/users/{id}" - - @Test - fun `Given valid request, should return user details`() { - val result: UserDTO = mockMvc.get(requestPath, adminUser.id) { - authorizeAsAdmin() - }.andExpect { - status { isOk() } - }.andReturn().parse() - - with(result) { - id shouldBe adminUser.id - username shouldBe adminUser.username.value - email shouldBe adminUser.email?.value - role shouldBe adminUser.role - maxTemporaryFileSize shouldBe adminUser.maxTemporaryFileSize.value - maxPermanentFileSize shouldBe adminUser.maxPermanentFileSize.value - defaultFileLifetime shouldBe adminUser.defaultFileLifetime.value - maxFileLifetime shouldBe adminUser.maxFileLifetime.value - } - } - - @Test - fun `Given unauthorized user, should throw 403`() { - mockMvc.get(requestPath, adminUser.id) { - authorizeAsUser(user) - }.andExpect { - status { isForbidden() } - } - } - - @Test - fun `Given invalid id, should throw 404`() { - mockMvc.get(requestPath, adminUser.id + 123) { - authorizeAsAdmin() - }.andExpect { - status { isNotFound() } - } - } - } - - @TestInstance(TestInstance.Lifecycle.PER_CLASS) - @Nested - inner class UsersList : MockMvcTestBase() { - @Autowired - private lateinit var userService: UserService - private lateinit var adminUser: User - private lateinit var user: User - - @BeforeEach - fun createUsers() { - adminUser = userService.createUser( - Username("username3"), - RawPassword("password"), - Email("email@gmail.com"), - Role.ADMIN - ) - user = userService.createUser( - Username("username4"), - RawPassword("password2"), - Email("email2@gmail.com"), - Role.USER - ) - } - - private val requestPath = "/api/admin/users" - - @Test - fun `Given valid request, should return page`() { - mockMvc.get(requestPath) { - authorizeAsAdmin() - }.andExpect { - status { isOk() } - } - } - - @Test - fun `Given unauthorized user, should throw 403`() { - mockMvc.get(requestPath) { - authorizeAsUser(user) - }.andExpect { - status { isForbidden() } - } - } - } - - @Nested - inner class UsersCreate : MockMvcTestBase() { - - private val requestPath = "/api/admin/users" - - @Autowired - private lateinit var userService: UserService - - @Autowired - private lateinit var userTestData: UserTestData - - @Test - fun `Given valid request, should create user`() { - val newUserUsername = "createdUser" - - val response: UserDTO = mockMvc.postJson(requestPath) { - jsonContent = CreateUserDTO(newUserUsername, "password", "mail@example.com", Role.USER) - authorizeAsAdmin() - }.andExpect { - status { isOk() } - }.andReturn().parse() - - with(userService.getUser(newUserUsername.toUsername())) { - response.id shouldBe id - response.username shouldBe username.value - response.email shouldBe email?.value - response.role shouldBe role - } - } - - @Test - fun `Given unauthorized user, should throw 403`() { - mockMvc.postJson(requestPath) { - jsonContent = CreateUserDTO("createdUser", "password", "mail@example.com", Role.USER) - }.andExpect { - status { isForbidden() } - } - } - - @Test - fun `Given duplicate username, should throw 400`() { - userService.createUser( - Username("duplicateUser"), - RawPassword("password"), - Email("mail@example.com"), - Role.USER - ) - mockMvc.postJson(requestPath) { - jsonContent = CreateUserDTO("duplicateUser", "password", "mail2@example.com", Role.ADMIN) - authorizeAsAdmin() - }.andExpect { - status { isBadRequest() } - } - } - } - - @Nested - inner class UsersUpdate : MockMvcTestBase() { - - private val requestPath = "/api/admin/users/{id}" - - @Autowired - private lateinit var userService: UserService - - @Autowired - private lateinit var userTestData: UserTestData - - @Autowired - private lateinit var passwordEncoder: Pbkdf2PasswordEncoder - - @Test - fun `Given valid request, should update user`() { - val oldUser = userTestData.createTestUser() - val updateUserDTO = getUpdateUserDTO() - - mockMvc.patchJson(requestPath, oldUser.id) { - jsonContent = updateUserDTO - authorizeAsAdmin() - }.andExpect { - status { isOk() } - } - - with(userService.getUser(oldUser.id)) { - email?.value shouldBe updateUserDTO.email - username.value shouldBe updateUserDTO.username - role shouldBe Role.ADMIN - passwordEncoder.matches(updateUserDTO.password, password.value) shouldBe true - } - } - - @Test - fun `Given unauthorized user, should throw 403`() { - val oldUser = userTestData.createTestUser() - - mockMvc.patchJson(requestPath, oldUser.id) { - jsonContent = getUpdateUserDTO() - authorizeAsUser(oldUser) - }.andExpect { - status { isForbidden() } - } - } - - @Test - fun `Given no password field, should not update password`() { - val oldUser = userTestData.createTestUser() - mockMvc.patchJson(requestPath, oldUser.id) { - jsonContent = getUpdateUserDTO(password = null) - authorizeAsAdmin() - }.andExpect { - status { isOk() } - } - - assertTrue(passwordEncoder.matches("password", userService.getUser(oldUser.id).password.value)) - } - - @Test - fun `Given wrong userId, should return 400`() { - val oldUser = userTestData.createTestUser() - - mockMvc.patchJson(requestPath, oldUser.id + 123) { - jsonContent = getUpdateUserDTO() - authorizeAsAdmin() - }.andExpect { - status { isBadRequest() } - } - } - - private fun getUpdateUserDTO(password: String? = "password2"): UpdateUserDTO = UpdateUserDTO( - username = "newExampleUser", - email = "mail2@example.com", - password = password, - role = Role.ADMIN, - maxTemporaryFileSize = ConfigurationKey.DEFAULT_USER_MAX_TEMPORARY_FILE_SIZE.defaultValue.toLong(), - maxPermanentFileSize = ConfigurationKey.DEFAULT_USER_MAX_PERMANENT_FILE_SIZE.defaultValue.toLong(), - defaultFileLifetime = ConfigurationKey.DEFAULT_USER_DEFAULT_FILE_LIFETIME.defaultValue.toLong(), - maxFileLifetime = ConfigurationKey.DEFAULT_USER_MAX_FILE_LIFETIME.defaultValue.toLong() - ) - } - - @Nested - inner class UsersDelete : MockMvcTestBase() { - - @Autowired - private lateinit var userService: UserService - - @Autowired - private lateinit var userTestData: UserTestData - - private val requestPath = "/api/admin/users/{id}" - - @Test - fun `Given valid request, should delete user`() { - val user = userTestData.createTestUser() - - mockMvc.delete(requestPath, user.id) { - authorizeAsAdmin() - }.andExpect { - status { isOk() } - } - - assertNull(userService.findUser(user.id)) - } - - @Test - fun `Given unauthorized user, should throw 403`() { - val user = userTestData.createTestUser() - - mockMvc.delete(requestPath, user.id) { - authorizeAsUser(user) - }.andExpect { - status { isForbidden() } - } - - assertNotNull(userService.findUser(user.id)) - } - - @Test - fun `Given wrong userId, should return 400`() { - val user = userTestData.createTestUser() - - mockMvc.delete(requestPath, user.id + 123) { - authorizeAsAdmin() - }.andExpect { - status { isBadRequest() } - } - } - - @Test - fun `Given root account, should return 403`() { - val user = userTestData.createTestUser(role = Role.ADMIN) - - mockMvc.delete(requestPath, userService.getUser(Username("root")).id) { - authorizeAsUser(user) - }.andExpect { - status { isForbidden() } - } - } - - @Test - fun `Given current account, should return 400`() { - val user = userTestData.createTestUser(role = Role.ADMIN) - - mockMvc.delete(requestPath, user.id) { - authorizeAsUser(user) - }.andExpect { - status { isBadRequest() } - } - } - } -} diff --git a/spring-app/src/test/kotlin/pl/starchasers/up/data/value/UsernameTest.kt b/spring-app/src/test/kotlin/pl/starchasers/up/data/value/UsernameTest.kt deleted file mode 100644 index 65a41b8b..00000000 --- a/spring-app/src/test/kotlin/pl/starchasers/up/data/value/UsernameTest.kt +++ /dev/null @@ -1,30 +0,0 @@ -package pl.starchasers.up.data.value - -import org.junit.jupiter.api.Assertions.assertEquals -import org.junit.jupiter.api.Test -import org.junit.jupiter.api.assertThrows -import pl.starchasers.up.exception.ValidationException - -internal class UsernameTest { - - @Test - fun `should allow valid usernames`() { - val username = Username("exampleUsername123") - assertEquals("exampleUsername123", username.value) - } - - @Test - fun `given blank username, should throw ValidationException`() { - assertThrows { Username("") } - } - - @Test - fun `given username with whitespace, should throw ValidationException`() { - assertThrows { Username("qwe asd") } - } - - @Test - fun `given too long username, should throw ValidationException`() { - assertThrows { Username("a".repeat(33)) } - } -} diff --git a/spring-app/src/test/kotlin/pl/starchasers/up/testdata/UserTestData.kt b/spring-app/src/test/kotlin/pl/starchasers/up/testdata/UserTestData.kt deleted file mode 100644 index c46ef7b2..00000000 --- a/spring-app/src/test/kotlin/pl/starchasers/up/testdata/UserTestData.kt +++ /dev/null @@ -1,28 +0,0 @@ -package pl.starchasers.up.testdata - -import org.springframework.stereotype.Service -import pl.starchasers.up.data.model.User -import pl.starchasers.up.data.value.Email -import pl.starchasers.up.data.value.RawPassword -import pl.starchasers.up.data.value.toUsername -import pl.starchasers.up.security.Role -import pl.starchasers.up.service.UserService - -@Service -class UserTestData( - private val userService: UserService -) { - - companion object { - const val DEFAULT_USERNAME = "exampleUser" - const val DEFAULT_PASSWORD = "password" - } - - fun createTestUser(role: Role = Role.USER): User = - userService.createUser( - DEFAULT_USERNAME.toUsername(), - RawPassword(DEFAULT_PASSWORD), - Email("email@example.com"), - role - ) -} From 8f638cb10e5660e70bf2e8e53c20228b30cd5292 Mon Sep 17 00:00:00 2001 From: KocproZ Date: Mon, 10 Feb 2025 18:47:13 +0100 Subject: [PATCH 03/12] Cors --- .../up/configuration/WebSecurityConfiguration.kt | 9 ++------- spring-app/src/main/resources/application-h2.yaml | 11 ----------- spring-app/src/main/resources/application-junit.yaml | 3 --- 3 files changed, 2 insertions(+), 21 deletions(-) delete mode 100644 spring-app/src/main/resources/application-h2.yaml delete mode 100644 spring-app/src/main/resources/application-junit.yaml diff --git a/spring-app/src/main/kotlin/pl/starchasers/up/configuration/WebSecurityConfiguration.kt b/spring-app/src/main/kotlin/pl/starchasers/up/configuration/WebSecurityConfiguration.kt index d71c554b..72784ce1 100644 --- a/spring-app/src/main/kotlin/pl/starchasers/up/configuration/WebSecurityConfiguration.kt +++ b/spring-app/src/main/kotlin/pl/starchasers/up/configuration/WebSecurityConfiguration.kt @@ -25,12 +25,7 @@ class WebSecurityConfiguration() { fun filterChain(http: HttpSecurity): SecurityFilterChain = http .csrf { it.disable() } .sessionManagement { it.sessionCreationPolicy(SessionCreationPolicy.STATELESS) } - .also { - if (devCors) { - logger.info("Development environment set. Enabling CORS for all origins.") - it.cors {} - } - } + .cors {} .build() @Bean @@ -38,7 +33,7 @@ class WebSecurityConfiguration() { val configuration = CorsConfiguration() configuration.allowedOrigins = listOf("*") configuration.allowedMethods = listOf("GET", "POST", "PUT", "DELETE", "PATCH") -// configuration.allowCredentials = true + configuration.allowCredentials = false configuration.applyPermitDefaultValues() val source = UrlBasedCorsConfigurationSource() source.registerCorsConfiguration("/**", configuration) diff --git a/spring-app/src/main/resources/application-h2.yaml b/spring-app/src/main/resources/application-h2.yaml deleted file mode 100644 index fb28dd60..00000000 --- a/spring-app/src/main/resources/application-h2.yaml +++ /dev/null @@ -1,11 +0,0 @@ -spring: - datasource: - url: jdbc:h2:mem:db;DB_CLOSE_DELAY=-1 - username: sa - password: sa - driver-class-name: org.h2.Driver - flyway: - enabled: false - jpa: - hibernate: - ddl-auto: create diff --git a/spring-app/src/main/resources/application-junit.yaml b/spring-app/src/main/resources/application-junit.yaml deleted file mode 100644 index 270c82c2..00000000 --- a/spring-app/src/main/resources/application-junit.yaml +++ /dev/null @@ -1,3 +0,0 @@ -up: - jwt: - base64-secret: "YTNrWl5idUwqNSFSb2FDZ2lkTmJzdFFMckB4TUdERmU=" From af62407c66a14a58c985bcb0c91ddc9e2ffd3544 Mon Sep 17 00:00:00 2001 From: "Jakub \"Kuboczoch\" Pokorski" Date: Mon, 10 Feb 2025 18:49:00 +0100 Subject: [PATCH 04/12] docs: update README.md with setup steps --- README.md | 45 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 45 insertions(+) diff --git a/README.md b/README.md index eed5a93e..4a3b20fe 100644 --- a/README.md +++ b/README.md @@ -1 +1,46 @@ # up + +## How to run the project locally + +> [!NOTE] +> Following setup is for Intellij IDEA Ultimate. + +### Setup PostgreSQL + +1. You can do it in multiple ways, including creating a `docker-compose.yaml`, + that you can modify to your needs. Here is an example: +```yaml +services: + db: + image: postgres:17.2 + container_name: postgres-container + restart: always + environment: + - POSTGRES_USER=postgres + - POSTGRES_PASSWORD=postgres + ports: + - '5432:5432' + volumes: + - ./db:/var/lib/postgresql/data +``` + +### Creating Spring Boot IDE run configuration + +1. Go to `Edit Configurations` located in the top right corner of the IDE +2. Click on the `+` sign and select `Spring Boot` +3. Name the configuration `up` +4. Set the java to at least `17`, but we recommend using the latest version +5. Set the classpath to `up.spring-app.main` +6. Set the class to `pl.starchasers.up.UpApplication` + +### Creating env files + +1. We recommend downloading [this IDE plugin](https://plugins.jetbrains.com/plugin/7861-envfile), + if you prefer other options, you can replicate it in your own way. +2. Create `local.env` file in the root of the project +``` +UP_JDBC_STRING=jdbc:postgresql://localhost:5555/postgres?currentSchema=up&encoding=UTF-8 +UP_DB_USER=postgres +UP_DB_PASS=postgres +``` +3. Link the `local.env` file to your Spring-Boot run configuration. From 837cfc7d47217de7667c382529c69f95f21e0f13 Mon Sep 17 00:00:00 2001 From: "Jakub \"Kuboczoch\" Pokorski" Date: Mon, 10 Feb 2025 18:55:28 +0100 Subject: [PATCH 05/12] Revert "docs: update README.md with setup steps" This reverts commit af62407c66a14a58c985bcb0c91ddc9e2ffd3544. --- README.md | 45 --------------------------------------------- 1 file changed, 45 deletions(-) diff --git a/README.md b/README.md index 4a3b20fe..eed5a93e 100644 --- a/README.md +++ b/README.md @@ -1,46 +1 @@ # up - -## How to run the project locally - -> [!NOTE] -> Following setup is for Intellij IDEA Ultimate. - -### Setup PostgreSQL - -1. You can do it in multiple ways, including creating a `docker-compose.yaml`, - that you can modify to your needs. Here is an example: -```yaml -services: - db: - image: postgres:17.2 - container_name: postgres-container - restart: always - environment: - - POSTGRES_USER=postgres - - POSTGRES_PASSWORD=postgres - ports: - - '5432:5432' - volumes: - - ./db:/var/lib/postgresql/data -``` - -### Creating Spring Boot IDE run configuration - -1. Go to `Edit Configurations` located in the top right corner of the IDE -2. Click on the `+` sign and select `Spring Boot` -3. Name the configuration `up` -4. Set the java to at least `17`, but we recommend using the latest version -5. Set the classpath to `up.spring-app.main` -6. Set the class to `pl.starchasers.up.UpApplication` - -### Creating env files - -1. We recommend downloading [this IDE plugin](https://plugins.jetbrains.com/plugin/7861-envfile), - if you prefer other options, you can replicate it in your own way. -2. Create `local.env` file in the root of the project -``` -UP_JDBC_STRING=jdbc:postgresql://localhost:5555/postgres?currentSchema=up&encoding=UTF-8 -UP_DB_USER=postgres -UP_DB_PASS=postgres -``` -3. Link the `local.env` file to your Spring-Boot run configuration. From 7308a34e7ee36c165ebc35deb96bd2312c5a8ece Mon Sep 17 00:00:00 2001 From: KocproZ Date: Mon, 10 Feb 2025 18:58:57 +0100 Subject: [PATCH 06/12] JDBC url --- spring-app/src/main/resources/application.yaml | 2 +- spring-app/src/test/resources/application.yaml | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/spring-app/src/main/resources/application.yaml b/spring-app/src/main/resources/application.yaml index a8d9f304..906a2a49 100644 --- a/spring-app/src/main/resources/application.yaml +++ b/spring-app/src/main/resources/application.yaml @@ -3,7 +3,7 @@ spring: hibernate: ddl-auto: validate datasource: - url: ${UP_JDBC_STRING} + url: jdbc:postgresql://${UP_DB_HOST:localhost}:${UP_DB_PORT:5432}/${UP_DB_NAME}?currentSchema=${UP_DB_SCHEMA}&encoding=UTF-8 username: ${UP_DB_USER} password: ${UP_DB_PASS} driver-class-name: org.postgresql.Driver diff --git a/spring-app/src/test/resources/application.yaml b/spring-app/src/test/resources/application.yaml index 6b57a4bf..3df855f5 100644 --- a/spring-app/src/test/resources/application.yaml +++ b/spring-app/src/test/resources/application.yaml @@ -10,7 +10,6 @@ up: datastore: ${DATASTORE_PATH:uploads} max-file-size: 100 cleanup-interval: ${UP_CLEANUP_INTERVAL:3600000} - jwt-secret: verySecret domain: ${UP_DOMAIN:http://localhost:8080} chunk-size: 4194304 dev: From 5ebe01ce6f198422b18cd7421f71f9417f0814ca Mon Sep 17 00:00:00 2001 From: "Jakub \"Kuboczoch\" Pokorski" Date: Mon, 10 Feb 2025 20:51:24 +0100 Subject: [PATCH 07/12] init next 15.1.6 --- next-app/.babelrc | 7 - next-app/.editorconfig | 21 - next-app/.eslintrc.json | 29 - next-app/.gitignore | 22 +- next-app/.nvmrc | Bin 9 -> 22 bytes next-app/.prettierrc.js | 9 - next-app/@types/api-client/common.ts | 4 - next-app/@types/api-client/deleteFile.ts | 12 - .../@types/api-client/getConfiguration.ts | 9 - next-app/@types/api-client/uploadFile.ts | 12 - next-app/@types/axios.ts | 10 - next-app/@types/box.ts | 5 - next-app/@types/custom.d.ts | 19 - next-app/@types/emotion.d.ts | 7 - next-app/@types/react-dropzone.ts | 7 - next-app/README.md | 2 - next-app/eslint.config.mjs | 16 + next-app/next-env.d.ts | 5 - next-app/next.config.js | 7 - next-app/next.config.ts | 7 + next-app/package-lock.json | 5178 ++++++++++++++++ next-app/package.json | 63 +- next-app/postcss.config.mjs | 8 + next-app/public/favicon.ico | Bin 34203 -> 0 bytes next-app/public/file.svg | 1 + next-app/public/globe.svg | 1 + next-app/public/icons/icon-144x144.png | Bin 13611 -> 0 bytes next-app/public/icons/icon-192x192.png | Bin 20524 -> 0 bytes next-app/public/icons/icon-256x256.png | Bin 28696 -> 0 bytes next-app/public/icons/icon-384x384.png | Bin 53224 -> 0 bytes next-app/public/icons/icon-48x48.png | Bin 3518 -> 0 bytes next-app/public/icons/icon-512x512.png | Bin 18121 -> 0 bytes next-app/public/icons/icon-72x72.png | Bin 5749 -> 0 bytes next-app/public/icons/icon-96x96.png | Bin 8255 -> 0 bytes next-app/public/images/mainImage.jpg | Bin 40524 -> 0 bytes next-app/public/manifest.json | 25 - next-app/public/next.svg | 1 + next-app/public/robots.txt | 3 - next-app/public/vercel.svg | 1 + next-app/public/window.svg | 1 + next-app/src/api-client/const.ts | 7 - next-app/src/api-client/delete-file.ts | 16 - next-app/src/api-client/get-configuration.ts | 15 - next-app/src/api-client/index.ts | 11 - next-app/src/api-client/upload-file.ts | 17 - next-app/src/app/favicon.ico | Bin 0 -> 25931 bytes next-app/src/app/globals.css | 21 + next-app/src/app/layout.tsx | 34 + next-app/src/app/page.tsx | 101 + .../styleHelpers/centerBothSidesHelper.ts | 9 - .../styleHelpers/childrenWithDotsHelper.ts | 22 - .../hoverExpandableElementHelper.ts | 22 - next-app/src/assets/styleHelpers/index.ts | 11 - next-app/src/assets/theme/breakpoints.ts | 9 - next-app/src/assets/theme/colors.ts | 227 - next-app/src/assets/theme/constants.ts | 11 - next-app/src/assets/theme/gradients.ts | 3 - next-app/src/assets/theme/index.ts | 28 - next-app/src/assets/theme/shadows.ts | 6 - next-app/src/assets/theme/transitions.ts | 7 - .../components/blocks/Box/BackgroundBox.ts | 19 - next-app/src/components/blocks/Box/Content.ts | 19 - next-app/src/components/blocks/Box/Image.ts | 19 - .../components/blocks/Box/TransparentBar.ts | 13 - next-app/src/components/blocks/Box/index.ts | 42 - .../blocks/Boxes/DefaultUploadBox/index.ts | 19 - .../blocks/Boxes/FileUploadedBox/index.ts | 25 - .../src/components/blocks/HomePage/index.ts | 15 - .../src/components/blocks/Page/Content.ts | 11 - next-app/src/components/blocks/Page/index.ts | 31 - .../src/components/elements/AlignedDiv.ts | 17 - .../components/elements/Button/ButtonText.ts | 18 - .../elements/Button/IconContainer.ts | 21 - .../elements/Button/LoaderContainer.ts | 19 - .../elements/Button/StyledButton.ts | 19 - .../components/elements/Button/StyledLink.ts | 7 - .../src/components/elements/Button/index.tsx | 87 - .../Button/variants/_colorVariants.ts | 53 - .../elements/Button/variants/index.ts | 33 - .../variants/primary/PrimaryButtonText.ts | 11 - .../variants/primary/PrimaryStyledButton.ts | 41 - .../transparent/TransparentButtonText.ts | 12 - .../transparent/TransparentStyledButton.ts | 43 - .../uploadDashed/UploadDashedButton.ts | 24 - .../uploadDashed/UploadDashedButtonText.ts | 14 - .../components/elements/ButtonContainer.ts | 12 - next-app/src/components/elements/Circle.ts | 16 - .../elements/CircularProgressBar.ts | 32 - next-app/src/components/elements/Container.ts | 25 - .../components/elements/DesktopContainer.ts | 15 - .../elements/DragContainer/BorderContainer.ts | 15 - .../components/elements/DragContainer/Box.ts | 13 - .../elements/DragContainer/index.tsx | 43 - .../components/elements/ExpandableBalloon.tsx | 40 - .../components/elements/ExpandableElement.ts | 11 - next-app/src/components/elements/Icon.ts | 10 - .../Layout/GlobalStyle/animationsStyle.ts | 61 - .../elements/Layout/GlobalStyle/index.tsx | 21 - .../elements/Layout/GlobalStyle/resetStyle.ts | 141 - .../components/elements/Layout/Providers.tsx | 17 - .../src/components/elements/Layout/index.tsx | 51 - .../components/elements/LineWithText/Line.ts | 9 - .../LineWithText/LineWithTextContainer.ts | 12 - .../elements/LineWithText/index.tsx | 25 - .../components/elements/LinkCopyButton.tsx | 214 - next-app/src/components/elements/Loader.tsx | 42 - .../elements/Menu/ConfigurationMenu.tsx | 77 - .../components/elements/MobileContainer.ts | 15 - .../src/components/elements/QRCodeElement.tsx | 47 - .../src/components/elements/SideBoxButton.tsx | 42 - .../components/elements/TimerCountdown.tsx | 62 - next-app/src/components/elements/Tooltip.ts | 40 - .../elements/Typography/TypographyH5.ts | 7 - .../elements/Typography/TypographyP.ts | 9 - .../components/elements/Typography/index.ts | 4 - .../src/containers/HomePage/HomePageView.tsx | 75 - .../src/containers/HomePage/footerLinks.ts | 5 - next-app/src/containers/HomePage/index.tsx | 13 - .../src/containers/HomePage/useHomePage.ts | 22 - .../DefaultUploadBox/DefaultUploadBoxView.tsx | 68 - .../UploadBoxes/DefaultUploadBox/index.tsx | 10 - .../DefaultUploadBox/useDefaultUploadBox.ts | 16 - .../FileUploadedBox/FileUploadedBoxView.tsx | 125 - .../UploadBoxes/FileUploadedBox/index.tsx | 10 - .../FileUploadedBox/useFileUploadedBox.ts | 61 - .../UploadingBox/UploadingBoxView.tsx | 24 - .../UploadBoxes/UploadingBox/index.tsx | 10 - .../UploadingBox/useUploadingBox.ts | 16 - next-app/src/containers/UploadBoxes/index.tsx | 19 - next-app/src/hooks/useTooltip.tsx | 27 - next-app/src/pages/_app.tsx | 31 - next-app/src/pages/_document.tsx | 26 - next-app/src/pages/index.tsx | 14 - next-app/src/providers/FileUploadProvider.tsx | 153 - .../providers/UploadBoxContentProvider.tsx | 24 - next-app/src/utils/handleErrorMessage.tsx | 21 - next-app/src/utils/hexToRGB.ts | 21 - next-app/tailwind.config.ts | 18 + next-app/tsconfig.json | 35 +- next-app/tslint.json | 12 - next-app/yarn.lock | 5388 ----------------- 141 files changed, 5430 insertions(+), 8643 deletions(-) delete mode 100644 next-app/.babelrc delete mode 100644 next-app/.editorconfig delete mode 100644 next-app/.eslintrc.json delete mode 100644 next-app/.prettierrc.js delete mode 100644 next-app/@types/api-client/common.ts delete mode 100644 next-app/@types/api-client/deleteFile.ts delete mode 100644 next-app/@types/api-client/getConfiguration.ts delete mode 100644 next-app/@types/api-client/uploadFile.ts delete mode 100644 next-app/@types/axios.ts delete mode 100644 next-app/@types/box.ts delete mode 100644 next-app/@types/custom.d.ts delete mode 100644 next-app/@types/emotion.d.ts delete mode 100644 next-app/@types/react-dropzone.ts create mode 100644 next-app/eslint.config.mjs delete mode 100644 next-app/next-env.d.ts delete mode 100644 next-app/next.config.js create mode 100644 next-app/next.config.ts create mode 100644 next-app/package-lock.json create mode 100644 next-app/postcss.config.mjs delete mode 100644 next-app/public/favicon.ico create mode 100644 next-app/public/file.svg create mode 100644 next-app/public/globe.svg delete mode 100644 next-app/public/icons/icon-144x144.png delete mode 100644 next-app/public/icons/icon-192x192.png delete mode 100644 next-app/public/icons/icon-256x256.png delete mode 100644 next-app/public/icons/icon-384x384.png delete mode 100644 next-app/public/icons/icon-48x48.png delete mode 100644 next-app/public/icons/icon-512x512.png delete mode 100644 next-app/public/icons/icon-72x72.png delete mode 100644 next-app/public/icons/icon-96x96.png delete mode 100644 next-app/public/images/mainImage.jpg delete mode 100644 next-app/public/manifest.json create mode 100644 next-app/public/next.svg delete mode 100644 next-app/public/robots.txt create mode 100644 next-app/public/vercel.svg create mode 100644 next-app/public/window.svg delete mode 100644 next-app/src/api-client/const.ts delete mode 100644 next-app/src/api-client/delete-file.ts delete mode 100644 next-app/src/api-client/get-configuration.ts delete mode 100644 next-app/src/api-client/index.ts delete mode 100644 next-app/src/api-client/upload-file.ts create mode 100644 next-app/src/app/favicon.ico create mode 100644 next-app/src/app/globals.css create mode 100644 next-app/src/app/layout.tsx create mode 100644 next-app/src/app/page.tsx delete mode 100644 next-app/src/assets/styleHelpers/centerBothSidesHelper.ts delete mode 100644 next-app/src/assets/styleHelpers/childrenWithDotsHelper.ts delete mode 100644 next-app/src/assets/styleHelpers/hoverExpandableElementHelper.ts delete mode 100644 next-app/src/assets/styleHelpers/index.ts delete mode 100644 next-app/src/assets/theme/breakpoints.ts delete mode 100644 next-app/src/assets/theme/colors.ts delete mode 100644 next-app/src/assets/theme/constants.ts delete mode 100644 next-app/src/assets/theme/gradients.ts delete mode 100644 next-app/src/assets/theme/index.ts delete mode 100644 next-app/src/assets/theme/shadows.ts delete mode 100644 next-app/src/assets/theme/transitions.ts delete mode 100644 next-app/src/components/blocks/Box/BackgroundBox.ts delete mode 100644 next-app/src/components/blocks/Box/Content.ts delete mode 100644 next-app/src/components/blocks/Box/Image.ts delete mode 100644 next-app/src/components/blocks/Box/TransparentBar.ts delete mode 100644 next-app/src/components/blocks/Box/index.ts delete mode 100644 next-app/src/components/blocks/Boxes/DefaultUploadBox/index.ts delete mode 100644 next-app/src/components/blocks/Boxes/FileUploadedBox/index.ts delete mode 100644 next-app/src/components/blocks/HomePage/index.ts delete mode 100644 next-app/src/components/blocks/Page/Content.ts delete mode 100644 next-app/src/components/blocks/Page/index.ts delete mode 100644 next-app/src/components/elements/AlignedDiv.ts delete mode 100644 next-app/src/components/elements/Button/ButtonText.ts delete mode 100644 next-app/src/components/elements/Button/IconContainer.ts delete mode 100644 next-app/src/components/elements/Button/LoaderContainer.ts delete mode 100644 next-app/src/components/elements/Button/StyledButton.ts delete mode 100644 next-app/src/components/elements/Button/StyledLink.ts delete mode 100644 next-app/src/components/elements/Button/index.tsx delete mode 100644 next-app/src/components/elements/Button/variants/_colorVariants.ts delete mode 100644 next-app/src/components/elements/Button/variants/index.ts delete mode 100644 next-app/src/components/elements/Button/variants/primary/PrimaryButtonText.ts delete mode 100644 next-app/src/components/elements/Button/variants/primary/PrimaryStyledButton.ts delete mode 100644 next-app/src/components/elements/Button/variants/transparent/TransparentButtonText.ts delete mode 100644 next-app/src/components/elements/Button/variants/transparent/TransparentStyledButton.ts delete mode 100644 next-app/src/components/elements/Button/variants/uploadDashed/UploadDashedButton.ts delete mode 100644 next-app/src/components/elements/Button/variants/uploadDashed/UploadDashedButtonText.ts delete mode 100644 next-app/src/components/elements/ButtonContainer.ts delete mode 100644 next-app/src/components/elements/Circle.ts delete mode 100644 next-app/src/components/elements/CircularProgressBar.ts delete mode 100644 next-app/src/components/elements/Container.ts delete mode 100644 next-app/src/components/elements/DesktopContainer.ts delete mode 100644 next-app/src/components/elements/DragContainer/BorderContainer.ts delete mode 100644 next-app/src/components/elements/DragContainer/Box.ts delete mode 100644 next-app/src/components/elements/DragContainer/index.tsx delete mode 100644 next-app/src/components/elements/ExpandableBalloon.tsx delete mode 100644 next-app/src/components/elements/ExpandableElement.ts delete mode 100644 next-app/src/components/elements/Icon.ts delete mode 100644 next-app/src/components/elements/Layout/GlobalStyle/animationsStyle.ts delete mode 100644 next-app/src/components/elements/Layout/GlobalStyle/index.tsx delete mode 100644 next-app/src/components/elements/Layout/GlobalStyle/resetStyle.ts delete mode 100644 next-app/src/components/elements/Layout/Providers.tsx delete mode 100644 next-app/src/components/elements/Layout/index.tsx delete mode 100644 next-app/src/components/elements/LineWithText/Line.ts delete mode 100644 next-app/src/components/elements/LineWithText/LineWithTextContainer.ts delete mode 100644 next-app/src/components/elements/LineWithText/index.tsx delete mode 100644 next-app/src/components/elements/LinkCopyButton.tsx delete mode 100644 next-app/src/components/elements/Loader.tsx delete mode 100644 next-app/src/components/elements/Menu/ConfigurationMenu.tsx delete mode 100644 next-app/src/components/elements/MobileContainer.ts delete mode 100644 next-app/src/components/elements/QRCodeElement.tsx delete mode 100644 next-app/src/components/elements/SideBoxButton.tsx delete mode 100644 next-app/src/components/elements/TimerCountdown.tsx delete mode 100644 next-app/src/components/elements/Tooltip.ts delete mode 100644 next-app/src/components/elements/Typography/TypographyH5.ts delete mode 100644 next-app/src/components/elements/Typography/TypographyP.ts delete mode 100644 next-app/src/components/elements/Typography/index.ts delete mode 100644 next-app/src/containers/HomePage/HomePageView.tsx delete mode 100644 next-app/src/containers/HomePage/footerLinks.ts delete mode 100644 next-app/src/containers/HomePage/index.tsx delete mode 100644 next-app/src/containers/HomePage/useHomePage.ts delete mode 100644 next-app/src/containers/UploadBoxes/DefaultUploadBox/DefaultUploadBoxView.tsx delete mode 100644 next-app/src/containers/UploadBoxes/DefaultUploadBox/index.tsx delete mode 100644 next-app/src/containers/UploadBoxes/DefaultUploadBox/useDefaultUploadBox.ts delete mode 100644 next-app/src/containers/UploadBoxes/FileUploadedBox/FileUploadedBoxView.tsx delete mode 100644 next-app/src/containers/UploadBoxes/FileUploadedBox/index.tsx delete mode 100644 next-app/src/containers/UploadBoxes/FileUploadedBox/useFileUploadedBox.ts delete mode 100644 next-app/src/containers/UploadBoxes/UploadingBox/UploadingBoxView.tsx delete mode 100644 next-app/src/containers/UploadBoxes/UploadingBox/index.tsx delete mode 100644 next-app/src/containers/UploadBoxes/UploadingBox/useUploadingBox.ts delete mode 100644 next-app/src/containers/UploadBoxes/index.tsx delete mode 100644 next-app/src/hooks/useTooltip.tsx delete mode 100644 next-app/src/pages/_app.tsx delete mode 100644 next-app/src/pages/_document.tsx delete mode 100644 next-app/src/pages/index.tsx delete mode 100644 next-app/src/providers/FileUploadProvider.tsx delete mode 100644 next-app/src/providers/UploadBoxContentProvider.tsx delete mode 100644 next-app/src/utils/handleErrorMessage.tsx delete mode 100644 next-app/src/utils/hexToRGB.ts create mode 100644 next-app/tailwind.config.ts delete mode 100644 next-app/tslint.json delete mode 100644 next-app/yarn.lock diff --git a/next-app/.babelrc b/next-app/.babelrc deleted file mode 100644 index 575ac26c..00000000 --- a/next-app/.babelrc +++ /dev/null @@ -1,7 +0,0 @@ -{ - "presets": [ - "next/babel" - ], - "plugins": ["@emotion"] -} - diff --git a/next-app/.editorconfig b/next-app/.editorconfig deleted file mode 100644 index 20359a2a..00000000 --- a/next-app/.editorconfig +++ /dev/null @@ -1,21 +0,0 @@ -root = true - -[*] -charset = utf-8 -end_of_line = lf -indent_size = 2 -indent_style = space -insert_final_newline = true -max_line_length = 120 -tab_width = 2 -ij_continuation_indent_size = 2 -ij_formatter_off_tag = @formatter:off -ij_formatter_on_tag = @formatter:on -ij_formatter_tags_enabled = false -ij_smart_tabs = false -ij_visual_guides = none -ij_wrap_on_typing = false -trim_trailing_whitespace = true -ij_typescript_use_double_quotes = false -ij_html_space_inside_empty_tag = true -ij_xml_space_inside_empty_tag = true \ No newline at end of file diff --git a/next-app/.eslintrc.json b/next-app/.eslintrc.json deleted file mode 100644 index 7eb45f05..00000000 --- a/next-app/.eslintrc.json +++ /dev/null @@ -1,29 +0,0 @@ -{ - "env": { - "es6": true, - "browser": true, - "node": true - }, - "extends": [ - "plugin:@typescript-eslint/recommended", - "plugin:prettier/recommended", - "prettier" - ], - "parser": "@typescript-eslint/parser", - "parserOptions": { - "project": "tsconfig.json", - "sourceType": "module" - }, - "plugins": [ - "eslint-plugin-prettier", - "@typescript-eslint" - ], - "rules": { - "@typescript-eslint/no-explicit-any": "off", - "@typescript-eslint/explicit-module-boundary-types": "off", - "@typescript-eslint/no-empty-interface": "off", - "@typescript-eslint/ban-ts-comment": "off", - "@typescript-eslint/no-var-requires": "off", - "prettier/prettier": "error" - } -} diff --git a/next-app/.gitignore b/next-app/.gitignore index 3086c9a0..5ef6a520 100644 --- a/next-app/.gitignore +++ b/next-app/.gitignore @@ -3,7 +3,12 @@ # dependencies /node_modules /.pnp -.pnp.js +.pnp.* +.yarn/* +!.yarn/patches +!.yarn/plugins +!.yarn/releases +!.yarn/versions # testing /coverage @@ -23,17 +28,14 @@ npm-debug.log* yarn-debug.log* yarn-error.log* +.pnpm-debug.log* -# local env files -.env -.env.* -.env.local -.env.development.local -.env.test.local -.env.production.local +# env files (can opt-in for committing if needed) +.env* # vercel .vercel -#idea -.idea +# typescript +*.tsbuildinfo +next-env.d.ts diff --git a/next-app/.nvmrc b/next-app/.nvmrc index e44a38e0803edbf4823dcabc9ee9623b03771e60..6418c0bffccc23b9aa0261f1c7b7df51fa3dffcf 100644 GIT binary patch literal 22 YcmezWuZ+P62=y2Y8H~XsF9R0?07PB`-~a#s literal 9 QcmXRjw9qp&(lg`&01E~I+5i9m diff --git a/next-app/.prettierrc.js b/next-app/.prettierrc.js deleted file mode 100644 index c061d4b0..00000000 --- a/next-app/.prettierrc.js +++ /dev/null @@ -1,9 +0,0 @@ -module.exports = { - semi: false, - trailingComma: 'none', - singleQuote: true, - jsxSingleQuote: true, - tabWidth: 2, - printWidth: 100, - endOfLine: 'auto' -} diff --git a/next-app/@types/api-client/common.ts b/next-app/@types/api-client/common.ts deleted file mode 100644 index cd1b7255..00000000 --- a/next-app/@types/api-client/common.ts +++ /dev/null @@ -1,4 +0,0 @@ -export interface IUpAppUniversalError { - message: string - success: boolean -} diff --git a/next-app/@types/api-client/deleteFile.ts b/next-app/@types/api-client/deleteFile.ts deleted file mode 100644 index 563964fe..00000000 --- a/next-app/@types/api-client/deleteFile.ts +++ /dev/null @@ -1,12 +0,0 @@ -export interface IDeleteFileRequest { - key: string - data: { - accessToken: string - } -} - -export interface IDeleteFileResponse { - key: string - accessToken: string - toDelete?: string -} diff --git a/next-app/@types/api-client/getConfiguration.ts b/next-app/@types/api-client/getConfiguration.ts deleted file mode 100644 index 7176a432..00000000 --- a/next-app/@types/api-client/getConfiguration.ts +++ /dev/null @@ -1,9 +0,0 @@ -export interface IGetConfigurationRequest {} - -export interface IGetConfigurationResponse { - defaultFileLifetime: number - maxFileLifetime: number - maxPermanentFileSize: number - maxTemporaryFileSize: number - permanentAllowed: boolean -} diff --git a/next-app/@types/api-client/uploadFile.ts b/next-app/@types/api-client/uploadFile.ts deleted file mode 100644 index c63647fc..00000000 --- a/next-app/@types/api-client/uploadFile.ts +++ /dev/null @@ -1,12 +0,0 @@ -export interface IUploadFileRequest { - data: { - file: File - expires?: number | string - } -} - -export interface IUploadFileResponse { - key: string - accessToken: string - toDelete: string -} diff --git a/next-app/@types/axios.ts b/next-app/@types/axios.ts deleted file mode 100644 index e813aa9d..00000000 --- a/next-app/@types/axios.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { AxiosRequestConfig } from 'axios' - -export interface IAxiosRequest { - config?: AxiosRequestConfig -} - -export interface IOnUploadProgress { - loaded: number - total: number -} diff --git a/next-app/@types/box.ts b/next-app/@types/box.ts deleted file mode 100644 index 6fa66a8a..00000000 --- a/next-app/@types/box.ts +++ /dev/null @@ -1,5 +0,0 @@ -export enum Box { - DefaultUploadBox, - UploadingBox, - FileUploadedBox -} diff --git a/next-app/@types/custom.d.ts b/next-app/@types/custom.d.ts deleted file mode 100644 index fa3176d1..00000000 --- a/next-app/@types/custom.d.ts +++ /dev/null @@ -1,19 +0,0 @@ -declare module '*.svg' { - const content: any - export default content -} - -declare module '*.png' { - const content: any - export default content -} - -declare module '*.jpg' { - const content: any - export default content -} - -declare module '*.jpeg' { - const content: any - export default content -} diff --git a/next-app/@types/emotion.d.ts b/next-app/@types/emotion.d.ts deleted file mode 100644 index f1216416..00000000 --- a/next-app/@types/emotion.d.ts +++ /dev/null @@ -1,7 +0,0 @@ -import '@emotion/react' - -import { ITheme } from '../src/assets/theme' - -declare module '@emotion/react' { - export interface Theme extends ITheme {} -} diff --git a/next-app/@types/react-dropzone.ts b/next-app/@types/react-dropzone.ts deleted file mode 100644 index c59367ee..00000000 --- a/next-app/@types/react-dropzone.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { DropEvent, FileRejection } from 'react-dropzone' - -export type TOnDropFunction = ( - acceptedFiles: File[], - fileRejections: FileRejection[], - event: DropEvent -) => void diff --git a/next-app/README.md b/next-app/README.md index 300b29d9..eabc60ea 100644 --- a/next-app/README.md +++ b/next-app/README.md @@ -1,3 +1 @@ # up-next-app - -Project bootstrapped with [next-popular-website-starter](https://github.com/Kuboczoch/next-popular-website-starter) diff --git a/next-app/eslint.config.mjs b/next-app/eslint.config.mjs new file mode 100644 index 00000000..c85fb67c --- /dev/null +++ b/next-app/eslint.config.mjs @@ -0,0 +1,16 @@ +import { dirname } from "path"; +import { fileURLToPath } from "url"; +import { FlatCompat } from "@eslint/eslintrc"; + +const __filename = fileURLToPath(import.meta.url); +const __dirname = dirname(__filename); + +const compat = new FlatCompat({ + baseDirectory: __dirname, +}); + +const eslintConfig = [ + ...compat.extends("next/core-web-vitals", "next/typescript"), +]; + +export default eslintConfig; diff --git a/next-app/next-env.d.ts b/next-app/next-env.d.ts deleted file mode 100644 index 4f11a03d..00000000 --- a/next-app/next-env.d.ts +++ /dev/null @@ -1,5 +0,0 @@ -/// -/// - -// NOTE: This file should not be edited -// see https://nextjs.org/docs/basic-features/typescript for more information. diff --git a/next-app/next.config.js b/next-app/next.config.js deleted file mode 100644 index 97419f4a..00000000 --- a/next-app/next.config.js +++ /dev/null @@ -1,7 +0,0 @@ -module.exports = { - handleImages: ['jpe', 'jpeg', 'png', 'svg'], - // node_modules directory is checked for types, need help with that how to ignore it - typescript: { - ignoreBuildErrors: true, - }, -} diff --git a/next-app/next.config.ts b/next-app/next.config.ts new file mode 100644 index 00000000..f5f4b272 --- /dev/null +++ b/next-app/next.config.ts @@ -0,0 +1,7 @@ +import type { NextConfig } from "next"; + +const nextConfig: NextConfig = { + output: 'export' +}; + +export default nextConfig; diff --git a/next-app/package-lock.json b/next-app/package-lock.json new file mode 100644 index 00000000..18c4e0c3 --- /dev/null +++ b/next-app/package-lock.json @@ -0,0 +1,5178 @@ +{ + "name": "next-app", + "version": "0.1.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "next-app", + "version": "0.1.0", + "dependencies": { + "next": "15.1.6", + "react": "^19.0.0", + "react-dom": "^19.0.0" + }, + "devDependencies": { + "@eslint/eslintrc": "^3", + "@types/node": "^20", + "@types/react": "^19", + "@types/react-dom": "^19", + "eslint": "^9", + "eslint-config-next": "15.1.6", + "postcss": "^8", + "tailwindcss": "^3.4.1", + "typescript": "^5" + } + }, + "node_modules/@alloc/quick-lru": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", + "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.1.tgz", + "integrity": "sha512-s3O3waFUrMV8P/XaF/+ZTp1X9XBZW1a4B97ZnjQF2KYWaFD2A8KyFBsrsfSjEmjn3RGWAIuvlneuZm3CUK3jbA==", + "dev": true, + "dependencies": { + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.12.1", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz", + "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==", + "dev": true, + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/config-array": { + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.19.2.tgz", + "integrity": "sha512-GNKqxfHG2ySmJOBSHg7LxeUx4xpuCoFjacmlCoYWEbaPXLwvfIjixRI12xCQZeULksQb23uiA8F40w5TojpV7w==", + "dev": true, + "dependencies": { + "@eslint/object-schema": "^2.1.6", + "debug": "^4.3.1", + "minimatch": "^3.1.2" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/core": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.11.0.tgz", + "integrity": "sha512-DWUB2pksgNEb6Bz2fggIy1wh6fGgZP4Xyy/Mt0QZPiloKKXerbqq9D3SBQTlCRYOrcRPu4vuz+CGjwdfqxnoWA==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.15" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.2.0.tgz", + "integrity": "sha512-grOjVNN8P3hjJn/eIETF1wwd12DdnwFDoyceUJLYYdkpbwq3nLi+4fqrTAONx7XDALqlL220wC/RHSC/QTI/0w==", + "dev": true, + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^10.0.1", + "globals": "^14.0.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/js": { + "version": "9.20.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.20.0.tgz", + "integrity": "sha512-iZA07H9io9Wn836aVTytRaNqh00Sad+EamwOVJT12GTLw1VGMFV/4JaME+JjLtr9fiGaoWgYnS54wrfWsSs4oQ==", + "dev": true, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/object-schema": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.6.tgz", + "integrity": "sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==", + "dev": true, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/plugin-kit": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.2.5.tgz", + "integrity": "sha512-lB05FkqEdUg2AA0xEbUz0SnkXT1LcCTa438W4IWTUh4hdOnVbQyOJ81OrDXsJk/LSiJHubgGEFoR5EHq1NsH1A==", + "dev": true, + "dependencies": { + "@eslint/core": "^0.10.0", + "levn": "^0.4.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/plugin-kit/node_modules/@eslint/core": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.10.0.tgz", + "integrity": "sha512-gFHJ+xBOo4G3WRlR1e/3G8A6/KZAH6zcE/hkLRCZTi/B9avAG365QhFA8uOGzTMqgTghpn7/fSnscW++dpMSAw==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.15" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@humanfs/core": { + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", + "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==", + "dev": true, + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/node": { + "version": "0.16.6", + "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.6.tgz", + "integrity": "sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==", + "dev": true, + "dependencies": { + "@humanfs/core": "^0.19.1", + "@humanwhocodes/retry": "^0.3.0" + }, + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/node/node_modules/@humanwhocodes/retry": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.3.1.tgz", + "integrity": "sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==", + "dev": true, + "engines": { + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/retry": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.1.tgz", + "integrity": "sha512-c7hNEllBlenFTHBky65mhq8WD2kbN9Q6gk0bTk8lSBvc554jpXSkST1iePudpt7+A/AQvuHs9EMqjHDXMY1lrA==", + "dev": true, + "engines": { + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@img/sharp-win32-x64": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.33.5.tgz", + "integrity": "sha512-MpY/o8/8kj+EcnxwvrP4aTJSWw/aZ7JIGR4aBeZkZw5B7/Jn+tY9/VNwtcoGmdT7GfggGIU4kygOMSbYnOrAbg==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "dev": true, + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz", + "integrity": "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==", + "dev": true, + "dependencies": { + "@jridgewell/set-array": "^1.2.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", + "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", + "dev": true + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@next/env": { + "version": "15.1.6", + "resolved": "https://registry.npmjs.org/@next/env/-/env-15.1.6.tgz", + "integrity": "sha512-d9AFQVPEYNr+aqokIiPLNK/MTyt3DWa/dpKveiAaVccUadFbhFEvY6FXYX2LJO2Hv7PHnLBu2oWwB4uBuHjr/w==" + }, + "node_modules/@next/eslint-plugin-next": { + "version": "15.1.6", + "resolved": "https://registry.npmjs.org/@next/eslint-plugin-next/-/eslint-plugin-next-15.1.6.tgz", + "integrity": "sha512-+slMxhTgILUntZDGNgsKEYHUvpn72WP1YTlkmEhS51vnVd7S9jEEy0n9YAMcI21vUG4akTw9voWH02lrClt/yw==", + "dev": true, + "dependencies": { + "fast-glob": "3.3.1" + } + }, + "node_modules/@next/swc-darwin-arm64": { + "version": "15.1.6", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-15.1.6.tgz", + "integrity": "sha512-u7lg4Mpl9qWpKgy6NzEkz/w0/keEHtOybmIl0ykgItBxEM5mYotS5PmqTpo+Rhg8FiOiWgwr8USxmKQkqLBCrw==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-darwin-x64": { + "version": "15.1.6", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-15.1.6.tgz", + "integrity": "sha512-x1jGpbHbZoZ69nRuogGL2MYPLqohlhnT9OCU6E6QFewwup+z+M6r8oU47BTeJcWsF2sdBahp5cKiAcDbwwK/lg==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-arm64-gnu": { + "version": "15.1.6", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-15.1.6.tgz", + "integrity": "sha512-jar9sFw0XewXsBzPf9runGzoivajeWJUc/JkfbLTC4it9EhU8v7tCRLH7l5Y1ReTMN6zKJO0kKAGqDk8YSO2bg==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-arm64-musl": { + "version": "15.1.6", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-15.1.6.tgz", + "integrity": "sha512-+n3u//bfsrIaZch4cgOJ3tXCTbSxz0s6brJtU3SzLOvkJlPQMJ+eHVRi6qM2kKKKLuMY+tcau8XD9CJ1OjeSQQ==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-x64-gnu": { + "version": "15.1.6", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-15.1.6.tgz", + "integrity": "sha512-SpuDEXixM3PycniL4iVCLyUyvcl6Lt0mtv3am08sucskpG0tYkW1KlRhTgj4LI5ehyxriVVcfdoxuuP8csi3kQ==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-x64-musl": { + "version": "15.1.6", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-15.1.6.tgz", + "integrity": "sha512-L4druWmdFSZIIRhF+G60API5sFB7suTbDRhYWSjiw0RbE+15igQvE2g2+S973pMGvwN3guw7cJUjA/TmbPWTHQ==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-win32-arm64-msvc": { + "version": "15.1.6", + "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-15.1.6.tgz", + "integrity": "sha512-s8w6EeqNmi6gdvM19tqKKWbCyOBvXFbndkGHl+c9YrzsLARRdCHsD9S1fMj8gsXm9v8vhC8s3N8rjuC/XrtkEg==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-win32-x64-msvc": { + "version": "15.1.6", + "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-15.1.6.tgz", + "integrity": "sha512-6xomMuu54FAFxttYr5PJbEfu96godcxBTRk1OhAvJq0/EnmFU/Ybiax30Snis4vdWZ9LGpf7Roy5fSs7v/5ROQ==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nolyfill/is-core-module": { + "version": "1.0.39", + "resolved": "https://registry.npmjs.org/@nolyfill/is-core-module/-/is-core-module-1.0.39.tgz", + "integrity": "sha512-nn5ozdjYQpUCZlWGuxcJY/KpxkWQs4DcbMCmKojjyrYDEAGy4Ce19NN4v5MduafTwJlbKc99UA8YhSVqq9yPZA==", + "dev": true, + "engines": { + "node": ">=12.4.0" + } + }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "dev": true, + "optional": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/@rtsao/scc": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@rtsao/scc/-/scc-1.1.0.tgz", + "integrity": "sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==", + "dev": true + }, + "node_modules/@rushstack/eslint-patch": { + "version": "1.10.5", + "resolved": "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.10.5.tgz", + "integrity": "sha512-kkKUDVlII2DQiKy7UstOR1ErJP8kUKAQ4oa+SQtM0K+lPdmmjj0YnnxBgtTVYH7mUKtbsxeFC9y0AmK7Yb78/A==", + "dev": true + }, + "node_modules/@swc/counter": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@swc/counter/-/counter-0.1.3.tgz", + "integrity": "sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==" + }, + "node_modules/@swc/helpers": { + "version": "0.5.15", + "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.15.tgz", + "integrity": "sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==", + "dependencies": { + "tslib": "^2.8.0" + } + }, + "node_modules/@types/estree": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", + "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==", + "dev": true + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "dev": true + }, + "node_modules/@types/json5": { + "version": "0.0.29", + "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", + "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", + "dev": true + }, + "node_modules/@types/node": { + "version": "20.17.17", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.17.17.tgz", + "integrity": "sha512-/WndGO4kIfMicEQLTi/mDANUu/iVUhT7KboZPdEqqHQ4aTS+3qT3U5gIqWDFV+XouorjfgGqvKILJeHhuQgFYg==", + "dev": true, + "dependencies": { + "undici-types": "~6.19.2" + } + }, + "node_modules/@types/react": { + "version": "19.0.8", + "resolved": "https://registry.npmjs.org/@types/react/-/react-19.0.8.tgz", + "integrity": "sha512-9P/o1IGdfmQxrujGbIMDyYaaCykhLKc0NGCtYcECNUr9UAaDe4gwvV9bR6tvd5Br1SG0j+PBpbKr2UYY8CwqSw==", + "dev": true, + "dependencies": { + "csstype": "^3.0.2" + } + }, + "node_modules/@types/react-dom": { + "version": "19.0.3", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.0.3.tgz", + "integrity": "sha512-0Knk+HJiMP/qOZgMyNFamlIjw9OFCsyC2ZbigmEEyXXixgre6IQpm/4V+r3qH4GC1JPvRJKInw+on2rV6YZLeA==", + "dev": true, + "peerDependencies": { + "@types/react": "^19.0.0" + } + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "8.24.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.24.0.tgz", + "integrity": "sha512-aFcXEJJCI4gUdXgoo/j9udUYIHgF23MFkg09LFz2dzEmU0+1Plk4rQWv/IYKvPHAtlkkGoB3m5e6oUp+JPsNaQ==", + "dev": true, + "dependencies": { + "@eslint-community/regexpp": "^4.10.0", + "@typescript-eslint/scope-manager": "8.24.0", + "@typescript-eslint/type-utils": "8.24.0", + "@typescript-eslint/utils": "8.24.0", + "@typescript-eslint/visitor-keys": "8.24.0", + "graphemer": "^1.4.0", + "ignore": "^5.3.1", + "natural-compare": "^1.4.0", + "ts-api-utils": "^2.0.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^8.0.0 || ^8.0.0-alpha.0", + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <5.8.0" + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "8.24.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.24.0.tgz", + "integrity": "sha512-MFDaO9CYiard9j9VepMNa9MTcqVvSny2N4hkY6roquzj8pdCBRENhErrteaQuu7Yjn1ppk0v1/ZF9CG3KIlrTA==", + "dev": true, + "dependencies": { + "@typescript-eslint/scope-manager": "8.24.0", + "@typescript-eslint/types": "8.24.0", + "@typescript-eslint/typescript-estree": "8.24.0", + "@typescript-eslint/visitor-keys": "8.24.0", + "debug": "^4.3.4" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <5.8.0" + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "8.24.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.24.0.tgz", + "integrity": "sha512-HZIX0UByphEtdVBKaQBgTDdn9z16l4aTUz8e8zPQnyxwHBtf5vtl1L+OhH+m1FGV9DrRmoDuYKqzVrvWDcDozw==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "8.24.0", + "@typescript-eslint/visitor-keys": "8.24.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "8.24.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.24.0.tgz", + "integrity": "sha512-8fitJudrnY8aq0F1wMiPM1UUgiXQRJ5i8tFjq9kGfRajU+dbPyOuHbl0qRopLEidy0MwqgTHDt6CnSeXanNIwA==", + "dev": true, + "dependencies": { + "@typescript-eslint/typescript-estree": "8.24.0", + "@typescript-eslint/utils": "8.24.0", + "debug": "^4.3.4", + "ts-api-utils": "^2.0.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <5.8.0" + } + }, + "node_modules/@typescript-eslint/types": { + "version": "8.24.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.24.0.tgz", + "integrity": "sha512-VacJCBTyje7HGAw7xp11q439A+zeGG0p0/p2zsZwpnMzjPB5WteaWqt4g2iysgGFafrqvyLWqq6ZPZAOCoefCw==", + "dev": true, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "8.24.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.24.0.tgz", + "integrity": "sha512-ITjYcP0+8kbsvT9bysygfIfb+hBj6koDsu37JZG7xrCiy3fPJyNmfVtaGsgTUSEuTzcvME5YI5uyL5LD1EV5ZQ==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "8.24.0", + "@typescript-eslint/visitor-keys": "8.24.0", + "debug": "^4.3.4", + "fast-glob": "^3.3.2", + "is-glob": "^4.0.3", + "minimatch": "^9.0.4", + "semver": "^7.6.0", + "ts-api-utils": "^2.0.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <5.8.0" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/fast-glob": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", + "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.8" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/glob-parent": { + "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" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "8.24.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.24.0.tgz", + "integrity": "sha512-07rLuUBElvvEb1ICnafYWr4hk8/U7X9RDCOqd9JcAMtjh/9oRmcfN4yGzbPVirgMR0+HLVHehmu19CWeh7fsmQ==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.4.0", + "@typescript-eslint/scope-manager": "8.24.0", + "@typescript-eslint/types": "8.24.0", + "@typescript-eslint/typescript-estree": "8.24.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <5.8.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "8.24.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.24.0.tgz", + "integrity": "sha512-kArLq83QxGLbuHrTMoOEWO+l2MwsNS2TGISEdx8xgqpkbytB07XmlQyQdNDrCc1ecSqx0cnmhGvpX+VBwqqSkg==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "8.24.0", + "eslint-visitor-keys": "^4.2.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/acorn": { + "version": "8.14.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz", + "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/ajv": { + "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", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ansi-regex": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", + "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "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/any-promise": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", + "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", + "dev": true + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/arg": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", + "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", + "dev": true + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "node_modules/aria-query": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.2.tgz", + "integrity": "sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/array-buffer-byte-length": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz", + "integrity": "sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==", + "dev": true, + "dependencies": { + "call-bound": "^1.0.3", + "is-array-buffer": "^3.0.5" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array-includes": { + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.8.tgz", + "integrity": "sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.4", + "is-string": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.findlast": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/array.prototype.findlast/-/array.prototype.findlast-1.2.5.tgz", + "integrity": "sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.findlastindex": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.5.tgz", + "integrity": "sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flat": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.3.tgz", + "integrity": "sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flatmap": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.3.tgz", + "integrity": "sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.tosorted": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.4.tgz", + "integrity": "sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.3", + "es-errors": "^1.3.0", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/arraybuffer.prototype.slice": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.4.tgz", + "integrity": "sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==", + "dev": true, + "dependencies": { + "array-buffer-byte-length": "^1.0.1", + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "is-array-buffer": "^3.0.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/ast-types-flow": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.8.tgz", + "integrity": "sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==", + "dev": true + }, + "node_modules/async-function": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/async-function/-/async-function-1.0.0.tgz", + "integrity": "sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/available-typed-arrays": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", + "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", + "dev": true, + "dependencies": { + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/axe-core": { + "version": "4.10.2", + "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.10.2.tgz", + "integrity": "sha512-RE3mdQ7P3FRSe7eqCWoeQ/Z9QXrtniSjp1wUjt5nRC3WIpz5rSCve6o3fsZ2aCpJtrZjSZgjwXAoTO5k4tEI0w==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/axobject-query": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-4.1.0.tgz", + "integrity": "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "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 + }, + "node_modules/binary-extensions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/brace-expansion": { + "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" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/busboy": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz", + "integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==", + "dependencies": { + "streamsearch": "^1.1.0" + }, + "engines": { + "node": ">=10.16.0" + } + }, + "node_modules/call-bind": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", + "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==", + "dev": true, + "dependencies": { + "call-bind-apply-helpers": "^1.0.0", + "es-define-property": "^1.0.0", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.1.tgz", + "integrity": "sha512-BhYE+WDaywFg2TBWYNXAE+8B1ATnThNBqXHP5nQu0jWJdVvY2hvkpyB3qOmtmDePiS5/BDQ8wASEWGMWRG148g==", + "dev": true, + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/call-bound": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.3.tgz", + "integrity": "sha512-YTd+6wGlNlPxSuri7Y6X8tY2dmm12UMH66RpKMhiX6rsk5wXXnYgbUcOt8kiS31/AjfoTOvCsE+w8nZQLQnzHA==", + "dev": true, + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/callsites": { + "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" + } + }, + "node_modules/camelcase-css": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", + "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001699", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001699.tgz", + "integrity": "sha512-b+uH5BakXZ9Do9iK+CkDmctUSEqZl+SP056vc5usa0PL+ev5OHw003rZXcnjNDv3L8P5j6rwT6C0BPKSikW08w==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ] + }, + "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/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "dev": true, + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/chokidar/node_modules/glob-parent": { + "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" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/client-only": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz", + "integrity": "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==" + }, + "node_modules/color": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/color/-/color-4.2.3.tgz", + "integrity": "sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==", + "optional": true, + "dependencies": { + "color-convert": "^2.0.1", + "color-string": "^1.9.0" + }, + "engines": { + "node": ">=12.5.0" + } + }, + "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==", + "devOptional": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "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==", + "devOptional": true + }, + "node_modules/color-string": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz", + "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==", + "optional": true, + "dependencies": { + "color-name": "^1.0.0", + "simple-swizzle": "^0.2.2" + } + }, + "node_modules/commander": { + "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" + } + }, + "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 + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dev": true, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/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, + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/csstype": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", + "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", + "dev": true + }, + "node_modules/damerau-levenshtein": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz", + "integrity": "sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==", + "dev": true + }, + "node_modules/data-view-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.2.tgz", + "integrity": "sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==", + "dev": true, + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/data-view-byte-length": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.2.tgz", + "integrity": "sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==", + "dev": true, + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/inspect-js" + } + }, + "node_modules/data-view-byte-offset": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.1.tgz", + "integrity": "sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==", + "dev": true, + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/debug": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", + "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "dev": true, + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true + }, + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "dev": true, + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/define-properties": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "dev": true, + "dependencies": { + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/detect-libc": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.3.tgz", + "integrity": "sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==", + "optional": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/didyoumean": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", + "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==", + "dev": true + }, + "node_modules/dlv": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", + "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", + "dev": true + }, + "node_modules/doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "dev": true, + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "dev": true + }, + "node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true + }, + "node_modules/enhanced-resolve": { + "version": "5.18.1", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.1.tgz", + "integrity": "sha512-ZSW3ma5GkcQBIpwZTSRAI8N71Uuwgs93IezB7mf7R60tC8ZbJideoDNKjHn2O9KIlx6rkGTTEk1xUCK2E1Y2Yg==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/es-abstract": { + "version": "1.23.9", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.9.tgz", + "integrity": "sha512-py07lI0wjxAC/DcfK1S6G7iANonniZwTISvdPzk9hzeH0IZIshbuuFxLIU96OyF89Yb9hiqWn8M/bY83KY5vzA==", + "dev": true, + "dependencies": { + "array-buffer-byte-length": "^1.0.2", + "arraybuffer.prototype.slice": "^1.0.4", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "data-view-buffer": "^1.0.2", + "data-view-byte-length": "^1.0.2", + "data-view-byte-offset": "^1.0.1", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-set-tostringtag": "^2.1.0", + "es-to-primitive": "^1.3.0", + "function.prototype.name": "^1.1.8", + "get-intrinsic": "^1.2.7", + "get-proto": "^1.0.0", + "get-symbol-description": "^1.1.0", + "globalthis": "^1.0.4", + "gopd": "^1.2.0", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "internal-slot": "^1.1.0", + "is-array-buffer": "^3.0.5", + "is-callable": "^1.2.7", + "is-data-view": "^1.0.2", + "is-regex": "^1.2.1", + "is-shared-array-buffer": "^1.0.4", + "is-string": "^1.1.1", + "is-typed-array": "^1.1.15", + "is-weakref": "^1.1.0", + "math-intrinsics": "^1.1.0", + "object-inspect": "^1.13.3", + "object-keys": "^1.1.1", + "object.assign": "^4.1.7", + "own-keys": "^1.0.1", + "regexp.prototype.flags": "^1.5.3", + "safe-array-concat": "^1.1.3", + "safe-push-apply": "^1.0.0", + "safe-regex-test": "^1.1.0", + "set-proto": "^1.0.0", + "string.prototype.trim": "^1.2.10", + "string.prototype.trimend": "^1.0.9", + "string.prototype.trimstart": "^1.0.8", + "typed-array-buffer": "^1.0.3", + "typed-array-byte-length": "^1.0.3", + "typed-array-byte-offset": "^1.0.4", + "typed-array-length": "^1.0.7", + "unbox-primitive": "^1.1.0", + "which-typed-array": "^1.1.18" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-iterator-helpers": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.2.1.tgz", + "integrity": "sha512-uDn+FE1yrDzyC0pCo961B2IHbdM8y/ACZsKD4dG6WqrjV53BADjwa7D+1aom2rsNVfLyDgU/eigvlJGJ08OQ4w==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.6", + "es-errors": "^1.3.0", + "es-set-tostringtag": "^2.0.3", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.6", + "globalthis": "^1.0.4", + "gopd": "^1.2.0", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.2.0", + "has-symbols": "^1.1.0", + "internal-slot": "^1.1.0", + "iterator.prototype": "^1.1.4", + "safe-array-concat": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "dev": true, + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "dev": true, + "dependencies": { + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-shim-unscopables": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz", + "integrity": "sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==", + "dev": true, + "dependencies": { + "hasown": "^2.0.0" + } + }, + "node_modules/es-to-primitive": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.3.0.tgz", + "integrity": "sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==", + "dev": true, + "dependencies": { + "is-callable": "^1.2.7", + "is-date-object": "^1.0.5", + "is-symbol": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint": { + "version": "9.20.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.20.0.tgz", + "integrity": "sha512-aL4F8167Hg4IvsW89ejnpTwx+B/UQRzJPGgbIOl+4XqffWsahVVsLEWoZvnrVuwpWmnRd7XeXmQI1zlKcFDteA==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.12.1", + "@eslint/config-array": "^0.19.0", + "@eslint/core": "^0.11.0", + "@eslint/eslintrc": "^3.2.0", + "@eslint/js": "9.20.0", + "@eslint/plugin-kit": "^0.2.5", + "@humanfs/node": "^0.16.6", + "@humanwhocodes/module-importer": "^1.0.1", + "@humanwhocodes/retry": "^0.4.1", + "@types/estree": "^1.0.6", + "@types/json-schema": "^7.0.15", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.6", + "debug": "^4.3.2", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^8.2.0", + "eslint-visitor-keys": "^4.2.0", + "espree": "^10.3.0", + "esquery": "^1.5.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^8.0.0", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://eslint.org/donate" + }, + "peerDependencies": { + "jiti": "*" + }, + "peerDependenciesMeta": { + "jiti": { + "optional": true + } + } + }, + "node_modules/eslint-config-next": { + "version": "15.1.6", + "resolved": "https://registry.npmjs.org/eslint-config-next/-/eslint-config-next-15.1.6.tgz", + "integrity": "sha512-Wd1uy6y7nBbXUSg9QAuQ+xYEKli5CgUhLjz1QHW11jLDis5vK5XB3PemL6jEmy7HrdhaRFDz+GTZ/3FoH+EUjg==", + "dev": true, + "dependencies": { + "@next/eslint-plugin-next": "15.1.6", + "@rushstack/eslint-patch": "^1.10.3", + "@typescript-eslint/eslint-plugin": "^5.4.2 || ^6.0.0 || ^7.0.0 || ^8.0.0", + "@typescript-eslint/parser": "^5.4.2 || ^6.0.0 || ^7.0.0 || ^8.0.0", + "eslint-import-resolver-node": "^0.3.6", + "eslint-import-resolver-typescript": "^3.5.2", + "eslint-plugin-import": "^2.31.0", + "eslint-plugin-jsx-a11y": "^6.10.0", + "eslint-plugin-react": "^7.37.0", + "eslint-plugin-react-hooks": "^5.0.0" + }, + "peerDependencies": { + "eslint": "^7.23.0 || ^8.0.0 || ^9.0.0", + "typescript": ">=3.3.1" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/eslint-import-resolver-node": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", + "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==", + "dev": true, + "dependencies": { + "debug": "^3.2.7", + "is-core-module": "^2.13.0", + "resolve": "^1.22.4" + } + }, + "node_modules/eslint-import-resolver-node/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/eslint-import-resolver-typescript": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.7.0.tgz", + "integrity": "sha512-Vrwyi8HHxY97K5ebydMtffsWAn1SCR9eol49eCd5fJS4O1WV7PaAjbcjmbfJJSMz/t4Mal212Uz/fQZrOB8mow==", + "dev": true, + "dependencies": { + "@nolyfill/is-core-module": "1.0.39", + "debug": "^4.3.7", + "enhanced-resolve": "^5.15.0", + "fast-glob": "^3.3.2", + "get-tsconfig": "^4.7.5", + "is-bun-module": "^1.0.2", + "is-glob": "^4.0.3", + "stable-hash": "^0.0.4" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/unts/projects/eslint-import-resolver-ts" + }, + "peerDependencies": { + "eslint": "*", + "eslint-plugin-import": "*", + "eslint-plugin-import-x": "*" + }, + "peerDependenciesMeta": { + "eslint-plugin-import": { + "optional": true + }, + "eslint-plugin-import-x": { + "optional": true + } + } + }, + "node_modules/eslint-import-resolver-typescript/node_modules/fast-glob": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", + "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.8" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/eslint-import-resolver-typescript/node_modules/glob-parent": { + "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" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/eslint-module-utils": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.12.0.tgz", + "integrity": "sha512-wALZ0HFoytlyh/1+4wuZ9FJCD/leWHQzzrxJ8+rebyReSLk7LApMyd3WJaLVoN+D5+WIdJyDK1c6JnE65V4Zyg==", + "dev": true, + "dependencies": { + "debug": "^3.2.7" + }, + "engines": { + "node": ">=4" + }, + "peerDependenciesMeta": { + "eslint": { + "optional": true + } + } + }, + "node_modules/eslint-module-utils/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/eslint-plugin-import": { + "version": "2.31.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.31.0.tgz", + "integrity": "sha512-ixmkI62Rbc2/w8Vfxyh1jQRTdRTF52VxwRVHl/ykPAmqG+Nb7/kNn+byLP0LxPgI7zWA16Jt82SybJInmMia3A==", + "dev": true, + "dependencies": { + "@rtsao/scc": "^1.1.0", + "array-includes": "^3.1.8", + "array.prototype.findlastindex": "^1.2.5", + "array.prototype.flat": "^1.3.2", + "array.prototype.flatmap": "^1.3.2", + "debug": "^3.2.7", + "doctrine": "^2.1.0", + "eslint-import-resolver-node": "^0.3.9", + "eslint-module-utils": "^2.12.0", + "hasown": "^2.0.2", + "is-core-module": "^2.15.1", + "is-glob": "^4.0.3", + "minimatch": "^3.1.2", + "object.fromentries": "^2.0.8", + "object.groupby": "^1.0.3", + "object.values": "^1.2.0", + "semver": "^6.3.1", + "string.prototype.trimend": "^1.0.8", + "tsconfig-paths": "^3.15.0" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9" + } + }, + "node_modules/eslint-plugin-import/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/eslint-plugin-import/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/eslint-plugin-jsx-a11y": { + "version": "6.10.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.10.2.tgz", + "integrity": "sha512-scB3nz4WmG75pV8+3eRUQOHZlNSUhFNq37xnpgRkCCELU3XMvXAxLk1eqWWyE22Ki4Q01Fnsw9BA3cJHDPgn2Q==", + "dev": true, + "dependencies": { + "aria-query": "^5.3.2", + "array-includes": "^3.1.8", + "array.prototype.flatmap": "^1.3.2", + "ast-types-flow": "^0.0.8", + "axe-core": "^4.10.0", + "axobject-query": "^4.1.0", + "damerau-levenshtein": "^1.0.8", + "emoji-regex": "^9.2.2", + "hasown": "^2.0.2", + "jsx-ast-utils": "^3.3.5", + "language-tags": "^1.0.9", + "minimatch": "^3.1.2", + "object.fromentries": "^2.0.8", + "safe-regex-test": "^1.0.3", + "string.prototype.includes": "^2.0.1" + }, + "engines": { + "node": ">=4.0" + }, + "peerDependencies": { + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9" + } + }, + "node_modules/eslint-plugin-react": { + "version": "7.37.4", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.37.4.tgz", + "integrity": "sha512-BGP0jRmfYyvOyvMoRX/uoUeW+GqNj9y16bPQzqAHf3AYII/tDs+jMN0dBVkl88/OZwNGwrVFxE7riHsXVfy/LQ==", + "dev": true, + "dependencies": { + "array-includes": "^3.1.8", + "array.prototype.findlast": "^1.2.5", + "array.prototype.flatmap": "^1.3.3", + "array.prototype.tosorted": "^1.1.4", + "doctrine": "^2.1.0", + "es-iterator-helpers": "^1.2.1", + "estraverse": "^5.3.0", + "hasown": "^2.0.2", + "jsx-ast-utils": "^2.4.1 || ^3.0.0", + "minimatch": "^3.1.2", + "object.entries": "^1.1.8", + "object.fromentries": "^2.0.8", + "object.values": "^1.2.1", + "prop-types": "^15.8.1", + "resolve": "^2.0.0-next.5", + "semver": "^6.3.1", + "string.prototype.matchall": "^4.0.12", + "string.prototype.repeat": "^1.0.0" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7" + } + }, + "node_modules/eslint-plugin-react-hooks": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-5.1.0.tgz", + "integrity": "sha512-mpJRtPgHN2tNAvZ35AMfqeB3Xqeo273QxrHJsbBEPWODRM4r0yB6jfoROqKEYrOn27UtRPpcpHc2UqyBSuUNTw==", + "dev": true, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0" + } + }, + "node_modules/eslint-plugin-react/node_modules/resolve": { + "version": "2.0.0-next.5", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz", + "integrity": "sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==", + "dev": true, + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/eslint-plugin-react/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/eslint-scope": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.2.0.tgz", + "integrity": "sha512-PHlWUfG6lvPc3yvP5A4PNyBL1W8fkDUccmI21JUu/+GKZBoH/W5u6usENXUrWFRsyoW5ACUjFGgAFQp5gUlb/A==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz", + "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==", + "dev": true, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/espree": { + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-10.3.0.tgz", + "integrity": "sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==", + "dev": true, + "dependencies": { + "acorn": "^8.14.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^4.2.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esquery": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", + "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", + "dev": true, + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "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" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "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" + } + }, + "node_modules/esutils": { + "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" + } + }, + "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 + }, + "node_modules/fast-glob": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz", + "integrity": "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-glob/node_modules/glob-parent": { + "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" + }, + "engines": { + "node": ">= 6" + } + }, + "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 + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true + }, + "node_modules/fastq": { + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.0.tgz", + "integrity": "sha512-7SFSRCNjBQIZH/xZR3iy5iQYR8aGBE0h3VG6/cwlbrpdciNYBMotQav8c1XI3HjHH+NikUpP53nPdlZSdWmFzA==", + "dev": true, + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/file-entry-cache": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", + "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", + "dev": true, + "dependencies": { + "flat-cache": "^4.0.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat-cache": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", + "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", + "dev": true, + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.4" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/flatted": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.2.tgz", + "integrity": "sha512-AiwGJM8YcNOaobumgtng+6NHuOqC3A7MixFeDafM3X9cIUM+xUXoS5Vfgf+OihAYe20fxqNM9yPBXJzRtZ/4eA==", + "dev": true + }, + "node_modules/for-each": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.4.tgz", + "integrity": "sha512-kKaIINnFpzW6ffJNDjjyjrk21BkDx38c0xa/klsT8VzLCaMEefv4ZTacrcVR4DmgTeBra++jMDAfS/tS799YDw==", + "dev": true, + "dependencies": { + "is-callable": "^1.2.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/foreground-child": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.0.tgz", + "integrity": "sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.0", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/function.prototype.name": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.8.tgz", + "integrity": "sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "functions-have-names": "^1.2.3", + "hasown": "^2.0.2", + "is-callable": "^1.2.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-intrinsic": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.7.tgz", + "integrity": "sha512-VW6Pxhsrk0KAOqs3WEd0klDiF/+V7gQOpAvY1jVU/LHmaD/kQO4523aiJuikX/QAKYiW6x8Jh+RJej1almdtCA==", + "dev": true, + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "function-bind": "^1.1.2", + "get-proto": "^1.0.0", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "dev": true, + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/get-symbol-description": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.1.0.tgz", + "integrity": "sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==", + "dev": true, + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-tsconfig": { + "version": "4.10.0", + "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.10.0.tgz", + "integrity": "sha512-kGzZ3LWWQcGIAmg6iWvXn0ei6WDtV26wzHRMwDSzmAbcXrTEXxHy6IehI6/4eT6VRKyMP1eF1VqwrVUmE/LR7A==", + "dev": true, + "dependencies": { + "resolve-pkg-maps": "^1.0.0" + }, + "funding": { + "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" + } + }, + "node_modules/glob": { + "version": "10.4.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", + "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", + "dev": true, + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/glob/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/glob/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/globals": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", + "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", + "dev": true, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globalthis": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", + "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", + "dev": true, + "dependencies": { + "define-properties": "^1.2.1", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true + }, + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dev": true + }, + "node_modules/has-bigints": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.1.0.tgz", + "integrity": "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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/has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "dev": true, + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.2.0.tgz", + "integrity": "sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==", + "dev": true, + "dependencies": { + "dunder-proto": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "dev": true, + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/import-fresh": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", + "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", + "dev": true, + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/internal-slot": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.1.0.tgz", + "integrity": "sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==", + "dev": true, + "dependencies": { + "es-errors": "^1.3.0", + "hasown": "^2.0.2", + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-array-buffer": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.5.tgz", + "integrity": "sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-arrayish": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", + "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==", + "optional": true + }, + "node_modules/is-async-function": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.1.1.tgz", + "integrity": "sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==", + "dev": true, + "dependencies": { + "async-function": "^1.0.0", + "call-bound": "^1.0.3", + "get-proto": "^1.0.1", + "has-tostringtag": "^1.0.2", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-bigint": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.1.0.tgz", + "integrity": "sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==", + "dev": true, + "dependencies": { + "has-bigints": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-binary-path": { + "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" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-boolean-object": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.2.2.tgz", + "integrity": "sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==", + "dev": true, + "dependencies": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-bun-module": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/is-bun-module/-/is-bun-module-1.3.0.tgz", + "integrity": "sha512-DgXeu5UWI0IsMQundYb5UAOzm6G2eVnarJ0byP6Tm55iZNKceD59LNPA2L4VvsScTtHcw0yEkVwSf7PC+QoLSA==", + "dev": true, + "dependencies": { + "semver": "^7.6.3" + } + }, + "node_modules/is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-core-module": { + "version": "2.16.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", + "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", + "dev": true, + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-data-view": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.2.tgz", + "integrity": "sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==", + "dev": true, + "dependencies": { + "call-bound": "^1.0.2", + "get-intrinsic": "^1.2.6", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-date-object": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.1.0.tgz", + "integrity": "sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==", + "dev": true, + "dependencies": { + "call-bound": "^1.0.2", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extglob": { + "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" + } + }, + "node_modules/is-finalizationregistry": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.1.1.tgz", + "integrity": "sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==", + "dev": true, + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-generator-function": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.0.tgz", + "integrity": "sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ==", + "dev": true, + "dependencies": { + "call-bound": "^1.0.3", + "get-proto": "^1.0.0", + "has-tostringtag": "^1.0.2", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-glob": { + "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" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-map": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", + "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/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, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-number-object": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.1.1.tgz", + "integrity": "sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==", + "dev": true, + "dependencies": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-regex": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", + "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==", + "dev": true, + "dependencies": { + "call-bound": "^1.0.2", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-set": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz", + "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-shared-array-buffer": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.4.tgz", + "integrity": "sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==", + "dev": true, + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-string": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.1.1.tgz", + "integrity": "sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==", + "dev": true, + "dependencies": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-symbol": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.1.1.tgz", + "integrity": "sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==", + "dev": true, + "dependencies": { + "call-bound": "^1.0.2", + "has-symbols": "^1.1.0", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-typed-array": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz", + "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==", + "dev": true, + "dependencies": { + "which-typed-array": "^1.1.16" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakmap": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", + "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakref": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.1.1.tgz", + "integrity": "sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==", + "dev": true, + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakset": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.4.tgz", + "integrity": "sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==", + "dev": true, + "dependencies": { + "call-bound": "^1.0.3", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "node_modules/iterator.prototype": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.5.tgz", + "integrity": "sha512-H0dkQoCa3b2VEeKQBOxFph+JAbcrQdE7KC0UkqwpLmv2EC4P41QXP+rqo9wYodACiG5/WM5s9oDApTU8utwj9g==", + "dev": true, + "dependencies": { + "define-data-property": "^1.1.4", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.6", + "get-proto": "^1.0.0", + "has-symbols": "^1.1.0", + "set-function-name": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/jackspeak": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", + "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", + "dev": true, + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, + "node_modules/jiti": { + "version": "1.21.7", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.7.tgz", + "integrity": "sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==", + "dev": true, + "bin": { + "jiti": "bin/jiti.js" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true + }, + "node_modules/json-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 + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true + }, + "node_modules/json5": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", + "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", + "dev": true, + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/jsx-ast-utils": { + "version": "3.3.5", + "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz", + "integrity": "sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==", + "dev": true, + "dependencies": { + "array-includes": "^3.1.6", + "array.prototype.flat": "^1.3.1", + "object.assign": "^4.1.4", + "object.values": "^1.1.6" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/language-subtag-registry": { + "version": "0.3.23", + "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.23.tgz", + "integrity": "sha512-0K65Lea881pHotoGEa5gDlMxt3pctLi2RplBb7Ezh4rRdLEOtgi7n4EwK9lamnUCkKBqaeKRVebTq6BAxSkpXQ==", + "dev": true + }, + "node_modules/language-tags": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/language-tags/-/language-tags-1.0.9.tgz", + "integrity": "sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA==", + "dev": true, + "dependencies": { + "language-subtag-registry": "^0.3.20" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/lilconfig": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz", + "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==", + "dev": true, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antonk52" + } + }, + "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 + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true + }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "dev": true, + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "dev": true + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "dev": true, + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/minimatch": { + "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" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "dev": true, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "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 + }, + "node_modules/mz": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", + "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", + "dev": true, + "dependencies": { + "any-promise": "^1.0.0", + "object-assign": "^4.0.1", + "thenify-all": "^1.0.0" + } + }, + "node_modules/nanoid": { + "version": "3.3.8", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.8.tgz", + "integrity": "sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true + }, + "node_modules/next": { + "version": "15.1.6", + "resolved": "https://registry.npmjs.org/next/-/next-15.1.6.tgz", + "integrity": "sha512-Hch4wzbaX0vKQtalpXvUiw5sYivBy4cm5rzUKrBnUB/y436LGrvOUqYvlSeNVCWFO/770gDlltR9gqZH62ct4Q==", + "dependencies": { + "@next/env": "15.1.6", + "@swc/counter": "0.1.3", + "@swc/helpers": "0.5.15", + "busboy": "1.6.0", + "caniuse-lite": "^1.0.30001579", + "postcss": "8.4.31", + "styled-jsx": "5.1.6" + }, + "bin": { + "next": "dist/bin/next" + }, + "engines": { + "node": "^18.18.0 || ^19.8.0 || >= 20.0.0" + }, + "optionalDependencies": { + "@next/swc-darwin-arm64": "15.1.6", + "@next/swc-darwin-x64": "15.1.6", + "@next/swc-linux-arm64-gnu": "15.1.6", + "@next/swc-linux-arm64-musl": "15.1.6", + "@next/swc-linux-x64-gnu": "15.1.6", + "@next/swc-linux-x64-musl": "15.1.6", + "@next/swc-win32-arm64-msvc": "15.1.6", + "@next/swc-win32-x64-msvc": "15.1.6", + "sharp": "^0.33.5" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.1.0", + "@playwright/test": "^1.41.2", + "babel-plugin-react-compiler": "*", + "react": "^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0", + "react-dom": "^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0", + "sass": "^1.3.0" + }, + "peerDependenciesMeta": { + "@opentelemetry/api": { + "optional": true + }, + "@playwright/test": { + "optional": true + }, + "babel-plugin-react-compiler": { + "optional": true + }, + "sass": { + "optional": true + } + } + }, + "node_modules/next/node_modules/postcss": { + "version": "8.4.31", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", + "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "nanoid": "^3.3.6", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/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, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-hash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", + "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/object-inspect": { + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/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, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.assign": { + "version": "4.1.7", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.7.tgz", + "integrity": "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0", + "has-symbols": "^1.1.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.entries": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.8.tgz", + "integrity": "sha512-cmopxi8VwRIAw/fkijJohSfpef5PdN0pMQJN6VC/ZKvn0LIknWD8KtgY6KlQdEc4tIjcQ3HxSMmnvtzIscdaYQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.fromentries": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz", + "integrity": "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.groupby": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.3.tgz", + "integrity": "sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.values": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.1.tgz", + "integrity": "sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/optionator": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", + "dev": true, + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/own-keys": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/own-keys/-/own-keys-1.0.1.tgz", + "integrity": "sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.2.6", + "object-keys": "^1.1.1", + "safe-push-apply": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/package-json-from-dist": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", + "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", + "dev": true + }, + "node_modules/parent-module": { + "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" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/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, + "engines": { + "node": ">=8" + } + }, + "node_modules/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, + "engines": { + "node": ">=8" + } + }, + "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 + }, + "node_modules/path-scurry": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "dev": true, + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==" + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "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/pirates": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", + "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/possible-typed-array-names": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz", + "integrity": "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/postcss": { + "version": "8.5.1", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.1.tgz", + "integrity": "sha512-6oz2beyjc5VMn/KV1pPw8fliQkhBXrVn1Z3TVyqZxU8kZpzEKhBdmCFqI6ZbmGtamQvQGuU1sgPTk8ZrXDD7jQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "nanoid": "^3.3.8", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-import": { + "version": "15.1.0", + "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz", + "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==", + "dev": true, + "dependencies": { + "postcss-value-parser": "^4.0.0", + "read-cache": "^1.0.0", + "resolve": "^1.1.7" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "postcss": "^8.0.0" + } + }, + "node_modules/postcss-js": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz", + "integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==", + "dev": true, + "dependencies": { + "camelcase-css": "^2.0.1" + }, + "engines": { + "node": "^12 || ^14 || >= 16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": "^8.4.21" + } + }, + "node_modules/postcss-load-config": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.2.tgz", + "integrity": "sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "lilconfig": "^3.0.0", + "yaml": "^2.3.4" + }, + "engines": { + "node": ">= 14" + }, + "peerDependencies": { + "postcss": ">=8.0.9", + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "postcss": { + "optional": true + }, + "ts-node": { + "optional": true + } + } + }, + "node_modules/postcss-nested": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.2.0.tgz", + "integrity": "sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "postcss-selector-parser": "^6.1.1" + }, + "engines": { + "node": ">=12.0" + }, + "peerDependencies": { + "postcss": "^8.2.14" + } + }, + "node_modules/postcss-selector-parser": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", + "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", + "dev": true, + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "dev": true + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/prop-types": { + "version": "15.8.1", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", + "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", + "dev": true, + "dependencies": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.1" + } + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "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/react": { + "version": "19.0.0", + "resolved": "https://registry.npmjs.org/react/-/react-19.0.0.tgz", + "integrity": "sha512-V8AVnmPIICiWpGfm6GLzCR/W5FXLchHop40W4nXBmdlEceh16rCN8O8LNWm5bh5XUX91fh7KpA+W0TgMKmgTpQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { + "version": "19.0.0", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.0.0.tgz", + "integrity": "sha512-4GV5sHFG0e/0AD4X+ySy6UJd3jVl1iNsNHdpad0qhABJ11twS3TTBnseqsKurKcsNqCEFeGL3uLpVChpIO3QfQ==", + "dependencies": { + "scheduler": "^0.25.0" + }, + "peerDependencies": { + "react": "^19.0.0" + } + }, + "node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", + "dev": true + }, + "node_modules/read-cache": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", + "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", + "dev": true, + "dependencies": { + "pify": "^2.3.0" + } + }, + "node_modules/readdirp": { + "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" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/reflect.getprototypeof": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz", + "integrity": "sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.9", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.7", + "get-proto": "^1.0.1", + "which-builtin-type": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/regexp.prototype.flags": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz", + "integrity": "sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-errors": "^1.3.0", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "set-function-name": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve": { + "version": "1.22.10", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", + "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", + "dev": true, + "dependencies": { + "is-core-module": "^2.16.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/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, + "engines": { + "node": ">=4" + } + }, + "node_modules/resolve-pkg-maps": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", + "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", + "dev": true, + "funding": { + "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true, + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "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": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/safe-array-concat": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.3.tgz", + "integrity": "sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "get-intrinsic": "^1.2.6", + "has-symbols": "^1.1.0", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">=0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-push-apply": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/safe-push-apply/-/safe-push-apply-1.0.0.tgz", + "integrity": "sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==", + "dev": true, + "dependencies": { + "es-errors": "^1.3.0", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-regex-test": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz", + "integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==", + "dev": true, + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "is-regex": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/scheduler": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.25.0.tgz", + "integrity": "sha512-xFVuu11jh+xcO7JOAGJNOXld8/TcEHK/4CituBUeUb5hqxJLj9YuemAEuvm9gQ/+pgXYfbQuqAkiYu+u7YEsNA==" + }, + "node_modules/semver": { + "version": "7.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz", + "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==", + "devOptional": true, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/set-function-length": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "dev": true, + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-function-name": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", + "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", + "dev": true, + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-proto": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/set-proto/-/set-proto-1.0.0.tgz", + "integrity": "sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==", + "dev": true, + "dependencies": { + "dunder-proto": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/sharp": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.33.5.tgz", + "integrity": "sha512-haPVm1EkS9pgvHrQ/F3Xy+hgcuMV0Wm9vfIBSiwZ05k+xgb0PkBQpGsAA/oWdDobNaZTH5ppvHtzCFbnSEwHVw==", + "hasInstallScript": true, + "optional": true, + "dependencies": { + "color": "^4.2.3", + "detect-libc": "^2.0.3", + "semver": "^7.6.3" + }, + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-darwin-arm64": "0.33.5", + "@img/sharp-darwin-x64": "0.33.5", + "@img/sharp-libvips-darwin-arm64": "1.0.4", + "@img/sharp-libvips-darwin-x64": "1.0.4", + "@img/sharp-libvips-linux-arm": "1.0.5", + "@img/sharp-libvips-linux-arm64": "1.0.4", + "@img/sharp-libvips-linux-s390x": "1.0.4", + "@img/sharp-libvips-linux-x64": "1.0.4", + "@img/sharp-libvips-linuxmusl-arm64": "1.0.4", + "@img/sharp-libvips-linuxmusl-x64": "1.0.4", + "@img/sharp-linux-arm": "0.33.5", + "@img/sharp-linux-arm64": "0.33.5", + "@img/sharp-linux-s390x": "0.33.5", + "@img/sharp-linux-x64": "0.33.5", + "@img/sharp-linuxmusl-arm64": "0.33.5", + "@img/sharp-linuxmusl-x64": "0.33.5", + "@img/sharp-wasm32": "0.33.5", + "@img/sharp-win32-ia32": "0.33.5", + "@img/sharp-win32-x64": "0.33.5" + } + }, + "node_modules/shebang-command": { + "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" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/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, + "engines": { + "node": ">=8" + } + }, + "node_modules/side-channel": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", + "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", + "dev": true, + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3", + "side-channel-list": "^1.0.0", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-list": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", + "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", + "dev": true, + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "dev": true, + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-weakmap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", + "dev": true, + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/simple-swizzle": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", + "integrity": "sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==", + "optional": true, + "dependencies": { + "is-arrayish": "^0.3.1" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/stable-hash": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/stable-hash/-/stable-hash-0.0.4.tgz", + "integrity": "sha512-LjdcbuBeLcdETCrPn9i8AYAZ1eCtu4ECAWtP7UleOiZ9LzVxRzzUZEoZ8zB24nhkQnDWyET0I+3sWokSDS3E7g==", + "dev": true + }, + "node_modules/streamsearch": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz", + "integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==", + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dev": true, + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/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, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/string-width-cjs/node_modules/strip-ansi": { + "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" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string.prototype.includes": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/string.prototype.includes/-/string.prototype.includes-2.0.1.tgz", + "integrity": "sha512-o7+c9bW6zpAdJHTtujeePODAhkuicdAryFsfVKwA+wGw89wJ4GTY484WTucM9hLtDEOpOvI+aHnzqnC5lHp4Rg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.3" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/string.prototype.matchall": { + "version": "4.0.12", + "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.12.tgz", + "integrity": "sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.6", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.6", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "internal-slot": "^1.1.0", + "regexp.prototype.flags": "^1.5.3", + "set-function-name": "^2.0.2", + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.repeat": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/string.prototype.repeat/-/string.prototype.repeat-1.0.0.tgz", + "integrity": "sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==", + "dev": true, + "dependencies": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5" + } + }, + "node_modules/string.prototype.trim": { + "version": "1.2.10", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.10.tgz", + "integrity": "sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "define-data-property": "^1.1.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-object-atoms": "^1.0.0", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimend": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.9.tgz", + "integrity": "sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimstart": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", + "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "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" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi-cjs/node_modules/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, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/styled-jsx": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/styled-jsx/-/styled-jsx-5.1.6.tgz", + "integrity": "sha512-qSVyDTeMotdvQYoHWLNGwRFJHC+i+ZvdBRYosOFgC+Wg1vx4frN2/RG/NA7SYqqvKNLf39P2LSRA2pu6n0XYZA==", + "dependencies": { + "client-only": "0.0.1" + }, + "engines": { + "node": ">= 12.0.0" + }, + "peerDependencies": { + "react": ">= 16.8.0 || 17.x.x || ^18.0.0-0 || ^19.0.0-0" + }, + "peerDependenciesMeta": { + "@babel/core": { + "optional": true + }, + "babel-plugin-macros": { + "optional": true + } + } + }, + "node_modules/sucrase": { + "version": "3.35.0", + "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.0.tgz", + "integrity": "sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.2", + "commander": "^4.0.0", + "glob": "^10.3.10", + "lines-and-columns": "^1.1.6", + "mz": "^2.7.0", + "pirates": "^4.0.1", + "ts-interface-checker": "^0.1.9" + }, + "bin": { + "sucrase": "bin/sucrase", + "sucrase-node": "bin/sucrase-node" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "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/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, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/tailwindcss": { + "version": "3.4.17", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.17.tgz", + "integrity": "sha512-w33E2aCvSDP0tW9RZuNXadXlkHXqFzSkQew/aIa2i/Sj8fThxwovwlXHSPXTbAHwEIhBFXAedUhP2tueAKP8Og==", + "dev": true, + "dependencies": { + "@alloc/quick-lru": "^5.2.0", + "arg": "^5.0.2", + "chokidar": "^3.6.0", + "didyoumean": "^1.2.2", + "dlv": "^1.1.3", + "fast-glob": "^3.3.2", + "glob-parent": "^6.0.2", + "is-glob": "^4.0.3", + "jiti": "^1.21.6", + "lilconfig": "^3.1.3", + "micromatch": "^4.0.8", + "normalize-path": "^3.0.0", + "object-hash": "^3.0.0", + "picocolors": "^1.1.1", + "postcss": "^8.4.47", + "postcss-import": "^15.1.0", + "postcss-js": "^4.0.1", + "postcss-load-config": "^4.0.2", + "postcss-nested": "^6.2.0", + "postcss-selector-parser": "^6.1.2", + "resolve": "^1.22.8", + "sucrase": "^3.35.0" + }, + "bin": { + "tailwind": "lib/cli.js", + "tailwindcss": "lib/cli.js" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/tailwindcss/node_modules/fast-glob": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", + "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.8" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/tailwindcss/node_modules/fast-glob/node_modules/glob-parent": { + "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" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/tapable": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", + "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/thenify": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", + "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", + "dev": true, + "dependencies": { + "any-promise": "^1.0.0" + } + }, + "node_modules/thenify-all": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", + "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", + "dev": true, + "dependencies": { + "thenify": ">= 3.1.0 < 4" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/to-regex-range": { + "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" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/ts-api-utils": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.0.1.tgz", + "integrity": "sha512-dnlgjFSVetynI8nzgJ+qF62efpglpWRk8isUEWZGWlJYySCTD6aKvbUDu+zbPeDakk3bg5H4XpitHukgfL1m9w==", + "dev": true, + "engines": { + "node": ">=18.12" + }, + "peerDependencies": { + "typescript": ">=4.8.4" + } + }, + "node_modules/ts-interface-checker": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", + "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==", + "dev": true + }, + "node_modules/tsconfig-paths": { + "version": "3.15.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", + "integrity": "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==", + "dev": true, + "dependencies": { + "@types/json5": "^0.0.29", + "json5": "^1.0.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + } + }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==" + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/typed-array-buffer": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz", + "integrity": "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==", + "dev": true, + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/typed-array-byte-length": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.3.tgz", + "integrity": "sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.8", + "for-each": "^0.3.3", + "gopd": "^1.2.0", + "has-proto": "^1.2.0", + "is-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-byte-offset": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.4.tgz", + "integrity": "sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==", + "dev": true, + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "for-each": "^0.3.3", + "gopd": "^1.2.0", + "has-proto": "^1.2.0", + "is-typed-array": "^1.1.15", + "reflect.getprototypeof": "^1.0.9" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-length": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.7.tgz", + "integrity": "sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "is-typed-array": "^1.1.13", + "possible-typed-array-names": "^1.0.0", + "reflect.getprototypeof": "^1.0.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typescript": { + "version": "5.7.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.3.tgz", + "integrity": "sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/unbox-primitive": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.1.0.tgz", + "integrity": "sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==", + "dev": true, + "dependencies": { + "call-bound": "^1.0.3", + "has-bigints": "^1.0.2", + "has-symbols": "^1.1.0", + "which-boxed-primitive": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/undici-types": { + "version": "6.19.8", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", + "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==", + "dev": true + }, + "node_modules/uri-js": { + "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" + } + }, + "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 + }, + "node_modules/which": { + "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" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/which-boxed-primitive": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz", + "integrity": "sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==", + "dev": true, + "dependencies": { + "is-bigint": "^1.1.0", + "is-boolean-object": "^1.2.1", + "is-number-object": "^1.1.1", + "is-string": "^1.1.1", + "is-symbol": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-builtin-type": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.2.1.tgz", + "integrity": "sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==", + "dev": true, + "dependencies": { + "call-bound": "^1.0.2", + "function.prototype.name": "^1.1.6", + "has-tostringtag": "^1.0.2", + "is-async-function": "^2.0.0", + "is-date-object": "^1.1.0", + "is-finalizationregistry": "^1.1.0", + "is-generator-function": "^1.0.10", + "is-regex": "^1.2.1", + "is-weakref": "^1.0.2", + "isarray": "^2.0.5", + "which-boxed-primitive": "^1.1.0", + "which-collection": "^1.0.2", + "which-typed-array": "^1.1.16" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-collection": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz", + "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==", + "dev": true, + "dependencies": { + "is-map": "^2.0.3", + "is-set": "^2.0.3", + "is-weakmap": "^2.0.2", + "is-weakset": "^2.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-typed-array": { + "version": "1.1.18", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.18.tgz", + "integrity": "sha512-qEcY+KJYlWyLH9vNbsr6/5j59AXk5ni5aakf8ldzBvGde6Iz4sxZGkJyWSAueTG7QhOvNRYb1lDdFmL5Td0QKA==", + "dev": true, + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "for-each": "^0.3.3", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/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, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/wrap-ansi-cjs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/strip-ansi": { + "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" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/yaml": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.7.0.tgz", + "integrity": "sha512-+hSoy/QHluxmC9kCIJyL/uyFmLmc+e5CFR5Wa+bpIhIj85LVb9ZH2nVnqrHoSvKogwODv0ClqZkmiSSaIH5LTA==", + "dev": true, + "bin": { + "yaml": "bin.mjs" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + } + } +} diff --git a/next-app/package.json b/next-app/package.json index bfbfd201..279bf821 100644 --- a/next-app/package.json +++ b/next-app/package.json @@ -1,58 +1,27 @@ { - "name": "up-website", - "version": "2.0.0", - "private": false, - "license": "MIT", + "name": "next-app", + "version": "0.1.0", + "private": true, "scripts": { "dev": "next dev", "build": "next build", "start": "next start", - "export": "next export", - "eslint-check": "eslint @types src/*", - "eslint-fix": "eslint --fix @types src/*" + "lint": "next lint" }, "dependencies": { - "@emotion/babel-plugin": "^11.3.0", - "@emotion/cache": "^11.4.0", - "@emotion/css": "^11.1.3", - "@emotion/react": "^11.4.0", - "@emotion/styled": "^11.3.0", - "@fortawesome/fontawesome-svg-core": "^1.2.36", - "@fortawesome/free-solid-svg-icons": "^5.15.4", - "@fortawesome/react-fontawesome": "^0.1.15", - "axios": "^0.24.0", - "copy-to-clipboard": "^3.3.1", - "dotenv": "^10.0.0", - "imagemin-mozjpeg": "^9.0.0", - "imagemin-optipng": "^8.0.0", - "imagemin-svgo": "^10.0.0", - "lodash": "^4.17.21", - "next": "^12.0.7", - "next-optimized-images": "^2.6.2", - "react": "^17.0.2", - "react-circular-progressbar": "^2.0.4", - "react-countdown": "^2.3.2", - "react-dom": "^17.0.2", - "react-dropzone": "^11.3.4", - "react-new-window": "^0.2.1", - "react-qrcode-logo": "^2.5.0", - "react-query": "^3.32.3", - "react-toastify": "^8.0.3" + "react": "^19.0.0", + "react-dom": "^19.0.0", + "next": "15.1.6" }, "devDependencies": { - "@babel/core": "^7.14.3", - "@types/lodash": "^4.14.178", - "@types/node": "^16.11.7", - "@types/react": "^17.0.6", - "@types/react-stickynode": "^4.0.0", - "@typescript-eslint/eslint-plugin": "^5.4.0", - "@typescript-eslint/parser": "^5.4.0", - "babel-loader": "^8.2.2", - "eslint": "^8.2.0", - "eslint-config-prettier": "^8.3.0", - "eslint-plugin-prettier": "^4.0.0", - "file-loader": "^6.2.0", - "prettier": "^2.3.0", - "typescript": "^4.2.4" + "typescript": "^5", + "@types/node": "^20", + "@types/react": "^19", + "@types/react-dom": "^19", + "postcss": "^8", + "tailwindcss": "^3.4.1", + "eslint": "^9", + "eslint-config-next": "15.1.6", + "@eslint/eslintrc": "^3" } } diff --git a/next-app/postcss.config.mjs b/next-app/postcss.config.mjs new file mode 100644 index 00000000..1a69fd2a --- /dev/null +++ b/next-app/postcss.config.mjs @@ -0,0 +1,8 @@ +/** @type {import('postcss-load-config').Config} */ +const config = { + plugins: { + tailwindcss: {}, + }, +}; + +export default config; diff --git a/next-app/public/favicon.ico b/next-app/public/favicon.ico deleted file mode 100644 index e0c24d5b3ba8ad1f1a4f3385ebe6028b5b29d384..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 34203 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 TDR<%b27rT&v-K-0zxe+HmEotf diff --git a/next-app/public/file.svg b/next-app/public/file.svg new file mode 100644 index 00000000..004145cd --- /dev/null +++ b/next-app/public/file.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/next-app/public/globe.svg b/next-app/public/globe.svg new file mode 100644 index 00000000..567f17b0 --- /dev/null +++ b/next-app/public/globe.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/next-app/public/icons/icon-144x144.png b/next-app/public/icons/icon-144x144.png deleted file mode 100644 index 71bc52efe0652254e26f360821f38c73b73ce17d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13611 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 diff --git a/next-app/public/icons/icon-192x192.png b/next-app/public/icons/icon-192x192.png deleted file mode 100644 index bcbfdf23a61a83106495da8387a90ae88229c0de..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20524 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 z 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 O0KW|Z-uKt@vi=X?-vKlL diff --git a/next-app/public/icons/icon-48x48.png b/next-app/public/icons/icon-48x48.png deleted file mode 100644 index 79906aacdbbc9aec0468106f79ee680cfc7c9597..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3518 zcmV;v4MFmWP)w!fzFUz^l9+++1AKK7q4=fDX z<;81&`>pcA(^hHWm%z)I1M|NEeqfd6@3%{H*V_H_tNZ#lbh^LqoieQcb-qk-t@>PC z$DfVUzHAV;HE~VeXAQ3L2wPml{l`K2b*sEs#q-oXcm~;n8;Iw)=c1eM4dDCoB3Y%m zDzGb4ntLKsnqBYxKQsMneV)1Dh&ts9gd{Za4vxBKMXmy=?UEQ12028UQAeaJh;-F1 z&DRv>YF57lldf3(vvsR9OSlIy_)Y&TuxCkhCm^pRwwriQiP7m?3 z@%>IG${;LYlPXBp0L@B4e!tND3E4i5kdO zS!@Q+V*XTjex^&Uz_jF$!9L04r%vQ~CO_}Y{W|I;%>Udyv{6|^Mx5<3Pff%d(OyCt zL>u7G#Tf@eLwzpHR5416Vcdnt4=52+emw${%agZs|-iMNt& zCftm|v;)CNW1d!Hg@23jXu2>Zy__ygN>1tgghY#N78>NsF8O)PkI4h&$6c$e zM0|O|X%|z?$WI9dtU^FVJv;S3kl&!lPf9zb`o>!}ZOJ9?Q!5~I`cX~3+BWK%xD9ld z=YZK}lo;zIY>BlB{frrjZaIQveiDRT2o0WBVH+O*4GilQkQ~#F2v6iYw0%OzJp1ec zZ5xo+Q5Rm~9B~^Y(}fudX4X(wdNl=7j3J4x)F5@4jDZ%E8%UNYm>vYd35aNd(BOF` zBUfkQK&o#dqR3BlsBw%1%o{!BGg(NdPMhDiktTIMCmr=B^6YCSAL|*X?7$pd^{Fq> zEq6RXH{X7L3+`*iZ4U0GFMstOy7kTnX!B=op=54U5{EUs5E?vJBKpRk(H82&su`)? zQP)B`T`pX%4khGumCrT#W}mYq;<<4eU)V&i@7_jF?$^Y5XydU#@e7aid1XYKT$1=_awICpDkI?fkyeLUjDix~LYNrJL4PU!< z?}LCL$~dHZM_VEESi=h7nb9}#Y{0cprmUi$DJ|S2YZxvA)J9!OUT2w9-xTGB=IOon z{~<}#>va-BoDyoay8P|l{Rb#&4KXo-B{W79awE=M=zCQbf$7@`F zwX_m=Al)~z%2WHyU%oPVCznr4n7tF!ixoJ0Gd^(UBuZmk96*InlLy z&wfhwtaeG7n4biyYNggZr#JCj91X^MoHAvpyApXmA(76^-Z2Q6#R?p4y8_PVC!hKr zU2*k|bmQl?(DgTd5x7a>x*NVgH+=SHT7S-^6tl`p$!8fu9=P`eP&a$z^X~(u0rF>Q z@=oN%Qu0%ZJfDt*NiuU|lpCB~)t$uN>+bY&=zERa8%BVVLPqBESOkXfJ< zh$WlIt_Yz~S3-v_;1#${rp|s)A~(;!)7?-_H5VClL3-)8ueb+UYua=!CtdQz&rdI$M@G<+0?eKvO4wx(0cR}g?htDy^4BlD zOamk9D458Ri4}-zvd);WicM&I??SL3es%G#^nSsKehc}$hrDy#>mxpc&;D31oq7Hh z^oKwF#Y42V;%ZbXO33~<-lY7%1Vzj~L=)sQMU6rm=zCI3QD{+u-@Ck}%7p1U$a6>3 zL|#R|QE0jKNp4u?Z>w*F0ys%|Gj99l6I9hHbfwkc@uQE9%lX5PJdQMLViigh15t&1 z8>o9)kkF!7z|0Oy^`A9ZM|d-iLq64pyy+Z1IAqdDiJabypiO6-dnxUF?T_vXIA_Ar zVorVk^7b9HDq_PDAe7Fxps&q$c@YERO3?fK;^EI?9^Incm?d*y_W(p8_`6RL0BT?ptmtkyATjo=jS2jH&}t`JEeg9RF!+t zCBFBTxY{-jdA1LO^Lhs4Gr85&oyR;kM7}Uqz=Jk z_QVnak&GsmqnPQSrv>tRfoDWCm8K$Z$^5+(((ELPIHPT~ZCF{g-BKGu;H>Jy!u6E_ND*$_7RX8Q1%p@a;?&YC`RJG7w zG+t@vC$HfZ0Qs73poJTKiRN-QjuJRq9HS3DP%Y*0;}xpFB3`g%coRG1TMxCyCf-A< zLZ*kjy&Qx>cU3=oy;nd8(SKWa{dI1nQxeVAktHqa7p~#Ei=#`b(dE#t)%04(A52Q} z;kXT0?I1MjEC$cLgHgUCGSc~R^|~%Ueh1h35Kz(47p>ND>hhRXqAbed!-tQ2?55r+ zD_-6Cd+O|pks_9%P^>KkkGNk6%jc}SnKMS80m28`(~qc57GFEJ?de6}!x zmh!`sZXcIxH*dZD>&R9CSg2c*O)ErQ2>o4Mi#Y_unKQ-?!~2p50ycB0jObU@3ak;j zjdKsIA}9$6z$&h0x%6l?C9LPfPOAw9jx}lEN|u2zTgr zEziqU$PHJteS{NzxA{OR%N69}Sr^jAb1%Vxb&iBJs(m$zN9EUk*#sAVjLa0Ulhn*5;@Hl|5FY|hR= z0v?Z32YlYKDvARS@JGlOh*Ja`Gz4M|!by;HA@o=UaUS0bM3c4@5HUNog$%=eMaLp? zBR)OOBKpT=&69-)Wgl+k1b0QUsel00RA5ADn?x~|;Q9ne$RaF9@sx9-W~ImR|ErY9 znMK+`k#|XlB|tpEz;}rnkAZNaitiT{`K08C-!}d}fM|pCs1`BoSL2$CJY_?b?V|*g zWFx^V!1cK-anrgGll4mDM0N7IN`*S3I6l`=cZdg=a2UkHaR%n`sva4aEAk1yB5(34 zH2;wUQ8&<_==mC{667}_`X8zCVW7gjsE)qirXsFucPYRrwoDd~m8YgRw>uf8m3)As zj)(^|@jxghfJ!hN<9P+ROp*@ARpjCQCFC0-8h^ybfu%%bht|SA@5r|RcDV)tHP!k_ z0bHAVD#`ZIZ;)4;wTZkF^$-Y$V>J-3D)P~T!EkiWOJ1+S%73XuwB0#K%Oy)>2a{NV z=XewA4UBTOSc`FIr0jzVu~(?*_q30`whm_*-k<^YdYEk!=ZL$+gP|ys|5*@9`Txc} zzr!aGibG87#D6Ph5g@BY47%z;{%ZLDt%MZ8{?FGSpo-GAt_27kebFZR*qAac3cXS5 z>~l??RMaDH2ZE978ib?THZdchanhIBJ!B*t5#56w3A-#)7os0PLwz&sv)^gBc>_ne zPB(kF(5gW|9Y?;bUsM^8=EJCt=+`(cdZJG{>TiJfmabqZB-3Lk)&Vgxt>d1=$G)&} z9XlC_yt^8)RKbswc^Sw*1OFeC%?R&VyS(C(mo7H{t$fsEPQ@NAQ*Mu^+SlS zD-_Wy5Ro|T3&aumf}Zyq@W0P{ANGktz(%aV7OcQeAYeEAe-x>+1_3qL=U*Vd2M5)2 su+LWz{WB5yCO@!UK;Dfy<|oDN|C6FajTLO^bN~PV07*qoM6N<$f>6@J1^@s6 diff --git a/next-app/public/icons/icon-512x512.png b/next-app/public/icons/icon-512x512.png deleted file mode 100644 index 2e8583c1ef52f1004c0292b6e806bc415f97a43f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18121 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 diff --git a/next-app/public/icons/icon-96x96.png b/next-app/public/icons/icon-96x96.png deleted file mode 100644 index 6620dd569d521beae49ceda2e049c61a8d552cac..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8255 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 diff --git a/next-app/public/images/mainImage.jpg b/next-app/public/images/mainImage.jpg deleted file mode 100644 index 09146954c633a65cd3f65468bb3697c6218495eb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 40524 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 \ No newline at end of file diff --git a/next-app/public/robots.txt b/next-app/public/robots.txt deleted file mode 100644 index 38977874..00000000 --- a/next-app/public/robots.txt +++ /dev/null @@ -1,3 +0,0 @@ -# https://www.robotstxt.org/robotstxt.html -User-agent: * -Disallow: /u/ diff --git a/next-app/public/vercel.svg b/next-app/public/vercel.svg new file mode 100644 index 00000000..77053960 --- /dev/null +++ b/next-app/public/vercel.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/next-app/public/window.svg b/next-app/public/window.svg new file mode 100644 index 00000000..b2b2a44f --- /dev/null +++ b/next-app/public/window.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/next-app/src/api-client/const.ts b/next-app/src/api-client/const.ts deleted file mode 100644 index 3bfef799..00000000 --- a/next-app/src/api-client/const.ts +++ /dev/null @@ -1,7 +0,0 @@ -export const backendApiUrl = process.env.NEXT_PUBLIC_BACKEND_API_URL ?? '/api' - -export const ApiEndpoints: { [key in string]: string } = { - uploadFile: `${backendApiUrl}/upload`, - deleteFile: `${backendApiUrl}/u`, // /key - getApplicationConfiguration: `${backendApiUrl}/configuration` -} diff --git a/next-app/src/api-client/delete-file.ts b/next-app/src/api-client/delete-file.ts deleted file mode 100644 index 83ae32ac..00000000 --- a/next-app/src/api-client/delete-file.ts +++ /dev/null @@ -1,16 +0,0 @@ -import axios, { AxiosResponse } from 'axios' - -import { IDeleteFileRequest, IDeleteFileResponse } from '../../@types/api-client/deleteFile' -import { ApiEndpoints } from './const' -import { IAxiosRequest } from '../../@types/axios' - -const deleteFile = ( - payload: IDeleteFileRequest & IAxiosRequest -): Promise> => { - return axios.delete(`${ApiEndpoints.deleteFile}/${payload.key}`, { - ...payload.config, - data: payload.data - }) -} - -export default deleteFile diff --git a/next-app/src/api-client/get-configuration.ts b/next-app/src/api-client/get-configuration.ts deleted file mode 100644 index 4d16a0d8..00000000 --- a/next-app/src/api-client/get-configuration.ts +++ /dev/null @@ -1,15 +0,0 @@ -import axios, { AxiosResponse } from 'axios' -import { - IGetConfigurationRequest, - IGetConfigurationResponse -} from '../../@types/api-client/getConfiguration' -import { ApiEndpoints } from './const' -import { IAxiosRequest } from '../../@types/axios' - -const getConfiguration = ( - payload: IGetConfigurationRequest & IAxiosRequest -): Promise> => { - return axios.get(ApiEndpoints.getApplicationConfiguration, payload.config) -} - -export default getConfiguration diff --git a/next-app/src/api-client/index.ts b/next-app/src/api-client/index.ts deleted file mode 100644 index 770fd428..00000000 --- a/next-app/src/api-client/index.ts +++ /dev/null @@ -1,11 +0,0 @@ -import getConfiguration from './get-configuration' -import uploadFile from './upload-file' -import deleteFile from './delete-file' - -const APIClient = { - getConfiguration, - uploadFile, - deleteFile -} - -export default APIClient diff --git a/next-app/src/api-client/upload-file.ts b/next-app/src/api-client/upload-file.ts deleted file mode 100644 index d44146da..00000000 --- a/next-app/src/api-client/upload-file.ts +++ /dev/null @@ -1,17 +0,0 @@ -import axios, { AxiosResponse } from 'axios' - -import { IUploadFileRequest, IUploadFileResponse } from '../../@types/api-client/uploadFile' -import { ApiEndpoints } from './const' -import { IAxiosRequest } from '../../@types/axios' - -const uploadFile = ( - payload: IUploadFileRequest & IAxiosRequest -): Promise> => { - const data = new FormData() - data.append('file', payload.data.file) - data.append('expires', payload.data.expires?.toString() ?? undefined) - - return axios.post(ApiEndpoints.uploadFile, data, payload.config) -} - -export default uploadFile diff --git a/next-app/src/app/favicon.ico b/next-app/src/app/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..718d6fea4835ec2d246af9800eddb7ffb276240c GIT binary patch literal 25931 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 LrJugUA?W`A8`#=m literal 0 HcmV?d00001 diff --git a/next-app/src/app/globals.css b/next-app/src/app/globals.css new file mode 100644 index 00000000..6b717ad3 --- /dev/null +++ b/next-app/src/app/globals.css @@ -0,0 +1,21 @@ +@tailwind base; +@tailwind components; +@tailwind utilities; + +:root { + --background: #ffffff; + --foreground: #171717; +} + +@media (prefers-color-scheme: dark) { + :root { + --background: #0a0a0a; + --foreground: #ededed; + } +} + +body { + color: var(--foreground); + background: var(--background); + font-family: Arial, Helvetica, sans-serif; +} diff --git a/next-app/src/app/layout.tsx b/next-app/src/app/layout.tsx new file mode 100644 index 00000000..f7fa87eb --- /dev/null +++ b/next-app/src/app/layout.tsx @@ -0,0 +1,34 @@ +import type { Metadata } from "next"; +import { Geist, Geist_Mono } from "next/font/google"; +import "./globals.css"; + +const geistSans = Geist({ + variable: "--font-geist-sans", + subsets: ["latin"], +}); + +const geistMono = Geist_Mono({ + variable: "--font-geist-mono", + subsets: ["latin"], +}); + +export const metadata: Metadata = { + title: "Create Next App", + description: "Generated by create next app", +}; + +export default function RootLayout({ + children, +}: Readonly<{ + children: React.ReactNode; +}>) { + return ( + + + {children} + + + ); +} diff --git a/next-app/src/app/page.tsx b/next-app/src/app/page.tsx new file mode 100644 index 00000000..3eee0141 --- /dev/null +++ b/next-app/src/app/page.tsx @@ -0,0 +1,101 @@ +import Image from "next/image"; + +export default function Home() { + return ( + + ); +} diff --git a/next-app/src/assets/styleHelpers/centerBothSidesHelper.ts b/next-app/src/assets/styleHelpers/centerBothSidesHelper.ts deleted file mode 100644 index 38feb262..00000000 --- a/next-app/src/assets/styleHelpers/centerBothSidesHelper.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { css } from '@emotion/css' - -const centerBothSidesHelper = css` - display: flex; - justify-content: center; - align-items: center; -` - -export default centerBothSidesHelper diff --git a/next-app/src/assets/styleHelpers/childrenWithDotsHelper.ts b/next-app/src/assets/styleHelpers/childrenWithDotsHelper.ts deleted file mode 100644 index 79202117..00000000 --- a/next-app/src/assets/styleHelpers/childrenWithDotsHelper.ts +++ /dev/null @@ -1,22 +0,0 @@ -import { css } from '@emotion/css' -import { Theme } from '@emotion/react' - -const childrenWithDotsHelper = (theme: Theme) => css` - > *:not(:first-of-type) { - position: relative; - margin-left: 25px; - - &::before { - content: 'â—‹'; - position: absolute; - left: calc(-16px); - height: 13px; - display: flex; - align-items: center; - font-size: 13px; - color: ${theme.colors.upNeutralFillNight}; - } - } -` - -export default childrenWithDotsHelper diff --git a/next-app/src/assets/styleHelpers/hoverExpandableElementHelper.ts b/next-app/src/assets/styleHelpers/hoverExpandableElementHelper.ts deleted file mode 100644 index 9847cb1e..00000000 --- a/next-app/src/assets/styleHelpers/hoverExpandableElementHelper.ts +++ /dev/null @@ -1,22 +0,0 @@ -import { css } from '@emotion/css' - -import { ExpandableElement } from '../../components/elements/ExpandableElement' -import { StaticSizeElement, padding } from '../../components/elements/ExpandableBalloon' - -const hoverExpandableElementHelper = (props: { width: number; height: number }) => css` - position: relative; - - ${StaticSizeElement} { - width: ${props.width - 2 * padding}px; - height: ${props.height - 2 * padding}px; - } - - &:hover { - ${ExpandableElement} { - width: ${props.width}px; - height: ${props.height}px; - } - } -` - -export default hoverExpandableElementHelper diff --git a/next-app/src/assets/styleHelpers/index.ts b/next-app/src/assets/styleHelpers/index.ts deleted file mode 100644 index ae433376..00000000 --- a/next-app/src/assets/styleHelpers/index.ts +++ /dev/null @@ -1,11 +0,0 @@ -import centerBothSidesHelper from './centerBothSidesHelper' -import childrenWithDotsHelper from './childrenWithDotsHelper' -import hoverExpandableElementHelper from './hoverExpandableElementHelper' - -const styleHelpers = { - centerBothSides: centerBothSidesHelper, - childrenWithDots: childrenWithDotsHelper, - hoverExpandableElement: hoverExpandableElementHelper -} - -export default styleHelpers diff --git a/next-app/src/assets/theme/breakpoints.ts b/next-app/src/assets/theme/breakpoints.ts deleted file mode 100644 index c2c35433..00000000 --- a/next-app/src/assets/theme/breakpoints.ts +++ /dev/null @@ -1,9 +0,0 @@ -const breakpoints = { - xs: '576px', - sm: '636px', - md: '768px', - lg: '992px', - xl: '1200px' -} - -export default breakpoints diff --git a/next-app/src/assets/theme/colors.ts b/next-app/src/assets/theme/colors.ts deleted file mode 100644 index 127617fc..00000000 --- a/next-app/src/assets/theme/colors.ts +++ /dev/null @@ -1,227 +0,0 @@ -export type TColor = - | 'transparent' - | 'upBase01' - | 'upBase02' - | 'upBase03' - | 'upBase04' - | 'upBase05' - | 'upBase06' - | 'upBase07' - | 'upBase08' - | 'upBase09' - | 'upPrimary' - | 'upPrimaryHover' - | 'upPrimaryActive' - | 'upPrimaryText' - | 'upSecondary' - | 'upSecondaryHover' - | 'upSecondaryActive' - | 'upAccent' - | 'upAccentHover' - | 'upAccentActive' - | 'upAccentText' - | 'upSelection' - | 'upFocus' - | 'upClear' - | 'upClearDisabled' - | 'upClearHover' - | 'upClearActive' - | 'upClearInverse' - | 'upClearInverseHover' - | 'upClearInverseActive' - | 'upErrorFill' - | 'upErrorBg' - | 'upErrorBgHover' - | 'upSuccessFill' - | 'upSuccessBg' - | 'upSuccessBgHover' - | 'upWarningFill' - | 'upWarningBg' - | 'upWarningBgHover' - | 'upInfoFill' - | 'upInfoBg' - | 'upInfoBgHover' - | 'upNeutralFill' - | 'upNeutralBg' - | 'upNeutralBgHover' - | 'upText01' - | 'upText02' - | 'upText03' - | 'upLink' - | 'upLinkHover' - | 'upPositive' - | 'upPositiveHover' - | 'upNegative' - | 'upNegativeHover' - | 'upErrorFillNight' - | 'upErrorBgNight' - | 'upErrorBgNightHover' - | 'upSuccessFillNight' - | 'upSuccessBgNight' - | 'upSuccessBgNightHover' - | 'upWarningFillNight' - | 'upWarningBgNight' - | 'upWarningBgNightHover' - | 'upInfoFillNight' - | 'upInfoBgNight' - | 'upInfoBgNightHover' - | 'upNeutralFillNight' - | 'upNeutralBgNight' - | 'upNeutralBgNightHover' - | 'upText01Night' - | 'upText02Night' - | 'upText03Night' - | 'upLinkNight' - | 'upLinkNightHover' - | 'upPositiveNight' - | 'upPositiveNightHover' - | 'upNegativeNight' - | 'upNegativeNightHover' - | 'upSupport01' - | 'upSupport02' - | 'upSupport03' - | 'upSupport04' - | 'upSupport05' - | 'upSupport06' - | 'upSupport07' - | 'upSupport08' - | 'upSupport09' - | 'upSupport10' - | 'upSupport11' - | 'upSupport12' - | 'upSupport13' - | 'upSupport14' - | 'upSupport15' - | 'upSupport16' - | 'upSupport17' - | 'upSupport18' - | 'upSupport19' - | 'upSupport20' - | 'upSupport21' - | 'upSupport22' - | 'upBackground' - | 'mako' - | 'shark' - | 'timberwolf' - -/** - List of possible colors in your app. - This is used for better color management and suggestions from your *Editor*. - **/ - -const colors: { - [index in TColor]: string -} = { - transparent: 'transparent', - upBase01: '#ffffff', - upBase02: '#f6f6f6', - upBase03: '#ededed', // basic border - upBase04: '#d7d7d7', // hovered borders - upBase05: '#b0b0b0', // interface icons - upBase06: '#959595', // hovered interface icons - upBase07: '#808080', // inverted background - upBase08: '#333', // dark interface icons - upBase09: '#000', // icons on inverted background - upPrimary: '#6c86e2', // primary buttons, background - upPrimaryHover: '#526ed3', // primary buttons hover - upPrimaryActive: '#314692', // primary buttons hover - upPrimaryText: '#fff', // text on primary background - upSecondary: '#ebefff', // inputs and secondary buttons - upSecondaryHover: '#dfe3f3', // inputs and secondary buttons hover - upSecondaryActive: '#d8ddf2', // inputs and secondary buttons pressed - upAccent: '#ff8078', // fill and outline of accent elements - upAccentHover: '#ff9a94', // accent elements hover - upAccentActive: '#e7716a', // accent elements pressed - upAccentText: '#fff', // text on accent background - upSelection: 'rgba(112, 182, 246, 0.12)', // selected text background - upFocus: 'rgba(51, 51, 51, 0.64)', // focus ring color - upClear: 'rgba(0, 0, 0, 0.08)', // translucent dark fill - upClearDisabled: 'rgba(0, 0, 0, 0.04)', // translucent dark fill disabled - upClearHover: 'rgba(0, 0, 0, 0.16)', // translucent dark fill hover - upClearActive: 'rgba(0, 0, 0, 0.2)', // translucent dark fill pressed - upClearInverse: 'rgba(255, 255, 255, 0.16)', // translucent light fill - upClearInverseHover: 'rgba(255, 255, 255, 0.24)', // translucent light fill hover - upClearInverseActive: 'rgba(255, 255, 255, 0.4)', // translucent light fill pressed - // Statuses - upErrorFill: 'rgba(244, 87, 37, 1)', // icons and decorative elements with error status - upErrorBg: 'rgba(244, 87, 37, 0.12)', // translucent error background - upErrorBgHover: 'rgba(244, 87, 37, 0.24)', // translucent hover error background - upSuccessFill: 'rgba(74, 201, 155, 1)', // icon and decorative elements with success status - upSuccessBg: 'rgba(74, 201, 155, 0.12)', // translucent success background - upSuccessBgHover: 'rgba(74, 201, 155, 0.24)', // translucent success hover - upWarningFill: 'rgba(255, 199, 0, 1)', // icon and decorative elements with warning status - upWarningBg: 'rgba(255, 199, 0, 0.12)', // translucent warning background - upWarningBgHover: 'rgba(255, 199, 0, 0.24)', // translucent warning background - upInfoFill: 'rgba(112, 182, 246, 1)', // icon and decorative elements with info status - upInfoBg: 'rgba(112, 182, 246, 0.12)', // translucent info background - upInfoBgHover: 'rgba(112, 182, 246, 0.24)', // translucent info background - upNeutralFill: 'rgb(121, 129, 140)', // icon and decorative elements with neutral status - upNeutralBg: 'rgba(121, 129, 140, 0.12)', // translucent info background - upNeutralBgHover: 'rgba(121, 129, 140, 0.24)', // translucent info background - // Text - upText01: 'rgba(27, 31, 59, 1)', - upText02: 'rgba(27, 31, 59, 0.65)', - upText03: 'rgba(27, 31, 59, 0.4)', - upLink: '#526ed3', - upLinkHover: '#6c86e2', - upPositive: '#3aa981', - upPositiveHover: '#7ac5aa', - upNegative: '#dd4c1e', - upNegativeHover: '#e38163', - // Modifiers for dark background - upErrorFillNight: 'rgba(255, 140, 103, 1)', - upErrorBgNight: 'rgba(244, 87, 37, 0.32)', - upErrorBgNightHover: 'rgba(244, 87, 37, 0.4)', - upSuccessFillNight: 'rgb(74, 201, 155)', - upSuccessBgNight: 'rgba(74, 201, 155, 0.32)', - upSuccessBgNightHover: 'rgba(74, 201, 155, 0.4)', - upWarningFillNight: 'rgb(255, 199, 0)', - upWarningBgNight: 'rgba(255, 199, 0, 0.32)', - upWarningBgNightHover: 'rgba(255, 199, 0, 0.4)', - upInfoFillNight: 'rgb(112, 182, 246)', - upInfoBgNight: 'rgba(112, 182, 246, 0.32)', - upInfoBgNightHover: 'rgba(112, 182, 246, 0.4)', - upNeutralFillNight: 'rgb(149, 155, 164)', - upNeutralBgNight: 'rgb(149, 155, 164, 0.32)', - upNeutralBgNightHover: 'rgb(149, 155, 164, 0.48)', - // - upText01Night: 'rgba(255, 255, 255, 1)', - upText02Night: 'rgba(255, 255, 255, 0.72)', - upText03Night: 'rgba(255, 255, 255, 0.6)', - upLinkNight: '#6788ff', - upLinkNightHover: '#526ed3', - upPositiveNight: '#44c596', - upPositiveNightHover: '#3aa981', - upNegativeNight: '#e02711', - upNegativeNightHover: '#bb593a', - // - upSupport01: '#a8cef1', - upSupport02: '#3682db', - upSupport03: '#8dda71', - upSupport04: '#34b41f', - upSupport05: '#e29398', - upSupport06: '#b8474e', - upSupport07: '#fcc068', - upSupport08: '#ff8a00', - upSupport09: '#dab3f9', - upSupport10: '#7b439e', - upSupport11: '#fee797', - upSupport12: '#fcbb14', - upSupport13: '#ea97c4', - upSupport14: '#bd65a4', - upSupport15: '#7fd7cc', - upSupport16: '#2fad96', - upSupport17: '#d4aca2', - upSupport18: '#9d6f64', - upSupport19: '#d2e9a2', - upSupport20: '#aadc42', - upSupport21: '#a0c5df', - upSupport22: '#3c7ba8', - // Project custom - upBackground: '#1a1b1c', - mako: '#434755', - shark: '#1F2229', - timberwolf: '#DAD7D2' -} - -export default colors diff --git a/next-app/src/assets/theme/constants.ts b/next-app/src/assets/theme/constants.ts deleted file mode 100644 index 255c6371..00000000 --- a/next-app/src/assets/theme/constants.ts +++ /dev/null @@ -1,11 +0,0 @@ -const constants = { - containerSizes: { - xs: '0px', - sm: '600px', - md: '720px', - lg: '960px', - xl: '1140px' - } -} - -export default constants diff --git a/next-app/src/assets/theme/gradients.ts b/next-app/src/assets/theme/gradients.ts deleted file mode 100644 index e60a5a5e..00000000 --- a/next-app/src/assets/theme/gradients.ts +++ /dev/null @@ -1,3 +0,0 @@ -const gradients = {} - -export default gradients diff --git a/next-app/src/assets/theme/index.ts b/next-app/src/assets/theme/index.ts deleted file mode 100644 index d3c76103..00000000 --- a/next-app/src/assets/theme/index.ts +++ /dev/null @@ -1,28 +0,0 @@ -import breakpoints from './breakpoints' -import colors from './colors' -import constants from './constants' -import gradients from './gradients' -import shadows from './shadows' -import transitions from './transitions' - -export interface ITheme { - name: string - breakpoints: typeof breakpoints - colors: typeof colors - constants: typeof constants - gradients: typeof gradients - shadows: typeof shadows - transitions: typeof transitions -} - -const theme = { - name: 'Default theme', - breakpoints, - colors, - constants, - gradients, - shadows, - transitions -} - -export default theme diff --git a/next-app/src/assets/theme/shadows.ts b/next-app/src/assets/theme/shadows.ts deleted file mode 100644 index 3a04692f..00000000 --- a/next-app/src/assets/theme/shadows.ts +++ /dev/null @@ -1,6 +0,0 @@ -const shadows = { - light: '0px 16px 20px rgba(203, 221, 236, 0.5)', - strong: '0px 16px 50px rgba(11, 46, 142, 0.25)' -} - -export default shadows diff --git a/next-app/src/assets/theme/transitions.ts b/next-app/src/assets/theme/transitions.ts deleted file mode 100644 index 1945fd36..00000000 --- a/next-app/src/assets/theme/transitions.ts +++ /dev/null @@ -1,7 +0,0 @@ -const transitions = { - quick: '100ms', - normal: '250ms', - slow: '400ms' -} - -export default transitions diff --git a/next-app/src/components/blocks/Box/BackgroundBox.ts b/next-app/src/components/blocks/Box/BackgroundBox.ts deleted file mode 100644 index 39aaa152..00000000 --- a/next-app/src/components/blocks/Box/BackgroundBox.ts +++ /dev/null @@ -1,19 +0,0 @@ -import styled from '@emotion/styled' - -const BackgroundBox = styled('div')` - position: absolute; - width: calc(100% + 25px); - height: calc(100% - 35px); - border-radius: 8px; - top: 35px; - left: 10px; - background: ${(props) => props.theme.colors.shark}; - z-index: -1; - opacity: 0.7; - - @media (max-width: ${(props) => props.theme.breakpoints.sm}) { - left: -12.5px; - } -` - -export default BackgroundBox diff --git a/next-app/src/components/blocks/Box/Content.ts b/next-app/src/components/blocks/Box/Content.ts deleted file mode 100644 index 90f3f5c0..00000000 --- a/next-app/src/components/blocks/Box/Content.ts +++ /dev/null @@ -1,19 +0,0 @@ -import styled from '@emotion/styled' - -const Content = styled('div')` - position: relative; - display: grid; - grid-template-columns: 1fr 2fr; - grid-column-gap: 25px; - grid-row-gap: 25px; - background: ${(props) => props.theme.colors.mako}; - border-radius: 8px; - padding: 25px; - z-index: 1; - - @media (max-width: ${(props) => props.theme.breakpoints.md}) { - grid-template-columns: 1fr; - } -` - -export default Content diff --git a/next-app/src/components/blocks/Box/Image.ts b/next-app/src/components/blocks/Box/Image.ts deleted file mode 100644 index 3dad4b96..00000000 --- a/next-app/src/components/blocks/Box/Image.ts +++ /dev/null @@ -1,19 +0,0 @@ -import styled from '@emotion/styled' - -const Image = styled('img')` - width: 100%; - // For now this is best fast solution - height: 300px; - background-color: rgb(31, 34, 41); - border-radius: 8px; - object-fit: cover; - transition: opacity 500ms ease 0s; - user-select: none; - -webkit-user-drag: none; - - @media (max-width: ${(props) => props.theme.breakpoints.md}) { - display: none; - } -` - -export default Image diff --git a/next-app/src/components/blocks/Box/TransparentBar.ts b/next-app/src/components/blocks/Box/TransparentBar.ts deleted file mode 100644 index 8081df22..00000000 --- a/next-app/src/components/blocks/Box/TransparentBar.ts +++ /dev/null @@ -1,13 +0,0 @@ -import styled from '@emotion/styled' - -const TransparentBar = styled('div')` - display: grid; - padding: 15px 25px; - grid-template-columns: 1fr 1fr; - - @media (max-width: ${(props) => props.theme.breakpoints.sm}) { - grid-template-columns: 1fr; - } -` - -export default TransparentBar diff --git a/next-app/src/components/blocks/Box/index.ts b/next-app/src/components/blocks/Box/index.ts deleted file mode 100644 index 706c6722..00000000 --- a/next-app/src/components/blocks/Box/index.ts +++ /dev/null @@ -1,42 +0,0 @@ -import styled from '@emotion/styled' - -import Content from './Content' -import Image from './Image' -import TransparentBar from './TransparentBar' -import BackgroundBox from './BackgroundBox' - -const Box = styled('div')` - position: relative; - width: ${(props) => props.theme.constants.containerSizes.md}; - margin: 0 auto; - min-height: 1px; - transition: 1000ms margin; - - @media (max-width: ${(props) => props.theme.breakpoints.lg}) { - width: ${(props) => props.theme.constants.containerSizes.sm}; - } - - @media (max-width: ${(props) => props.theme.breakpoints.md}) { - width: calc(100% - 50px); - } - - @media (max-width: ${(props) => props.theme.breakpoints.xs}) { - margin: 0 25px; - } -` - -type BoxProps = typeof Box & { - BackgroundBox: typeof BackgroundBox - Content: typeof Content - Image: typeof Image - TransparentBar: typeof TransparentBar -} - -const BoxProps = Box as BoxProps - -BoxProps.BackgroundBox = BackgroundBox -BoxProps.Content = Content -BoxProps.Image = Image -BoxProps.TransparentBar = TransparentBar - -export default BoxProps diff --git a/next-app/src/components/blocks/Boxes/DefaultUploadBox/index.ts b/next-app/src/components/blocks/Boxes/DefaultUploadBox/index.ts deleted file mode 100644 index 83777d43..00000000 --- a/next-app/src/components/blocks/Boxes/DefaultUploadBox/index.ts +++ /dev/null @@ -1,19 +0,0 @@ -import styled from '@emotion/styled' - -const DefaultUploadBox = styled('div')` - display: flex; - flex-direction: column; - justify-content: center; - align-items: center; - padding: 0 45px; - - @media (max-width: ${(props) => props.theme.breakpoints.lg}) { - padding: 0 25px; - } - - @media (max-width: ${(props) => props.theme.breakpoints.md}) { - padding: 0; - } -` - -export default DefaultUploadBox diff --git a/next-app/src/components/blocks/Boxes/FileUploadedBox/index.ts b/next-app/src/components/blocks/Boxes/FileUploadedBox/index.ts deleted file mode 100644 index b9f2d33e..00000000 --- a/next-app/src/components/blocks/Boxes/FileUploadedBox/index.ts +++ /dev/null @@ -1,25 +0,0 @@ -import styled from '@emotion/styled' - -const FileUploadedBox = styled('div')` - display: grid; - grid-template-columns: 1fr; - grid-template-rows: 128px auto 40px; - grid-row-gap: 20px; - - padding: 0 45px; - - @media (max-width: ${(props) => props.theme.breakpoints.lg}) { - padding: 0 25px; - } - - @media (max-width: ${(props) => props.theme.breakpoints.md}) { - padding: 0; - } - - @media (max-width: ${(props) => props.theme.breakpoints.sm}) { - grid-template-rows: auto 1fr auto; - grid-row-gap: 10px; - } -` - -export default FileUploadedBox diff --git a/next-app/src/components/blocks/HomePage/index.ts b/next-app/src/components/blocks/HomePage/index.ts deleted file mode 100644 index d08a01ec..00000000 --- a/next-app/src/components/blocks/HomePage/index.ts +++ /dev/null @@ -1,15 +0,0 @@ -import styled from '@emotion/styled' - -const HomePage = styled('div')` - margin-top: 160px; - - @media (max-width: ${(props) => props.theme.breakpoints.md}) { - margin-top: 120px; - } - - @media (max-width: ${(props) => props.theme.breakpoints.sm}) { - margin-top: 40px; - } -` - -export default HomePage diff --git a/next-app/src/components/blocks/Page/Content.ts b/next-app/src/components/blocks/Page/Content.ts deleted file mode 100644 index 92a85716..00000000 --- a/next-app/src/components/blocks/Page/Content.ts +++ /dev/null @@ -1,11 +0,0 @@ -import styled from '@emotion/styled' - -const Content = styled('main')` - position: relative; - grid-area: content; - min-height: 125px; - z-index: 1; - transition: 400ms all; -` - -export default Content diff --git a/next-app/src/components/blocks/Page/index.ts b/next-app/src/components/blocks/Page/index.ts deleted file mode 100644 index 0d722fee..00000000 --- a/next-app/src/components/blocks/Page/index.ts +++ /dev/null @@ -1,31 +0,0 @@ -import styled from '@emotion/styled' - -import Content from './Content' - -const Page = styled('div')` - display: grid; - min-height: 100vh; - width: 100%; - - grid-template-columns: auto; - grid-template-areas: 'content'; - grid-template-rows: 1fr; - - @media (max-width: ${(props) => props.theme.breakpoints.md}) { - grid-template-columns: 100%; - } - - @media (max-width: ${(props) => props.theme.breakpoints.sm}) { - grid-template-rows: 5px auto auto; - } -` - -type PageProps = typeof Page & { - Content: typeof Content -} - -const PageBlock = Page as PageProps - -PageBlock.Content = Content - -export default PageBlock diff --git a/next-app/src/components/elements/AlignedDiv.ts b/next-app/src/components/elements/AlignedDiv.ts deleted file mode 100644 index 65f7a241..00000000 --- a/next-app/src/components/elements/AlignedDiv.ts +++ /dev/null @@ -1,17 +0,0 @@ -import styled from '@emotion/styled' - -const AlignedDiv = styled('div')<{ align?: 'flex-start' | 'flex-end' }>` - display: flex; - justify-content: ${(props) => props.align}; - align-items: center; - - @media (max-width: ${(props) => props.theme.breakpoints.sm}) { - justify-content: center; - } -` - -AlignedDiv.defaultProps = { - align: 'flex-start' -} - -export default AlignedDiv diff --git a/next-app/src/components/elements/Button/ButtonText.ts b/next-app/src/components/elements/Button/ButtonText.ts deleted file mode 100644 index 01f553dc..00000000 --- a/next-app/src/components/elements/Button/ButtonText.ts +++ /dev/null @@ -1,18 +0,0 @@ -import styled from '@emotion/styled' - -import theme from '../../../assets/theme' -import { changeOpacityOnLoading } from './LoaderContainer' -import { colorStates } from './variants/_colorVariants' - -const ButtonText = styled('span')<{ isLoading?: boolean; colorStates: colorStates }>` - font-weight: bold; - font-size: 16px; - line-height: 25px; - text-align: center; - overflow-wrap: break-word; - transition: all ${theme.transitions.normal}; - - ${(props) => props.isLoading && changeOpacityOnLoading}; -` - -export default ButtonText diff --git a/next-app/src/components/elements/Button/IconContainer.ts b/next-app/src/components/elements/Button/IconContainer.ts deleted file mode 100644 index 3b37210f..00000000 --- a/next-app/src/components/elements/Button/IconContainer.ts +++ /dev/null @@ -1,21 +0,0 @@ -import styled from '@emotion/styled' - -import theme from '../../../assets/theme' -import { changeOpacityOnLoading } from './LoaderContainer' - -const IconContainer = styled('div')<{ - disableMargin?: boolean - iconAlign?: 'left' | 'right' - isLoading?: boolean -}>` - display: flex; - justify-content: center; - align-items: center; - margin: ${(props) => - props.disableMargin ? '0' : props.iconAlign === 'left' ? '0 10px 0 0' : '0 0 0 10px'}; - transition: ${theme.transitions.normal}; - - ${(props) => props.isLoading && changeOpacityOnLoading}; -` - -export default IconContainer diff --git a/next-app/src/components/elements/Button/LoaderContainer.ts b/next-app/src/components/elements/Button/LoaderContainer.ts deleted file mode 100644 index f914f73e..00000000 --- a/next-app/src/components/elements/Button/LoaderContainer.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { css } from '@emotion/react' -import styled from '@emotion/styled' - -const LoaderContainer = styled('div')<{ isLoading?: boolean }>` - position: absolute; - top: 0; - right: 0; - bottom: 0; - left: 0; - display: ${(props) => (props.isLoading ? 'flex' : 'none')}; - justify-content: center; - align-items: center; -` - -export const changeOpacityOnLoading = css` - opacity: 0.5; -` - -export default LoaderContainer diff --git a/next-app/src/components/elements/Button/StyledButton.ts b/next-app/src/components/elements/Button/StyledButton.ts deleted file mode 100644 index fba85520..00000000 --- a/next-app/src/components/elements/Button/StyledButton.ts +++ /dev/null @@ -1,19 +0,0 @@ -import styled from '@emotion/styled' - -import { colorStates } from './variants/_colorVariants' - -const StyledButton = styled('div')<{ - disabled?: boolean - iconAlign?: 'left' | 'right' - colorStates: colorStates -}>` - position: relative; - display: flex; - justify-content: center; - align-items: center; - cursor: pointer; - user-select: none; - flex-direction: ${(props) => (props.iconAlign === 'left' ? 'row' : 'row-reverse')}; -` - -export default StyledButton diff --git a/next-app/src/components/elements/Button/StyledLink.ts b/next-app/src/components/elements/Button/StyledLink.ts deleted file mode 100644 index 5d04c2ea..00000000 --- a/next-app/src/components/elements/Button/StyledLink.ts +++ /dev/null @@ -1,7 +0,0 @@ -import styled from '@emotion/styled' - -const StyledLink = styled('a')` - text-decoration: none; -` - -export default StyledLink diff --git a/next-app/src/components/elements/Button/index.tsx b/next-app/src/components/elements/Button/index.tsx deleted file mode 100644 index 8e577c82..00000000 --- a/next-app/src/components/elements/Button/index.tsx +++ /dev/null @@ -1,87 +0,0 @@ -import React, { useMemo } from 'react' -import Link, { LinkProps } from 'next/link' - -import variants, { possibleVariants } from './variants' -import IconContainer from './IconContainer' -import StyledLink from './StyledLink' -import LoaderContainer from './LoaderContainer' -import colorVariants, { colorStates } from './variants/_colorVariants' - -interface IButtonProps { - children?: React.ReactNode - icon?: React.ReactNode - iconAlign?: 'left' | 'right' - variant?: possibleVariants - colorStates?: colorStates - link?: LinkProps - loader?: React.ReactNode - isLoading?: boolean - linkProps?: Record - buttonProps?: Record - textProps?: Record - iconProps?: Record - disabled?: boolean -} - -/** - * @example - * - **/ -const Button = ({ children, variant, ...props }: IButtonProps) => { - const Variant = useMemo(() => { - return variants[variant] - }, [variant]) - - const ButtonComponent = () => ( - - {props.loader} - {props.icon && ( - - {props.icon} - - )} - {children && ( - - {children} - - )} - - ) - - if (props.link) { - return ( - - - - - - ) - } - - return -} - -const defaultProps: IButtonProps = { - children: 'Click me!', - icon: null, - iconAlign: 'right', - variant: 'primary', - link: undefined, - loader: null, - isLoading: false, - linkProps: {}, - buttonProps: {}, - textProps: {} -} - -Button.defaultProps = defaultProps - -export default Button diff --git a/next-app/src/components/elements/Button/variants/_colorVariants.ts b/next-app/src/components/elements/Button/variants/_colorVariants.ts deleted file mode 100644 index 7895001b..00000000 --- a/next-app/src/components/elements/Button/variants/_colorVariants.ts +++ /dev/null @@ -1,53 +0,0 @@ -import { TColor } from '../../../../assets/theme/colors' - -export type colorStates = { - unset: TColor - hover: TColor - active: TColor - focus: TColor - disabled: TColor -} - -interface colorVariant { - [key: string]: colorStates -} - -const colorVariants: colorVariant = { - primary: { - unset: 'shark', - hover: 'shark', - active: 'shark', - focus: 'shark', - disabled: 'shark' - }, - secondary: { - unset: 'upPositive', - hover: 'upPositiveHover', - active: 'upPositiveHover', - focus: 'upPositiveHover', - disabled: 'upSuccessBgNight' - }, - transparent: { - unset: 'transparent', - hover: 'transparent', - active: 'transparent', - focus: 'transparent', - disabled: 'transparent' - }, - fluffy: { - unset: 'upPrimary', - hover: 'upPrimaryHover', - active: 'upPrimaryActive', - focus: 'upPrimaryActive', - disabled: 'upPrimaryActive' - }, - dangerous: { - unset: 'upNegative', - hover: 'upNegativeNight', - active: 'upNegativeHover', - focus: 'upNegativeHover', - disabled: 'upErrorBgNight' - } -} - -export default colorVariants diff --git a/next-app/src/components/elements/Button/variants/index.ts b/next-app/src/components/elements/Button/variants/index.ts deleted file mode 100644 index 4cb93351..00000000 --- a/next-app/src/components/elements/Button/variants/index.ts +++ /dev/null @@ -1,33 +0,0 @@ -import StyledButton from '../StyledButton' -import ButtonText from '../ButtonText' - -import PrimaryStyledButton from './primary/PrimaryStyledButton' -import PrimaryButtonText from './primary/PrimaryButtonText' -import UploadDashedButton from './uploadDashed/UploadDashedButton' -import UploadDashedButtonText from './uploadDashed/UploadDashedButtonText' -import TransparentStyledButton from './transparent/TransparentStyledButton' -import TransparentButtonText from './transparent/TransparentButtonText' - -export type possibleVariants = 'primary' | 'uploadDashed' | 'transparent' - -type TVariant = { - Button: typeof StyledButton - Text: typeof ButtonText -} - -const variants: { [index in possibleVariants]: TVariant } = { - primary: { - Button: PrimaryStyledButton, - Text: PrimaryButtonText - }, - uploadDashed: { - Button: UploadDashedButton, - Text: UploadDashedButtonText - }, - transparent: { - Button: TransparentStyledButton, - Text: TransparentButtonText - } -} - -export default variants diff --git a/next-app/src/components/elements/Button/variants/primary/PrimaryButtonText.ts b/next-app/src/components/elements/Button/variants/primary/PrimaryButtonText.ts deleted file mode 100644 index b04b179a..00000000 --- a/next-app/src/components/elements/Button/variants/primary/PrimaryButtonText.ts +++ /dev/null @@ -1,11 +0,0 @@ -import styled from '@emotion/styled' - -import ButtonText from '../../ButtonText' - -const PrimaryButtonText = styled(ButtonText)` - color: ${(props) => props.theme.colors.upBase03}; - font-weight: normal; - line-height: 1; -` - -export default PrimaryButtonText diff --git a/next-app/src/components/elements/Button/variants/primary/PrimaryStyledButton.ts b/next-app/src/components/elements/Button/variants/primary/PrimaryStyledButton.ts deleted file mode 100644 index 37898e39..00000000 --- a/next-app/src/components/elements/Button/variants/primary/PrimaryStyledButton.ts +++ /dev/null @@ -1,41 +0,0 @@ -import { css, Theme } from '@emotion/react' -import styled from '@emotion/styled' - -import hexToRGB from '../../../../../utils/hexToRGB' -import StyledButton from '../../StyledButton' -import { colorStates } from '../_colorVariants' - -const disabledStyle = (props: { theme: Theme; colorStates: colorStates }) => css` - box-shadow: unset; - background: ${props.theme.colors[props.colorStates.disabled]}; - border-color: ${props.theme.colors[props.colorStates.disabled]}; - cursor: default; - - &:hover { - box-shadow: unset; - background: ${props.theme.colors[props.colorStates.disabled]}; - border-color: ${props.theme.colors[props.colorStates.disabled]}; - } -` - -const PrimaryStyledButton = styled(StyledButton)` - box-shadow: 0 4px 20px 0 ${(props) => hexToRGB(props.theme.colors[props.colorStates.unset], 0.3)}; - border: 2px solid ${(props) => props.theme.colors[props.colorStates.unset]}; - background: ${(props) => props.theme.colors[props.colorStates.unset]}; - padding: 5px 10px; - border-radius: 8px; - transition: all ${(props) => props.theme.transitions.normal}; - opacity: 0.7; - - &:hover { - box-shadow: 0 4px 20px 0 - ${(props) => hexToRGB(props.theme.colors[props.colorStates.hover], 0.3)}; - border: 2px solid ${(props) => props.theme.colors[props.colorStates.hover]}; - background: ${(props) => props.theme.colors[props.colorStates.hover]}; - opacity: 1; - } - - ${(props) => props.disabled && disabledStyle}; -` - -export default PrimaryStyledButton diff --git a/next-app/src/components/elements/Button/variants/transparent/TransparentButtonText.ts b/next-app/src/components/elements/Button/variants/transparent/TransparentButtonText.ts deleted file mode 100644 index 974737e4..00000000 --- a/next-app/src/components/elements/Button/variants/transparent/TransparentButtonText.ts +++ /dev/null @@ -1,12 +0,0 @@ -import styled from '@emotion/styled' - -import ButtonText from '../../ButtonText' - -const TransparentButtonText = styled(ButtonText)` - color: ${(props) => - props.colorStates.unset === 'transparent' - ? props.theme.colors.upBase09 - : props.theme.colors.upBase01}; -` - -export default TransparentButtonText diff --git a/next-app/src/components/elements/Button/variants/transparent/TransparentStyledButton.ts b/next-app/src/components/elements/Button/variants/transparent/TransparentStyledButton.ts deleted file mode 100644 index 64352e06..00000000 --- a/next-app/src/components/elements/Button/variants/transparent/TransparentStyledButton.ts +++ /dev/null @@ -1,43 +0,0 @@ -import { css, Theme } from '@emotion/react' -import styled from '@emotion/styled' - -import hexToRGB from '../../../../../utils/hexToRGB' -import StyledButton from '../../StyledButton' -import { colorStates } from '../_colorVariants' - -const disabledStyle = (props: { theme: Theme; colorStates: colorStates }) => css` - box-shadow: unset; - background: ${props.theme.colors[props.colorStates.disabled]}; - border-color: ${props.theme.colors[props.colorStates.disabled]}; - cursor: default; - - &:hover { - box-shadow: unset; - background: ${props.theme.colors[props.colorStates.disabled]}; - border-color: ${props.theme.colors[props.colorStates.disabled]}; - } -` - -const TransparentStyledButton = styled(StyledButton)` - box-shadow: 0 4px 20px 0 ${(props) => hexToRGB(props.theme.colors[props.colorStates.unset], 0.3)}; - border: 2px solid ${(props) => props.theme.colors[props.colorStates.unset]}; - background: ${(props) => props.theme.colors[props.colorStates.unset]}; - padding: 16px 30px; - border-radius: 3px; - transition: all ${(props) => props.theme.transitions.normal}; - - &:hover { - box-shadow: 0 4px 20px 0 - ${(props) => hexToRGB(props.theme.colors[props.colorStates.hover], 0.3)}; - border: 2px solid ${(props) => props.theme.colors[props.colorStates.hover]}; - background: ${(props) => props.theme.colors[props.colorStates.hover]}; - } - - &:active { - opacity: 0.7; - } - - ${(props) => props.disabled && disabledStyle}; -` - -export default TransparentStyledButton diff --git a/next-app/src/components/elements/Button/variants/uploadDashed/UploadDashedButton.ts b/next-app/src/components/elements/Button/variants/uploadDashed/UploadDashedButton.ts deleted file mode 100644 index 907d0e81..00000000 --- a/next-app/src/components/elements/Button/variants/uploadDashed/UploadDashedButton.ts +++ /dev/null @@ -1,24 +0,0 @@ -import styled from '@emotion/styled' - -import hexToRGB from '../../../../../utils/hexToRGB' -import StyledButton from '../../StyledButton' -import UploadDashedButtonText from './UploadDashedButtonText' - -const UploadDashedButton = styled(StyledButton)` - border: 3px dashed ${(props) => hexToRGB(props.theme.colors.upBase01, 0.4)}; - border-radius: 8px; - width: calc(100% - 106px); - padding: 50px; - - &:active { - ${UploadDashedButtonText} { - opacity: 0.7; - } - } - - @media (max-width: ${(props) => props.theme.breakpoints.md}) { - padding: 35px; - } -` - -export default UploadDashedButton diff --git a/next-app/src/components/elements/Button/variants/uploadDashed/UploadDashedButtonText.ts b/next-app/src/components/elements/Button/variants/uploadDashed/UploadDashedButtonText.ts deleted file mode 100644 index ef8c3afc..00000000 --- a/next-app/src/components/elements/Button/variants/uploadDashed/UploadDashedButtonText.ts +++ /dev/null @@ -1,14 +0,0 @@ -import styled from '@emotion/styled' - -import ButtonText from '../../ButtonText' - -const UploadDashedButtonText = styled(ButtonText)` - text-align: center; - justify-content: center; - display: flex; - color: ${(props) => props.theme.colors.upBase01}; - font-weight: bold; - transition: all ${(props) => props.theme.transitions.normal}; -` - -export default UploadDashedButtonText diff --git a/next-app/src/components/elements/ButtonContainer.ts b/next-app/src/components/elements/ButtonContainer.ts deleted file mode 100644 index 0f2cbbd8..00000000 --- a/next-app/src/components/elements/ButtonContainer.ts +++ /dev/null @@ -1,12 +0,0 @@ -import styled from '@emotion/styled' - -/** - * Wrapper for `Button` element - */ - -const ButtonContainer = styled('div')<{ columns?: string }>` - display: grid; - grid-template-columns: ${(props) => props.columns || 'auto 1fr'}; -` - -export default ButtonContainer diff --git a/next-app/src/components/elements/Circle.ts b/next-app/src/components/elements/Circle.ts deleted file mode 100644 index d425214a..00000000 --- a/next-app/src/components/elements/Circle.ts +++ /dev/null @@ -1,16 +0,0 @@ -import styled from '@emotion/styled' - -import theme from '../../assets/theme' - -const Circle = styled('div')<{ size: string; background?: string }>` - height: ${(props) => props.size}; - width: ${(props) => props.size}; - border-radius: 100%; - background: ${(props) => props.background}; -` - -Circle.defaultProps = { - background: theme.colors.mako -} - -export default Circle diff --git a/next-app/src/components/elements/CircularProgressBar.ts b/next-app/src/components/elements/CircularProgressBar.ts deleted file mode 100644 index 3da91a46..00000000 --- a/next-app/src/components/elements/CircularProgressBar.ts +++ /dev/null @@ -1,32 +0,0 @@ -import styled from '@emotion/styled' -import { CircularProgressbar as Loader } from 'react-circular-progressbar' -import 'react-circular-progressbar/dist/styles.css' - -const CircularProgressBar = styled(Loader)` - max-width: 50%; - margin: 0 auto; - - > .CircularProgressbar-text { - dominant-baseline: central; - fill: ${(props) => props.theme.colors.timberwolf}; - font-size: 15px; - } - - > .CircularProgressbar-background { - fill: ${(props) => props.theme.colors.shark}; - } - - > .CircularProgressbar-trail { - stroke: ${(props) => props.theme.colors.shark}; - } - - > .CircularProgressbar-path { - stroke: ${(props) => props.theme.colors.timberwolf}; - } - - @media (max-width: ${(props) => props.theme.breakpoints.xs}) { - max-width: 75%; - } -` - -export default CircularProgressBar diff --git a/next-app/src/components/elements/Container.ts b/next-app/src/components/elements/Container.ts deleted file mode 100644 index 2675b8d5..00000000 --- a/next-app/src/components/elements/Container.ts +++ /dev/null @@ -1,25 +0,0 @@ -import styled from '@emotion/styled' - -const Container = styled('div')` - width: ${(props) => props.theme.constants.containerSizes.xl}; - min-height: 1px; - margin: 0 auto; - - @media (max-width: ${(props) => props.theme.breakpoints.xl}) { - width: ${(props) => props.theme.constants.containerSizes.lg}; - } - - @media (max-width: ${(props) => props.theme.breakpoints.lg}) { - width: ${(props) => props.theme.constants.containerSizes.md}; - } - - @media (max-width: ${(props) => props.theme.breakpoints.md}) { - width: ${(props) => props.theme.constants.containerSizes.sm}; - } - - @media (max-width: ${(props) => props.theme.breakpoints.sm}) { - width: 90%; - } -` - -export default Container diff --git a/next-app/src/components/elements/DesktopContainer.ts b/next-app/src/components/elements/DesktopContainer.ts deleted file mode 100644 index 90bd3d87..00000000 --- a/next-app/src/components/elements/DesktopContainer.ts +++ /dev/null @@ -1,15 +0,0 @@ -import styled from '@emotion/styled' - -import theme from '../../assets/theme' - -const DesktopContainer = styled('div')<{ breakpoint?: string }>` - @media (max-width: ${(props) => props.breakpoint}) { - display: none !important; - } -` - -DesktopContainer.defaultProps = { - breakpoint: theme.breakpoints.md -} - -export default DesktopContainer diff --git a/next-app/src/components/elements/DragContainer/BorderContainer.ts b/next-app/src/components/elements/DragContainer/BorderContainer.ts deleted file mode 100644 index dd94ff44..00000000 --- a/next-app/src/components/elements/DragContainer/BorderContainer.ts +++ /dev/null @@ -1,15 +0,0 @@ -import styled from '@emotion/styled' - -const BorderContainer = styled('div')` - margin: 16px; - height: calc(100% - 38px); - width: calc(100% - 38px); - display: flex; - align-items: center; - justify-content: center; - border: 3px dashed rgba(255, 255, 255, 0.4); - border-radius: 8px; - z-index: 100; -` - -export default BorderContainer diff --git a/next-app/src/components/elements/DragContainer/Box.ts b/next-app/src/components/elements/DragContainer/Box.ts deleted file mode 100644 index fd91bddd..00000000 --- a/next-app/src/components/elements/DragContainer/Box.ts +++ /dev/null @@ -1,13 +0,0 @@ -import styled from '@emotion/styled' - -const Box = styled('div')` - position: absolute; - top: 0; - right: 0; - bottom: 0; - left: 0; - opacity: 0; - transition: 400ms all; -` - -export default Box diff --git a/next-app/src/components/elements/DragContainer/index.tsx b/next-app/src/components/elements/DragContainer/index.tsx deleted file mode 100644 index 57e22bee..00000000 --- a/next-app/src/components/elements/DragContainer/index.tsx +++ /dev/null @@ -1,43 +0,0 @@ -import { css } from '@emotion/css' -import React, { useContext, useMemo } from 'react' -import { FileUploadContext } from '../../../providers/FileUploadProvider' -import Box from './Box' -import BorderContainer from './BorderContainer' -import { TypographyH5 } from '../Typography' -import theme from '../../../assets/theme' -import { UploadBoxContentContext } from '../../../providers/UploadBoxContentProvider' -import { Box as BoxType } from '../../../../@types/box' - -const DragContainer = () => { - const uploadBoxContentContext = useContext(UploadBoxContentContext) - const fileUploadContext = useContext(FileUploadContext) - - const boxClassname = useMemo(() => { - return ( - (fileUploadContext.fileUploadDropzone.isDragActive && - uploadBoxContentContext.currentBox === BoxType.DefaultUploadBox && - css` - opacity: 1; - z-index: 100; - `) ?? - null - ) - }, [fileUploadContext.fileUploadDropzone.isDragActive, uploadBoxContentContext.currentBox]) - - return ( - - - - Drop file here! - - - - ) -} - -export default DragContainer diff --git a/next-app/src/components/elements/ExpandableBalloon.tsx b/next-app/src/components/elements/ExpandableBalloon.tsx deleted file mode 100644 index 50f564ef..00000000 --- a/next-app/src/components/elements/ExpandableBalloon.tsx +++ /dev/null @@ -1,40 +0,0 @@ -import { css } from '@emotion/css' -import styled from '@emotion/styled' -import React from 'react' - -import theme from '../../assets/theme' -import ExpandableElement from './ExpandableElement' - -export const padding = 15 - -export const StaticSizeElement = styled('div')`` - -const ExpandableBalloon: React.FC = (props) => ( - - - - {props.children} - - - -) - -export default ExpandableBalloon diff --git a/next-app/src/components/elements/ExpandableElement.ts b/next-app/src/components/elements/ExpandableElement.ts deleted file mode 100644 index 0d04b895..00000000 --- a/next-app/src/components/elements/ExpandableElement.ts +++ /dev/null @@ -1,11 +0,0 @@ -import styled from '@emotion/styled' - -export const ExpandableElement = styled('div')` - position: absolute; - width: 0; - height: 0; - transition: ${(props) => props.theme.transitions.normal}; - overflow: hidden; -` - -export default ExpandableElement diff --git a/next-app/src/components/elements/Icon.ts b/next-app/src/components/elements/Icon.ts deleted file mode 100644 index d6ab80b3..00000000 --- a/next-app/src/components/elements/Icon.ts +++ /dev/null @@ -1,10 +0,0 @@ -import styled from '@emotion/styled' -import { FontAwesomeIcon } from '@fortawesome/react-fontawesome' - -const Icon = styled(FontAwesomeIcon)` - color: ${(props) => props.theme.colors.upBase01}; - font-size: 20px; - margin-right: 10px; -` - -export default Icon diff --git a/next-app/src/components/elements/Layout/GlobalStyle/animationsStyle.ts b/next-app/src/components/elements/Layout/GlobalStyle/animationsStyle.ts deleted file mode 100644 index 7928591a..00000000 --- a/next-app/src/components/elements/Layout/GlobalStyle/animationsStyle.ts +++ /dev/null @@ -1,61 +0,0 @@ -import { css } from '@emotion/css' - -export const fadeIn = css` - animation-name: fadeIn; -` - -export const fadeOut = css` - animation-name: fadeOut; -` - -export const fadeInUp = css` - animation-name: fadeInUp; -` - -const animationsStyle = css` - @keyframes fadeIn { - from { - opacity: 0; - } - - to { - opacity: 1; - } - } - - .fadeIn { - ${fadeIn}; - } - - @keyframes fadeOut { - from { - opacity: 1; - } - - to { - opacity: 0; - } - } - - .fadeOut { - ${fadeOut}; - } - - @keyframes fadeInUp { - from { - opacity: 0; - transform: translate3d(0, 100%, 0); - } - - to { - opacity: 1; - transform: translate3d(0, 0, 0); - } - } - - .fadeInUp { - ${fadeInUp}; - } -` - -export default animationsStyle diff --git a/next-app/src/components/elements/Layout/GlobalStyle/index.tsx b/next-app/src/components/elements/Layout/GlobalStyle/index.tsx deleted file mode 100644 index a2245376..00000000 --- a/next-app/src/components/elements/Layout/GlobalStyle/index.tsx +++ /dev/null @@ -1,21 +0,0 @@ -import { injectGlobal } from '@emotion/css' - -import resetStyle from './resetStyle' -import animationsStyle from './animationsStyle' - -const GlobalStyle = injectGlobal` - ${resetStyle}; - - body { - font-family: 'Lato', sans-serif; - font-size: 16px; - line-height: 1.2; - color: #333333; - overflow-x: hidden; - font-weight: 400; - } - - ${animationsStyle}; -` - -export default GlobalStyle diff --git a/next-app/src/components/elements/Layout/GlobalStyle/resetStyle.ts b/next-app/src/components/elements/Layout/GlobalStyle/resetStyle.ts deleted file mode 100644 index 13f6507e..00000000 --- a/next-app/src/components/elements/Layout/GlobalStyle/resetStyle.ts +++ /dev/null @@ -1,141 +0,0 @@ -import { css } from '@emotion/css' - -const resetStyle = css` - html, - body, - div, - span, - applet, - object, - iframe, - h1, - h2, - h3, - h4, - h5, - h6, - p, - blockquote, - pre, - a, - abbr, - acronym, - address, - big, - cite, - code, - del, - dfn, - em, - img, - ins, - kbd, - q, - s, - samp, - small, - strike, - strong, - sub, - sup, - tt, - var, - b, - u, - i, - center, - dl, - dt, - dd, - ol, - ul, - li, - fieldset, - form, - label, - legend, - table, - caption, - tbody, - tfoot, - thead, - tr, - th, - td, - article, - aside, - canvas, - details, - embed, - figure, - figcaption, - footer, - header, - hgroup, - menu, - nav, - output, - ruby, - section, - summary, - time, - mark, - audio, - video, - input, - textarea { - margin: 0; - padding: 0; - border: 0; - font: inherit; - vertical-align: baseline; - background: transparent; - } - /* HTML5 display-role reset for older browsers */ - article, - aside, - details, - figcaption, - figure, - footer, - header, - hgroup, - menu, - nav, - section { - display: block; - } - body { - line-height: 1; - } - ol, - ul { - list-style: none; - } - blockquote, - q { - quotes: none; - } - blockquote:before, - blockquote:after, - q:before, - q:after { - content: none; - } - table { - border-collapse: collapse; - border-spacing: 0; - } - - html { - font-family: sans-serif; - } - - /* Custom */ - - a { - text-decoration: none; - } -` - -export default resetStyle diff --git a/next-app/src/components/elements/Layout/Providers.tsx b/next-app/src/components/elements/Layout/Providers.tsx deleted file mode 100644 index e081e0ea..00000000 --- a/next-app/src/components/elements/Layout/Providers.tsx +++ /dev/null @@ -1,17 +0,0 @@ -import React from 'react' -import { QueryClient, QueryClientProvider } from 'react-query' - -import FileUploadProvider from '../../../providers/FileUploadProvider' -import UploadBoxContentProvider from '../../../providers/UploadBoxContentProvider' - -const queryClient = new QueryClient() - -const Providers: React.FC = (props) => ( - - - {props.children} - - -) - -export default Providers diff --git a/next-app/src/components/elements/Layout/index.tsx b/next-app/src/components/elements/Layout/index.tsx deleted file mode 100644 index d9c87344..00000000 --- a/next-app/src/components/elements/Layout/index.tsx +++ /dev/null @@ -1,51 +0,0 @@ -import { css } from '@emotion/css' -import React, { useContext, useMemo } from 'react' -import Head from 'next/head' -import Page from '../../blocks/Page' -import { FileUploadContext } from '../../../providers/FileUploadProvider' -import DragContainer from '../DragContainer' -import { UploadBoxContentContext } from '../../../providers/UploadBoxContentProvider' -import { Box } from '../../../../@types/box' - -export interface LayoutProps { - title?: string -} - -const Layout: React.FC = ({ - title = 'UP | Share your dreams', - children, - ...props -}) => { - const uploadBoxContentContext = useContext(UploadBoxContentContext) - const fileUploadContext = useContext(FileUploadContext) - - const contentClassname = useMemo(() => { - return ( - (fileUploadContext.fileUploadDropzone.isDragActive && - uploadBoxContentContext.currentBox === Box.DefaultUploadBox && - css` - filter: brightness(50%); - `) ?? - null - ) - }, [fileUploadContext.fileUploadDropzone.isDragActive, uploadBoxContentContext.currentBox]) - - return ( - <> - - {title} - - - - - - - ) -} - -export default Layout diff --git a/next-app/src/components/elements/LineWithText/Line.ts b/next-app/src/components/elements/LineWithText/Line.ts deleted file mode 100644 index 3ef431fa..00000000 --- a/next-app/src/components/elements/LineWithText/Line.ts +++ /dev/null @@ -1,9 +0,0 @@ -import styled from '@emotion/styled' - -const Line = styled('div')` - width: 100%; - height: 2px; - background-color: ${(props) => props.theme.colors.timberwolf}; -` - -export default Line diff --git a/next-app/src/components/elements/LineWithText/LineWithTextContainer.ts b/next-app/src/components/elements/LineWithText/LineWithTextContainer.ts deleted file mode 100644 index 364e8677..00000000 --- a/next-app/src/components/elements/LineWithText/LineWithTextContainer.ts +++ /dev/null @@ -1,12 +0,0 @@ -import styled from '@emotion/styled' - -const LineWithTextContainer = styled('div')` - display: grid; - grid-template-columns: 1fr auto 1fr; - grid-column-gap: 10px; - margin: 25px 0; - align-items: center; - width: 100%; -` - -export default LineWithTextContainer diff --git a/next-app/src/components/elements/LineWithText/index.tsx b/next-app/src/components/elements/LineWithText/index.tsx deleted file mode 100644 index 945e7207..00000000 --- a/next-app/src/components/elements/LineWithText/index.tsx +++ /dev/null @@ -1,25 +0,0 @@ -import React from 'react' - -import Line from './Line' -import LineWithTextContainer from './LineWithTextContainer' -import { TypographyP } from '../Typography' -import { css } from '@emotion/css' -import theme from '../../../assets/theme' - -const LineWithText: React.FC = (props) => ( - - - - {props.children} - - - -) - -export default LineWithText diff --git a/next-app/src/components/elements/LinkCopyButton.tsx b/next-app/src/components/elements/LinkCopyButton.tsx deleted file mode 100644 index 63f5853c..00000000 --- a/next-app/src/components/elements/LinkCopyButton.tsx +++ /dev/null @@ -1,214 +0,0 @@ -import styled from '@emotion/styled' -import { css } from '@emotion/css' -import copy from 'copy-to-clipboard' -import React, { useCallback, useRef } from 'react' -import Button from './Button' -import useTooltip from '../../hooks/useTooltip' -import DesktopContainer from './DesktopContainer' -import MobileContainer from './MobileContainer' -import theme from '../../assets/theme' - -interface ILinkCopyButton { - link: string - text: React.ReactNode -} - -const Area = styled('div')` - position: relative; - display: grid; - grid-template-columns: 1fr 50px; - - @media (max-width: ${(props) => props.theme.breakpoints.sm}) { - grid-template-columns: 1fr; - grid-row-gap: 10px; - } -` - -const CopyContainer = styled('div')` - background: #2b2e39; - border-top-left-radius: 8px; - border-bottom-left-radius: 8px; - overflow-x: auto; - overflow-y: hidden; - padding: 8px 16px; - min-height: 32px; - cursor: pointer; - transition: 200ms background; - - &:hover { - background: #1f2229; - } -` - -const LinkText = styled('span')` - color: ${(props) => props.theme.colors.timberwolf}; - font-size: 16px; - line-height: 1; - white-space: nowrap; - text-overflow: ellipsis; - overflow: hidden; - min-height: 17px; - - @media (min-width: ${(props) => props.theme.breakpoints.md}) and (max-width: ${(props) => - props.theme.breakpoints.lg}) { - justify-content: flex-start; - } - - @media (max-width: ${(props) => props.theme.breakpoints.sm}) { - justify-content: flex-start; - } -` - -const CopyLink = styled('a')` - display: flex; - align-items: center; - justify-content: center; - height: 100%; - overflow: hidden; -` - -const LinkCopyButton = (props: ILinkCopyButton) => { - const [setTooltip, Tooltip] = useTooltip('Copied!') - const linkNode = useRef(null) - - const handleDesktopCopyButton: React.MouseEventHandler = useCallback( - (event) => { - event.preventDefault() - setTooltip(true) - copy(props.link) - }, - [props.link] - ) - - const handleMobileCopyButton: React.MouseEventHandler = useCallback( - (event) => { - event.preventDefault() - setTooltip(true) - copy(props.link) - setTimeout(() => setTooltip(false), 2000) - }, - [props.link] - ) - - const selectLink = useCallback(() => { - try { - const _current = linkNode.current - if (_current) { - const range = new Range() - range.setStart(_current, 0) - range.setEndAfter(_current) - const selection = window.getSelection() - if (selection) { - selection.removeAllRanges() - selection.addRange(range) - } - } - } catch (e) { - // Handle warning about browser is outdated to have this feature - console.error('Your browser is outdated', e) - } - }, [linkNode.current]) - - const handlePreventClick: React.MouseEventHandler = useCallback((event) => { - event.preventDefault() - }, []) - - return ( - <> - - - - - {props.link} - - -
- {Tooltip} - -
- -
- - - - - {props.link} - - {Tooltip} - - - - - - ) -} - -export default LinkCopyButton diff --git a/next-app/src/components/elements/Loader.tsx b/next-app/src/components/elements/Loader.tsx deleted file mode 100644 index 96f547c3..00000000 --- a/next-app/src/components/elements/Loader.tsx +++ /dev/null @@ -1,42 +0,0 @@ -import { keyframes } from '@emotion/css' -import styled from '@emotion/styled' -import React from 'react' - -import theme from '../../assets/theme' - -const spinner = keyframes` - 0% { - transform: rotate(0deg); - } - 50% { - transform: rotate(180deg); - opacity: 0.5; - } - 100% { - transform: rotate(360deg); - } -` - -const LoaderStyle = styled('span')<{ loaderColor: string }>` - display: inline-flex; - width: 14px; - height: 14px; - border-radius: 50%; - overflow: hidden; - border-width: 2px; - border-style: solid; - border-color: ${(props) => props.loaderColor}; - border-top-color: transparent !important; - animation: ${spinner} 1s linear infinite; -` - -interface LoaderProps { - loaderColor?: string - style?: Record -} - -const Loader = ({ loaderColor = theme.colors.upBase09, ...props }: LoaderProps) => ( - -) - -export default Loader diff --git a/next-app/src/components/elements/Menu/ConfigurationMenu.tsx b/next-app/src/components/elements/Menu/ConfigurationMenu.tsx deleted file mode 100644 index 7bde858f..00000000 --- a/next-app/src/components/elements/Menu/ConfigurationMenu.tsx +++ /dev/null @@ -1,77 +0,0 @@ -import { css } from '@emotion/css' -import { faCog } from '@fortawesome/free-solid-svg-icons' -import React, { useContext, useMemo, useState } from 'react' -import SideBoxButton from '../SideBoxButton' -import Icon from '../Icon' -import { UploadBoxContentContext } from '../../../providers/UploadBoxContentProvider' -import { Box } from '../../../../@types/box' -import theme from '../../../assets/theme' -import hexToRGB from '../../../utils/hexToRGB' - -const ConfigurationMenu = () => { - const { currentBox } = useContext(UploadBoxContentContext) - const [open, setOpen] = useState(false) - - const possibleToShow = useMemo(() => { - return currentBox === Box.DefaultUploadBox - }, [currentBox]) - - return ( -
-
-
- Awesome -   - Our future config panel -
-
- setOpen(!open)} - background={open ? '#434755' : theme.colors.upPrimary} - backgroundHover={open ? hexToRGB('#434755', 0.8) : theme.colors.upPrimaryHover} - > - - -
-
-
- ) -} - -export default ConfigurationMenu diff --git a/next-app/src/components/elements/MobileContainer.ts b/next-app/src/components/elements/MobileContainer.ts deleted file mode 100644 index 61bd3188..00000000 --- a/next-app/src/components/elements/MobileContainer.ts +++ /dev/null @@ -1,15 +0,0 @@ -import styled from '@emotion/styled' - -import theme from '../../assets/theme' - -const MobileContainer = styled('div')<{ breakpoint?: string }>` - @media (min-width: ${(props) => props.breakpoint}) { - display: none; - } -` - -MobileContainer.defaultProps = { - breakpoint: theme.breakpoints.md -} - -export default MobileContainer diff --git a/next-app/src/components/elements/QRCodeElement.tsx b/next-app/src/components/elements/QRCodeElement.tsx deleted file mode 100644 index a5fa1a89..00000000 --- a/next-app/src/components/elements/QRCodeElement.tsx +++ /dev/null @@ -1,47 +0,0 @@ -import { css } from '@emotion/css' -import { QRCode } from 'react-qrcode-logo' -import React from 'react' -import { IProps as IQRCodeElementProps } from 'react-qrcode-logo/lib/index' -import merge from 'lodash/merge' -import theme from '../../assets/theme' - -interface IRequiredQRElementProps extends IQRCodeElementProps { - size: number - eyeRadius: number - qrStyle: 'squares' | 'dots' - ecLevel: 'L' | 'M' | 'Q' | 'H' - quietZone: number -} - -const defaultProps: IRequiredQRElementProps = { - size: 120, - eyeRadius: 0, - qrStyle: 'squares', - ecLevel: 'L', - quietZone: 4 -} - -const QRCodeElement = (props: IQRCodeElementProps) => { - const _defaultProps = merge(defaultProps, props) - - return ( -
- -
- ) -} - -export default QRCodeElement diff --git a/next-app/src/components/elements/SideBoxButton.tsx b/next-app/src/components/elements/SideBoxButton.tsx deleted file mode 100644 index 49c5e8fc..00000000 --- a/next-app/src/components/elements/SideBoxButton.tsx +++ /dev/null @@ -1,42 +0,0 @@ -import styled from '@emotion/styled' -import { css } from '@emotion/react' - -const active = (marginRight?: string) => css` - margin-right: ${marginRight ?? '-45px'}; -` - -export const MovableElement = styled('div')<{ - delay: string - active: boolean - marginRight?: string -}>` - transition-property: margin-right; - transition-delay: ${(props) => props.delay}; - transition-duration: 500ms; - margin-right: 0px; - ${(props) => props.active && active(props.marginRight)}; -` - -const SideBoxButton = styled('div')<{ background?: string; backgroundHover?: string }>` - display: flex; - justify-content: flex-end; - align-items: center; - background: ${(props) => props.background ?? props.theme.colors.upPrimary}; - border-top-right-radius: 8px; - border-bottom-right-radius: 8px; - //width: 80px; - transition-property: background; - cursor: pointer; - font-size: 17.5px; - margin-left: auto; - height: 100%; - transition: 250ms all; - min-width: 43px; - - &:hover { - background: ${(props) => props.backgroundHover ?? props.theme.colors.upPrimaryHover}; - margin-right: -3px; - } -` - -export default SideBoxButton diff --git a/next-app/src/components/elements/TimerCountdown.tsx b/next-app/src/components/elements/TimerCountdown.tsx deleted file mode 100644 index 250d21f1..00000000 --- a/next-app/src/components/elements/TimerCountdown.tsx +++ /dev/null @@ -1,62 +0,0 @@ -import { css } from '@emotion/css' -import styled from '@emotion/styled' -import Countdown, { CountdownRendererFn } from 'react-countdown' - -const DateFormat = styled('div')` - font-size: 12px; - - > span { - display: inline; - width: 17px; - color: ${(props) => props.theme.colors.timberwolf}; - - &:last-child { - width: 14px; - } - - &.date { - width: 40px; - margin-right: 2px; - } - } -` - -interface ITimerCountdown { - date: Date -} - -const dateRenderer: CountdownRendererFn = ({ days, hours, minutes, seconds }) => ( - - Expires in: - {days !== 0 ? {days + (days === 1 ? ' day,' : ' days,')} : null} - {hours < 10 ? `0${hours}:` : `${hours}:`} - {minutes < 10 ? `0${minutes}:` : `${minutes}:`} - {seconds < 10 ? `0${seconds}` : `${seconds}`} - -) - -const TimerCountdown = (props: ITimerCountdown) => { - return ( -
- -
- ) -} - -export default TimerCountdown diff --git a/next-app/src/components/elements/Tooltip.ts b/next-app/src/components/elements/Tooltip.ts deleted file mode 100644 index 775fbf9c..00000000 --- a/next-app/src/components/elements/Tooltip.ts +++ /dev/null @@ -1,40 +0,0 @@ -import { css } from '@emotion/react' -import styled from '@emotion/styled' - -const active = css` - top: -45px; - opacity: 1; - z-index: 1; -` - -const Tooltip = styled('div')<{ active: boolean }>` - position: absolute; - top: 0; - opacity: 0; - background-color: ${(props) => props.theme.colors.shark}; - color: ${(props) => props.theme.colors.timberwolf}; - border-radius: 8px; - font-size: 16px; - transition: 200ms all; - z-index: -1; - padding: 8px; - margin: 0 auto; - - &::before { - content: ''; - position: absolute; - height: 5px; - width: 5px; - background: #1f2229; - transform: rotate(45deg); - left: 0; - right: 0; - margin: 0 auto; - bottom: -2px; - z-index: -1; - } - - ${(props) => props.active && active}; -` - -export default Tooltip diff --git a/next-app/src/components/elements/Typography/TypographyH5.ts b/next-app/src/components/elements/Typography/TypographyH5.ts deleted file mode 100644 index 14fee6e8..00000000 --- a/next-app/src/components/elements/Typography/TypographyH5.ts +++ /dev/null @@ -1,7 +0,0 @@ -import styled from '@emotion/styled' - -const TypographyH5 = styled('h5')` - font-size: 20px; -` - -export default TypographyH5 diff --git a/next-app/src/components/elements/Typography/TypographyP.ts b/next-app/src/components/elements/Typography/TypographyP.ts deleted file mode 100644 index 113aa915..00000000 --- a/next-app/src/components/elements/Typography/TypographyP.ts +++ /dev/null @@ -1,9 +0,0 @@ -import styled from '@emotion/styled' - -const TypographyP = styled('p')` - color: ${(props) => props.theme.colors.upNeutralFillNight}; - font-weight: normal; - font-size: 13px; -` - -export default TypographyP diff --git a/next-app/src/components/elements/Typography/index.ts b/next-app/src/components/elements/Typography/index.ts deleted file mode 100644 index 688989b9..00000000 --- a/next-app/src/components/elements/Typography/index.ts +++ /dev/null @@ -1,4 +0,0 @@ -import TypographyH5 from './TypographyH5' -import TypographyP from './TypographyP' - -export { TypographyH5, TypographyP } diff --git a/next-app/src/containers/HomePage/HomePageView.tsx b/next-app/src/containers/HomePage/HomePageView.tsx deleted file mode 100644 index 36e60b00..00000000 --- a/next-app/src/containers/HomePage/HomePageView.tsx +++ /dev/null @@ -1,75 +0,0 @@ -import { css, cx } from '@emotion/css' -import Link from 'next/link' -import React from 'react' -import { IHomePageProps } from '../../pages' -import { IHomePageStateProps } from './useHomePage' -import HomePage from '../../components/blocks/HomePage' -import Container from '../../components/elements/Container' -import Box from '../../components/blocks/Box' -import AlignedDiv from '../../components/elements/AlignedDiv' -import Circle from '../../components/elements/Circle' -import styleHelpers from '../../assets/styleHelpers' -import theme from '../../assets/theme' -import { TypographyP } from '../../components/elements/Typography' -import footerLinks from './footerLinks' -import ExpandableBalloon from '../../components/elements/ExpandableBalloon' -import UploadBoxes from '../UploadBoxes' -import DesktopContainer from '../../components/elements/DesktopContainer' -// import ConfigurationMenu from '../../components/elements/Menu/ConfigurationMenu' - -interface IHomePageViewProps extends IHomePageProps, IHomePageStateProps {} - -const HomePageView = (props: IHomePageViewProps) => ( - - - - - - {React.createElement(UploadBoxes[props.uploadBoxContent.currentBox]?.Component)} - - - - -
- - i - - - Did you know that you can paste images and text from your clipboard - directly into our website? - -
-
-
- - {footerLinks.map((footerLink) => ( - - - {footerLink.text} - - - ))} - - -
- {/**/} - {/* */} - {/**/} -
-
-
-) - -export default HomePageView diff --git a/next-app/src/containers/HomePage/footerLinks.ts b/next-app/src/containers/HomePage/footerLinks.ts deleted file mode 100644 index 1ae857b8..00000000 --- a/next-app/src/containers/HomePage/footerLinks.ts +++ /dev/null @@ -1,5 +0,0 @@ -const footerLinks: { text: string; href: string }[] = [ - { text: 'Github', href: 'https://github.com/Starchasers/up' }, - { text: 'Starchasers', href: 'https://github.com/Starchasers' } -] -export default footerLinks diff --git a/next-app/src/containers/HomePage/index.tsx b/next-app/src/containers/HomePage/index.tsx deleted file mode 100644 index 1ebdf462..00000000 --- a/next-app/src/containers/HomePage/index.tsx +++ /dev/null @@ -1,13 +0,0 @@ -import React from 'react' - -import { IHomePageProps } from '../../pages' - -import useHomePage from './useHomePage' -import HomePageView from './HomePageView' - -const HomePage = (props: IHomePageProps) => { - const state = useHomePage(props) - return -} - -export default HomePage diff --git a/next-app/src/containers/HomePage/useHomePage.ts b/next-app/src/containers/HomePage/useHomePage.ts deleted file mode 100644 index e3a7db54..00000000 --- a/next-app/src/containers/HomePage/useHomePage.ts +++ /dev/null @@ -1,22 +0,0 @@ -import { useContext } from 'react' - -import { - TUploadBoxContentContext, - UploadBoxContentContext -} from '../../providers/UploadBoxContentProvider' -import { IHomePageProps } from '../../pages' -import { FileUploadContext, TFileUploadContext } from '../../providers/FileUploadProvider' - -export interface IHomePageStateProps { - uploadBoxContent: TUploadBoxContentContext - fileUploadContext: TFileUploadContext -} - -const useHomePage = ({}: IHomePageProps): IHomePageStateProps => { - const uploadBoxContent = useContext(UploadBoxContentContext) - const fileUploadContext = useContext(FileUploadContext) - - return { uploadBoxContent, fileUploadContext } -} - -export default useHomePage diff --git a/next-app/src/containers/UploadBoxes/DefaultUploadBox/DefaultUploadBoxView.tsx b/next-app/src/containers/UploadBoxes/DefaultUploadBox/DefaultUploadBoxView.tsx deleted file mode 100644 index 787f3b40..00000000 --- a/next-app/src/containers/UploadBoxes/DefaultUploadBox/DefaultUploadBoxView.tsx +++ /dev/null @@ -1,68 +0,0 @@ -import { css } from '@emotion/css' -import { faFolderOpen } from '@fortawesome/free-solid-svg-icons' -import React from 'react' - -import DefaultUpload from '../../../components/blocks/Boxes/DefaultUploadBox' -import Button from '../../../components/elements/Button' -import colorVariants from '../../../components/elements/Button/variants/_colorVariants' -import theme from '../../../assets/theme' -import LineWithText from '../../../components/elements/LineWithText' -import DesktopContainer from '../../../components/elements/DesktopContainer' -import MobileContainer from '../../../components/elements/MobileContainer' -import Icon from '../../../components/elements/Icon' -import { IDefaultUploadBoxState } from './useDefaultUploadBox' - -const DefaultUploadBoxView = (props: IDefaultUploadBoxState) => ( - <> - - - - OR - - - - - - - - - -) - -export default DefaultUploadBoxView diff --git a/next-app/src/containers/UploadBoxes/DefaultUploadBox/index.tsx b/next-app/src/containers/UploadBoxes/DefaultUploadBox/index.tsx deleted file mode 100644 index cf2f761c..00000000 --- a/next-app/src/containers/UploadBoxes/DefaultUploadBox/index.tsx +++ /dev/null @@ -1,10 +0,0 @@ -import useDefaultUploadBox from './useDefaultUploadBox' -import DefaultUploadBoxView from './DefaultUploadBoxView' - -const DefaultUploadBox = () => { - const state = useDefaultUploadBox() - - return -} - -export default DefaultUploadBox diff --git a/next-app/src/containers/UploadBoxes/DefaultUploadBox/useDefaultUploadBox.ts b/next-app/src/containers/UploadBoxes/DefaultUploadBox/useDefaultUploadBox.ts deleted file mode 100644 index c53a6ceb..00000000 --- a/next-app/src/containers/UploadBoxes/DefaultUploadBox/useDefaultUploadBox.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { useContext } from 'react' -import { FileUploadContext, TFileUploadContext } from '../../../providers/FileUploadProvider' - -export interface IDefaultUploadBoxState { - fileUpload: TFileUploadContext -} - -const useDefaultUploadBox = (): IDefaultUploadBoxState => { - const fileUpload = useContext(FileUploadContext) - - return { - fileUpload - } -} - -export default useDefaultUploadBox diff --git a/next-app/src/containers/UploadBoxes/FileUploadedBox/FileUploadedBoxView.tsx b/next-app/src/containers/UploadBoxes/FileUploadedBox/FileUploadedBoxView.tsx deleted file mode 100644 index 25b1c510..00000000 --- a/next-app/src/containers/UploadBoxes/FileUploadedBox/FileUploadedBoxView.tsx +++ /dev/null @@ -1,125 +0,0 @@ -import { css } from '@emotion/css' -import { faAngleLeft, faCopy } from '@fortawesome/free-solid-svg-icons' -import React from 'react' -import FileUploaded from '../../../components/blocks/Boxes/FileUploadedBox' -import Button from '../../../components/elements/Button' -import Icon from '../../../components/elements/Icon' -import LinkCopyButton from '../../../components/elements/LinkCopyButton' -import ButtonContainer from '../../../components/elements/ButtonContainer' -import TimerCountdown from '../../../components/elements/TimerCountdown' -import theme from '../../../assets/theme' -import QRCodeElement from '../../../components/elements/QRCodeElement' -import { IUseFileUploadedBoxState } from './useFileUploadedBox' -// import colorVariants from '../../../components/elements/Button/variants/_colorVariants' -import MobileContainer from '../../../components/elements/MobileContainer' -import DesktopContainer from '../../../components/elements/DesktopContainer' - -interface IFileUploadedBoxViewProps extends IUseFileUploadedBoxState {} - -const FileUploadedBoxView = (props: IFileUploadedBoxViewProps) => ( - - - - - - - - Copy URL - - - - } - /> - {/* *:first-of-type {*/} - {/* grid-row: 2;*/} - {/* }*/} - {/* }*/} - {/* `}*/} - {/*>*/} - {/* */} - {/* }*/} - {/* iconAlign={'right'}*/} - {/* buttonProps={{*/} - {/* className: css`*/} - {/* opacity: 0.85;*/} - {/* `,*/} - {/* onClick: props.handleDeleteFileClick*/} - {/* }}*/} - {/* iconProps={{*/} - {/* className: css`*/} - {/* > svg {*/} - {/* margin: unset;*/} - {/* font-size: 18px;*/} - {/* }*/} - {/* `*/} - {/* }}*/} - {/* colorStates={colorVariants.dangerous}*/} - {/* >*/} - {/* Delete file*/} - {/* */} - {/* */} - {/**/} - :first-of-type { - grid-row: 3; - } - > :last-of-type { - grid-row: 1; - } - } - `} - > - - - - -) - -export default FileUploadedBoxView diff --git a/next-app/src/containers/UploadBoxes/FileUploadedBox/index.tsx b/next-app/src/containers/UploadBoxes/FileUploadedBox/index.tsx deleted file mode 100644 index 8973e251..00000000 --- a/next-app/src/containers/UploadBoxes/FileUploadedBox/index.tsx +++ /dev/null @@ -1,10 +0,0 @@ -import useFileUploadedBox from './useFileUploadedBox' -import FileUploadedBoxView from './FileUploadedBoxView' - -const FileUploadedBox = () => { - const state = useFileUploadedBox() - - return -} - -export default FileUploadedBox diff --git a/next-app/src/containers/UploadBoxes/FileUploadedBox/useFileUploadedBox.ts b/next-app/src/containers/UploadBoxes/FileUploadedBox/useFileUploadedBox.ts deleted file mode 100644 index 7035c33c..00000000 --- a/next-app/src/containers/UploadBoxes/FileUploadedBox/useFileUploadedBox.ts +++ /dev/null @@ -1,61 +0,0 @@ -import { useCallback, useContext, useMemo } from 'react' -import { toast } from 'react-toastify' -import { FileUploadContext } from '../../../providers/FileUploadProvider' -import { UploadBoxContentContext } from '../../../providers/UploadBoxContentProvider' -import { Box } from '../../../../@types/box' -import { IUploadFileResponse } from '../../../../@types/api-client/uploadFile' - -const fileServingPath = 'u' - -export interface IUseFileUploadedBoxState { - link: string - handleGoBackButton: () => void - handleDeleteFileClick: () => void - fileUploadData: IUploadFileResponse | null -} - -const useFileUploadedBox = (): IUseFileUploadedBoxState => { - const fileUploadContext = useContext(FileUploadContext) - const uploadBoxContent = useContext(UploadBoxContentContext) - - const link = useMemo((): string => { - if (fileUploadContext.uploadFileMutation.data) { - return `${window.location.origin}/${fileServingPath}/${fileUploadContext.uploadFileMutation.data?.data.key}` - } else { - return 'Oopsie woopsie' - } - }, [fileUploadContext.uploadFileMutation.data]) - - const handleGoBackButton = useCallback(() => { - fileUploadContext.uploadFileMutation.reset() - uploadBoxContent.setCurrentBox(Box.DefaultUploadBox) - }, []) - - const handleDeleteFileClick = useCallback(async () => { - if (fileUploadContext.uploadFileMutation.data) { - if (confirm('Are you sure you want to delete this file?')) { - const response = await fileUploadContext.deleteFileMutation.mutateAsync({ - key: fileUploadContext.uploadFileMutation.data.data.key, - data: { accessToken: fileUploadContext.uploadFileMutation.data.data.accessToken } - }) - if (response.status === 200) { - uploadBoxContent.setCurrentBox(Box.DefaultUploadBox) - toast.success('Deleted successfully') - } - } - } - }, [fileUploadContext.deleteFileMutation]) - - const fileUploadData = useMemo(() => { - return fileUploadContext.uploadFileMutation.data?.data ?? null - }, [fileUploadContext.uploadFileMutation.data]) - - return { - link, - handleGoBackButton, - handleDeleteFileClick, - fileUploadData - } -} - -export default useFileUploadedBox diff --git a/next-app/src/containers/UploadBoxes/UploadingBox/UploadingBoxView.tsx b/next-app/src/containers/UploadBoxes/UploadingBox/UploadingBoxView.tsx deleted file mode 100644 index 34aef6ca..00000000 --- a/next-app/src/containers/UploadBoxes/UploadingBox/UploadingBoxView.tsx +++ /dev/null @@ -1,24 +0,0 @@ -import { css } from '@emotion/css' -import React from 'react' -import CircularProgressBar from '../../../components/elements/CircularProgressBar' -import { IUseUploadingBoxState } from './useUploadingBox' - -const UploadingBoxView = (props: IUseUploadingBoxState) => ( -
- -
-) - -export default UploadingBoxView diff --git a/next-app/src/containers/UploadBoxes/UploadingBox/index.tsx b/next-app/src/containers/UploadBoxes/UploadingBox/index.tsx deleted file mode 100644 index 56b69c86..00000000 --- a/next-app/src/containers/UploadBoxes/UploadingBox/index.tsx +++ /dev/null @@ -1,10 +0,0 @@ -import useUploadingBox from './useUploadingBox' -import UploadingBoxView from './UploadingBoxView' - -const UploadingBox = () => { - const state = useUploadingBox() - - return -} - -export default UploadingBox diff --git a/next-app/src/containers/UploadBoxes/UploadingBox/useUploadingBox.ts b/next-app/src/containers/UploadBoxes/UploadingBox/useUploadingBox.ts deleted file mode 100644 index 2af7ce3f..00000000 --- a/next-app/src/containers/UploadBoxes/UploadingBox/useUploadingBox.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { useContext } from 'react' -import { FileUploadContext, TFileUploadContext } from '../../../providers/FileUploadProvider' - -export interface IUseUploadingBoxState { - fileUpload: TFileUploadContext -} - -const useUploadingBox = (): IUseUploadingBoxState => { - const fileUpload = useContext(FileUploadContext) - - return { - fileUpload - } -} - -export default useUploadingBox diff --git a/next-app/src/containers/UploadBoxes/index.tsx b/next-app/src/containers/UploadBoxes/index.tsx deleted file mode 100644 index 442edab7..00000000 --- a/next-app/src/containers/UploadBoxes/index.tsx +++ /dev/null @@ -1,19 +0,0 @@ -import { Box } from '../../../@types/box' - -import DefaultUploadBoxView from './DefaultUploadBox' -import UploadingBox from './UploadingBox' -import FileUploadedBox from './FileUploadedBox' - -const UploadBoxes: { [key in Box]: { Component: () => JSX.Element } } = { - [Box.DefaultUploadBox]: { - Component: DefaultUploadBoxView - }, - [Box.UploadingBox]: { - Component: UploadingBox - }, - [Box.FileUploadedBox]: { - Component: FileUploadedBox - } -} - -export default UploadBoxes diff --git a/next-app/src/hooks/useTooltip.tsx b/next-app/src/hooks/useTooltip.tsx deleted file mode 100644 index b1b24fe0..00000000 --- a/next-app/src/hooks/useTooltip.tsx +++ /dev/null @@ -1,27 +0,0 @@ -import { css } from '@emotion/css' -import React, { useState } from 'react' -import Tooltip from '../components/elements/Tooltip' - -const useTooltip = ( - text: string -): [React.Dispatch>, React.ReactNode] => { - const [active, setActive] = useState(false) - - return [ - setActive, -
- {text} -
- ] -} - -export default useTooltip diff --git a/next-app/src/pages/_app.tsx b/next-app/src/pages/_app.tsx deleted file mode 100644 index 09f4aa1d..00000000 --- a/next-app/src/pages/_app.tsx +++ /dev/null @@ -1,31 +0,0 @@ -import { ThemeProvider } from '@emotion/react' -import React from 'react' -import { AppProps } from 'next/app' -import 'react-toastify/dist/ReactToastify.css' - -import GlobalStyle from '../components/elements/Layout/GlobalStyle' -import theme from '../assets/theme' -import Providers from '../components/elements/Layout/Providers' -import { ToastContainer } from 'react-toastify' - -const App = ({ Component, pageProps }: AppProps) => ( - - {GlobalStyle} - - - - - -) - -export default App diff --git a/next-app/src/pages/_document.tsx b/next-app/src/pages/_document.tsx deleted file mode 100644 index 311ba622..00000000 --- a/next-app/src/pages/_document.tsx +++ /dev/null @@ -1,26 +0,0 @@ -import React from 'react' -import Document, { Html, Head, Main, NextScript } from 'next/document' - -import theme from '../assets/theme' - -class MyDocument extends Document { - render() { - return ( - - - - - - -
- - - - ) - } -} - -export default MyDocument diff --git a/next-app/src/pages/index.tsx b/next-app/src/pages/index.tsx deleted file mode 100644 index dea0150f..00000000 --- a/next-app/src/pages/index.tsx +++ /dev/null @@ -1,14 +0,0 @@ -import React from 'react' - -import Layout from '../components/elements/Layout' -import HomePage from '../containers/HomePage' - -export interface IHomePageProps {} - -const Home = (props: IHomePageProps) => ( - - - -) - -export default Home diff --git a/next-app/src/providers/FileUploadProvider.tsx b/next-app/src/providers/FileUploadProvider.tsx deleted file mode 100644 index 26925cd3..00000000 --- a/next-app/src/providers/FileUploadProvider.tsx +++ /dev/null @@ -1,153 +0,0 @@ -import { AxiosError, AxiosResponse } from 'axios' -import React, { useContext, useEffect, useState } from 'react' -import { DropzoneState, useDropzone } from 'react-dropzone' -import { toast } from 'react-toastify' -import { useMutation, UseMutationResult } from 'react-query' -import APIClient from '../api-client' -import { IUploadFileRequest, IUploadFileResponse } from '../../@types/api-client/uploadFile' -import { TOnDropFunction } from '../../@types/react-dropzone' -import { UploadBoxContentContext } from './UploadBoxContentProvider' -import { Box } from '../../@types/box' -import handleErrorMessage from '../utils/handleErrorMessage' -import { IOnUploadProgress } from '../../@types/axios' -import { IUpAppUniversalError } from '../../@types/api-client/common' -import { IDeleteFileRequest, IDeleteFileResponse } from '../../@types/api-client/deleteFile' - -export type TFileUploadContext = { - uploadFileMutation: UseMutationResult< - AxiosResponse, - unknown, - IUploadFileRequest - > - deleteFileMutation: UseMutationResult< - AxiosResponse, - unknown, - IDeleteFileRequest - > - fileUploadDropzone: DropzoneState - loadingValue: number | null -} - -const defaultValue: TFileUploadContext = { - uploadFileMutation: null, - deleteFileMutation: null, - fileUploadDropzone: null, - loadingValue: null -} - -export const FileUploadContext = React.createContext(defaultValue) - -const FileUploadProvider: React.FC = (props) => { - const uploadBoxContext = useContext(UploadBoxContentContext) - const [loadingValue, setLoadingValue] = useState(null) - - const getConfigurationMutation = useMutation(APIClient.getConfiguration, { - onError: (error: AxiosError | Error) => { - handleErrorMessage(error, { autoClose: false }) - uploadBoxContext.setCurrentBox(Box.DefaultUploadBox) - } - }) - - const uploadFileMutation = useMutation(APIClient.uploadFile, { - onMutate: () => { - uploadBoxContext.setCurrentBox(Box.UploadingBox) - }, - onError: (error: AxiosError | Error) => { - handleErrorMessage(error, { autoClose: false }) - uploadBoxContext.setCurrentBox(Box.DefaultUploadBox) - } - }) - - const uploadFile = async (file: File) => { - try { - let configuration: typeof getConfigurationMutation.data - if (getConfigurationMutation.isSuccess) { - configuration = getConfigurationMutation.data - } else { - configuration = await getConfigurationMutation.mutateAsync({}) - } - - if (file.size <= configuration.data.maxTemporaryFileSize) { - await uploadFileMutation.mutateAsync({ - data: { file, expires: '24h' }, - config: { - onUploadProgress: (value: IOnUploadProgress) => - setLoadingValue(Math.round((value.loaded / value.total) * 100)) - } - }) - uploadBoxContext.setCurrentBox(Box.FileUploadedBox) - setLoadingValue(null) - } else { - toast('File too large', { type: 'error' }) - } - } catch (e) { - uploadFileMutation.reset() - } - } - - const deleteFileMutation = useMutation(APIClient.deleteFile, { - onSuccess: uploadFileMutation.reset, - onError: (error: AxiosError | Error) => { - handleErrorMessage(error) - } - }) - - const onDrop: TOnDropFunction = (acceptedFiles) => { - // Dragging files to upload should be only allowed on DefaultUploadBoxView - if (uploadBoxContext.currentBox !== Box.DefaultUploadBox) { - return - } - - uploadFile(acceptedFiles[0]) - } - - const fileUploadDropzone = useDropzone({ - multiple: false, - noClick: true, - noKeyboard: true, - onDrop - }) - - useEffect(() => { - const handleOnPaste = async (event: ClipboardEvent) => { - const items = event.clipboardData?.items - if (!items) return - - let file: File | null - const clipboardText: string | undefined = event.clipboardData?.getData('text') - - if (clipboardText === '') { - file = items[0].getAsFile() - } else if (clipboardText?.length) { - file = new File([clipboardText], 'paste.txt', { - type: 'text/plain' - }) - } else { - return - } - - if (!file) return - - await uploadFile(file) - } - - window.addEventListener('paste', handleOnPaste, false) - return () => window.removeEventListener('paste', handleOnPaste) - }, []) - - return ( - - - {props.children} - - ) -} - -export default FileUploadProvider diff --git a/next-app/src/providers/UploadBoxContentProvider.tsx b/next-app/src/providers/UploadBoxContentProvider.tsx deleted file mode 100644 index bafb8b2d..00000000 --- a/next-app/src/providers/UploadBoxContentProvider.tsx +++ /dev/null @@ -1,24 +0,0 @@ -import React, { createContext, useState } from 'react' -import { Box } from '../../@types/box' - -export type TUploadBoxContentContext = { - currentBox: Box - setCurrentBox: React.Dispatch -} - -export const UploadBoxContentContext = createContext({ - currentBox: Box.DefaultUploadBox, - setCurrentBox: () => undefined -}) - -const UploadBoxContentProvider: React.FC = (props) => { - const [currentBox, setCurrentBox] = useState(Box.DefaultUploadBox) - - return ( - - {props.children} - - ) -} - -export default UploadBoxContentProvider diff --git a/next-app/src/utils/handleErrorMessage.tsx b/next-app/src/utils/handleErrorMessage.tsx deleted file mode 100644 index 36c66639..00000000 --- a/next-app/src/utils/handleErrorMessage.tsx +++ /dev/null @@ -1,21 +0,0 @@ -import axios, { AxiosError } from 'axios' -import { toast } from 'react-toastify' -import { ToastOptions } from 'react-toastify/dist/types' -import { IUpAppUniversalError } from '../../@types/api-client/common' - -const handleErrorMessage = ( - error: AxiosError | Error, - options?: ToastOptions -) => { - if (axios.isAxiosError(error)) { - toast(error.response?.data.message ?? error.toString(), { - type: 'error', - theme: 'dark', - ...options - }) - } else { - toast(error, { type: 'error', theme: 'dark' }) - } -} - -export default handleErrorMessage diff --git a/next-app/src/utils/hexToRGB.ts b/next-app/src/utils/hexToRGB.ts deleted file mode 100644 index 3f64fce9..00000000 --- a/next-app/src/utils/hexToRGB.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { TColor } from '../assets/theme/colors' - -function hexToRGB(hex: TColor | string, alpha?: number) { - try { - const r = parseInt(hex.slice(1, 3), 16) - const g = parseInt(hex.slice(3, 5), 16) - const b = parseInt(hex.slice(5, 7), 16) - - if (alpha) { - return `rgba(${r},${g},${b},${alpha})` - } - - return `rgb(${r},${g},${b})` - } catch (e) { - console.error(`Error converting to rgb for: ${hex}`, e) - } - - return hex -} - -export default hexToRGB diff --git a/next-app/tailwind.config.ts b/next-app/tailwind.config.ts new file mode 100644 index 00000000..109807be --- /dev/null +++ b/next-app/tailwind.config.ts @@ -0,0 +1,18 @@ +import type { Config } from "tailwindcss"; + +export default { + content: [ + "./src/pages/**/*.{js,ts,jsx,tsx,mdx}", + "./src/components/**/*.{js,ts,jsx,tsx,mdx}", + "./src/app/**/*.{js,ts,jsx,tsx,mdx}", + ], + theme: { + extend: { + colors: { + background: "var(--background)", + foreground: "var(--foreground)", + }, + }, + }, + plugins: [], +} satisfies Config; diff --git a/next-app/tsconfig.json b/next-app/tsconfig.json index e687329b..c1334095 100644 --- a/next-app/tsconfig.json +++ b/next-app/tsconfig.json @@ -1,34 +1,27 @@ { "compilerOptions": { - "target": "es5", - "lib": [ - "dom", - "dom.iterable", - "esnext" - ], + "target": "ES2017", + "lib": ["dom", "dom.iterable", "esnext"], "allowJs": true, "skipLibCheck": true, - "strict": false, - "forceConsistentCasingInFileNames": true, + "strict": true, "noEmit": true, "esModuleInterop": true, "module": "esnext", - "moduleResolution": "node", + "moduleResolution": "bundler", "resolveJsonModule": true, "isolatedModules": true, "jsx": "preserve", "incremental": true, - "noImplicitAny": true, - "strictNullChecks": true + "plugins": [ + { + "name": "next" + } + ], + "paths": { + "@/*": ["./src/*"] + } }, - "include": [ - "next-env.d.ts", - "**/*.ts", - "**/*.tsx", - "src/custom.d.ts" - ], - "exclude": [ - "node_modules", - "@types/generated" - ] + "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"], + "exclude": ["node_modules"] } diff --git a/next-app/tslint.json b/next-app/tslint.json deleted file mode 100644 index f63205a1..00000000 --- a/next-app/tslint.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "defaultSeverity": "error", - "extends": [ - "tslint:recommended" - ], - "jsRules": {}, - "rules": { - "semicolon": [true, "never"], - "quotemark": [true, "single", "jsx-single"] - }, - "rulesDirectory": [] -} diff --git a/next-app/yarn.lock b/next-app/yarn.lock deleted file mode 100644 index a4810342..00000000 --- a/next-app/yarn.lock +++ /dev/null @@ -1,5388 +0,0 @@ -# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. -# yarn lockfile v1 - - -"@babel/code-frame@7.12.11": - version "7.12.11" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.12.11.tgz#f4ad435aa263db935b8f10f2c552d23fb716a63f" - integrity sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw== - dependencies: - "@babel/highlight" "^7.10.4" - -"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.16.0": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.16.0.tgz#0dfc80309beec8411e65e706461c408b0bb9b431" - integrity sha512-IF4EOMEV+bfYwOmNxGzSnjR2EmQod7f1UXOpZM3l4i4o4QNwzjtJAu/HxdjHq0aYBvdqMuQEY1eg0nqW9ZPORA== - dependencies: - "@babel/highlight" "^7.16.0" - -"@babel/compat-data@^7.16.0": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.16.0.tgz#ea269d7f78deb3a7826c39a4048eecda541ebdaa" - integrity sha512-DGjt2QZse5SGd9nfOSqO4WLJ8NN/oHkijbXbPrxuoJO3oIPJL3TciZs9FX+cOHNiY9E9l0opL8g7BmLe3T+9ew== - -"@babel/core@^7.14.3": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.16.0.tgz#c4ff44046f5fe310525cc9eb4ef5147f0c5374d4" - integrity sha512-mYZEvshBRHGsIAiyH5PzCFTCfbWfoYbO/jcSdXQSUQu1/pW0xDZAUP7KEc32heqWTAfAHhV9j1vH8Sav7l+JNQ== - dependencies: - "@babel/code-frame" "^7.16.0" - "@babel/generator" "^7.16.0" - "@babel/helper-compilation-targets" "^7.16.0" - "@babel/helper-module-transforms" "^7.16.0" - "@babel/helpers" "^7.16.0" - "@babel/parser" "^7.16.0" - "@babel/template" "^7.16.0" - "@babel/traverse" "^7.16.0" - "@babel/types" "^7.16.0" - convert-source-map "^1.7.0" - debug "^4.1.0" - gensync "^1.0.0-beta.2" - json5 "^2.1.2" - semver "^6.3.0" - source-map "^0.5.0" - -"@babel/generator@^7.16.0": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.16.0.tgz#d40f3d1d5075e62d3500bccb67f3daa8a95265b2" - integrity sha512-RR8hUCfRQn9j9RPKEVXo9LiwoxLPYn6hNZlvUOR8tSnaxlD0p0+la00ZP9/SnRt6HchKr+X0fO2r8vrETiJGew== - dependencies: - "@babel/types" "^7.16.0" - jsesc "^2.5.1" - source-map "^0.5.0" - -"@babel/helper-compilation-targets@^7.16.0": - version "7.16.3" - resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.16.3.tgz#5b480cd13f68363df6ec4dc8ac8e2da11363cbf0" - integrity sha512-vKsoSQAyBmxS35JUOOt+07cLc6Nk/2ljLIHwmq2/NM6hdioUaqEXq/S+nXvbvXbZkNDlWOymPanJGOc4CBjSJA== - dependencies: - "@babel/compat-data" "^7.16.0" - "@babel/helper-validator-option" "^7.14.5" - browserslist "^4.17.5" - semver "^6.3.0" - -"@babel/helper-function-name@^7.16.0": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.16.0.tgz#b7dd0797d00bbfee4f07e9c4ea5b0e30c8bb1481" - integrity sha512-BZh4mEk1xi2h4HFjWUXRQX5AEx4rvaZxHgax9gcjdLWdkjsY7MKt5p0otjsg5noXw+pB+clMCjw+aEVYADMjog== - dependencies: - "@babel/helper-get-function-arity" "^7.16.0" - "@babel/template" "^7.16.0" - "@babel/types" "^7.16.0" - -"@babel/helper-get-function-arity@^7.16.0": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.16.0.tgz#0088c7486b29a9cb5d948b1a1de46db66e089cfa" - integrity sha512-ASCquNcywC1NkYh/z7Cgp3w31YW8aojjYIlNg4VeJiHkqyP4AzIvr4qx7pYDb4/s8YcsZWqqOSxgkvjUz1kpDQ== - dependencies: - "@babel/types" "^7.16.0" - -"@babel/helper-hoist-variables@^7.16.0": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.16.0.tgz#4c9023c2f1def7e28ff46fc1dbcd36a39beaa81a" - integrity sha512-1AZlpazjUR0EQZQv3sgRNfM9mEVWPK3M6vlalczA+EECcPz3XPh6VplbErL5UoMpChhSck5wAJHthlj1bYpcmg== - dependencies: - "@babel/types" "^7.16.0" - -"@babel/helper-member-expression-to-functions@^7.16.0": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.16.0.tgz#29287040efd197c77636ef75188e81da8bccd5a4" - integrity sha512-bsjlBFPuWT6IWhl28EdrQ+gTvSvj5tqVP5Xeftp07SEuz5pLnsXZuDkDD3Rfcxy0IsHmbZ+7B2/9SHzxO0T+sQ== - dependencies: - "@babel/types" "^7.16.0" - -"@babel/helper-module-imports@^7.12.13", "@babel/helper-module-imports@^7.16.0": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.16.0.tgz#90538e60b672ecf1b448f5f4f5433d37e79a3ec3" - integrity sha512-kkH7sWzKPq0xt3H1n+ghb4xEMP8k0U7XV3kkB+ZGy69kDk2ySFW1qPi06sjKzFY3t1j6XbJSqr4mF9L7CYVyhg== - dependencies: - "@babel/types" "^7.16.0" - -"@babel/helper-module-transforms@^7.16.0": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.16.0.tgz#1c82a8dd4cb34577502ebd2909699b194c3e9bb5" - integrity sha512-My4cr9ATcaBbmaEa8M0dZNA74cfI6gitvUAskgDtAFmAqyFKDSHQo5YstxPbN+lzHl2D9l/YOEFqb2mtUh4gfA== - dependencies: - "@babel/helper-module-imports" "^7.16.0" - "@babel/helper-replace-supers" "^7.16.0" - "@babel/helper-simple-access" "^7.16.0" - "@babel/helper-split-export-declaration" "^7.16.0" - "@babel/helper-validator-identifier" "^7.15.7" - "@babel/template" "^7.16.0" - "@babel/traverse" "^7.16.0" - "@babel/types" "^7.16.0" - -"@babel/helper-optimise-call-expression@^7.16.0": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.16.0.tgz#cecdb145d70c54096b1564f8e9f10cd7d193b338" - integrity sha512-SuI467Gi2V8fkofm2JPnZzB/SUuXoJA5zXe/xzyPP2M04686RzFKFHPK6HDVN6JvWBIEW8tt9hPR7fXdn2Lgpw== - dependencies: - "@babel/types" "^7.16.0" - -"@babel/helper-plugin-utils@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.14.5.tgz#5ac822ce97eec46741ab70a517971e443a70c5a9" - integrity sha512-/37qQCE3K0vvZKwoK4XU/irIJQdIfCJuhU5eKnNxpFDsOkgFaUAwbv+RYw6eYgsC0E4hS7r5KqGULUogqui0fQ== - -"@babel/helper-replace-supers@^7.16.0": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.16.0.tgz#73055e8d3cf9bcba8ddb55cad93fedc860f68f17" - integrity sha512-TQxuQfSCdoha7cpRNJvfaYxxxzmbxXw/+6cS7V02eeDYyhxderSoMVALvwupA54/pZcOTtVeJ0xccp1nGWladA== - dependencies: - "@babel/helper-member-expression-to-functions" "^7.16.0" - "@babel/helper-optimise-call-expression" "^7.16.0" - "@babel/traverse" "^7.16.0" - "@babel/types" "^7.16.0" - -"@babel/helper-simple-access@^7.16.0": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.16.0.tgz#21d6a27620e383e37534cf6c10bba019a6f90517" - integrity sha512-o1rjBT/gppAqKsYfUdfHq5Rk03lMQrkPHG1OWzHWpLgVXRH4HnMM9Et9CVdIqwkCQlobnGHEJMsgWP/jE1zUiw== - dependencies: - "@babel/types" "^7.16.0" - -"@babel/helper-split-export-declaration@^7.16.0": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.0.tgz#29672f43663e936df370aaeb22beddb3baec7438" - integrity sha512-0YMMRpuDFNGTHNRiiqJX19GjNXA4H0E8jZ2ibccfSxaCogbm3am5WN/2nQNj0YnQwGWM1J06GOcQ2qnh3+0paw== - dependencies: - "@babel/types" "^7.16.0" - -"@babel/helper-validator-identifier@^7.14.9", "@babel/helper-validator-identifier@^7.15.7": - version "7.15.7" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.15.7.tgz#220df993bfe904a4a6b02ab4f3385a5ebf6e2389" - integrity sha512-K4JvCtQqad9OY2+yTU8w+E82ywk/fe+ELNlt1G8z3bVGlZfn/hOcQQsUhGhW/N+tb3fxK800wLtKOE/aM0m72w== - -"@babel/helper-validator-option@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.14.5.tgz#6e72a1fff18d5dfcb878e1e62f1a021c4b72d5a3" - integrity sha512-OX8D5eeX4XwcroVW45NMvoYaIuFI+GQpA2a8Gi+X/U/cDUIRsV37qQfF905F0htTRCREQIB4KqPeaveRJUl3Ow== - -"@babel/helpers@^7.16.0": - version "7.16.3" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.16.3.tgz#27fc64f40b996e7074dc73128c3e5c3e7f55c43c" - integrity sha512-Xn8IhDlBPhvYTvgewPKawhADichOsbkZuzN7qz2BusOM0brChsyXMDJvldWaYMMUNiCQdQzNEioXTp3sC8Nt8w== - dependencies: - "@babel/template" "^7.16.0" - "@babel/traverse" "^7.16.3" - "@babel/types" "^7.16.0" - -"@babel/highlight@^7.10.4", "@babel/highlight@^7.16.0": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.16.0.tgz#6ceb32b2ca4b8f5f361fb7fd821e3fddf4a1725a" - integrity sha512-t8MH41kUQylBtu2+4IQA3atqevA2lRgqA2wyVB/YiWmsDSuylZZuXOUy9ric30hfzauEFfdsuk/eXTRrGrfd0g== - dependencies: - "@babel/helper-validator-identifier" "^7.15.7" - chalk "^2.0.0" - js-tokens "^4.0.0" - -"@babel/parser@^7.16.0", "@babel/parser@^7.16.3": - version "7.16.3" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.16.3.tgz#271bafcb811080905a119222edbc17909c82261d" - integrity sha512-dcNwU1O4sx57ClvLBVFbEgx0UZWfd0JQX5X6fxFRCLHelFBGXFfSz6Y0FAq2PEwUqlqLkdVjVr4VASEOuUnLJw== - -"@babel/plugin-syntax-jsx@7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.14.5.tgz#000e2e25d8673cce49300517a3eda44c263e4201" - integrity sha512-ohuFIsOMXJnbOMRfX7/w7LocdR6R7whhuRD4ax8IipLcLPlZGJKkBxgHp++U4N/vKyU16/YDQr2f5seajD3jIw== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-syntax-jsx@^7.12.13": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.16.0.tgz#f9624394317365a9a88c82358d3f8471154698f1" - integrity sha512-8zv2+xiPHwly31RK4RmnEYY5zziuF3O7W2kIDW+07ewWDh6Oi0dRq8kwvulRkFgt6DB97RlKs5c1y068iPlCUg== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/runtime@7.15.4": - version "7.15.4" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.15.4.tgz#fd17d16bfdf878e6dd02d19753a39fa8a8d9c84a" - integrity sha512-99catp6bHCaxr4sJ/DbTGgHS4+Rs2RVd2g7iOap6SLGPDknRK9ztKNsE/Fg6QhSeh1FGE5f6gHGQmvvn3I3xhw== - dependencies: - regenerator-runtime "^0.13.4" - -"@babel/runtime@^7.12.5", "@babel/runtime@^7.13.10", "@babel/runtime@^7.5.5", "@babel/runtime@^7.6.2", "@babel/runtime@^7.7.2": - version "7.16.3" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.16.3.tgz#b86f0db02a04187a3c17caa77de69840165d42d5" - integrity sha512-WBwekcqacdY2e9AF/Q7WLFUWmdJGJTkbjqTjoMDgXkVZ3ZRUvOPsLb5KdwISoQVsbP+DQzVZW4Zhci0DvpbNTQ== - dependencies: - regenerator-runtime "^0.13.4" - -"@babel/template@^7.16.0": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.16.0.tgz#d16a35ebf4cd74e202083356fab21dd89363ddd6" - integrity sha512-MnZdpFD/ZdYhXwiunMqqgyZyucaYsbL0IrjoGjaVhGilz+x8YB++kRfygSOIj1yOtWKPlx7NBp+9I1RQSgsd5A== - dependencies: - "@babel/code-frame" "^7.16.0" - "@babel/parser" "^7.16.0" - "@babel/types" "^7.16.0" - -"@babel/traverse@^7.16.0", "@babel/traverse@^7.16.3": - version "7.16.3" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.16.3.tgz#f63e8a938cc1b780f66d9ed3c54f532ca2d14787" - integrity sha512-eolumr1vVMjqevCpwVO99yN/LoGL0EyHiLO5I043aYQvwOJ9eR5UsZSClHVCzfhBduMAsSzgA/6AyqPjNayJag== - dependencies: - "@babel/code-frame" "^7.16.0" - "@babel/generator" "^7.16.0" - "@babel/helper-function-name" "^7.16.0" - "@babel/helper-hoist-variables" "^7.16.0" - "@babel/helper-split-export-declaration" "^7.16.0" - "@babel/parser" "^7.16.3" - "@babel/types" "^7.16.0" - debug "^4.1.0" - globals "^11.1.0" - -"@babel/types@7.15.0": - version "7.15.0" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.15.0.tgz#61af11f2286c4e9c69ca8deb5f4375a73c72dcbd" - integrity sha512-OBvfqnllOIdX4ojTHpwZbpvz4j3EWyjkZEdmjH0/cgsd6QOdSgU8rLSk6ard/pcW7rlmjdVSX/AWOaORR1uNOQ== - dependencies: - "@babel/helper-validator-identifier" "^7.14.9" - to-fast-properties "^2.0.0" - -"@babel/types@^7.16.0": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.16.0.tgz#db3b313804f96aadd0b776c4823e127ad67289ba" - integrity sha512-PJgg/k3SdLsGb3hhisFvtLOw5ts113klrpLuIPtCJIU+BB24fqq6lf8RWqKJEjzqXR9AEH1rIb5XTqwBHB+kQg== - dependencies: - "@babel/helper-validator-identifier" "^7.15.7" - to-fast-properties "^2.0.0" - -"@emotion/babel-plugin@^11.0.0", "@emotion/babel-plugin@^11.3.0": - version "11.3.0" - resolved "https://registry.yarnpkg.com/@emotion/babel-plugin/-/babel-plugin-11.3.0.tgz#3a16850ba04d8d9651f07f3fb674b3436a4fb9d7" - integrity sha512-UZKwBV2rADuhRp+ZOGgNWg2eYgbzKzQXfQPtJbu/PLy8onurxlNCLvxMQEvlr1/GudguPI5IU9qIY1+2z1M5bA== - dependencies: - "@babel/helper-module-imports" "^7.12.13" - "@babel/plugin-syntax-jsx" "^7.12.13" - "@babel/runtime" "^7.13.10" - "@emotion/hash" "^0.8.0" - "@emotion/memoize" "^0.7.5" - "@emotion/serialize" "^1.0.2" - babel-plugin-macros "^2.6.1" - convert-source-map "^1.5.0" - escape-string-regexp "^4.0.0" - find-root "^1.1.0" - source-map "^0.5.7" - stylis "^4.0.3" - -"@emotion/cache@^11.4.0", "@emotion/cache@^11.5.0", "@emotion/cache@^11.6.0": - version "11.6.0" - resolved "https://registry.yarnpkg.com/@emotion/cache/-/cache-11.6.0.tgz#65fbdbbe4382f1991d8b20853c38e63ecccec9a1" - integrity sha512-ElbsWY1KMwEowkv42vGo0UPuLgtPYfIs9BxxVrmvsaJVvktknsHYYlx5NQ5g6zLDcOTyamlDc7FkRg2TAcQDKQ== - dependencies: - "@emotion/memoize" "^0.7.4" - "@emotion/sheet" "^1.1.0" - "@emotion/utils" "^1.0.0" - "@emotion/weak-memoize" "^0.2.5" - stylis "^4.0.10" - -"@emotion/css@^11.1.3": - version "11.5.0" - resolved "https://registry.yarnpkg.com/@emotion/css/-/css-11.5.0.tgz#0a80017080cb44d47994fe576b9923bfc8b0f6ad" - integrity sha512-mqjz/3aqR9rp40M+pvwdKYWxlQK4Nj3cnNjo3Tx6SM14dSsEn7q/4W2/I7PlgG+mb27iITHugXuBIHH/QwUBVQ== - dependencies: - "@emotion/babel-plugin" "^11.0.0" - "@emotion/cache" "^11.5.0" - "@emotion/serialize" "^1.0.0" - "@emotion/sheet" "^1.0.3" - "@emotion/utils" "^1.0.0" - -"@emotion/hash@^0.8.0": - version "0.8.0" - resolved "https://registry.yarnpkg.com/@emotion/hash/-/hash-0.8.0.tgz#bbbff68978fefdbe68ccb533bc8cbe1d1afb5413" - integrity sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow== - -"@emotion/is-prop-valid@^1.1.1": - version "1.1.1" - resolved "https://registry.yarnpkg.com/@emotion/is-prop-valid/-/is-prop-valid-1.1.1.tgz#cbd843d409dfaad90f9404e7c0404c55eae8c134" - integrity sha512-bW1Tos67CZkOURLc0OalnfxtSXQJMrAMV0jZTVGJUPSOd4qgjF3+tTD5CwJM13PHA8cltGW1WGbbvV9NpvUZPw== - dependencies: - "@emotion/memoize" "^0.7.4" - -"@emotion/memoize@^0.7.4", "@emotion/memoize@^0.7.5": - version "0.7.5" - resolved "https://registry.yarnpkg.com/@emotion/memoize/-/memoize-0.7.5.tgz#2c40f81449a4e554e9fc6396910ed4843ec2be50" - integrity sha512-igX9a37DR2ZPGYtV6suZ6whr8pTFtyHL3K/oLUotxpSVO2ASaprmAe2Dkq7tBo7CRY7MMDrAa9nuQP9/YG8FxQ== - -"@emotion/react@^11.4.0": - version "11.6.0" - resolved "https://registry.yarnpkg.com/@emotion/react/-/react-11.6.0.tgz#61fcb95c1e01255734c2c721cb9beabcf521eb0f" - integrity sha512-23MnRZFBN9+D1lHXC5pD6z4X9yhPxxtHr6f+iTGz6Fv6Rda0GdefPrsHL7otsEf+//7uqCdT5QtHeRxHCERzuw== - dependencies: - "@babel/runtime" "^7.13.10" - "@emotion/cache" "^11.6.0" - "@emotion/serialize" "^1.0.2" - "@emotion/sheet" "^1.1.0" - "@emotion/utils" "^1.0.0" - "@emotion/weak-memoize" "^0.2.5" - hoist-non-react-statics "^3.3.1" - -"@emotion/serialize@^1.0.0", "@emotion/serialize@^1.0.2": - version "1.0.2" - resolved "https://registry.yarnpkg.com/@emotion/serialize/-/serialize-1.0.2.tgz#77cb21a0571c9f68eb66087754a65fa97bfcd965" - integrity sha512-95MgNJ9+/ajxU7QIAruiOAdYNjxZX7G2mhgrtDWswA21VviYIRP1R5QilZ/bDY42xiKsaktP4egJb3QdYQZi1A== - dependencies: - "@emotion/hash" "^0.8.0" - "@emotion/memoize" "^0.7.4" - "@emotion/unitless" "^0.7.5" - "@emotion/utils" "^1.0.0" - csstype "^3.0.2" - -"@emotion/sheet@^1.0.3", "@emotion/sheet@^1.1.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@emotion/sheet/-/sheet-1.1.0.tgz#56d99c41f0a1cda2726a05aa6a20afd4c63e58d2" - integrity sha512-u0AX4aSo25sMAygCuQTzS+HsImZFuS8llY8O7b9MDRzbJM0kVJlAz6KNDqcG7pOuQZJmj/8X/rAW+66kMnMW+g== - -"@emotion/styled@^11.3.0": - version "11.6.0" - resolved "https://registry.yarnpkg.com/@emotion/styled/-/styled-11.6.0.tgz#9230d1a7bcb2ebf83c6a579f4c80e0664132d81d" - integrity sha512-mxVtVyIOTmCAkFbwIp+nCjTXJNgcz4VWkOYQro87jE2QBTydnkiYusMrRGFtzuruiGK4dDaNORk4gH049iiQuw== - dependencies: - "@babel/runtime" "^7.13.10" - "@emotion/babel-plugin" "^11.3.0" - "@emotion/is-prop-valid" "^1.1.1" - "@emotion/serialize" "^1.0.2" - "@emotion/utils" "^1.0.0" - -"@emotion/unitless@^0.7.5": - version "0.7.5" - resolved "https://registry.yarnpkg.com/@emotion/unitless/-/unitless-0.7.5.tgz#77211291c1900a700b8a78cfafda3160d76949ed" - integrity sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg== - -"@emotion/utils@^1.0.0": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@emotion/utils/-/utils-1.0.0.tgz#abe06a83160b10570816c913990245813a2fd6af" - integrity sha512-mQC2b3XLDs6QCW+pDQDiyO/EdGZYOygE8s5N5rrzjSI4M3IejPE/JPndCBwRT9z982aqQNi6beWs1UeayrQxxA== - -"@emotion/weak-memoize@^0.2.5": - version "0.2.5" - resolved "https://registry.yarnpkg.com/@emotion/weak-memoize/-/weak-memoize-0.2.5.tgz#8eed982e2ee6f7f4e44c253e12962980791efd46" - integrity sha512-6U71C2Wp7r5XtFtQzYrW5iKFT67OixrSxjI4MptCHzdSVlgabczzqLe0ZSgnub/5Kp4hSbpDB1tMytZY9pwxxA== - -"@eslint/eslintrc@^1.0.4": - version "1.0.4" - resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-1.0.4.tgz#dfe0ff7ba270848d10c5add0715e04964c034b31" - integrity sha512-h8Vx6MdxwWI2WM8/zREHMoqdgLNXEL4QX3MWSVMdyNJGvXVOs+6lp+m2hc3FnuMHDc4poxFNI20vCk0OmI4G0Q== - dependencies: - ajv "^6.12.4" - debug "^4.3.2" - espree "^9.0.0" - globals "^13.9.0" - ignore "^4.0.6" - import-fresh "^3.2.1" - js-yaml "^4.1.0" - minimatch "^3.0.4" - strip-json-comments "^3.1.1" - -"@fortawesome/fontawesome-common-types@^0.2.36": - version "0.2.36" - resolved "https://registry.yarnpkg.com/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-0.2.36.tgz#b44e52db3b6b20523e0c57ef8c42d315532cb903" - integrity sha512-a/7BiSgobHAgBWeN7N0w+lAhInrGxksn13uK7231n2m8EDPE3BMCl9NZLTGrj9ZXfCmC6LM0QLqXidIizVQ6yg== - -"@fortawesome/fontawesome-svg-core@^1.2.36": - version "1.2.36" - resolved "https://registry.yarnpkg.com/@fortawesome/fontawesome-svg-core/-/fontawesome-svg-core-1.2.36.tgz#4f2ea6f778298e0c47c6524ce2e7fd58eb6930e3" - integrity sha512-YUcsLQKYb6DmaJjIHdDWpBIGCcyE/W+p/LMGvjQem55Mm2XWVAP5kWTMKWLv9lwpCVjpLxPyOMOyUocP1GxrtA== - dependencies: - "@fortawesome/fontawesome-common-types" "^0.2.36" - -"@fortawesome/free-solid-svg-icons@^5.15.4": - version "5.15.4" - resolved "https://registry.yarnpkg.com/@fortawesome/free-solid-svg-icons/-/free-solid-svg-icons-5.15.4.tgz#2a68f3fc3ddda12e52645654142b9e4e8fbb6cc5" - integrity sha512-JLmQfz6tdtwxoihXLg6lT78BorrFyCf59SAwBM6qV/0zXyVeDygJVb3fk+j5Qat+Yvcxp1buLTY5iDh1ZSAQ8w== - dependencies: - "@fortawesome/fontawesome-common-types" "^0.2.36" - -"@fortawesome/react-fontawesome@^0.1.15": - version "0.1.16" - resolved "https://registry.yarnpkg.com/@fortawesome/react-fontawesome/-/react-fontawesome-0.1.16.tgz#ce7665490214e20f929368d6b65f68884a99276a" - integrity sha512-aLmzDwC9rEOAJv2UJdMns89VZR5Ry4IHu5dQQh24Z/lWKEm44lfQr1UNalZlkUaQN8d155tNh+CS7ntntj1VMA== - dependencies: - prop-types "^15.7.2" - -"@hapi/accept@5.0.2": - version "5.0.2" - resolved "https://registry.yarnpkg.com/@hapi/accept/-/accept-5.0.2.tgz#ab7043b037e68b722f93f376afb05e85c0699523" - integrity sha512-CmzBx/bXUR8451fnZRuZAJRlzgm0Jgu5dltTX/bszmR2lheb9BpyN47Q1RbaGTsvFzn0PXAEs+lXDKfshccYZw== - dependencies: - "@hapi/boom" "9.x.x" - "@hapi/hoek" "9.x.x" - -"@hapi/boom@9.x.x": - version "9.1.4" - resolved "https://registry.yarnpkg.com/@hapi/boom/-/boom-9.1.4.tgz#1f9dad367c6a7da9f8def24b4a986fc5a7bd9db6" - integrity sha512-Ls1oH8jaN1vNsqcaHVYJrKmgMcKsC1wcp8bujvXrHaAqD2iDYq3HoOwsxwo09Cuda5R5nC0o0IxlrlTuvPuzSw== - dependencies: - "@hapi/hoek" "9.x.x" - -"@hapi/hoek@9.x.x": - version "9.2.1" - resolved "https://registry.yarnpkg.com/@hapi/hoek/-/hoek-9.2.1.tgz#9551142a1980503752536b5050fd99f4a7f13b17" - integrity sha512-gfta+H8aziZsm8pZa0vj04KO6biEiisppNgA1kbJvFrrWu9Vm7eaUEy76DIxsuTaWvti5fkJVhllWc6ZTE+Mdw== - -"@humanwhocodes/config-array@^0.6.0": - version "0.6.0" - resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.6.0.tgz#b5621fdb3b32309d2d16575456cbc277fa8f021a" - integrity sha512-JQlEKbcgEUjBFhLIF4iqM7u/9lwgHRBcpHrmUNCALK0Q3amXN6lxdoXLnF0sm11E9VqTmBALR87IlUg1bZ8A9A== - dependencies: - "@humanwhocodes/object-schema" "^1.2.0" - debug "^4.1.1" - minimatch "^3.0.4" - -"@humanwhocodes/object-schema@^1.2.0": - version "1.2.1" - resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz#b520529ec21d8e5945a1851dfd1c32e94e39ff45" - integrity sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA== - -"@mrmlnc/readdir-enhanced@^2.2.1": - version "2.2.1" - resolved "https://registry.yarnpkg.com/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz#524af240d1a360527b730475ecfa1344aa540dde" - integrity sha512-bPHp6Ji8b41szTOcaP63VlnbbO5Ny6dwAATtY6JTjh5N2OLrb5Qk/Th5cRkRQhkWCt+EJsYrNB0MiL+Gpn6e3g== - dependencies: - call-me-maybe "^1.0.1" - glob-to-regexp "^0.3.0" - -"@napi-rs/triples@1.0.3": - version "1.0.3" - resolved "https://registry.yarnpkg.com/@napi-rs/triples/-/triples-1.0.3.tgz#76d6d0c3f4d16013c61e45dfca5ff1e6c31ae53c" - integrity sha512-jDJTpta+P4p1NZTFVLHJ/TLFVYVcOqv6l8xwOeBKNPMgY/zDYH/YH7SJbvrr/h1RcS9GzbPcLKGzpuK9cV56UA== - -"@next/env@12.0.7": - version "12.0.7" - resolved "https://registry.yarnpkg.com/@next/env/-/env-12.0.7.tgz#316f7bd1b6b69f554d2676cfc91a16bc7e32ee79" - integrity sha512-TNDqBV37wd95SiNdZsSUq8gnnrTwr+aN9wqy4Zxrxw4bC/jCHNsbK94DxjkG99VL30VCRXXDBTA1/Wa2jIpF9Q== - -"@next/polyfill-module@12.0.7": - version "12.0.7" - resolved "https://registry.yarnpkg.com/@next/polyfill-module/-/polyfill-module-12.0.7.tgz#140e698557113cd3a3c0833f15ca8af1b608f2dc" - integrity sha512-sA8LAMMlmcspIZw/jeQuJTyA3uGrqOhTBaQE+G9u6DPohqrBFRkaz7RzzJeqXkUXw600occsIBknSjyVd1R67A== - -"@next/react-dev-overlay@12.0.7": - version "12.0.7" - resolved "https://registry.yarnpkg.com/@next/react-dev-overlay/-/react-dev-overlay-12.0.7.tgz#ae8f9bd14b1786e52330b729ff63061735d21c77" - integrity sha512-dSQLgpZ5uzyittFtIHlJCLAbc0LlMFbRBSYuGsIlrtGyjYN+WMcnz8lK48VLxNPFGuB/hEzkWV4TW5Zu75+Fzg== - dependencies: - "@babel/code-frame" "7.12.11" - anser "1.4.9" - chalk "4.0.0" - classnames "2.2.6" - css.escape "1.5.1" - data-uri-to-buffer "3.0.1" - platform "1.3.6" - shell-quote "1.7.3" - source-map "0.8.0-beta.0" - stacktrace-parser "0.1.10" - strip-ansi "6.0.1" - -"@next/react-refresh-utils@12.0.7": - version "12.0.7" - resolved "https://registry.yarnpkg.com/@next/react-refresh-utils/-/react-refresh-utils-12.0.7.tgz#921c403798e188b4f1d9e609283c0e8d3e532f89" - integrity sha512-Pglj1t+7RxH0txEqVcD8ZxrJgqLDmKvQDqxKq3ZPRWxMv7LTl7FVT2Pnb36QFeBwCvMVl67jxsADKsW0idz8sA== - -"@next/swc-android-arm64@12.0.7": - version "12.0.7" - resolved "https://registry.yarnpkg.com/@next/swc-android-arm64/-/swc-android-arm64-12.0.7.tgz#9b0a9e4bc646a045eef725764112096f0a6ea204" - integrity sha512-yViT7EEc7JqxncRT+ZTeTsrAYXLlcefo0Y0eAfYmmalGD2605L4FWAVrJi4WnrSLji7l+veczw1WBmNeHICKKA== - -"@next/swc-darwin-arm64@12.0.7": - version "12.0.7" - resolved "https://registry.yarnpkg.com/@next/swc-darwin-arm64/-/swc-darwin-arm64-12.0.7.tgz#2fd506dba91e4a35036b9fc7930a4d6b8895f16a" - integrity sha512-vhAyW2rDEUcQesRVaj0z1hSoz7QhDzzGd0V1/5/5i9YJOfOtyrPsVJ82tlf7BfXl6/Ep+eKNfWVIb5/Jv89EKg== - -"@next/swc-darwin-x64@12.0.7": - version "12.0.7" - resolved "https://registry.yarnpkg.com/@next/swc-darwin-x64/-/swc-darwin-x64-12.0.7.tgz#b3016503caa5ed5cc6a20051517d5b2a79cfdc58" - integrity sha512-km+6Rx6TvbraoQ1f0MXa69ol/x0RxzucFGa2OgZaYJERas0spy0iwW8hpASsGcf597D8VRW1x+R2C7ZdjVBSTw== - -"@next/swc-linux-arm-gnueabihf@12.0.7": - version "12.0.7" - resolved "https://registry.yarnpkg.com/@next/swc-linux-arm-gnueabihf/-/swc-linux-arm-gnueabihf-12.0.7.tgz#8e91ecddc2d6d26946949a67d481110db3063d09" - integrity sha512-d0zWr877YqZ2cf/DQy6obouaR39r0FPebcXj2nws9AC99m68CO2xVpWv9jT7mFvpY+T40HJisLH80jSZ2iQ9sA== - -"@next/swc-linux-arm64-gnu@12.0.7": - version "12.0.7" - resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-12.0.7.tgz#1eefcf7b063610315b74e5c7dc24c3437370e49d" - integrity sha512-fdobh5u6gG13Gd5LkHhJ+W8tF9hbaFolRW99FhzArMe5/nMKlLdBymOxvitE3K4gSFQxbXJA6TbU0Vv0e59Kww== - -"@next/swc-linux-arm64-musl@12.0.7": - version "12.0.7" - resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-12.0.7.tgz#e9e764519dfb75e43355c442181346cd6e72459b" - integrity sha512-vx0c5Q3oIScFNT/4jI9rCe0yPzKuCqWOkiO/OOV0ixSI2gLhbrwDIcdkm79fKVn3i8JOJunxE4zDoFeR/g8xqQ== - -"@next/swc-linux-x64-gnu@12.0.7": - version "12.0.7" - resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-12.0.7.tgz#fef02e14ed8f9c114479dabba1475ae2d3bb040d" - integrity sha512-9ITyp6s6uGVKNx3C/GP7GrYycbcwTADG7TdIXzXUxOOZORrdB1GNg3w/EL3Am4VMPPEpO6v1RfKo2IKZpVKfTA== - -"@next/swc-linux-x64-musl@12.0.7": - version "12.0.7" - resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-12.0.7.tgz#07dc334b1924d9f5a8c4a891b91562af19ff5de4" - integrity sha512-C+k+cygbIZXYfc+Hx2fNPUBEg7jzio+mniP5ywZevuTXW14zodIfQ3ZMoMJR8EpOVvYpjWFk2uAjiwqgx8vo/g== - -"@next/swc-win32-arm64-msvc@12.0.7": - version "12.0.7" - resolved "https://registry.yarnpkg.com/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-12.0.7.tgz#6c559d87ce142693173039a18b1c1d65519762dd" - integrity sha512-7jTRjOKkDVnb5s7VoHT7eX+eyT/5BQJ/ljP2G56riAgKGqPL63/V7FXemLhhLT67D+OjoP8DRA2E2ne6IPHk4w== - -"@next/swc-win32-ia32-msvc@12.0.7": - version "12.0.7" - resolved "https://registry.yarnpkg.com/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-12.0.7.tgz#16b23f2301b16877b3623f0e8364e8177e2ef7db" - integrity sha512-2u5pGDsk7H6gGxob2ATIojzlwKzgYsrijo7RRpXOiPePVqwPWg6/pmhaJzLdpfjaBgRg1NFmwSp/7Ump9X8Ijg== - -"@next/swc-win32-x64-msvc@12.0.7": - version "12.0.7" - resolved "https://registry.yarnpkg.com/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-12.0.7.tgz#8d75d3b6a872ab97ab73e3b4173d56dbb2991917" - integrity sha512-frEWtbf+q8Oz4e2UqKJrNssk6DZ6/NLCQXn5/ORWE9dPAfe9XS6aK5FRZ6DuEPmmKd5gOoRkKJFFz5nYd+TeyQ== - -"@nodelib/fs.scandir@2.1.5": - version "2.1.5" - resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" - integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== - dependencies: - "@nodelib/fs.stat" "2.0.5" - run-parallel "^1.1.9" - -"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": - version "2.0.5" - resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" - integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== - -"@nodelib/fs.stat@^1.1.2": - version "1.1.3" - resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz#2b5a3ab3f918cca48a8c754c08168e3f03eba61b" - integrity sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw== - -"@nodelib/fs.walk@^1.2.3": - version "1.2.8" - resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" - integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== - dependencies: - "@nodelib/fs.scandir" "2.1.5" - fastq "^1.6.0" - -"@sindresorhus/is@^0.7.0": - version "0.7.0" - resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-0.7.0.tgz#9a06f4f137ee84d7df0460c1fdb1135ffa6c50fd" - integrity sha512-ONhaKPIufzzrlNbqtWFFd+jlnemX6lJAgq9ZeiZtS7I1PIf/la7CW4m83rTXRnVnsMbW2k56pGYu7AUFJD9Pow== - -"@trysound/sax@0.2.0": - version "0.2.0" - resolved "https://registry.yarnpkg.com/@trysound/sax/-/sax-0.2.0.tgz#cccaab758af56761eb7bf37af6f03f326dd798ad" - integrity sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA== - -"@types/json-schema@^7.0.5", "@types/json-schema@^7.0.8", "@types/json-schema@^7.0.9": - version "7.0.9" - resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.9.tgz#97edc9037ea0c38585320b28964dde3b39e4660d" - integrity sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ== - -"@types/lodash@^4.14.178": - version "4.14.178" - resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.178.tgz#341f6d2247db528d4a13ddbb374bcdc80406f4f8" - integrity sha512-0d5Wd09ItQWH1qFbEyQ7oTQ3GZrMfth5JkbN3EvTKLXcHLRDSXeLnlvlOn0wvxVIwK5o2M8JzP/OWz7T3NRsbw== - -"@types/node@*", "@types/node@^16.11.7": - version "16.11.7" - resolved "https://registry.yarnpkg.com/@types/node/-/node-16.11.7.tgz#36820945061326978c42a01e56b61cd223dfdc42" - integrity sha512-QB5D2sqfSjCmTuWcBWyJ+/44bcjO7VbjSbOE0ucoVbAsSNQc4Lt6QkgkVXkTDwkL4z/beecZNDvVX15D4P8Jbw== - -"@types/parse-json@^4.0.0": - version "4.0.0" - resolved "https://registry.yarnpkg.com/@types/parse-json/-/parse-json-4.0.0.tgz#2f8bb441434d163b35fb8ffdccd7138927ffb8c0" - integrity sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA== - -"@types/prop-types@*": - version "15.7.4" - resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.4.tgz#fcf7205c25dff795ee79af1e30da2c9790808f11" - integrity sha512-rZ5drC/jWjrArrS8BR6SIr4cWpW09RNTYt9AMZo3Jwwif+iacXAqgVjm0B0Bv/S1jhDXKHqRVNCbACkJ89RAnQ== - -"@types/react-stickynode@^4.0.0": - version "4.0.0" - resolved "https://registry.yarnpkg.com/@types/react-stickynode/-/react-stickynode-4.0.0.tgz#54ba7ceab9bd563bccdcae72c7486a626e870ecb" - integrity sha512-PKkmOzF6WCNuyIKrvhidGeUPLfe8htPwfEljKnQBF4bA5v74ADvXtwkjavOH8i6aCSw9J14AyDDl1Ul0VNQJUg== - dependencies: - "@types/react" "*" - -"@types/react@*", "@types/react@^17.0.6": - version "17.0.34" - resolved "https://registry.yarnpkg.com/@types/react/-/react-17.0.34.tgz#797b66d359b692e3f19991b6b07e4b0c706c0102" - integrity sha512-46FEGrMjc2+8XhHXILr+3+/sTe3OfzSPU9YGKILLrUYbQ1CLQC9Daqo1KzENGXAWwrFwiY0l4ZbF20gRvgpWTg== - dependencies: - "@types/prop-types" "*" - "@types/scheduler" "*" - csstype "^3.0.2" - -"@types/scheduler@*": - version "0.16.2" - resolved "https://registry.yarnpkg.com/@types/scheduler/-/scheduler-0.16.2.tgz#1a62f89525723dde24ba1b01b092bf5df8ad4d39" - integrity sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew== - -"@typescript-eslint/eslint-plugin@^5.4.0": - version "5.4.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.4.0.tgz#05e711a2e7b68342661fde61bccbd1531c19521a" - integrity sha512-9/yPSBlwzsetCsGEn9j24D8vGQgJkOTr4oMLas/w886ZtzKIs1iyoqFrwsX2fqYEeUwsdBpC21gcjRGo57u0eg== - dependencies: - "@typescript-eslint/experimental-utils" "5.4.0" - "@typescript-eslint/scope-manager" "5.4.0" - debug "^4.3.2" - functional-red-black-tree "^1.0.1" - ignore "^5.1.8" - regexpp "^3.2.0" - semver "^7.3.5" - tsutils "^3.21.0" - -"@typescript-eslint/experimental-utils@5.4.0": - version "5.4.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-5.4.0.tgz#238a7418d2da3b24874ba35385eb21cc61d2a65e" - integrity sha512-Nz2JDIQUdmIGd6p33A+naQmwfkU5KVTLb/5lTk+tLVTDacZKoGQisj8UCxk7onJcrgjIvr8xWqkYI+DbI3TfXg== - dependencies: - "@types/json-schema" "^7.0.9" - "@typescript-eslint/scope-manager" "5.4.0" - "@typescript-eslint/types" "5.4.0" - "@typescript-eslint/typescript-estree" "5.4.0" - eslint-scope "^5.1.1" - eslint-utils "^3.0.0" - -"@typescript-eslint/parser@^5.4.0": - version "5.4.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-5.4.0.tgz#3aa83ce349d66e39b84151f6d5464928044ca9e3" - integrity sha512-JoB41EmxiYpaEsRwpZEYAJ9XQURPFer8hpkIW9GiaspVLX8oqbqNM8P4EP8HOZg96yaALiLEVWllA2E8vwsIKw== - dependencies: - "@typescript-eslint/scope-manager" "5.4.0" - "@typescript-eslint/types" "5.4.0" - "@typescript-eslint/typescript-estree" "5.4.0" - debug "^4.3.2" - -"@typescript-eslint/scope-manager@5.4.0": - version "5.4.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.4.0.tgz#aaab08415f4a9cf32b870c7750ae8ba4607126a1" - integrity sha512-pRxFjYwoi8R+n+sibjgF9iUiAELU9ihPBtHzocyW8v8D8G8KeQvXTsW7+CBYIyTYsmhtNk50QPGLE3vrvhM5KA== - dependencies: - "@typescript-eslint/types" "5.4.0" - "@typescript-eslint/visitor-keys" "5.4.0" - -"@typescript-eslint/types@5.4.0": - version "5.4.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.4.0.tgz#b1c130f4b381b77bec19696c6e3366f9781ce8f2" - integrity sha512-GjXNpmn+n1LvnttarX+sPD6+S7giO+9LxDIGlRl4wK3a7qMWALOHYuVSZpPTfEIklYjaWuMtfKdeByx0AcaThA== - -"@typescript-eslint/typescript-estree@5.4.0": - version "5.4.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.4.0.tgz#fe524fb308973c68ebeb7428f3b64499a6ba5fc0" - integrity sha512-nhlNoBdhKuwiLMx6GrybPT3SFILm5Gij2YBdPEPFlYNFAXUJWX6QRgvi/lwVoadaQEFsizohs6aFRMqsXI2ewA== - dependencies: - "@typescript-eslint/types" "5.4.0" - "@typescript-eslint/visitor-keys" "5.4.0" - debug "^4.3.2" - globby "^11.0.4" - is-glob "^4.0.3" - semver "^7.3.5" - tsutils "^3.21.0" - -"@typescript-eslint/visitor-keys@5.4.0": - version "5.4.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.4.0.tgz#09bc28efd3621f292fe88c86eef3bf4893364c8c" - integrity sha512-PVbax7MeE7tdLfW5SA0fs8NGVVr+buMPrcj+CWYWPXsZCH8qZ1THufDzbXm1xrZ2b2PA1iENJ0sRq5fuUtvsJg== - dependencies: - "@typescript-eslint/types" "5.4.0" - eslint-visitor-keys "^3.0.0" - -acorn-jsx@^5.3.1: - version "5.3.2" - resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" - integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== - -acorn@8.5.0, acorn@^8.5.0: - version "8.5.0" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.5.0.tgz#4512ccb99b3698c752591e9bb4472e38ad43cee2" - integrity sha512-yXbYeFy+jUuYd3/CDcg2NkIYE991XYX/bje7LmjJigUciaeO1JR4XxXgCIV1/Zc/dRuFEyw1L0pbA+qynJkW5Q== - -ajv-errors@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/ajv-errors/-/ajv-errors-1.0.1.tgz#f35986aceb91afadec4102fbd85014950cefa64d" - integrity sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ== - -ajv-keywords@^3.1.0, ajv-keywords@^3.5.2: - version "3.5.2" - resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.5.2.tgz#31f29da5ab6e00d1c2d329acf7b5929614d5014d" - integrity sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ== - -ajv@^6.1.0, ajv@^6.10.0, ajv@^6.12.4, ajv@^6.12.5: - version "6.12.6" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" - integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== - dependencies: - fast-deep-equal "^3.1.1" - fast-json-stable-stringify "^2.0.0" - json-schema-traverse "^0.4.1" - uri-js "^4.2.2" - -anser@1.4.9: - version "1.4.9" - resolved "https://registry.yarnpkg.com/anser/-/anser-1.4.9.tgz#1f85423a5dcf8da4631a341665ff675b96845760" - integrity sha512-AI+BjTeGt2+WFk4eWcqbQ7snZpDBt8SaLlj0RT2h5xfdWaiy51OjYvqwMrNzJLGy8iOAL6nKDITWO+rd4MkYEA== - -ansi-colors@^4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.1.tgz#cbb9ae256bf750af1eab344f229aa27fe94ba348" - integrity sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA== - -ansi-regex@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" - integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== - -ansi-styles@^3.2.1: - version "3.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" - integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== - dependencies: - color-convert "^1.9.0" - -ansi-styles@^4.1.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" - integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== - dependencies: - color-convert "^2.0.1" - -anymatch@~3.1.1: - version "3.1.2" - resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.2.tgz#c0557c096af32f106198f4f4e2a383537e378716" - integrity sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg== - dependencies: - normalize-path "^3.0.0" - picomatch "^2.0.4" - -arch@^2.1.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/arch/-/arch-2.2.0.tgz#1bc47818f305764f23ab3306b0bfc086c5a29d11" - integrity sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ== - -archive-type@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/archive-type/-/archive-type-4.0.0.tgz#f92e72233056dfc6969472749c267bdb046b1d70" - integrity sha1-+S5yIzBW38aWlHJ0nCZ72wRrHXA= - dependencies: - file-type "^4.2.0" - -argparse@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" - integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== - -arr-diff@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520" - integrity sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA= - -arr-flatten@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1" - integrity sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg== - -arr-union@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4" - integrity sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ= - -array-union@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39" - integrity sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk= - dependencies: - array-uniq "^1.0.1" - -array-union@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" - integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== - -array-uniq@^1.0.1: - version "1.0.3" - resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6" - integrity sha1-r2rId6Jcx/dOBYiUdThY39sk/bY= - -array-unique@^0.3.2: - version "0.3.2" - resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" - integrity sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg= - -arrify@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" - integrity sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0= - -asn1.js@^5.2.0: - version "5.4.1" - resolved "https://registry.yarnpkg.com/asn1.js/-/asn1.js-5.4.1.tgz#11a980b84ebb91781ce35b0fdc2ee294e3783f07" - integrity sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA== - dependencies: - bn.js "^4.0.0" - inherits "^2.0.1" - minimalistic-assert "^1.0.0" - safer-buffer "^2.1.0" - -assert@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/assert/-/assert-2.0.0.tgz#95fc1c616d48713510680f2eaf2d10dd22e02d32" - integrity sha512-se5Cd+js9dXJnu6Ag2JFc00t+HmHOen+8Q+L7O9zI0PqQXr20uk2J0XQqMxZEeo5U50o8Nvmmx7dZrl+Ufr35A== - dependencies: - es6-object-assign "^1.1.0" - is-nan "^1.2.1" - object-is "^1.0.1" - util "^0.12.0" - -assign-symbols@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" - integrity sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c= - -atob@^2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" - integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== - -attr-accept@^2.2.1: - version "2.2.2" - resolved "https://registry.yarnpkg.com/attr-accept/-/attr-accept-2.2.2.tgz#646613809660110749e92f2c10833b70968d929b" - integrity sha512-7prDjvt9HmqiZ0cl5CRjtS84sEyhsHP2coDkaZKRKVfCDo9s7iw7ChVmar78Gu9pC4SoR/28wFu/G5JJhTnqEg== - -available-typed-arrays@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz#92f95616501069d07d10edb2fc37d3e1c65123b7" - integrity sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw== - -axios@^0.24.0: - version "0.24.0" - resolved "https://registry.yarnpkg.com/axios/-/axios-0.24.0.tgz#804e6fa1e4b9c5288501dd9dff56a7a0940d20d6" - integrity sha512-Q6cWsys88HoPgAaFAVUb0WpPk0O8iTeisR9IMqy9G8AbO4NlpVknrnQS03zzF9PGAWgO3cgletO3VjV/P7VztA== - dependencies: - follow-redirects "^1.14.4" - -babel-loader@^8.2.2: - version "8.2.3" - resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-8.2.3.tgz#8986b40f1a64cacfcb4b8429320085ef68b1342d" - integrity sha512-n4Zeta8NC3QAsuyiizu0GkmRcQ6clkV9WFUnUf1iXP//IeSKbWjofW3UHyZVwlOB4y039YQKefawyTn64Zwbuw== - dependencies: - find-cache-dir "^3.3.1" - loader-utils "^1.4.0" - make-dir "^3.1.0" - schema-utils "^2.6.5" - -babel-plugin-macros@^2.6.1: - version "2.8.0" - resolved "https://registry.yarnpkg.com/babel-plugin-macros/-/babel-plugin-macros-2.8.0.tgz#0f958a7cc6556b1e65344465d99111a1e5e10138" - integrity sha512-SEP5kJpfGYqYKpBrj5XU3ahw5p5GOHJ0U5ssOSQ/WBVdwkD2Dzlce95exQTs3jOVWPPKLBN2rlEWkCK7dSmLvg== - dependencies: - "@babel/runtime" "^7.7.2" - cosmiconfig "^6.0.0" - resolve "^1.12.0" - -balanced-match@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" - integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== - -base64-js@^1.0.2, base64-js@^1.3.1: - version "1.5.1" - resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" - integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== - -base@^0.11.1: - version "0.11.2" - resolved "https://registry.yarnpkg.com/base/-/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f" - integrity sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg== - dependencies: - cache-base "^1.0.1" - class-utils "^0.3.5" - component-emitter "^1.2.1" - define-property "^1.0.0" - isobject "^3.0.1" - mixin-deep "^1.2.0" - pascalcase "^0.1.1" - -big-integer@^1.6.16: - version "1.6.51" - resolved "https://registry.yarnpkg.com/big-integer/-/big-integer-1.6.51.tgz#0df92a5d9880560d3ff2d5fd20245c889d130686" - integrity sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg== - -big.js@^5.2.2: - version "5.2.2" - resolved "https://registry.yarnpkg.com/big.js/-/big.js-5.2.2.tgz#65f0af382f578bcdc742bd9c281e9cb2d7768328" - integrity sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ== - -bin-build@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/bin-build/-/bin-build-3.0.0.tgz#c5780a25a8a9f966d8244217e6c1f5082a143861" - integrity sha512-jcUOof71/TNAI2uM5uoUaDq2ePcVBQ3R/qhxAz1rX7UfvduAL/RXD3jXzvn8cVcDJdGVkiR1shal3OH0ImpuhA== - dependencies: - decompress "^4.0.0" - download "^6.2.2" - execa "^0.7.0" - p-map-series "^1.0.0" - tempfile "^2.0.0" - -bin-check@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/bin-check/-/bin-check-4.1.0.tgz#fc495970bdc88bb1d5a35fc17e65c4a149fc4a49" - integrity sha512-b6weQyEUKsDGFlACWSIOfveEnImkJyK/FGW6FAG42loyoquvjdtOIqO6yBFzHyqyVVhNgNkQxxx09SFLK28YnA== - dependencies: - execa "^0.7.0" - executable "^4.1.0" - -bin-version-check@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/bin-version-check/-/bin-version-check-4.0.0.tgz#7d819c62496991f80d893e6e02a3032361608f71" - integrity sha512-sR631OrhC+1f8Cvs8WyVWOA33Y8tgwjETNPyyD/myRBXLkfS/vl74FmH/lFcRl9KY3zwGh7jFhvyk9vV3/3ilQ== - dependencies: - bin-version "^3.0.0" - semver "^5.6.0" - semver-truncate "^1.1.2" - -bin-version@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/bin-version/-/bin-version-3.1.0.tgz#5b09eb280752b1bd28f0c9db3f96f2f43b6c0839" - integrity sha512-Mkfm4iE1VFt4xd4vH+gx+0/71esbfus2LsnCGe8Pi4mndSPyT+NGES/Eg99jx8/lUGWfu3z2yuB/bt5UB+iVbQ== - dependencies: - execa "^1.0.0" - find-versions "^3.0.0" - -bin-wrapper@^4.0.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/bin-wrapper/-/bin-wrapper-4.1.0.tgz#99348f2cf85031e3ef7efce7e5300aeaae960605" - integrity sha512-hfRmo7hWIXPkbpi0ZltboCMVrU+0ClXR/JgbCKKjlDjQf6igXa7OwdqNcFWQZPZTgiY7ZpzE3+LjjkLiTN2T7Q== - dependencies: - bin-check "^4.1.0" - bin-version-check "^4.0.0" - download "^7.1.0" - import-lazy "^3.1.0" - os-filter-obj "^2.0.0" - pify "^4.0.1" - -binary-extensions@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" - integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== - -bl@^1.0.0: - version "1.2.3" - resolved "https://registry.yarnpkg.com/bl/-/bl-1.2.3.tgz#1e8dd80142eac80d7158c9dccc047fb620e035e7" - integrity sha512-pvcNpa0UU69UT341rO6AYy4FVAIkUHuZXRIWbq+zHnsVcRzDDjIAhGuuYoi0d//cwIwtt4pkpKycWEfjdV+vww== - dependencies: - readable-stream "^2.3.5" - safe-buffer "^5.1.1" - -bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.11.9: - version "4.12.0" - resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.12.0.tgz#775b3f278efbb9718eec7361f483fb36fbbfea88" - integrity sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA== - -bn.js@^5.0.0, bn.js@^5.1.1: - version "5.2.0" - resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.2.0.tgz#358860674396c6997771a9d051fcc1b57d4ae002" - integrity sha512-D7iWRBvnZE8ecXiLj/9wbxH7Tk79fAh8IHaTNq1RWRixsS02W+5qS+iE9yq6RYl0asXx5tw0bLhmT5pIfbSquw== - -boolbase@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e" - integrity sha1-aN/1++YMUes3cl6p4+0xDcwed24= - -brace-expansion@^1.1.7: - version "1.1.11" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" - integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== - dependencies: - balanced-match "^1.0.0" - concat-map "0.0.1" - -braces@^2.3.1: - version "2.3.2" - resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729" - integrity sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w== - dependencies: - arr-flatten "^1.1.0" - array-unique "^0.3.2" - extend-shallow "^2.0.1" - fill-range "^4.0.0" - isobject "^3.0.1" - repeat-element "^1.1.2" - snapdragon "^0.8.1" - snapdragon-node "^2.0.1" - split-string "^3.0.2" - to-regex "^3.0.1" - -braces@^3.0.1, braces@~3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" - integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== - dependencies: - fill-range "^7.0.1" - -broadcast-channel@^3.4.1: - version "3.7.0" - resolved "https://registry.yarnpkg.com/broadcast-channel/-/broadcast-channel-3.7.0.tgz#2dfa5c7b4289547ac3f6705f9c00af8723889937" - integrity sha512-cIAKJXAxGJceNZGTZSBzMxzyOn72cVgPnKx4dc6LRjQgbaJUQqhy5rzL3zbMxkMWsGKkv2hSFkPRMEXfoMZ2Mg== - dependencies: - "@babel/runtime" "^7.7.2" - detect-node "^2.1.0" - js-sha3 "0.8.0" - microseconds "0.2.0" - nano-time "1.0.0" - oblivious-set "1.0.0" - rimraf "3.0.2" - unload "2.2.0" - -brorand@^1.0.1, brorand@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" - integrity sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8= - -browserify-aes@^1.0.0, browserify-aes@^1.0.4: - version "1.2.0" - resolved "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-1.2.0.tgz#326734642f403dabc3003209853bb70ad428ef48" - integrity sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA== - dependencies: - buffer-xor "^1.0.3" - cipher-base "^1.0.0" - create-hash "^1.1.0" - evp_bytestokey "^1.0.3" - inherits "^2.0.1" - safe-buffer "^5.0.1" - -browserify-cipher@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/browserify-cipher/-/browserify-cipher-1.0.1.tgz#8d6474c1b870bfdabcd3bcfcc1934a10e94f15f0" - integrity sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w== - dependencies: - browserify-aes "^1.0.4" - browserify-des "^1.0.0" - evp_bytestokey "^1.0.0" - -browserify-des@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/browserify-des/-/browserify-des-1.0.2.tgz#3af4f1f59839403572f1c66204375f7a7f703e9c" - integrity sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A== - dependencies: - cipher-base "^1.0.1" - des.js "^1.0.0" - inherits "^2.0.1" - safe-buffer "^5.1.2" - -browserify-rsa@^4.0.0, browserify-rsa@^4.0.1: - version "4.1.0" - resolved "https://registry.yarnpkg.com/browserify-rsa/-/browserify-rsa-4.1.0.tgz#b2fd06b5b75ae297f7ce2dc651f918f5be158c8d" - integrity sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog== - dependencies: - bn.js "^5.0.0" - randombytes "^2.0.1" - -browserify-sign@^4.0.0: - version "4.2.1" - resolved "https://registry.yarnpkg.com/browserify-sign/-/browserify-sign-4.2.1.tgz#eaf4add46dd54be3bb3b36c0cf15abbeba7956c3" - integrity sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg== - dependencies: - bn.js "^5.1.1" - browserify-rsa "^4.0.1" - create-hash "^1.2.0" - create-hmac "^1.1.7" - elliptic "^6.5.3" - inherits "^2.0.4" - parse-asn1 "^5.1.5" - readable-stream "^3.6.0" - safe-buffer "^5.2.0" - -browserify-zlib@0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/browserify-zlib/-/browserify-zlib-0.2.0.tgz#2869459d9aa3be245fe8fe2ca1f46e2e7f54d73f" - integrity sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA== - dependencies: - pako "~1.0.5" - -browserslist@4.16.6: - version "4.16.6" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.16.6.tgz#d7901277a5a88e554ed305b183ec9b0c08f66fa2" - integrity sha512-Wspk/PqO+4W9qp5iUTJsa1B/QrYn1keNCcEP5OvP7WBwT4KaDly0uONYmC6Xa3Z5IqnUgS0KcgLYu1l74x0ZXQ== - dependencies: - caniuse-lite "^1.0.30001219" - colorette "^1.2.2" - electron-to-chromium "^1.3.723" - escalade "^3.1.1" - node-releases "^1.1.71" - -browserslist@^4.17.5: - version "4.18.1" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.18.1.tgz#60d3920f25b6860eb917c6c7b185576f4d8b017f" - integrity sha512-8ScCzdpPwR2wQh8IT82CA2VgDwjHyqMovPBZSNH54+tm4Jk2pCuv90gmAdH6J84OCRWi0b4gMe6O6XPXuJnjgQ== - dependencies: - caniuse-lite "^1.0.30001280" - electron-to-chromium "^1.3.896" - escalade "^3.1.1" - node-releases "^2.0.1" - picocolors "^1.0.0" - -buffer-alloc-unsafe@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz#bd7dc26ae2972d0eda253be061dba992349c19f0" - integrity sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg== - -buffer-alloc@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/buffer-alloc/-/buffer-alloc-1.2.0.tgz#890dd90d923a873e08e10e5fd51a57e5b7cce0ec" - integrity sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow== - dependencies: - buffer-alloc-unsafe "^1.1.0" - buffer-fill "^1.0.0" - -buffer-crc32@~0.2.3: - version "0.2.13" - resolved "https://registry.yarnpkg.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz#0d333e3f00eac50aa1454abd30ef8c2a5d9a7242" - integrity sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI= - -buffer-fill@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/buffer-fill/-/buffer-fill-1.0.0.tgz#f8f78b76789888ef39f205cd637f68e702122b2c" - integrity sha1-+PeLdniYiO858gXNY39o5wISKyw= - -buffer-xor@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9" - integrity sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk= - -buffer@5.6.0: - version "5.6.0" - resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.6.0.tgz#a31749dc7d81d84db08abf937b6b8c4033f62786" - integrity sha512-/gDYp/UtU0eA1ys8bOs9J6a+E/KWIY+DZ+Q2WESNUA0jFRsJOc0SNUO6xJ5SGA1xueg3NL65W6s+NY5l9cunuw== - dependencies: - base64-js "^1.0.2" - ieee754 "^1.1.4" - -buffer@^5.2.1: - version "5.7.1" - resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0" - integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== - dependencies: - base64-js "^1.3.1" - ieee754 "^1.1.13" - -builtin-status-codes@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz#85982878e21b98e1c66425e03d0174788f569ee8" - integrity sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug= - -bytes@3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.0.tgz#f6cf7933a360e0588fa9fde85651cdc7f805d1f6" - integrity sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg== - -cache-base@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2" - integrity sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ== - dependencies: - collection-visit "^1.0.0" - component-emitter "^1.2.1" - get-value "^2.0.6" - has-value "^1.0.0" - isobject "^3.0.1" - set-value "^2.0.0" - to-object-path "^0.3.0" - union-value "^1.0.0" - unset-value "^1.0.0" - -cacheable-request@^2.1.1: - version "2.1.4" - resolved "https://registry.yarnpkg.com/cacheable-request/-/cacheable-request-2.1.4.tgz#0d808801b6342ad33c91df9d0b44dc09b91e5c3d" - integrity sha1-DYCIAbY0KtM8kd+dC0TcCbkeXD0= - dependencies: - clone-response "1.0.2" - get-stream "3.0.0" - http-cache-semantics "3.8.1" - keyv "3.0.0" - lowercase-keys "1.0.0" - normalize-url "2.0.1" - responselike "1.0.2" - -call-bind@^1.0.0, call-bind@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c" - integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA== - dependencies: - function-bind "^1.1.1" - get-intrinsic "^1.0.2" - -call-me-maybe@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/call-me-maybe/-/call-me-maybe-1.0.1.tgz#26d208ea89e37b5cbde60250a15f031c16a4d66b" - integrity sha1-JtII6onje1y95gJQoV8DHBak1ms= - -callsites@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" - integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== - -caniuse-lite@^1.0.30001202, caniuse-lite@^1.0.30001219, caniuse-lite@^1.0.30001228, caniuse-lite@^1.0.30001280: - version "1.0.30001280" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001280.tgz#066a506046ba4be34cde5f74a08db7a396718fb7" - integrity sha512-kFXwYvHe5rix25uwueBxC569o53J6TpnGu0BEEn+6Lhl2vsnAumRFWEBhDft1fwyo6m1r4i+RqA4+163FpeFcA== - -caw@^2.0.0, caw@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/caw/-/caw-2.0.1.tgz#6c3ca071fc194720883c2dc5da9b074bfc7e9e95" - integrity sha512-Cg8/ZSBEa8ZVY9HspcGUYaK63d/bN7rqS3CYCzEGUxuYv6UlmcjzDUz2fCFFHyTvUW5Pk0I+3hkA3iXlIj6guA== - dependencies: - get-proxy "^2.0.0" - isurl "^1.0.0-alpha5" - tunnel-agent "^0.6.0" - url-to-options "^1.0.1" - -chalk@2.4.2, chalk@^2.0.0, chalk@^2.4.2: - version "2.4.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" - integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== - dependencies: - ansi-styles "^3.2.1" - escape-string-regexp "^1.0.5" - supports-color "^5.3.0" - -chalk@4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.0.0.tgz#6e98081ed2d17faab615eb52ac66ec1fe6209e72" - integrity sha512-N9oWFcegS0sFr9oh1oz2d7Npos6vNoWW9HvtCg5N1KRFpUhaAhvTv5Y58g880fZaEYSNm3qDz8SU1UrGvp+n7A== - dependencies: - ansi-styles "^4.1.0" - supports-color "^7.1.0" - -chalk@^4.0.0: - version "4.1.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" - integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== - dependencies: - ansi-styles "^4.1.0" - supports-color "^7.1.0" - -chokidar@3.5.1: - version "3.5.1" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.1.tgz#ee9ce7bbebd2b79f49f304799d5468e31e14e68a" - integrity sha512-9+s+Od+W0VJJzawDma/gvBNQqkTiqYTWLuZoyAsivsI4AaWTCzHG06/TMjsf1cYe9Cb97UCEhjz7HvnPk2p/tw== - dependencies: - anymatch "~3.1.1" - braces "~3.0.2" - glob-parent "~5.1.0" - is-binary-path "~2.1.0" - is-glob "~4.0.1" - normalize-path "~3.0.0" - readdirp "~3.5.0" - optionalDependencies: - fsevents "~2.3.1" - -cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.4.tgz#8760e4ecc272f4c363532f926d874aae2c1397de" - integrity sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q== - dependencies: - inherits "^2.0.1" - safe-buffer "^5.0.1" - -class-utils@^0.3.5: - version "0.3.6" - resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463" - integrity sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg== - dependencies: - arr-union "^3.1.0" - define-property "^0.2.5" - isobject "^3.0.0" - static-extend "^0.1.1" - -classnames@2.2.6: - version "2.2.6" - resolved "https://registry.yarnpkg.com/classnames/-/classnames-2.2.6.tgz#43935bffdd291f326dad0a205309b38d00f650ce" - integrity sha512-JR/iSQOSt+LQIWwrwEzJ9uk0xfN3mTVYMwt1Ir5mUcSN6pU+V4zQFFaJsclJbPuAUQH+yfWef6tm7l1quW3C8Q== - -clone-response@1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/clone-response/-/clone-response-1.0.2.tgz#d1dc973920314df67fbeb94223b4ee350239e96b" - integrity sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws= - dependencies: - mimic-response "^1.0.0" - -clsx@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/clsx/-/clsx-1.1.1.tgz#98b3134f9abbdf23b2663491ace13c5c03a73188" - integrity sha512-6/bPho624p3S2pMyvP5kKBPXnI3ufHLObBFCfgx+LkeR5lg2XYy2hqZqUf45ypD8COn2bhgGJSUE+l5dhNBieA== - -collection-visit@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0" - integrity sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA= - dependencies: - map-visit "^1.0.0" - object-visit "^1.0.0" - -color-convert@^1.9.0: - version "1.9.3" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" - integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== - dependencies: - color-name "1.1.3" - -color-convert@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" - integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== - dependencies: - color-name "~1.1.4" - -color-name@1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" - integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= - -color-name@~1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" - integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== - -colorette@^1.2.2: - version "1.4.0" - resolved "https://registry.yarnpkg.com/colorette/-/colorette-1.4.0.tgz#5190fbb87276259a86ad700bff2c6d6faa3fca40" - integrity sha512-Y2oEozpomLn7Q3HFP7dpww7AtMJplbM9lGZP6RDfHqmbeRjiwRg4n6VM6j4KLmRke85uWEI7JqF17f3pqdRA0g== - -commander@^2.8.1: - version "2.20.3" - resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" - integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== - -commander@^7.2.0: - version "7.2.0" - resolved "https://registry.yarnpkg.com/commander/-/commander-7.2.0.tgz#a36cb57d0b501ce108e4d20559a150a391d97ab7" - integrity sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw== - -commondir@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" - integrity sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs= - -component-emitter@^1.2.1: - version "1.3.0" - resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.3.0.tgz#16e4070fba8ae29b679f2215853ee181ab2eabc0" - integrity sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg== - -concat-map@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" - integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= - -config-chain@^1.1.11: - version "1.1.13" - resolved "https://registry.yarnpkg.com/config-chain/-/config-chain-1.1.13.tgz#fad0795aa6a6cdaff9ed1b68e9dff94372c232f4" - integrity sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ== - dependencies: - ini "^1.3.4" - proto-list "~1.2.1" - -constants-browserify@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/constants-browserify/-/constants-browserify-1.0.0.tgz#c20b96d8c617748aaf1c16021760cd27fcb8cb75" - integrity sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U= - -content-disposition@^0.5.2: - version "0.5.3" - resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.3.tgz#e130caf7e7279087c5616c2007d0485698984fbd" - integrity sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g== - dependencies: - safe-buffer "5.1.2" - -convert-source-map@1.7.0: - version "1.7.0" - resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.7.0.tgz#17a2cb882d7f77d3490585e2ce6c524424a3a442" - integrity sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA== - dependencies: - safe-buffer "~5.1.1" - -convert-source-map@^1.5.0, convert-source-map@^1.7.0: - version "1.8.0" - resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.8.0.tgz#f3373c32d21b4d780dd8004514684fb791ca4369" - integrity sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA== - dependencies: - safe-buffer "~5.1.1" - -copy-descriptor@^0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" - integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40= - -copy-to-clipboard@^3.3.1: - version "3.3.1" - resolved "https://registry.yarnpkg.com/copy-to-clipboard/-/copy-to-clipboard-3.3.1.tgz#115aa1a9998ffab6196f93076ad6da3b913662ae" - integrity sha512-i13qo6kIHTTpCm8/Wup+0b1mVWETvu2kIMzKoK8FpkLkFxlt0znUAHcMzox+T8sPlqtZXq3CulEjQHsYiGFJUw== - dependencies: - toggle-selection "^1.0.6" - -core-util-is@~1.0.0: - version "1.0.3" - resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85" - integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== - -cosmiconfig@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-6.0.0.tgz#da4fee853c52f6b1e6935f41c1a2fc50bd4a9982" - integrity sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg== - dependencies: - "@types/parse-json" "^4.0.0" - import-fresh "^3.1.0" - parse-json "^5.0.0" - path-type "^4.0.0" - yaml "^1.7.2" - -create-ecdh@^4.0.0: - version "4.0.4" - resolved "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.4.tgz#d6e7f4bffa66736085a0762fd3a632684dabcc4e" - integrity sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A== - dependencies: - bn.js "^4.1.0" - elliptic "^6.5.3" - -create-hash@^1.1.0, create-hash@^1.1.2, create-hash@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/create-hash/-/create-hash-1.2.0.tgz#889078af11a63756bcfb59bd221996be3a9ef196" - integrity sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg== - dependencies: - cipher-base "^1.0.1" - inherits "^2.0.1" - md5.js "^1.3.4" - ripemd160 "^2.0.1" - sha.js "^2.4.0" - -create-hmac@^1.1.0, create-hmac@^1.1.4, create-hmac@^1.1.7: - version "1.1.7" - resolved "https://registry.yarnpkg.com/create-hmac/-/create-hmac-1.1.7.tgz#69170c78b3ab957147b2b8b04572e47ead2243ff" - integrity sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg== - dependencies: - cipher-base "^1.0.3" - create-hash "^1.1.0" - inherits "^2.0.1" - ripemd160 "^2.0.0" - safe-buffer "^5.0.1" - sha.js "^2.4.8" - -cross-spawn@^5.0.1: - version "5.1.0" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449" - integrity sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk= - dependencies: - lru-cache "^4.0.1" - shebang-command "^1.2.0" - which "^1.2.9" - -cross-spawn@^6.0.0: - version "6.0.5" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" - integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ== - dependencies: - nice-try "^1.0.4" - path-key "^2.0.1" - semver "^5.5.0" - shebang-command "^1.2.0" - which "^1.2.9" - -cross-spawn@^7.0.0, cross-spawn@^7.0.2: - version "7.0.3" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" - integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== - dependencies: - path-key "^3.1.0" - shebang-command "^2.0.0" - which "^2.0.1" - -crypto-browserify@3.12.0: - version "3.12.0" - resolved "https://registry.yarnpkg.com/crypto-browserify/-/crypto-browserify-3.12.0.tgz#396cf9f3137f03e4b8e532c58f698254e00f80ec" - integrity sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg== - dependencies: - browserify-cipher "^1.0.0" - browserify-sign "^4.0.0" - create-ecdh "^4.0.0" - create-hash "^1.1.0" - create-hmac "^1.1.0" - diffie-hellman "^5.0.0" - inherits "^2.0.1" - pbkdf2 "^3.0.3" - public-encrypt "^4.0.0" - randombytes "^2.0.0" - randomfill "^1.0.3" - -css-select@^4.1.3: - version "4.1.3" - resolved "https://registry.yarnpkg.com/css-select/-/css-select-4.1.3.tgz#a70440f70317f2669118ad74ff105e65849c7067" - integrity sha512-gT3wBNd9Nj49rAbmtFHj1cljIAOLYSX1nZ8CB7TBO3INYckygm5B7LISU/szY//YmdiSLbJvDLOx9VnMVpMBxA== - dependencies: - boolbase "^1.0.0" - css-what "^5.0.0" - domhandler "^4.2.0" - domutils "^2.6.0" - nth-check "^2.0.0" - -css-tree@^1.1.2, css-tree@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-1.1.3.tgz#eb4870fb6fd7707327ec95c2ff2ab09b5e8db91d" - integrity sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q== - dependencies: - mdn-data "2.0.14" - source-map "^0.6.1" - -css-what@^5.0.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/css-what/-/css-what-5.1.0.tgz#3f7b707aadf633baf62c2ceb8579b545bb40f7fe" - integrity sha512-arSMRWIIFY0hV8pIxZMEfmMI47Wj3R/aWpZDDxWYCPEiOMv6tfOrnpDtgxBYPEQD4V0Y/958+1TdC3iWTFcUPw== - -css.escape@1.5.1: - version "1.5.1" - resolved "https://registry.yarnpkg.com/css.escape/-/css.escape-1.5.1.tgz#42e27d4fa04ae32f931a4b4d4191fa9cddee97cb" - integrity sha1-QuJ9T6BK4y+TGktNQZH6nN3ul8s= - -cssnano-preset-simple@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/cssnano-preset-simple/-/cssnano-preset-simple-3.0.0.tgz#e95d0012699ca2c741306e9a3b8eeb495a348dbe" - integrity sha512-vxQPeoMRqUT3c/9f0vWeVa2nKQIHFpogtoBvFdW4GQ3IvEJ6uauCP6p3Y5zQDLFcI7/+40FTgX12o7XUL0Ko+w== - dependencies: - caniuse-lite "^1.0.30001202" - -cssnano-simple@3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/cssnano-simple/-/cssnano-simple-3.0.0.tgz#a4b8ccdef4c7084af97e19bc5b93b4ecf211e90f" - integrity sha512-oU3ueli5Dtwgh0DyeohcIEE00QVfbPR3HzyXdAl89SfnQG3y0/qcpfLVW+jPIh3/rgMZGwuW96rejZGaYE9eUg== - dependencies: - cssnano-preset-simple "^3.0.0" - -csso@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/csso/-/csso-4.2.0.tgz#ea3a561346e8dc9f546d6febedd50187cf389529" - integrity sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA== - dependencies: - css-tree "^1.1.2" - -csstype@^3.0.2: - version "3.0.10" - resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.0.10.tgz#2ad3a7bed70f35b965707c092e5f30b327c290e5" - integrity sha512-2u44ZG2OcNUO9HDp/Jl8C07x6pU/eTR3ncV91SiK3dhG9TWvRVsCoJw14Ckx5DgWkzGA3waZWO3d7pgqpUI/XA== - -data-uri-to-buffer@3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/data-uri-to-buffer/-/data-uri-to-buffer-3.0.1.tgz#594b8973938c5bc2c33046535785341abc4f3636" - integrity sha512-WboRycPNsVw3B3TL559F7kuBUM4d8CgMEvk6xEJlOp7OBPjt6G7z8WMWlD2rOFZLk6OYfFIUGsCOWzcQH9K2og== - -debug@2, debug@^2.2.0, debug@^2.3.3: - version "2.6.9" - resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" - integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== - dependencies: - ms "2.0.0" - -debug@^4.1.0, debug@^4.1.1, debug@^4.3.2: - version "4.3.2" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.2.tgz#f0a49c18ac8779e31d4a0c6029dfb76873c7428b" - integrity sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw== - dependencies: - ms "2.1.2" - -decode-uri-component@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545" - integrity sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU= - -decompress-response@^3.2.0, decompress-response@^3.3.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-3.3.0.tgz#80a4dd323748384bfa248083622aedec982adff3" - integrity sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M= - dependencies: - mimic-response "^1.0.0" - -decompress-tar@^4.0.0, decompress-tar@^4.1.0, decompress-tar@^4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/decompress-tar/-/decompress-tar-4.1.1.tgz#718cbd3fcb16209716e70a26b84e7ba4592e5af1" - integrity sha512-JdJMaCrGpB5fESVyxwpCx4Jdj2AagLmv3y58Qy4GE6HMVjWz1FeVQk1Ct4Kye7PftcdOo/7U7UKzYBJgqnGeUQ== - dependencies: - file-type "^5.2.0" - is-stream "^1.1.0" - tar-stream "^1.5.2" - -decompress-tarbz2@^4.0.0: - version "4.1.1" - resolved "https://registry.yarnpkg.com/decompress-tarbz2/-/decompress-tarbz2-4.1.1.tgz#3082a5b880ea4043816349f378b56c516be1a39b" - integrity sha512-s88xLzf1r81ICXLAVQVzaN6ZmX4A6U4z2nMbOwobxkLoIIfjVMBg7TeguTUXkKeXni795B6y5rnvDw7rxhAq9A== - dependencies: - decompress-tar "^4.1.0" - file-type "^6.1.0" - is-stream "^1.1.0" - seek-bzip "^1.0.5" - unbzip2-stream "^1.0.9" - -decompress-targz@^4.0.0: - version "4.1.1" - resolved "https://registry.yarnpkg.com/decompress-targz/-/decompress-targz-4.1.1.tgz#c09bc35c4d11f3de09f2d2da53e9de23e7ce1eee" - integrity sha512-4z81Znfr6chWnRDNfFNqLwPvm4db3WuZkqV+UgXQzSngG3CEKdBkw5jrv3axjjL96glyiiKjsxJG3X6WBZwX3w== - dependencies: - decompress-tar "^4.1.1" - file-type "^5.2.0" - is-stream "^1.1.0" - -decompress-unzip@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/decompress-unzip/-/decompress-unzip-4.0.1.tgz#deaaccdfd14aeaf85578f733ae8210f9b4848f69" - integrity sha1-3qrM39FK6vhVePczroIQ+bSEj2k= - dependencies: - file-type "^3.8.0" - get-stream "^2.2.0" - pify "^2.3.0" - yauzl "^2.4.2" - -decompress@^4.0.0, decompress@^4.2.0: - version "4.2.1" - resolved "https://registry.yarnpkg.com/decompress/-/decompress-4.2.1.tgz#007f55cc6a62c055afa37c07eb6a4ee1b773f118" - integrity sha512-e48kc2IjU+2Zw8cTb6VZcJQ3lgVbS4uuB1TfCHbiZIP/haNXm+SVyhu+87jts5/3ROpd82GSVCoNs/z8l4ZOaQ== - dependencies: - decompress-tar "^4.0.0" - decompress-tarbz2 "^4.0.0" - decompress-targz "^4.0.0" - decompress-unzip "^4.0.1" - graceful-fs "^4.1.10" - make-dir "^1.0.0" - pify "^2.3.0" - strip-dirs "^2.0.0" - -deep-is@^0.1.3: - version "0.1.4" - resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" - integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== - -define-properties@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1" - integrity sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ== - dependencies: - object-keys "^1.0.12" - -define-property@^0.2.5: - version "0.2.5" - resolved "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116" - integrity sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY= - dependencies: - is-descriptor "^0.1.0" - -define-property@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/define-property/-/define-property-1.0.0.tgz#769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6" - integrity sha1-dp66rz9KY6rTr56NMEybvnm/sOY= - dependencies: - is-descriptor "^1.0.0" - -define-property@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/define-property/-/define-property-2.0.2.tgz#d459689e8d654ba77e02a817f8710d702cb16e9d" - integrity sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ== - dependencies: - is-descriptor "^1.0.2" - isobject "^3.0.1" - -depd@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" - integrity sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak= - -des.js@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/des.js/-/des.js-1.0.1.tgz#5382142e1bdc53f85d86d53e5f4aa7deb91e0843" - integrity sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA== - dependencies: - inherits "^2.0.1" - minimalistic-assert "^1.0.0" - -detect-node@^2.0.4, detect-node@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/detect-node/-/detect-node-2.1.0.tgz#c9c70775a49c3d03bc2c06d9a73be550f978f8b1" - integrity sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g== - -diffie-hellman@^5.0.0: - version "5.0.3" - resolved "https://registry.yarnpkg.com/diffie-hellman/-/diffie-hellman-5.0.3.tgz#40e8ee98f55a2149607146921c63e1ae5f3d2875" - integrity sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg== - dependencies: - bn.js "^4.1.0" - miller-rabin "^4.0.0" - randombytes "^2.0.0" - -dir-glob@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-2.0.0.tgz#0b205d2b6aef98238ca286598a8204d29d0a0034" - integrity sha512-37qirFDz8cA5fimp9feo43fSuRo2gHwaIn6dXL8Ber1dGwUosDrGZeCCXq57WnIqE4aQ+u3eQZzsk1yOzhdwag== - dependencies: - arrify "^1.0.1" - path-type "^3.0.0" - -dir-glob@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" - integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== - dependencies: - path-type "^4.0.0" - -doctrine@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961" - integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== - dependencies: - esutils "^2.0.2" - -dom-serializer@^1.0.1: - version "1.3.2" - resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-1.3.2.tgz#6206437d32ceefaec7161803230c7a20bc1b4d91" - integrity sha512-5c54Bk5Dw4qAxNOI1pFEizPSjVsx5+bpJKmL2kPn8JhBUq2q09tTCa3mjijun2NfK78NMouDYNMBkOrPZiS+ig== - dependencies: - domelementtype "^2.0.1" - domhandler "^4.2.0" - entities "^2.0.0" - -domain-browser@4.19.0: - version "4.19.0" - resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-4.19.0.tgz#1093e17c0a17dbd521182fe90d49ac1370054af1" - integrity sha512-fRA+BaAWOR/yr/t7T9E9GJztHPeFjj8U35ajyAjCDtAAnTn1Rc1f6W6VGPJrO1tkQv9zWu+JRof7z6oQtiYVFQ== - -domelementtype@^2.0.1, domelementtype@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.2.0.tgz#9a0b6c2782ed6a1c7323d42267183df9bd8b1d57" - integrity sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A== - -domhandler@^4.2.0: - version "4.2.2" - resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-4.2.2.tgz#e825d721d19a86b8c201a35264e226c678ee755f" - integrity sha512-PzE9aBMsdZO8TK4BnuJwH0QT41wgMbRzuZrHUcpYncEjmQazq8QEaBWgLG7ZyC/DAZKEgglpIA6j4Qn/HmxS3w== - dependencies: - domelementtype "^2.2.0" - -domutils@^2.6.0: - version "2.8.0" - resolved "https://registry.yarnpkg.com/domutils/-/domutils-2.8.0.tgz#4437def5db6e2d1f5d6ee859bd95ca7d02048135" - integrity sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A== - dependencies: - dom-serializer "^1.0.1" - domelementtype "^2.2.0" - domhandler "^4.2.0" - -dotenv@^10.0.0: - version "10.0.0" - resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-10.0.0.tgz#3d4227b8fb95f81096cdd2b66653fb2c7085ba81" - integrity sha512-rlBi9d8jpv9Sf1klPjNfFAuWDjKLwTIJJ/VxtoTwIR6hnZxcEOQCZg2oIL3MWBYw5GpUDKOEnND7LXTbIpQ03Q== - -download@^6.2.2: - version "6.2.5" - resolved "https://registry.yarnpkg.com/download/-/download-6.2.5.tgz#acd6a542e4cd0bb42ca70cfc98c9e43b07039714" - integrity sha512-DpO9K1sXAST8Cpzb7kmEhogJxymyVUd5qz/vCOSyvwtp2Klj2XcDt5YUuasgxka44SxF0q5RriKIwJmQHG2AuA== - dependencies: - caw "^2.0.0" - content-disposition "^0.5.2" - decompress "^4.0.0" - ext-name "^5.0.0" - file-type "5.2.0" - filenamify "^2.0.0" - get-stream "^3.0.0" - got "^7.0.0" - make-dir "^1.0.0" - p-event "^1.0.0" - pify "^3.0.0" - -download@^7.1.0: - version "7.1.0" - resolved "https://registry.yarnpkg.com/download/-/download-7.1.0.tgz#9059aa9d70b503ee76a132897be6dec8e5587233" - integrity sha512-xqnBTVd/E+GxJVrX5/eUJiLYjCGPwMpdL+jGhGU57BvtcA7wwhtHVbXBeUk51kOpW3S7Jn3BQbN9Q1R1Km2qDQ== - dependencies: - archive-type "^4.0.0" - caw "^2.0.1" - content-disposition "^0.5.2" - decompress "^4.2.0" - ext-name "^5.0.0" - file-type "^8.1.0" - filenamify "^2.0.0" - get-stream "^3.0.0" - got "^8.3.1" - make-dir "^1.2.0" - p-event "^2.1.0" - pify "^3.0.0" - -duplexer3@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/duplexer3/-/duplexer3-0.1.4.tgz#ee01dd1cac0ed3cbc7fdbea37dc0a8f1ce002ce2" - integrity sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI= - -electron-to-chromium@^1.3.723, electron-to-chromium@^1.3.896: - version "1.3.897" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.897.tgz#16ddf5943eeec6ae08704b015ecd26b143b03947" - integrity sha512-nRNZhAZ7hVCe75jrCUG7xLOqHMwloJMj6GEXEzY4OMahRGgwerAo+ls/qbqUwFH+E20eaSncKkQ4W8KP5SOiAg== - -elliptic@^6.5.3: - version "6.5.4" - resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.4.tgz#da37cebd31e79a1367e941b592ed1fbebd58abbb" - integrity sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ== - dependencies: - bn.js "^4.11.9" - brorand "^1.1.0" - hash.js "^1.0.0" - hmac-drbg "^1.0.1" - inherits "^2.0.4" - minimalistic-assert "^1.0.1" - minimalistic-crypto-utils "^1.0.1" - -emojis-list@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-2.1.0.tgz#4daa4d9db00f9819880c79fa457ae5b09a1fd389" - integrity sha1-TapNnbAPmBmIDHn6RXrlsJof04k= - -emojis-list@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-3.0.0.tgz#5570662046ad29e2e916e71aae260abdff4f6a78" - integrity sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q== - -encoding@0.1.13: - version "0.1.13" - resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.13.tgz#56574afdd791f54a8e9b2785c0582a2d26210fa9" - integrity sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A== - dependencies: - iconv-lite "^0.6.2" - -end-of-stream@^1.0.0, end-of-stream@^1.1.0: - version "1.4.4" - resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" - integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== - dependencies: - once "^1.4.0" - -enquirer@^2.3.5: - version "2.3.6" - resolved "https://registry.yarnpkg.com/enquirer/-/enquirer-2.3.6.tgz#2a7fe5dd634a1e4125a975ec994ff5456dc3734d" - integrity sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg== - dependencies: - ansi-colors "^4.1.1" - -entities@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/entities/-/entities-2.2.0.tgz#098dc90ebb83d8dffa089d55256b351d34c4da55" - integrity sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A== - -error-ex@^1.3.1: - version "1.3.2" - resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" - integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== - dependencies: - is-arrayish "^0.2.1" - -es-abstract@^1.18.5: - version "1.19.1" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.19.1.tgz#d4885796876916959de78edaa0df456627115ec3" - integrity sha512-2vJ6tjA/UfqLm2MPs7jxVybLoB8i1t1Jd9R3kISld20sIxPcTbLuggQOUxeWeAvIUkduv/CfMjuh4WmiXr2v9w== - dependencies: - call-bind "^1.0.2" - es-to-primitive "^1.2.1" - function-bind "^1.1.1" - get-intrinsic "^1.1.1" - get-symbol-description "^1.0.0" - has "^1.0.3" - has-symbols "^1.0.2" - internal-slot "^1.0.3" - is-callable "^1.2.4" - is-negative-zero "^2.0.1" - is-regex "^1.1.4" - is-shared-array-buffer "^1.0.1" - is-string "^1.0.7" - is-weakref "^1.0.1" - object-inspect "^1.11.0" - object-keys "^1.1.1" - object.assign "^4.1.2" - string.prototype.trimend "^1.0.4" - string.prototype.trimstart "^1.0.4" - unbox-primitive "^1.0.1" - -es-to-primitive@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a" - integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA== - dependencies: - is-callable "^1.1.4" - is-date-object "^1.0.1" - is-symbol "^1.0.2" - -es6-object-assign@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/es6-object-assign/-/es6-object-assign-1.1.0.tgz#c2c3582656247c39ea107cb1e6652b6f9f24523c" - integrity sha1-wsNYJlYkfDnqEHyx5mUrb58kUjw= - -escalade@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" - integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== - -escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" - integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= - -escape-string-regexp@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" - integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== - -eslint-config-prettier@^8.3.0: - version "8.3.0" - resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-8.3.0.tgz#f7471b20b6fe8a9a9254cc684454202886a2dd7a" - integrity sha512-BgZuLUSeKzvlL/VUjx/Yb787VQ26RU3gGjA3iiFvdsp/2bMfVIWUVP7tjxtjS0e+HP409cPlPvNkQloz8C91ew== - -eslint-plugin-prettier@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-prettier/-/eslint-plugin-prettier-4.0.0.tgz#8b99d1e4b8b24a762472b4567992023619cb98e0" - integrity sha512-98MqmCJ7vJodoQK359bqQWaxOE0CS8paAz/GgjaZLyex4TTk3g9HugoO89EqWCrFiOqn9EVvcoo7gZzONCWVwQ== - dependencies: - prettier-linter-helpers "^1.0.0" - -eslint-scope@^5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c" - integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== - dependencies: - esrecurse "^4.3.0" - estraverse "^4.1.1" - -eslint-scope@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-6.0.0.tgz#9cf45b13c5ac8f3d4c50f46a5121f61b3e318978" - integrity sha512-uRDL9MWmQCkaFus8RF5K9/L/2fn+80yoW3jkD53l4shjCh26fCtvJGasxjUqP5OT87SYTxCVA3BwTUzuELx9kA== - dependencies: - esrecurse "^4.3.0" - estraverse "^5.2.0" - -eslint-utils@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-3.0.0.tgz#8aebaface7345bb33559db0a1f13a1d2d48c3672" - integrity sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA== - dependencies: - eslint-visitor-keys "^2.0.0" - -eslint-visitor-keys@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz#f65328259305927392c938ed44eb0a5c9b2bd303" - integrity sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw== - -eslint-visitor-keys@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.1.0.tgz#eee4acea891814cda67a7d8812d9647dd0179af2" - integrity sha512-yWJFpu4DtjsWKkt5GeNBBuZMlNcYVs6vRCLoCVEJrTjaSB6LC98gFipNK/erM2Heg/E8mIK+hXG/pJMLK+eRZA== - -eslint@^8.2.0: - version "8.2.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.2.0.tgz#44d3fb506d0f866a506d97a0fc0e90ee6d06a815" - integrity sha512-erw7XmM+CLxTOickrimJ1SiF55jiNlVSp2qqm0NuBWPtHYQCegD5ZMaW0c3i5ytPqL+SSLaCxdvQXFPLJn+ABw== - dependencies: - "@eslint/eslintrc" "^1.0.4" - "@humanwhocodes/config-array" "^0.6.0" - ajv "^6.10.0" - chalk "^4.0.0" - cross-spawn "^7.0.2" - debug "^4.3.2" - doctrine "^3.0.0" - enquirer "^2.3.5" - escape-string-regexp "^4.0.0" - eslint-scope "^6.0.0" - eslint-utils "^3.0.0" - eslint-visitor-keys "^3.0.0" - espree "^9.0.0" - esquery "^1.4.0" - esutils "^2.0.2" - fast-deep-equal "^3.1.3" - file-entry-cache "^6.0.1" - functional-red-black-tree "^1.0.1" - glob-parent "^6.0.1" - globals "^13.6.0" - ignore "^4.0.6" - import-fresh "^3.0.0" - imurmurhash "^0.1.4" - is-glob "^4.0.0" - js-yaml "^4.1.0" - json-stable-stringify-without-jsonify "^1.0.1" - levn "^0.4.1" - lodash.merge "^4.6.2" - minimatch "^3.0.4" - natural-compare "^1.4.0" - optionator "^0.9.1" - progress "^2.0.0" - regexpp "^3.2.0" - semver "^7.2.1" - strip-ansi "^6.0.1" - strip-json-comments "^3.1.0" - text-table "^0.2.0" - v8-compile-cache "^2.0.3" - -espree@^9.0.0: - version "9.0.0" - resolved "https://registry.yarnpkg.com/espree/-/espree-9.0.0.tgz#e90a2965698228502e771c7a58489b1a9d107090" - integrity sha512-r5EQJcYZ2oaGbeR0jR0fFVijGOcwai07/690YRXLINuhmVeRY4UKSAsQPe/0BNuDgwP7Ophoc1PRsr2E3tkbdQ== - dependencies: - acorn "^8.5.0" - acorn-jsx "^5.3.1" - eslint-visitor-keys "^3.0.0" - -esquery@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.4.0.tgz#2148ffc38b82e8c7057dfed48425b3e61f0f24a5" - integrity sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w== - dependencies: - estraverse "^5.1.0" - -esrecurse@^4.3.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" - integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== - dependencies: - estraverse "^5.2.0" - -estraverse@^4.1.1: - version "4.3.0" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" - integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== - -estraverse@^5.1.0, estraverse@^5.2.0: - version "5.3.0" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" - integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== - -esutils@^2.0.2: - version "2.0.3" - resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" - integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== - -etag@1.8.1: - version "1.8.1" - resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" - integrity sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc= - -events@3.3.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400" - integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== - -evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz#7fcbdb198dc71959432efe13842684e0525acb02" - integrity sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA== - dependencies: - md5.js "^1.3.4" - safe-buffer "^5.1.1" - -exec-buffer@^3.0.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/exec-buffer/-/exec-buffer-3.2.0.tgz#b1686dbd904c7cf982e652c1f5a79b1e5573082b" - integrity sha512-wsiD+2Tp6BWHoVv3B+5Dcx6E7u5zky+hUwOHjuH2hKSLR3dvRmX8fk8UD8uqQixHs4Wk6eDmiegVrMPjKj7wpA== - dependencies: - execa "^0.7.0" - p-finally "^1.0.0" - pify "^3.0.0" - rimraf "^2.5.4" - tempfile "^2.0.0" - -execa@^0.7.0: - version "0.7.0" - resolved "https://registry.yarnpkg.com/execa/-/execa-0.7.0.tgz#944becd34cc41ee32a63a9faf27ad5a65fc59777" - integrity sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c= - dependencies: - cross-spawn "^5.0.1" - get-stream "^3.0.0" - is-stream "^1.1.0" - npm-run-path "^2.0.0" - p-finally "^1.0.0" - signal-exit "^3.0.0" - strip-eof "^1.0.0" - -execa@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/execa/-/execa-1.0.0.tgz#c6236a5bb4df6d6f15e88e7f017798216749ddd8" - integrity sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA== - dependencies: - cross-spawn "^6.0.0" - get-stream "^4.0.0" - is-stream "^1.1.0" - npm-run-path "^2.0.0" - p-finally "^1.0.0" - signal-exit "^3.0.0" - strip-eof "^1.0.0" - -execa@^4.0.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/execa/-/execa-4.1.0.tgz#4e5491ad1572f2f17a77d388c6c857135b22847a" - integrity sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA== - 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" - -executable@^4.1.0: - version "4.1.1" - resolved "https://registry.yarnpkg.com/executable/-/executable-4.1.1.tgz#41532bff361d3e57af4d763b70582db18f5d133c" - integrity sha512-8iA79xD3uAch729dUG8xaaBBFGaEa0wdD2VkYLFHwlqosEj/jT66AzcreRDSgV7ehnNLBW2WR5jIXwGKjVdTLg== - dependencies: - pify "^2.2.0" - -expand-brackets@^2.1.4: - version "2.1.4" - resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622" - integrity sha1-t3c14xXOMPa27/D4OwQVGiJEliI= - dependencies: - debug "^2.3.3" - define-property "^0.2.5" - extend-shallow "^2.0.1" - posix-character-classes "^0.1.0" - regex-not "^1.0.0" - snapdragon "^0.8.1" - to-regex "^3.0.1" - -ext-list@^2.0.0: - version "2.2.2" - resolved "https://registry.yarnpkg.com/ext-list/-/ext-list-2.2.2.tgz#0b98e64ed82f5acf0f2931babf69212ef52ddd37" - integrity sha512-u+SQgsubraE6zItfVA0tBuCBhfU9ogSRnsvygI7wht9TS510oLkBRXBsqopeUG/GBOIQyKZO9wjTqIu/sf5zFA== - dependencies: - mime-db "^1.28.0" - -ext-name@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/ext-name/-/ext-name-5.0.0.tgz#70781981d183ee15d13993c8822045c506c8f0a6" - integrity sha512-yblEwXAbGv1VQDmow7s38W77hzAgJAO50ztBLMcUyUBfxv1HC+LGwtiEN+Co6LtlqT/5uwVOxsD4TNIilWhwdQ== - dependencies: - ext-list "^2.0.0" - sort-keys-length "^1.0.0" - -extend-shallow@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" - integrity sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8= - dependencies: - is-extendable "^0.1.0" - -extend-shallow@^3.0.0, extend-shallow@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-3.0.2.tgz#26a71aaf073b39fb2127172746131c2704028db8" - integrity sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg= - dependencies: - assign-symbols "^1.0.0" - is-extendable "^1.0.1" - -extglob@^2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543" - integrity sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw== - dependencies: - array-unique "^0.3.2" - define-property "^1.0.0" - expand-brackets "^2.1.4" - extend-shallow "^2.0.1" - fragment-cache "^0.2.1" - regex-not "^1.0.0" - snapdragon "^0.8.1" - to-regex "^3.0.1" - -fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: - version "3.1.3" - resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" - integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== - -fast-diff@^1.1.2: - version "1.2.0" - resolved "https://registry.yarnpkg.com/fast-diff/-/fast-diff-1.2.0.tgz#73ee11982d86caaf7959828d519cfe927fac5f03" - integrity sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w== - -fast-glob@^2.0.2: - version "2.2.7" - resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-2.2.7.tgz#6953857c3afa475fff92ee6015d52da70a4cd39d" - integrity sha512-g1KuQwHOZAmOZMuBtHdxDtju+T2RT8jgCC9aANsbpdiDDTSnjgfuVsIBNKbUeJI3oKMRExcfNDtJl4OhbffMsw== - dependencies: - "@mrmlnc/readdir-enhanced" "^2.2.1" - "@nodelib/fs.stat" "^1.1.2" - glob-parent "^3.1.0" - is-glob "^4.0.0" - merge2 "^1.2.3" - micromatch "^3.1.10" - -fast-glob@^3.1.1: - version "3.2.7" - resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.7.tgz#fd6cb7a2d7e9aa7a7846111e85a196d6b2f766a1" - integrity sha512-rYGMRwip6lUMvYD3BTScMwT1HtAs2d71SMv66Vrxs0IekGZEjhM0pcMfjQPnknBt2zeCwQMEupiN02ZP4DiT1Q== - dependencies: - "@nodelib/fs.stat" "^2.0.2" - "@nodelib/fs.walk" "^1.2.3" - glob-parent "^5.1.2" - merge2 "^1.3.0" - micromatch "^4.0.4" - -fast-json-stable-stringify@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" - integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== - -fast-levenshtein@^2.0.6: - version "2.0.6" - resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" - integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= - -fast-xml-parser@^3.19.0: - version "3.21.1" - resolved "https://registry.yarnpkg.com/fast-xml-parser/-/fast-xml-parser-3.21.1.tgz#152a1d51d445380f7046b304672dd55d15c9e736" - integrity sha512-FTFVjYoBOZTJekiUsawGsSYV9QL0A+zDYCRj7y34IO6Jg+2IMYEtQa+bbictpdpV8dHxXywqU7C0gRDEOFtBFg== - dependencies: - strnum "^1.0.4" - -fastq@^1.6.0: - version "1.13.0" - resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.13.0.tgz#616760f88a7526bdfc596b7cab8c18938c36b98c" - integrity sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw== - dependencies: - reusify "^1.0.4" - -fd-slicer@~1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/fd-slicer/-/fd-slicer-1.1.0.tgz#25c7c89cb1f9077f8891bbe61d8f390eae256f1e" - integrity sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4= - dependencies: - pend "~1.2.0" - -figures@^3.0.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/figures/-/figures-3.2.0.tgz#625c18bd293c604dc4a8ddb2febf0c88341746af" - integrity sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg== - dependencies: - escape-string-regexp "^1.0.5" - -file-entry-cache@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027" - integrity sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg== - dependencies: - flat-cache "^3.0.4" - -file-loader@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/file-loader/-/file-loader-3.0.1.tgz#f8e0ba0b599918b51adfe45d66d1e771ad560faa" - integrity sha512-4sNIOXgtH/9WZq4NvlfU3Opn5ynUsqBwSLyM+I7UOwdGigTBYfVVQEwe/msZNX/j4pCJTIM14Fsw66Svo1oVrw== - dependencies: - loader-utils "^1.0.2" - schema-utils "^1.0.0" - -file-loader@^6.2.0: - version "6.2.0" - resolved "https://registry.yarnpkg.com/file-loader/-/file-loader-6.2.0.tgz#baef7cf8e1840df325e4390b4484879480eebe4d" - integrity sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw== - dependencies: - loader-utils "^2.0.0" - schema-utils "^3.0.0" - -file-selector@^0.2.2: - version "0.2.4" - resolved "https://registry.yarnpkg.com/file-selector/-/file-selector-0.2.4.tgz#7b98286f9dbb9925f420130ea5ed0a69238d4d80" - integrity sha512-ZDsQNbrv6qRi1YTDOEWzf5J2KjZ9KMI1Q2SGeTkCJmNNW25Jg4TW4UMcmoqcg4WrAyKRcpBXdbWRxkfrOzVRbA== - dependencies: - tslib "^2.0.3" - -file-type@5.2.0, file-type@^5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/file-type/-/file-type-5.2.0.tgz#2ddbea7c73ffe36368dfae49dc338c058c2b8ad6" - integrity sha1-LdvqfHP/42No365J3DOMBYwritY= - -file-type@^10.7.0: - version "10.11.0" - resolved "https://registry.yarnpkg.com/file-type/-/file-type-10.11.0.tgz#2961d09e4675b9fb9a3ee6b69e9cd23f43fd1890" - integrity sha512-uzk64HRpUZyTGZtVuvrjP0FYxzQrBf4rojot6J65YMEbwBLB0CWm0CLojVpwpmFmxcE/lkvYICgfcGozbBq6rw== - -file-type@^3.8.0: - version "3.9.0" - resolved "https://registry.yarnpkg.com/file-type/-/file-type-3.9.0.tgz#257a078384d1db8087bc449d107d52a52672b9e9" - integrity sha1-JXoHg4TR24CHvESdEH1SpSZyuek= - -file-type@^4.2.0: - version "4.4.0" - resolved "https://registry.yarnpkg.com/file-type/-/file-type-4.4.0.tgz#1b600e5fca1fbdc6e80c0a70c71c8dba5f7906c5" - integrity sha1-G2AOX8ofvcboDApwxxyNul95BsU= - -file-type@^6.1.0: - version "6.2.0" - resolved "https://registry.yarnpkg.com/file-type/-/file-type-6.2.0.tgz#e50cd75d356ffed4e306dc4f5bcf52a79903a919" - integrity sha512-YPcTBDV+2Tm0VqjybVd32MHdlEGAtuxS3VAYsumFokDSMG+ROT5wawGlnHDoz7bfMcMDt9hxuXvXwoKUx2fkOg== - -file-type@^8.1.0: - version "8.1.0" - resolved "https://registry.yarnpkg.com/file-type/-/file-type-8.1.0.tgz#244f3b7ef641bbe0cca196c7276e4b332399f68c" - integrity sha512-qyQ0pzAy78gVoJsmYeNgl8uH8yKhr1lVhW7JbzJmnlRi0I4R2eEDEJZVKG8agpDnLpacwNbDhLNG/LMdxHD2YQ== - -filename-reserved-regex@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/filename-reserved-regex/-/filename-reserved-regex-2.0.0.tgz#abf73dfab735d045440abfea2d91f389ebbfa229" - integrity sha1-q/c9+rc10EVECr/qLZHzieu/oik= - -filenamify@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/filenamify/-/filenamify-2.1.0.tgz#88faf495fb1b47abfd612300002a16228c677ee9" - integrity sha512-ICw7NTT6RsDp2rnYKVd8Fu4cr6ITzGy3+u4vUujPkabyaz+03F24NWEX7fs5fp+kBonlaqPH8fAO2NM+SXt/JA== - dependencies: - filename-reserved-regex "^2.0.0" - strip-outer "^1.0.0" - trim-repeated "^1.0.0" - -fill-range@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7" - integrity sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc= - dependencies: - extend-shallow "^2.0.1" - is-number "^3.0.0" - repeat-string "^1.6.1" - to-regex-range "^2.1.0" - -fill-range@^7.0.1: - version "7.0.1" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" - integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== - dependencies: - to-regex-range "^5.0.1" - -find-cache-dir@3.3.1: - version "3.3.1" - resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-3.3.1.tgz#89b33fad4a4670daa94f855f7fbe31d6d84fe880" - integrity sha512-t2GDMt3oGC/v+BMwzmllWDuJF/xcDtE5j/fCGbqDD7OLuJkj0cfh1YSA5VKPvwMeLFLNDBkwOKZ2X85jGLVftQ== - dependencies: - commondir "^1.0.1" - make-dir "^3.0.2" - pkg-dir "^4.1.0" - -find-cache-dir@^3.3.1: - version "3.3.2" - resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-3.3.2.tgz#b30c5b6eff0730731aea9bbd9dbecbd80256d64b" - integrity sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig== - dependencies: - commondir "^1.0.1" - make-dir "^3.0.2" - pkg-dir "^4.1.0" - -find-root@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/find-root/-/find-root-1.1.0.tgz#abcfc8ba76f708c42a97b3d685b7e9450bfb9ce4" - integrity sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng== - -find-up@^4.0.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" - integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== - dependencies: - locate-path "^5.0.0" - path-exists "^4.0.0" - -find-versions@^3.0.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/find-versions/-/find-versions-3.2.0.tgz#10297f98030a786829681690545ef659ed1d254e" - integrity sha512-P8WRou2S+oe222TOCHitLy8zj+SIsVJh52VP4lvXkaFVnOFFdoWv1H1Jjvel1aI6NCFOAaeAVm8qrI0odiLcww== - dependencies: - semver-regex "^2.0.0" - -flat-cache@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.0.4.tgz#61b0338302b2fe9f957dcc32fc2a87f1c3048b11" - integrity sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg== - dependencies: - flatted "^3.1.0" - rimraf "^3.0.2" - -flatted@^3.1.0: - version "3.2.4" - resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.4.tgz#28d9969ea90661b5134259f312ab6aa7929ac5e2" - integrity sha512-8/sOawo8tJ4QOBX8YlQBMxL8+RLZfxMQOif9o0KUKTNTjMYElWPE0r/m5VNFxTRd0NSw8qSy8dajrwX4RYI1Hw== - -follow-redirects@^1.14.4: - version "1.14.5" - resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.14.5.tgz#f09a5848981d3c772b5392309778523f8d85c381" - integrity sha512-wtphSXy7d4/OR+MvIFbCVBDzZ5520qV8XfPklSN5QtxuMUJZ+b0Wnst1e1lCDocfzuCkHqj8k0FpZqO+UIaKNA== - -for-in@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" - integrity sha1-gQaNKVqBQuwKxybG4iAMMPttXoA= - -foreach@^2.0.5: - version "2.0.5" - resolved "https://registry.yarnpkg.com/foreach/-/foreach-2.0.5.tgz#0bee005018aeb260d0a3af3ae658dd0136ec1b99" - integrity sha1-C+4AUBiusmDQo6865ljdATbsG5k= - -fragment-cache@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19" - integrity sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk= - dependencies: - map-cache "^0.2.2" - -from2@^2.1.1: - version "2.3.0" - resolved "https://registry.yarnpkg.com/from2/-/from2-2.3.0.tgz#8bfb5502bde4a4d36cfdeea007fcca21d7e382af" - integrity sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8= - dependencies: - inherits "^2.0.1" - readable-stream "^2.0.0" - -fs-constants@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/fs-constants/-/fs-constants-1.0.0.tgz#6be0de9be998ce16af8afc24497b9ee9b7ccd9ad" - integrity sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow== - -fs.realpath@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" - integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= - -fsevents@~2.3.1: - version "2.3.2" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" - integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== - -function-bind@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" - integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== - -functional-red-black-tree@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" - integrity sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc= - -gensync@^1.0.0-beta.2: - version "1.0.0-beta.2" - resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" - integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== - -get-intrinsic@^1.0.2, get-intrinsic@^1.1.0, get-intrinsic@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.1.1.tgz#15f59f376f855c446963948f0d24cd3637b4abc6" - integrity sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q== - dependencies: - function-bind "^1.1.1" - has "^1.0.3" - has-symbols "^1.0.1" - -get-orientation@1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/get-orientation/-/get-orientation-1.1.2.tgz#20507928951814f8a91ded0a0e67b29dfab98947" - integrity sha512-/pViTfifW+gBbh/RnlFYHINvELT9Znt+SYyDKAUL6uV6By019AK/s+i9XP4jSwq7lwP38Fd8HVeTxym3+hkwmQ== - dependencies: - stream-parser "^0.3.1" - -get-proxy@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/get-proxy/-/get-proxy-2.1.0.tgz#349f2b4d91d44c4d4d4e9cba2ad90143fac5ef93" - integrity sha512-zmZIaQTWnNQb4R4fJUEp/FC51eZsc6EkErspy3xtIYStaq8EB/hDIWipxsal+E8rz0qD7f2sL/NA9Xee4RInJw== - dependencies: - npm-conf "^1.1.0" - -get-stream@3.0.0, get-stream@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14" - integrity sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ= - -get-stream@^2.2.0: - version "2.3.1" - resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-2.3.1.tgz#5f38f93f346009666ee0150a054167f91bdd95de" - integrity sha1-Xzj5PzRgCWZu4BUKBUFn+Rvdld4= - dependencies: - object-assign "^4.0.1" - pinkie-promise "^2.0.0" - -get-stream@^4.0.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5" - integrity sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w== - dependencies: - pump "^3.0.0" - -get-stream@^5.0.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-5.2.0.tgz#4966a1795ee5ace65e706c4b7beb71257d6e22d3" - integrity sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA== - dependencies: - pump "^3.0.0" - -get-symbol-description@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/get-symbol-description/-/get-symbol-description-1.0.0.tgz#7fdb81c900101fbd564dd5f1a30af5aadc1e58d6" - integrity sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw== - dependencies: - call-bind "^1.0.2" - get-intrinsic "^1.1.1" - -get-value@^2.0.3, get-value@^2.0.6: - version "2.0.6" - resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" - integrity sha1-3BXKHGcjh8p2vTesCjlbogQqLCg= - -glob-parent@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-3.1.0.tgz#9e6af6299d8d3bd2bd40430832bd113df906c5ae" - integrity sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4= - dependencies: - is-glob "^3.1.0" - path-dirname "^1.0.0" - -glob-parent@^5.1.2, glob-parent@~5.1.0: - version "5.1.2" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" - integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== - dependencies: - is-glob "^4.0.1" - -glob-parent@^6.0.1: - version "6.0.2" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3" - integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== - dependencies: - is-glob "^4.0.3" - -glob-to-regexp@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz#8c5a1494d2066c570cc3bfe4496175acc4d502ab" - integrity sha1-jFoUlNIGbFcMw7/kSWF1rMTVAqs= - -glob-to-regexp@^0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz#c75297087c851b9a578bd217dd59a92f59fe546e" - integrity sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw== - -glob@^7.1.2, glob@^7.1.3: - version "7.2.0" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.0.tgz#d15535af7732e02e948f4c41628bd910293f6023" - integrity sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q== - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^3.0.4" - once "^1.3.0" - path-is-absolute "^1.0.0" - -globals@^11.1.0: - version "11.12.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" - integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== - -globals@^13.6.0, globals@^13.9.0: - version "13.12.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-13.12.0.tgz#4d733760304230a0082ed96e21e5c565f898089e" - integrity sha512-uS8X6lSKN2JumVoXrbUz+uG4BYG+eiawqm3qFcT7ammfbUHeCBoJMlHcec/S3krSk73/AE/f0szYFmgAA3kYZg== - dependencies: - type-fest "^0.20.2" - -globby@^11.0.4: - version "11.0.4" - resolved "https://registry.yarnpkg.com/globby/-/globby-11.0.4.tgz#2cbaff77c2f2a62e71e9b2813a67b97a3a3001a5" - integrity sha512-9O4MVG9ioZJ08ffbcyVYyLOJLk5JQ688pJ4eMGLpdWLHq/Wr1D9BlriLQyL0E+jbkuePVZXYFj47QM/v093wHg== - dependencies: - array-union "^2.1.0" - dir-glob "^3.0.1" - fast-glob "^3.1.1" - ignore "^5.1.4" - merge2 "^1.3.0" - slash "^3.0.0" - -globby@^8.0.1: - version "8.0.2" - resolved "https://registry.yarnpkg.com/globby/-/globby-8.0.2.tgz#5697619ccd95c5275dbb2d6faa42087c1a941d8d" - integrity sha512-yTzMmKygLp8RUpG1Ymu2VXPSJQZjNAZPD4ywgYEaG7e4tBJeUQBO8OpXrf1RCNcEs5alsoJYPAMiIHP0cmeC7w== - dependencies: - array-union "^1.0.1" - dir-glob "2.0.0" - fast-glob "^2.0.2" - glob "^7.1.2" - ignore "^3.3.5" - pify "^3.0.0" - slash "^1.0.0" - -got@^7.0.0: - version "7.1.0" - resolved "https://registry.yarnpkg.com/got/-/got-7.1.0.tgz#05450fd84094e6bbea56f451a43a9c289166385a" - integrity sha512-Y5WMo7xKKq1muPsxD+KmrR8DH5auG7fBdDVueZwETwV6VytKyU9OX/ddpq2/1hp1vIPvVb4T81dKQz3BivkNLw== - dependencies: - decompress-response "^3.2.0" - duplexer3 "^0.1.4" - get-stream "^3.0.0" - is-plain-obj "^1.1.0" - is-retry-allowed "^1.0.0" - is-stream "^1.0.0" - isurl "^1.0.0-alpha5" - lowercase-keys "^1.0.0" - p-cancelable "^0.3.0" - p-timeout "^1.1.1" - safe-buffer "^5.0.1" - timed-out "^4.0.0" - url-parse-lax "^1.0.0" - url-to-options "^1.0.1" - -got@^8.3.1: - version "8.3.2" - resolved "https://registry.yarnpkg.com/got/-/got-8.3.2.tgz#1d23f64390e97f776cac52e5b936e5f514d2e937" - integrity sha512-qjUJ5U/hawxosMryILofZCkm3C84PLJS/0grRIpjAwu+Lkxxj5cxeCU25BG0/3mDSpXKTyZr8oh8wIgLaH0QCw== - dependencies: - "@sindresorhus/is" "^0.7.0" - cacheable-request "^2.1.1" - decompress-response "^3.3.0" - duplexer3 "^0.1.4" - get-stream "^3.0.0" - into-stream "^3.1.0" - is-retry-allowed "^1.1.0" - isurl "^1.0.0-alpha5" - lowercase-keys "^1.0.0" - mimic-response "^1.0.0" - p-cancelable "^0.4.0" - p-timeout "^2.0.1" - pify "^3.0.0" - safe-buffer "^5.1.1" - timed-out "^4.0.1" - url-parse-lax "^3.0.0" - url-to-options "^1.0.1" - -graceful-fs@^4.1.10, graceful-fs@^4.1.2: - version "4.2.8" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.8.tgz#e412b8d33f5e006593cbd3cee6df9f2cebbe802a" - integrity sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg== - -has-bigints@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.1.tgz#64fe6acb020673e3b78db035a5af69aa9d07b113" - integrity sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA== - -has-flag@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" - integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= - -has-flag@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" - integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== - -has-symbol-support-x@^1.4.1: - version "1.4.2" - resolved "https://registry.yarnpkg.com/has-symbol-support-x/-/has-symbol-support-x-1.4.2.tgz#1409f98bc00247da45da67cee0a36f282ff26455" - integrity sha512-3ToOva++HaW+eCpgqZrCfN51IPB+7bJNVT6CUATzueB5Heb8o6Nam0V3HG5dlDvZU1Gn5QLcbahiKw/XVk5JJw== - -has-symbols@^1.0.1, has-symbols@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.2.tgz#165d3070c00309752a1236a479331e3ac56f1423" - integrity sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw== - -has-to-string-tag-x@^1.2.0: - version "1.4.1" - resolved "https://registry.yarnpkg.com/has-to-string-tag-x/-/has-to-string-tag-x-1.4.1.tgz#a045ab383d7b4b2012a00148ab0aa5f290044d4d" - integrity sha512-vdbKfmw+3LoOYVr+mtxHaX5a96+0f3DljYd8JOqvOLsf5mw2Otda2qCDT9qRqLAhrjyQ0h7ual5nOiASpsGNFw== - dependencies: - has-symbol-support-x "^1.4.1" - -has-tostringtag@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.0.tgz#7e133818a7d394734f941e73c3d3f9291e658b25" - integrity sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ== - dependencies: - has-symbols "^1.0.2" - -has-value@^0.3.1: - version "0.3.1" - resolved "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f" - integrity sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8= - dependencies: - get-value "^2.0.3" - has-values "^0.1.4" - isobject "^2.0.0" - -has-value@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/has-value/-/has-value-1.0.0.tgz#18b281da585b1c5c51def24c930ed29a0be6b177" - integrity sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc= - dependencies: - get-value "^2.0.6" - has-values "^1.0.0" - isobject "^3.0.0" - -has-values@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/has-values/-/has-values-0.1.4.tgz#6d61de95d91dfca9b9a02089ad384bff8f62b771" - integrity sha1-bWHeldkd/Km5oCCJrThL/49it3E= - -has-values@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/has-values/-/has-values-1.0.0.tgz#95b0b63fec2146619a6fe57fe75628d5a39efe4f" - integrity sha1-lbC2P+whRmGab+V/51Yo1aOe/k8= - dependencies: - is-number "^3.0.0" - kind-of "^4.0.0" - -has@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" - integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== - dependencies: - function-bind "^1.1.1" - -hash-base@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-3.1.0.tgz#55c381d9e06e1d2997a883b4a3fddfe7f0d3af33" - integrity sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA== - dependencies: - inherits "^2.0.4" - readable-stream "^3.6.0" - safe-buffer "^5.2.0" - -hash.js@^1.0.0, hash.js@^1.0.3: - version "1.1.7" - resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.7.tgz#0babca538e8d4ee4a0f8988d68866537a003cf42" - integrity sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA== - dependencies: - inherits "^2.0.3" - minimalistic-assert "^1.0.1" - -he@1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" - integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== - -hmac-drbg@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1" - integrity sha1-0nRXAQJabHdabFRXk+1QL8DGSaE= - dependencies: - hash.js "^1.0.3" - minimalistic-assert "^1.0.0" - minimalistic-crypto-utils "^1.0.1" - -hoist-non-react-statics@^3.3.1: - version "3.3.2" - resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz#ece0acaf71d62c2969c2ec59feff42a4b1a85b45" - integrity sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw== - dependencies: - react-is "^16.7.0" - -http-cache-semantics@3.8.1: - version "3.8.1" - resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-3.8.1.tgz#39b0e16add9b605bf0a9ef3d9daaf4843b4cacd2" - integrity sha512-5ai2iksyV8ZXmnZhHH4rWPoxxistEexSi5936zIQ1bnNTW5VnA85B6P/VpXiRM017IgRvb2kKo1a//y+0wSp3w== - -http-errors@1.7.3: - version "1.7.3" - resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.3.tgz#6c619e4f9c60308c38519498c14fbb10aacebb06" - integrity sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw== - dependencies: - depd "~1.1.2" - inherits "2.0.4" - setprototypeof "1.1.1" - statuses ">= 1.5.0 < 2" - toidentifier "1.0.0" - -https-browserify@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-1.0.0.tgz#ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73" - integrity sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM= - -human-signals@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-1.1.1.tgz#c5b1cd14f50aeae09ab6c59fe63ba3395fe4dfa3" - integrity sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw== - -iconv-lite@0.4.24: - version "0.4.24" - resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" - integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== - dependencies: - safer-buffer ">= 2.1.2 < 3" - -iconv-lite@^0.6.2: - version "0.6.3" - resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.6.3.tgz#a52f80bf38da1952eb5c681790719871a1a72501" - integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw== - dependencies: - safer-buffer ">= 2.1.2 < 3.0.0" - -ieee754@^1.1.13, ieee754@^1.1.4: - version "1.2.1" - resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" - integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== - -ignore@^3.3.5: - version "3.3.10" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.3.10.tgz#0a97fb876986e8081c631160f8f9f389157f0043" - integrity sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug== - -ignore@^4.0.6: - version "4.0.6" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc" - integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg== - -ignore@^5.1.4, ignore@^5.1.8: - version "5.1.9" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.1.9.tgz#9ec1a5cbe8e1446ec60d4420060d43aa6e7382fb" - integrity sha512-2zeMQpbKz5dhZ9IwL0gbxSW5w0NK/MSAMtNuhgIHEPmaU3vPdKPL0UdvUCXs5SS4JAwsBxysK5sFMW8ocFiVjQ== - -image-size@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/image-size/-/image-size-1.0.0.tgz#58b31fe4743b1cec0a0ac26f5c914d3c5b2f0750" - integrity sha512-JLJ6OwBfO1KcA+TvJT+v8gbE6iWbj24LyDNFgFEN0lzegn6cC6a/p3NIDaepMsJjQjlUWqIC7wJv8lBFxPNjcw== - dependencies: - queue "6.0.2" - -imagemin-mozjpeg@^9.0.0: - version "9.0.0" - resolved "https://registry.yarnpkg.com/imagemin-mozjpeg/-/imagemin-mozjpeg-9.0.0.tgz#d1af26d0b43d75a41c211051c1910da59d9d2324" - integrity sha512-TwOjTzYqCFRgROTWpVSt5UTT0JeCuzF1jswPLKALDd89+PmrJ2PdMMYeDLYZ1fs9cTovI9GJd68mRSnuVt691w== - dependencies: - execa "^4.0.0" - is-jpg "^2.0.0" - mozjpeg "^7.0.0" - -imagemin-optipng@^8.0.0: - version "8.0.0" - resolved "https://registry.yarnpkg.com/imagemin-optipng/-/imagemin-optipng-8.0.0.tgz#b88e5cf6da25cc8479e07cdf38c3ae0479df7ef2" - integrity sha512-CUGfhfwqlPjAC0rm8Fy+R2DJDBGjzy2SkfyT09L8rasnF9jSoHFqJ1xxSZWK6HVPZBMhGPMxCTL70OgTHlLF5A== - dependencies: - exec-buffer "^3.0.0" - is-png "^2.0.0" - optipng-bin "^7.0.0" - -imagemin-svgo@^10.0.0: - version "10.0.0" - resolved "https://registry.yarnpkg.com/imagemin-svgo/-/imagemin-svgo-10.0.0.tgz#0cc0c5636dc707ae96c580836c79922601da9b34" - integrity sha512-nuikUDlf8u81V25ckHrWE8l7fECNx403EU3a3qrSO8H4ipBSEL3QlOgrBqZ1SJQ1lsIzJbBKwXvsrVGGO6Hj2g== - dependencies: - is-svg "^4.3.1" - svgo "^2.5.0" - -imagemin@^6.1.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/imagemin/-/imagemin-6.1.0.tgz#62508b465728fea36c03cdc07d915fe2d8cf9e13" - integrity sha512-8ryJBL1CN5uSHpiBMX0rJw79C9F9aJqMnjGnrd/1CafegpNuA81RBAAru/jQQEOWlOJJlpRnlcVFF6wq+Ist0A== - dependencies: - file-type "^10.7.0" - globby "^8.0.1" - make-dir "^1.0.0" - p-pipe "^1.1.0" - pify "^4.0.1" - replace-ext "^1.0.0" - -img-loader@^3.0.1: - version "3.0.2" - resolved "https://registry.yarnpkg.com/img-loader/-/img-loader-3.0.2.tgz#423d39cb45f017e88c7959b2740226ce4c9001aa" - integrity sha512-rSriLKgvi85Km7ppSF+AEAM3nU4fxpvCkaXtC/IoCEU7jfks55bEANFs0bB9YXYkxY9JurZQIZFtXh5Gue3upw== - dependencies: - loader-utils "^1.1.0" - -import-fresh@^3.0.0, import-fresh@^3.1.0, import-fresh@^3.2.1: - version "3.3.0" - resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" - integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== - dependencies: - parent-module "^1.0.0" - resolve-from "^4.0.0" - -import-lazy@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/import-lazy/-/import-lazy-3.1.0.tgz#891279202c8a2280fdbd6674dbd8da1a1dfc67cc" - integrity sha512-8/gvXvX2JMn0F+CDlSC4l6kOmVaLOO3XLkksI7CI3Ud95KDYJuYur2b9P/PUt/i/pDAMd/DulQsNbbbmRRsDIQ== - -imurmurhash@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" - integrity sha1-khi5srkoojixPcT7a21XbyMUU+o= - -inflight@^1.0.4: - version "1.0.6" - resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" - integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= - dependencies: - once "^1.3.0" - wrappy "1" - -inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.3, inherits@~2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" - integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== - -ini@^1.3.4: - version "1.3.8" - resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" - integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== - -internal-slot@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.3.tgz#7347e307deeea2faac2ac6205d4bc7d34967f59c" - integrity sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA== - dependencies: - get-intrinsic "^1.1.0" - has "^1.0.3" - side-channel "^1.0.4" - -into-stream@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/into-stream/-/into-stream-3.1.0.tgz#96fb0a936c12babd6ff1752a17d05616abd094c6" - integrity sha1-lvsKk2wSur1v8XUqF9BWFqvQlMY= - dependencies: - from2 "^2.1.1" - p-is-promise "^1.1.0" - -is-accessor-descriptor@^0.1.6: - version "0.1.6" - resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6" - integrity sha1-qeEss66Nh2cn7u84Q/igiXtcmNY= - dependencies: - kind-of "^3.0.2" - -is-accessor-descriptor@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz#169c2f6d3df1f992618072365c9b0ea1f6878656" - integrity sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ== - dependencies: - kind-of "^6.0.0" - -is-arguments@^1.0.4: - version "1.1.1" - resolved "https://registry.yarnpkg.com/is-arguments/-/is-arguments-1.1.1.tgz#15b3f88fda01f2a97fec84ca761a560f123efa9b" - integrity sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA== - dependencies: - call-bind "^1.0.2" - has-tostringtag "^1.0.0" - -is-arrayish@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" - integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0= - -is-bigint@^1.0.1: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.0.4.tgz#08147a1875bc2b32005d41ccd8291dffc6691df3" - integrity sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg== - dependencies: - has-bigints "^1.0.1" - -is-binary-path@~2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" - integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== - dependencies: - binary-extensions "^2.0.0" - -is-boolean-object@^1.1.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.1.2.tgz#5c6dc200246dd9321ae4b885a114bb1f75f63719" - integrity sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA== - dependencies: - call-bind "^1.0.2" - has-tostringtag "^1.0.0" - -is-buffer@^1.1.5: - version "1.1.6" - resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" - integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== - -is-callable@^1.1.4, is-callable@^1.2.4: - version "1.2.4" - resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.4.tgz#47301d58dd0259407865547853df6d61fe471945" - integrity sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w== - -is-core-module@^2.2.0: - version "2.8.0" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.8.0.tgz#0321336c3d0925e497fd97f5d95cb114a5ccd548" - integrity sha512-vd15qHsaqrRL7dtH6QNuy0ndJmRDrS9HAM1CAiSifNUFv4x1a0CCVsj18hJ1mShxIG6T2i1sO78MkP56r0nYRw== - dependencies: - has "^1.0.3" - -is-data-descriptor@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56" - integrity sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y= - dependencies: - kind-of "^3.0.2" - -is-data-descriptor@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz#d84876321d0e7add03990406abbbbd36ba9268c7" - integrity sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ== - dependencies: - kind-of "^6.0.0" - -is-date-object@^1.0.1: - version "1.0.5" - resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.5.tgz#0841d5536e724c25597bf6ea62e1bd38298df31f" - integrity sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ== - dependencies: - has-tostringtag "^1.0.0" - -is-descriptor@^0.1.0: - version "0.1.6" - resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.6.tgz#366d8240dde487ca51823b1ab9f07a10a78251ca" - integrity sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg== - dependencies: - is-accessor-descriptor "^0.1.6" - is-data-descriptor "^0.1.4" - kind-of "^5.0.0" - -is-descriptor@^1.0.0, is-descriptor@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-1.0.2.tgz#3b159746a66604b04f8c81524ba365c5f14d86ec" - integrity sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg== - dependencies: - is-accessor-descriptor "^1.0.0" - is-data-descriptor "^1.0.0" - kind-of "^6.0.2" - -is-extendable@^0.1.0, is-extendable@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" - integrity sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik= - -is-extendable@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-1.0.1.tgz#a7470f9e426733d81bd81e1155264e3a3507cab4" - integrity sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA== - dependencies: - is-plain-object "^2.0.4" - -is-extglob@^2.1.0, is-extglob@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" - integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= - -is-generator-function@^1.0.7: - version "1.0.10" - resolved "https://registry.yarnpkg.com/is-generator-function/-/is-generator-function-1.0.10.tgz#f1558baf1ac17e0deea7c0415c438351ff2b3c72" - integrity sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A== - dependencies: - has-tostringtag "^1.0.0" - -is-glob@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-3.1.0.tgz#7ba5ae24217804ac70707b96922567486cc3e84a" - integrity sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo= - dependencies: - is-extglob "^2.1.0" - -is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: - version "4.0.3" - resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" - integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== - dependencies: - is-extglob "^2.1.1" - -is-jpg@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/is-jpg/-/is-jpg-2.0.0.tgz#2e1997fa6e9166eaac0242daae443403e4ef1d97" - integrity sha1-LhmX+m6RZuqsAkLarkQ0A+TvHZc= - -is-nan@^1.2.1: - version "1.3.2" - resolved "https://registry.yarnpkg.com/is-nan/-/is-nan-1.3.2.tgz#043a54adea31748b55b6cd4e09aadafa69bd9e1d" - integrity sha512-E+zBKpQ2t6MEo1VsonYmluk9NxGrbzpeeLC2xIViuO2EjU2xsXsBPwTr3Ykv9l08UYEVEdWeRZNouaZqF6RN0w== - dependencies: - call-bind "^1.0.0" - define-properties "^1.1.3" - -is-natural-number@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/is-natural-number/-/is-natural-number-4.0.1.tgz#ab9d76e1db4ced51e35de0c72ebecf09f734cde8" - integrity sha1-q5124dtM7VHjXeDHLr7PCfc0zeg= - -is-negative-zero@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.1.tgz#3de746c18dda2319241a53675908d8f766f11c24" - integrity sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w== - -is-number-object@^1.0.4: - version "1.0.6" - resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.6.tgz#6a7aaf838c7f0686a50b4553f7e54a96494e89f0" - integrity sha512-bEVOqiRcvo3zO1+G2lVMy+gkkEm9Yh7cDMRusKKu5ZJKPUYSJwICTKZrNKHA2EbSP0Tu0+6B/emsYNHZyn6K8g== - dependencies: - has-tostringtag "^1.0.0" - -is-number@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" - integrity sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU= - dependencies: - kind-of "^3.0.2" - -is-number@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" - integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== - -is-object@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-object/-/is-object-1.0.2.tgz#a56552e1c665c9e950b4a025461da87e72f86fcf" - integrity sha512-2rRIahhZr2UWb45fIOuvZGpFtz0TyOZLf32KxBbSoUCeZR495zCKlWUKKUByk3geS2eAs7ZAABt0Y/Rx0GiQGA== - -is-plain-obj@^1.0.0, is-plain-obj@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e" - integrity sha1-caUMhCnfync8kqOQpKA7OfzVHT4= - -is-plain-object@^2.0.3, is-plain-object@^2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" - integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== - dependencies: - isobject "^3.0.1" - -is-png@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/is-png/-/is-png-2.0.0.tgz#ee8cbc9e9b050425cedeeb4a6fb74a649b0a4a8d" - integrity sha512-4KPGizaVGj2LK7xwJIz8o5B2ubu1D/vcQsgOGFEDlpcvgZHto4gBnyd0ig7Ws+67ixmwKoNmu0hYnpo6AaKb5g== - -is-regex@^1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.4.tgz#eef5663cd59fa4c0ae339505323df6854bb15958" - integrity sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg== - dependencies: - call-bind "^1.0.2" - has-tostringtag "^1.0.0" - -is-retry-allowed@^1.0.0, is-retry-allowed@^1.1.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/is-retry-allowed/-/is-retry-allowed-1.2.0.tgz#d778488bd0a4666a3be8a1482b9f2baafedea8b4" - integrity sha512-RUbUeKwvm3XG2VYamhJL1xFktgjvPzL0Hq8C+6yrWIswDy3BIXGqCxhxkc30N9jqK311gVU137K8Ei55/zVJRg== - -is-shared-array-buffer@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.1.tgz#97b0c85fbdacb59c9c446fe653b82cf2b5b7cfe6" - integrity sha512-IU0NmyknYZN0rChcKhRO1X8LYz5Isj/Fsqh8NJOSf+N/hCOTwy29F32Ik7a+QszE63IdvmwdTPDd6cZ5pg4cwA== - -is-stream@^1.0.0, is-stream@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" - integrity sha1-EtSj3U5o4Lec6428hBc66A2RykQ= - -is-stream@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" - integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== - -is-string@^1.0.5, is-string@^1.0.7: - version "1.0.7" - resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.7.tgz#0dd12bf2006f255bb58f695110eff7491eebc0fd" - integrity sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg== - dependencies: - has-tostringtag "^1.0.0" - -is-svg@^4.3.1: - version "4.3.1" - resolved "https://registry.yarnpkg.com/is-svg/-/is-svg-4.3.1.tgz#8c63ec8c67c8c7f0a8de0a71c8c7d58eccf4406b" - integrity sha512-h2CGs+yPUyvkgTJQS9cJzo9lYK06WgRiXUqBBHtglSzVKAuH4/oWsqk7LGfbSa1hGk9QcZ0SyQtVggvBA8LZXA== - dependencies: - fast-xml-parser "^3.19.0" - -is-symbol@^1.0.2, is-symbol@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.4.tgz#a6dac93b635b063ca6872236de88910a57af139c" - integrity sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg== - dependencies: - has-symbols "^1.0.2" - -is-typed-array@^1.1.3, is-typed-array@^1.1.7: - version "1.1.8" - resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.8.tgz#cbaa6585dc7db43318bc5b89523ea384a6f65e79" - integrity sha512-HqH41TNZq2fgtGT8WHVFVJhBVGuY3AnP3Q36K8JKXUxSxRgk/d+7NjmwG2vo2mYmXK8UYZKu0qH8bVP5gEisjA== - dependencies: - available-typed-arrays "^1.0.5" - call-bind "^1.0.2" - es-abstract "^1.18.5" - foreach "^2.0.5" - has-tostringtag "^1.0.0" - -is-weakref@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-weakref/-/is-weakref-1.0.1.tgz#842dba4ec17fa9ac9850df2d6efbc1737274f2a2" - integrity sha512-b2jKc2pQZjaeFYWEf7ScFj+Be1I+PXmlu572Q8coTXZ+LD/QQZ7ShPMst8h16riVgyXTQwUsFEl74mDvc/3MHQ== - dependencies: - call-bind "^1.0.0" - -is-windows@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" - integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA== - -isarray@1.0.0, isarray@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" - integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= - -isexe@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" - integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= - -isobject@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" - integrity sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk= - dependencies: - isarray "1.0.0" - -isobject@^3.0.0, isobject@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" - integrity sha1-TkMekrEalzFjaqH5yNHMvP2reN8= - -isurl@^1.0.0-alpha5: - version "1.0.0" - resolved "https://registry.yarnpkg.com/isurl/-/isurl-1.0.0.tgz#b27f4f49f3cdaa3ea44a0a5b7f3462e6edc39d67" - integrity sha512-1P/yWsxPlDtn7QeRD+ULKQPaIaN6yF368GZ2vDfv0AL0NwpStafjWCDDdn0k8wgFMWpVAqG7oJhxHnlud42i9w== - dependencies: - has-to-string-tag-x "^1.2.0" - is-object "^1.0.1" - -jest-worker@27.0.0-next.5: - version "27.0.0-next.5" - resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-27.0.0-next.5.tgz#5985ee29b12a4e191f4aae4bb73b97971d86ec28" - integrity sha512-mk0umAQ5lT+CaOJ+Qp01N6kz48sJG2kr2n1rX0koqKf6FIygQV0qLOdN9SCYID4IVeSigDOcPeGLozdMLYfb5g== - dependencies: - "@types/node" "*" - merge-stream "^2.0.0" - supports-color "^8.0.0" - -js-sha3@0.8.0: - version "0.8.0" - resolved "https://registry.yarnpkg.com/js-sha3/-/js-sha3-0.8.0.tgz#b9b7a5da73afad7dedd0f8c463954cbde6818840" - integrity sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q== - -"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" - integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== - -js-yaml@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" - integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== - dependencies: - argparse "^2.0.1" - -jsesc@^2.5.1: - version "2.5.2" - resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" - integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== - -json-buffer@3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.0.tgz#5b1f397afc75d677bde8bcfc0e47e1f9a3d9a898" - integrity sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg= - -json-parse-even-better-errors@^2.3.0: - version "2.3.1" - resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" - integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== - -json-schema-traverse@^0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" - integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== - -json-stable-stringify-without-jsonify@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" - integrity sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE= - -json5@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.1.tgz#779fb0018604fa854eacbf6252180d83543e3dbe" - integrity sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow== - dependencies: - minimist "^1.2.0" - -json5@^2.1.2: - version "2.2.0" - resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.0.tgz#2dfefe720c6ba525d9ebd909950f0515316c89a3" - integrity sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA== - dependencies: - minimist "^1.2.5" - -keyv@3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/keyv/-/keyv-3.0.0.tgz#44923ba39e68b12a7cec7df6c3268c031f2ef373" - integrity sha512-eguHnq22OE3uVoSYG0LVWNP+4ppamWr9+zWBe1bsNcovIMy6huUJFPgy4mGwCd/rnl3vOLGW1MTlu4c57CT1xA== - dependencies: - json-buffer "3.0.0" - -kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0: - version "3.2.2" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" - integrity sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ= - dependencies: - is-buffer "^1.1.5" - -kind-of@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57" - integrity sha1-IIE989cSkosgc3hpGkUGb65y3Vc= - dependencies: - is-buffer "^1.1.5" - -kind-of@^5.0.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d" - integrity sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw== - -kind-of@^6.0.0, kind-of@^6.0.2: - version "6.0.3" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" - integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== - -levn@^0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade" - integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== - dependencies: - prelude-ls "^1.2.1" - type-check "~0.4.0" - -lines-and-columns@^1.1.6: - version "1.1.6" - resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.1.6.tgz#1c00c743b433cd0a4e80758f7b64a57440d9ff00" - integrity sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA= - -loader-utils@1.2.3: - version "1.2.3" - resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.2.3.tgz#1ff5dc6911c9f0a062531a4c04b609406108c2c7" - integrity sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA== - dependencies: - big.js "^5.2.2" - emojis-list "^2.0.0" - json5 "^1.0.1" - -loader-utils@^1.0.2, loader-utils@^1.1.0, loader-utils@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.4.0.tgz#c579b5e34cb34b1a74edc6c1fb36bfa371d5a613" - integrity sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA== - dependencies: - big.js "^5.2.2" - emojis-list "^3.0.0" - json5 "^1.0.1" - -loader-utils@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-2.0.2.tgz#d6e3b4fb81870721ae4e0868ab11dd638368c129" - integrity sha512-TM57VeHptv569d/GKh6TAYdzKblwDNiumOdkFnejjD0XwTH87K90w3O7AiJRqdQoXygvi1VQTJTLGhJl7WqA7A== - dependencies: - big.js "^5.2.2" - emojis-list "^3.0.0" - json5 "^2.1.2" - -locate-path@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" - integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== - dependencies: - p-locate "^4.1.0" - -lodash.isequal@^4.5.0: - version "4.5.0" - resolved "https://registry.yarnpkg.com/lodash.isequal/-/lodash.isequal-4.5.0.tgz#415c4478f2bcc30120c22ce10ed3226f7d3e18e0" - integrity sha1-QVxEePK8wwEgwizhDtMib30+GOA= - -lodash.merge@^4.6.2: - version "4.6.2" - resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" - integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== - -lodash.sortby@^4.7.0: - version "4.7.0" - resolved "https://registry.yarnpkg.com/lodash.sortby/-/lodash.sortby-4.7.0.tgz#edd14c824e2cc9c1e0b0a1b42bb5210516a42438" - integrity sha1-7dFMgk4sycHgsKG0K7UhBRakJDg= - -lodash@^4.17.21: - version "4.17.21" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" - integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== - -loose-envify@^1.1.0, loose-envify@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" - integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== - dependencies: - js-tokens "^3.0.0 || ^4.0.0" - -lowercase-keys@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.0.tgz#4e3366b39e7f5457e35f1324bdf6f88d0bfc7306" - integrity sha1-TjNms55/VFfjXxMkvfb4jQv8cwY= - -lowercase-keys@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.1.tgz#6f9e30b47084d971a7c820ff15a6c5167b74c26f" - integrity sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA== - -lru-cache@^4.0.1: - version "4.1.5" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.5.tgz#8bbe50ea85bed59bc9e33dcab8235ee9bcf443cd" - integrity sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g== - dependencies: - pseudomap "^1.0.2" - yallist "^2.1.2" - -lru-cache@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" - integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== - dependencies: - yallist "^4.0.0" - -make-dir@^1.0.0, make-dir@^1.2.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-1.3.0.tgz#79c1033b80515bd6d24ec9933e860ca75ee27f0c" - integrity sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ== - dependencies: - pify "^3.0.0" - -make-dir@^3.0.2, make-dir@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f" - integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw== - dependencies: - semver "^6.0.0" - -map-cache@^0.2.2: - version "0.2.2" - resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" - integrity sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8= - -map-visit@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f" - integrity sha1-7Nyo8TFE5mDxtb1B8S80edmN+48= - dependencies: - object-visit "^1.0.0" - -match-sorter@^6.0.2: - version "6.3.1" - resolved "https://registry.yarnpkg.com/match-sorter/-/match-sorter-6.3.1.tgz#98cc37fda756093424ddf3cbc62bfe9c75b92bda" - integrity sha512-mxybbo3pPNuA+ZuCUhm5bwNkXrJTbsk5VWbR5wiwz/GC6LIiegBGn2w3O08UG/jdbYLinw51fSQ5xNU1U3MgBw== - dependencies: - "@babel/runtime" "^7.12.5" - remove-accents "0.4.2" - -md5.js@^1.3.4: - version "1.3.5" - resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.5.tgz#b5d07b8e3216e3e27cd728d72f70d1e6a342005f" - integrity sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg== - dependencies: - hash-base "^3.0.0" - inherits "^2.0.1" - safe-buffer "^5.1.2" - -mdn-data@2.0.14: - version "2.0.14" - resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.14.tgz#7113fc4281917d63ce29b43446f701e68c25ba50" - integrity sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow== - -merge-stream@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" - integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== - -merge2@^1.2.3, merge2@^1.3.0: - version "1.4.1" - resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" - integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== - -micromatch@^3.1.10: - version "3.1.10" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23" - integrity sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg== - dependencies: - arr-diff "^4.0.0" - array-unique "^0.3.2" - braces "^2.3.1" - define-property "^2.0.2" - extend-shallow "^3.0.2" - extglob "^2.0.4" - fragment-cache "^0.2.1" - kind-of "^6.0.2" - nanomatch "^1.2.9" - object.pick "^1.3.0" - regex-not "^1.0.0" - snapdragon "^0.8.1" - to-regex "^3.0.2" - -micromatch@^4.0.4: - version "4.0.4" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.4.tgz#896d519dfe9db25fce94ceb7a500919bf881ebf9" - integrity sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg== - dependencies: - braces "^3.0.1" - picomatch "^2.2.3" - -microseconds@0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/microseconds/-/microseconds-0.2.0.tgz#233b25f50c62a65d861f978a4a4f8ec18797dc39" - integrity sha512-n7DHHMjR1avBbSpsTBj6fmMGh2AGrifVV4e+WYc3Q9lO+xnSZ3NyhcBND3vzzatt05LFhoKFRxrIyklmLlUtyA== - -miller-rabin@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/miller-rabin/-/miller-rabin-4.0.1.tgz#f080351c865b0dc562a8462966daa53543c78a4d" - integrity sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA== - dependencies: - bn.js "^4.0.0" - brorand "^1.0.1" - -mime-db@^1.28.0: - version "1.51.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.51.0.tgz#d9ff62451859b18342d960850dc3cfb77e63fb0c" - integrity sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g== - -mime@^2.0.3: - version "2.6.0" - resolved "https://registry.yarnpkg.com/mime/-/mime-2.6.0.tgz#a2a682a95cd4d0cb1d6257e28f83da7e35800367" - integrity sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg== - -mimic-fn@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" - integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== - -mimic-response@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-1.0.1.tgz#4923538878eef42063cb8a3e3b0798781487ab1b" - integrity sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ== - -minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" - integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== - -minimalistic-crypto-utils@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" - integrity sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo= - -minimatch@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" - integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== - dependencies: - brace-expansion "^1.1.7" - -minimist@^1.2.0, minimist@^1.2.5: - version "1.2.5" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" - integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== - -mixin-deep@^1.2.0: - version "1.3.2" - resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.2.tgz#1120b43dc359a785dce65b55b82e257ccf479566" - integrity sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA== - dependencies: - for-in "^1.0.2" - is-extendable "^1.0.1" - -mozjpeg@^7.0.0: - version "7.1.1" - resolved "https://registry.yarnpkg.com/mozjpeg/-/mozjpeg-7.1.1.tgz#dfb61953536e66fcabd4ae795e7a312d42a51f18" - integrity sha512-iIDxWvzhWvLC9mcRJ1uSkiKaj4drF58oCqK2bITm5c2Jt6cJ8qQjSSru2PCaysG+hLIinryj8mgz5ZJzOYTv1A== - dependencies: - bin-build "^3.0.0" - bin-wrapper "^4.0.0" - -ms@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" - integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= - -ms@2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" - integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== - -nano-time@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/nano-time/-/nano-time-1.0.0.tgz#b0554f69ad89e22d0907f7a12b0993a5d96137ef" - integrity sha1-sFVPaa2J4i0JB/ehKwmTpdlhN+8= - dependencies: - big-integer "^1.6.16" - -nanoid@^3.1.23: - version "3.1.30" - resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.1.30.tgz#63f93cc548d2a113dc5dfbc63bfa09e2b9b64362" - integrity sha512-zJpuPDwOv8D2zq2WRoMe1HsfZthVewpel9CAvTfc/2mBD1uUT/agc5f7GHGWXlYkFvi1mVxe4IjvP2HNrop7nQ== - -nanomatch@^1.2.9: - version "1.2.13" - resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119" - integrity sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA== - dependencies: - arr-diff "^4.0.0" - array-unique "^0.3.2" - define-property "^2.0.2" - extend-shallow "^3.0.2" - fragment-cache "^0.2.1" - is-windows "^1.0.2" - kind-of "^6.0.2" - object.pick "^1.3.0" - regex-not "^1.0.0" - snapdragon "^0.8.1" - to-regex "^3.0.1" - -natural-compare@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" - integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc= - -next-optimized-images@^2.6.2: - version "2.6.2" - resolved "https://registry.yarnpkg.com/next-optimized-images/-/next-optimized-images-2.6.2.tgz#8974a2186758c50e1a263c6866dbec5c25280db5" - integrity sha512-yH/f3eLmoQ/TxvWRiSuM6AuF3tR1s4nePdHPTm9gl4lAaGEKxTGaSuUL+ZxE5j/c/ITrnHVHibQzOz1Jl8euQw== - dependencies: - chalk "^2.4.2" - figures "^3.0.0" - file-loader "^3.0.1" - imagemin "^6.1.0" - img-loader "^3.0.1" - raw-loader "^2.0.0" - url-loader "^1.1.2" - -next@^12.0.7: - version "12.0.7" - resolved "https://registry.yarnpkg.com/next/-/next-12.0.7.tgz#33ebf229b81b06e583ab5ae7613cffe1ca2103fc" - integrity sha512-sKO8GJJYfuk9c+q+zHSNumvff+wP7ufmOlwT6BuzwiYfFJ61VTTkfTcDLSJ+95ErQJiC54uS4Yg5JEE8H6jXRA== - dependencies: - "@babel/runtime" "7.15.4" - "@hapi/accept" "5.0.2" - "@napi-rs/triples" "1.0.3" - "@next/env" "12.0.7" - "@next/polyfill-module" "12.0.7" - "@next/react-dev-overlay" "12.0.7" - "@next/react-refresh-utils" "12.0.7" - acorn "8.5.0" - assert "2.0.0" - browserify-zlib "0.2.0" - browserslist "4.16.6" - buffer "5.6.0" - caniuse-lite "^1.0.30001228" - chalk "2.4.2" - chokidar "3.5.1" - constants-browserify "1.0.0" - crypto-browserify "3.12.0" - cssnano-simple "3.0.0" - domain-browser "4.19.0" - encoding "0.1.13" - etag "1.8.1" - events "3.3.0" - find-cache-dir "3.3.1" - get-orientation "1.1.2" - https-browserify "1.0.0" - image-size "1.0.0" - jest-worker "27.0.0-next.5" - node-fetch "2.6.1" - node-html-parser "1.4.9" - os-browserify "0.3.0" - p-limit "3.1.0" - path-browserify "1.0.1" - postcss "8.2.15" - process "0.11.10" - querystring-es3 "0.2.1" - raw-body "2.4.1" - react-is "17.0.2" - react-refresh "0.8.3" - regenerator-runtime "0.13.4" - stream-browserify "3.0.0" - stream-http "3.1.1" - string_decoder "1.3.0" - styled-jsx "5.0.0-beta.3" - timers-browserify "2.0.12" - tty-browserify "0.0.1" - use-subscription "1.5.1" - util "0.12.4" - vm-browserify "1.1.2" - watchpack "2.3.0" - optionalDependencies: - "@next/swc-android-arm64" "12.0.7" - "@next/swc-darwin-arm64" "12.0.7" - "@next/swc-darwin-x64" "12.0.7" - "@next/swc-linux-arm-gnueabihf" "12.0.7" - "@next/swc-linux-arm64-gnu" "12.0.7" - "@next/swc-linux-arm64-musl" "12.0.7" - "@next/swc-linux-x64-gnu" "12.0.7" - "@next/swc-linux-x64-musl" "12.0.7" - "@next/swc-win32-arm64-msvc" "12.0.7" - "@next/swc-win32-ia32-msvc" "12.0.7" - "@next/swc-win32-x64-msvc" "12.0.7" - -nice-try@^1.0.4: - version "1.0.5" - resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" - integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== - -node-fetch@2.6.1: - version "2.6.1" - resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.1.tgz#045bd323631f76ed2e2b55573394416b639a0052" - integrity sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw== - -node-html-parser@1.4.9: - version "1.4.9" - resolved "https://registry.yarnpkg.com/node-html-parser/-/node-html-parser-1.4.9.tgz#3c8f6cac46479fae5800725edb532e9ae8fd816c" - integrity sha512-UVcirFD1Bn0O+TSmloHeHqZZCxHjvtIeGdVdGMhyZ8/PWlEiZaZ5iJzR189yKZr8p0FXN58BUeC7RHRkf/KYGw== - dependencies: - he "1.2.0" - -node-releases@^1.1.71: - version "1.1.77" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.77.tgz#50b0cfede855dd374e7585bf228ff34e57c1c32e" - integrity sha512-rB1DUFUNAN4Gn9keO2K1efO35IDK7yKHCdCaIMvFO7yUYmmZYeDjnGKle26G4rwj+LKRQpjyUUvMkPglwGCYNQ== - -node-releases@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.1.tgz#3d1d395f204f1f2f29a54358b9fb678765ad2fc5" - integrity sha512-CqyzN6z7Q6aMeF/ktcMVTzhAHCEpf8SOarwpzpf8pNBY2k5/oM34UHldUwp8VKI7uxct2HxSRdJjBaZeESzcxA== - -normalize-path@^3.0.0, normalize-path@~3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" - integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== - -normalize-url@2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-2.0.1.tgz#835a9da1551fa26f70e92329069a23aa6574d7e6" - integrity sha512-D6MUW4K/VzoJ4rJ01JFKxDrtY1v9wrgzCX5f2qj/lzH1m/lW6MhUZFKerVsnyjOhOsYzI9Kqqak+10l4LvLpMw== - dependencies: - prepend-http "^2.0.0" - query-string "^5.0.1" - sort-keys "^2.0.0" - -npm-conf@^1.1.0: - version "1.1.3" - resolved "https://registry.yarnpkg.com/npm-conf/-/npm-conf-1.1.3.tgz#256cc47bd0e218c259c4e9550bf413bc2192aff9" - integrity sha512-Yic4bZHJOt9RCFbRP3GgpqhScOY4HH3V2P8yBj6CeYq118Qr+BLXqT2JvpJ00mryLESpgOxf5XlFv4ZjXxLScw== - dependencies: - config-chain "^1.1.11" - pify "^3.0.0" - -npm-run-path@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f" - integrity sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8= - dependencies: - path-key "^2.0.0" - -npm-run-path@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea" - integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== - dependencies: - path-key "^3.0.0" - -nth-check@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-2.0.1.tgz#2efe162f5c3da06a28959fbd3db75dbeea9f0fc2" - integrity sha512-it1vE95zF6dTT9lBsYbxvqh0Soy4SPowchj0UBGj/V6cTPnXXtQOPUbhZ6CmGzAD/rW22LQK6E96pcdJXk4A4w== - dependencies: - boolbase "^1.0.0" - -object-assign@^4.0.1, object-assign@^4.1.0, object-assign@^4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" - integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= - -object-copy@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/object-copy/-/object-copy-0.1.0.tgz#7e7d858b781bd7c991a41ba975ed3812754e998c" - integrity sha1-fn2Fi3gb18mRpBupde04EnVOmYw= - dependencies: - copy-descriptor "^0.1.0" - define-property "^0.2.5" - kind-of "^3.0.3" - -object-inspect@^1.11.0, object-inspect@^1.9.0: - version "1.11.0" - resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.11.0.tgz#9dceb146cedd4148a0d9e51ab88d34cf509922b1" - integrity sha512-jp7ikS6Sd3GxQfZJPyH3cjcbJF6GZPClgdV+EFygjFLQ5FmW/dRUnTd9PQ9k0JhoNDabWFbpF1yCdSWCC6gexg== - -object-is@^1.0.1: - version "1.1.5" - resolved "https://registry.yarnpkg.com/object-is/-/object-is-1.1.5.tgz#b9deeaa5fc7f1846a0faecdceec138e5778f53ac" - integrity sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.3" - -object-keys@^1.0.12, object-keys@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" - integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== - -object-visit@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb" - integrity sha1-95xEk68MU3e1n+OdOV5BBC3QRbs= - dependencies: - isobject "^3.0.0" - -object.assign@^4.1.2: - version "4.1.2" - resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.2.tgz#0ed54a342eceb37b38ff76eb831a0e788cb63940" - integrity sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ== - dependencies: - call-bind "^1.0.0" - define-properties "^1.1.3" - has-symbols "^1.0.1" - object-keys "^1.1.1" - -object.pick@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747" - integrity sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c= - dependencies: - isobject "^3.0.1" - -oblivious-set@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/oblivious-set/-/oblivious-set-1.0.0.tgz#c8316f2c2fb6ff7b11b6158db3234c49f733c566" - integrity sha512-z+pI07qxo4c2CulUHCDf9lcqDlMSo72N/4rLUpRXf6fu+q8vjt8y0xS+Tlf8NTJDdTXHbdeO1n3MlbctwEoXZw== - -once@^1.3.0, once@^1.3.1, once@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" - integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= - dependencies: - wrappy "1" - -onetime@^5.1.0: - version "5.1.2" - resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" - integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== - dependencies: - mimic-fn "^2.1.0" - -optionator@^0.9.1: - version "0.9.1" - resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.1.tgz#4f236a6373dae0566a6d43e1326674f50c291499" - integrity sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw== - dependencies: - deep-is "^0.1.3" - fast-levenshtein "^2.0.6" - levn "^0.4.1" - prelude-ls "^1.2.1" - type-check "^0.4.0" - word-wrap "^1.2.3" - -optipng-bin@^7.0.0: - version "7.0.1" - resolved "https://registry.yarnpkg.com/optipng-bin/-/optipng-bin-7.0.1.tgz#beb8e55a52f8a26f885ee57ab44fcf62397d6972" - integrity sha512-W99mpdW7Nt2PpFiaO+74pkht7KEqkXkeRomdWXfEz3SALZ6hns81y/pm1dsGZ6ItUIfchiNIP6ORDr1zETU1jA== - dependencies: - bin-build "^3.0.0" - bin-wrapper "^4.0.0" - -os-browserify@0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/os-browserify/-/os-browserify-0.3.0.tgz#854373c7f5c2315914fc9bfc6bd8238fdda1ec27" - integrity sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc= - -os-filter-obj@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/os-filter-obj/-/os-filter-obj-2.0.0.tgz#1c0b62d5f3a2442749a2d139e6dddee6e81d8d16" - integrity sha512-uksVLsqG3pVdzzPvmAHpBK0wKxYItuzZr7SziusRPoz67tGV8rL1szZ6IdeUrbqLjGDwApBtN29eEE3IqGHOjg== - dependencies: - arch "^2.1.0" - -p-cancelable@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-0.3.0.tgz#b9e123800bcebb7ac13a479be195b507b98d30fa" - integrity sha512-RVbZPLso8+jFeq1MfNvgXtCRED2raz/dKpacfTNxsx6pLEpEomM7gah6VeHSYV3+vo0OAi4MkArtQcWWXuQoyw== - -p-cancelable@^0.4.0: - version "0.4.1" - resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-0.4.1.tgz#35f363d67d52081c8d9585e37bcceb7e0bbcb2a0" - integrity sha512-HNa1A8LvB1kie7cERyy21VNeHb2CWJJYqyyC2o3klWFfMGlFmWv2Z7sFgZH8ZiaYL95ydToKTFVXgMV/Os0bBQ== - -p-event@^1.0.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/p-event/-/p-event-1.3.0.tgz#8e6b4f4f65c72bc5b6fe28b75eda874f96a4a085" - integrity sha1-jmtPT2XHK8W2/ii3XtqHT5akoIU= - dependencies: - p-timeout "^1.1.1" - -p-event@^2.1.0: - version "2.3.1" - resolved "https://registry.yarnpkg.com/p-event/-/p-event-2.3.1.tgz#596279ef169ab2c3e0cae88c1cfbb08079993ef6" - integrity sha512-NQCqOFhbpVTMX4qMe8PF8lbGtzZ+LCiN7pcNrb/413Na7+TRoe1xkKUzuWa/YEJdGQ0FvKtj35EEbDoVPO2kbA== - dependencies: - p-timeout "^2.0.1" - -p-finally@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" - integrity sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4= - -p-is-promise@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/p-is-promise/-/p-is-promise-1.1.0.tgz#9c9456989e9f6588017b0434d56097675c3da05e" - integrity sha1-nJRWmJ6fZYgBewQ01WCXZ1w9oF4= - -p-limit@3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" - integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== - dependencies: - yocto-queue "^0.1.0" - -p-limit@^2.2.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" - integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== - dependencies: - p-try "^2.0.0" - -p-locate@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07" - integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== - dependencies: - p-limit "^2.2.0" - -p-map-series@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/p-map-series/-/p-map-series-1.0.0.tgz#bf98fe575705658a9e1351befb85ae4c1f07bdca" - integrity sha1-v5j+V1cFZYqeE1G++4WuTB8Hvco= - dependencies: - p-reduce "^1.0.0" - -p-pipe@^1.1.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/p-pipe/-/p-pipe-1.2.0.tgz#4b1a11399a11520a67790ee5a0c1d5881d6befe9" - integrity sha1-SxoROZoRUgpneQ7loMHViB1r7+k= - -p-reduce@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/p-reduce/-/p-reduce-1.0.0.tgz#18c2b0dd936a4690a529f8231f58a0fdb6a47dfa" - integrity sha1-GMKw3ZNqRpClKfgjH1ig/bakffo= - -p-timeout@^1.1.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/p-timeout/-/p-timeout-1.2.1.tgz#5eb3b353b7fce99f101a1038880bb054ebbea386" - integrity sha1-XrOzU7f86Z8QGhA4iAuwVOu+o4Y= - dependencies: - p-finally "^1.0.0" - -p-timeout@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/p-timeout/-/p-timeout-2.0.1.tgz#d8dd1979595d2dc0139e1fe46b8b646cb3cdf038" - integrity sha512-88em58dDVB/KzPEx1X0N3LwFfYZPyDc4B6eF38M1rk9VTZMbxXXgjugz8mmwpS9Ox4BDZ+t6t3QP5+/gazweIA== - dependencies: - p-finally "^1.0.0" - -p-try@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" - integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== - -pako@~1.0.5: - version "1.0.11" - resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.11.tgz#6c9599d340d54dfd3946380252a35705a6b992bf" - integrity sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw== - -parent-module@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" - integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== - dependencies: - callsites "^3.0.0" - -parse-asn1@^5.0.0, parse-asn1@^5.1.5: - version "5.1.6" - resolved "https://registry.yarnpkg.com/parse-asn1/-/parse-asn1-5.1.6.tgz#385080a3ec13cb62a62d39409cb3e88844cdaed4" - integrity sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw== - dependencies: - asn1.js "^5.2.0" - browserify-aes "^1.0.0" - evp_bytestokey "^1.0.0" - pbkdf2 "^3.0.3" - safe-buffer "^5.1.1" - -parse-json@^5.0.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd" - integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg== - dependencies: - "@babel/code-frame" "^7.0.0" - error-ex "^1.3.1" - json-parse-even-better-errors "^2.3.0" - lines-and-columns "^1.1.6" - -pascalcase@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14" - integrity sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ= - -path-browserify@1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-1.0.1.tgz#d98454a9c3753d5790860f16f68867b9e46be1fd" - integrity sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g== - -path-dirname@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/path-dirname/-/path-dirname-1.0.2.tgz#cc33d24d525e099a5388c0336c6e32b9160609e0" - integrity sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA= - -path-exists@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" - integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== - -path-is-absolute@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" - integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= - -path-key@^2.0.0, path-key@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" - integrity sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A= - -path-key@^3.0.0, path-key@^3.1.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" - integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== - -path-parse@^1.0.6: - version "1.0.7" - resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" - integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== - -path-type@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/path-type/-/path-type-3.0.0.tgz#cef31dc8e0a1a3bb0d105c0cd97cf3bf47f4e36f" - integrity sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg== - dependencies: - pify "^3.0.0" - -path-type@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" - integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== - -pbkdf2@^3.0.3: - version "3.1.2" - resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.1.2.tgz#dd822aa0887580e52f1a039dc3eda108efae3075" - integrity sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA== - dependencies: - create-hash "^1.1.2" - create-hmac "^1.1.4" - ripemd160 "^2.0.1" - safe-buffer "^5.0.1" - sha.js "^2.4.8" - -pend@~1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/pend/-/pend-1.2.0.tgz#7a57eb550a6783f9115331fcf4663d5c8e007a50" - integrity sha1-elfrVQpng/kRUzH89GY9XI4AelA= - -picocolors@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" - integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== - -picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.3: - version "2.3.0" - resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.0.tgz#f1f061de8f6a4bf022892e2d128234fb98302972" - integrity sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw== - -pify@^2.2.0, pify@^2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" - integrity sha1-7RQaasBDqEnqWISY59yosVMw6Qw= - -pify@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176" - integrity sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY= - -pify@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/pify/-/pify-4.0.1.tgz#4b2cd25c50d598735c50292224fd8c6df41e3231" - integrity sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g== - -pinkie-promise@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa" - integrity sha1-ITXW36ejWMBprJsXh3YogihFD/o= - dependencies: - pinkie "^2.0.0" - -pinkie@^2.0.0: - version "2.0.4" - resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" - integrity sha1-clVrgM+g1IqXToDnckjoDtT3+HA= - -pkg-dir@^4.1.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3" - integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ== - dependencies: - find-up "^4.0.0" - -platform@1.3.6: - version "1.3.6" - resolved "https://registry.yarnpkg.com/platform/-/platform-1.3.6.tgz#48b4ce983164b209c2d45a107adb31f473a6e7a7" - integrity sha512-fnWVljUchTro6RiCFvCXBbNhJc2NijN7oIQxbwsyL0buWJPG85v81ehlHI9fXrJsMNgTofEoWIQeClKpgxFLrg== - -posix-character-classes@^0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" - integrity sha1-AerA/jta9xoqbAL+q7jB/vfgDqs= - -postcss@8.2.15: - version "8.2.15" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.2.15.tgz#9e66ccf07292817d226fc315cbbf9bc148fbca65" - integrity sha512-2zO3b26eJD/8rb106Qu2o7Qgg52ND5HPjcyQiK2B98O388h43A448LCslC0dI2P97wCAQRJsFvwTRcXxTKds+Q== - dependencies: - colorette "^1.2.2" - nanoid "^3.1.23" - source-map "^0.6.1" - -prelude-ls@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" - integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== - -prepend-http@^1.0.1: - version "1.0.4" - resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-1.0.4.tgz#d4f4562b0ce3696e41ac52d0e002e57a635dc6dc" - integrity sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw= - -prepend-http@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-2.0.0.tgz#e92434bfa5ea8c19f41cdfd401d741a3c819d897" - integrity sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc= - -prettier-linter-helpers@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz#d23d41fe1375646de2d0104d3454a3008802cf7b" - integrity sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w== - dependencies: - fast-diff "^1.1.2" - -prettier@^2.3.0: - version "2.4.1" - resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.4.1.tgz#671e11c89c14a4cfc876ce564106c4a6726c9f5c" - integrity sha512-9fbDAXSBcc6Bs1mZrDYb3XKzDLm4EXXL9sC1LqKP5rZkT6KRr/rf9amVUcODVXgguK/isJz0d0hP72WeaKWsvA== - -process-nextick-args@~2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" - integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== - -process@0.11.10: - version "0.11.10" - resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" - integrity sha1-czIwDoQBYb2j5podHZGn1LwW8YI= - -progress@^2.0.0: - version "2.0.3" - resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8" - integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA== - -prop-types@^15.7.2: - version "15.7.2" - resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.7.2.tgz#52c41e75b8c87e72b9d9360e0206b99dcbffa6c5" - integrity sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ== - dependencies: - loose-envify "^1.4.0" - object-assign "^4.1.1" - react-is "^16.8.1" - -proto-list@~1.2.1: - version "1.2.4" - resolved "https://registry.yarnpkg.com/proto-list/-/proto-list-1.2.4.tgz#212d5bfe1318306a420f6402b8e26ff39647a849" - integrity sha1-IS1b/hMYMGpCD2QCuOJv85ZHqEk= - -pseudomap@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" - integrity sha1-8FKijacOYYkX7wqKw0wa5aaChrM= - -public-encrypt@^4.0.0: - version "4.0.3" - resolved "https://registry.yarnpkg.com/public-encrypt/-/public-encrypt-4.0.3.tgz#4fcc9d77a07e48ba7527e7cbe0de33d0701331e0" - integrity sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q== - dependencies: - bn.js "^4.1.0" - browserify-rsa "^4.0.0" - create-hash "^1.1.0" - parse-asn1 "^5.0.0" - randombytes "^2.0.1" - safe-buffer "^5.1.2" - -pump@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" - integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== - dependencies: - end-of-stream "^1.1.0" - once "^1.3.1" - -punycode@^2.1.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" - integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== - -qrcode-generator@^1.4.1: - version "1.4.4" - resolved "https://registry.yarnpkg.com/qrcode-generator/-/qrcode-generator-1.4.4.tgz#63f771224854759329a99048806a53ed278740e7" - integrity sha512-HM7yY8O2ilqhmULxGMpcHSF1EhJJ9yBj8gvDEuZ6M+KGJ0YY2hKpnXvRD+hZPLrDVck3ExIGhmPtSdcjC+guuw== - -query-string@^5.0.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/query-string/-/query-string-5.1.1.tgz#a78c012b71c17e05f2e3fa2319dd330682efb3cb" - integrity sha512-gjWOsm2SoGlgLEdAGt7a6slVOk9mGiXmPFMqrEhLQ68rhQuBnpfs3+EmlvqKyxnCo9/PPlF+9MtY02S1aFg+Jw== - dependencies: - decode-uri-component "^0.2.0" - object-assign "^4.1.0" - strict-uri-encode "^1.0.0" - -querystring-es3@0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/querystring-es3/-/querystring-es3-0.2.1.tgz#9ec61f79049875707d69414596fd907a4d711e73" - integrity sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM= - -queue-microtask@^1.2.2: - version "1.2.3" - resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" - integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== - -queue@6.0.2: - version "6.0.2" - resolved "https://registry.yarnpkg.com/queue/-/queue-6.0.2.tgz#b91525283e2315c7553d2efa18d83e76432fed65" - integrity sha512-iHZWu+q3IdFZFX36ro/lKBkSvfkztY5Y7HMiPlOUjhupPcG2JMfst2KKEpu5XndviX/3UhFbRngUPNKtgvtZiA== - dependencies: - inherits "~2.0.3" - -randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5: - version "2.1.0" - resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" - integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== - dependencies: - safe-buffer "^5.1.0" - -randomfill@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/randomfill/-/randomfill-1.0.4.tgz#c92196fc86ab42be983f1bf31778224931d61458" - integrity sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw== - dependencies: - randombytes "^2.0.5" - safe-buffer "^5.1.0" - -raw-body@2.4.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.4.1.tgz#30ac82f98bb5ae8c152e67149dac8d55153b168c" - integrity sha512-9WmIKF6mkvA0SLmA2Knm9+qj89e+j1zqgyn8aXGd7+nAduPoqgI9lO57SAZNn/Byzo5P7JhXTyg9PzaJbH73bA== - dependencies: - bytes "3.1.0" - http-errors "1.7.3" - iconv-lite "0.4.24" - unpipe "1.0.0" - -raw-loader@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/raw-loader/-/raw-loader-2.0.0.tgz#e2813d9e1e3f80d1bbade5ad082e809679e20c26" - integrity sha512-kZnO5MoIyrojfrPWqrhFNLZemIAX8edMOCp++yC5RKxzFB3m92DqKNhKlU6+FvpOhWtvyh3jOaD7J6/9tpdIKg== - dependencies: - loader-utils "^1.1.0" - schema-utils "^1.0.0" - -react-circular-progressbar@^2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/react-circular-progressbar/-/react-circular-progressbar-2.0.4.tgz#5b04a9cf6be8c522c180e4e99ec6db63677335b0" - integrity sha512-OfX0ThSxRYEVGaQSt0DlXfyl5w4DbXHsXetyeivmoQrh9xA9bzVPHNf8aAhOIiwiaxX2WYWpLDB3gcpsDJ9oww== - -react-countdown@^2.3.2: - version "2.3.2" - resolved "https://registry.yarnpkg.com/react-countdown/-/react-countdown-2.3.2.tgz#4cc27f28f2dcd47237ee66e4b9f6d2a21fc0b0ad" - integrity sha512-Q4SADotHtgOxNWhDdvgupmKVL0pMB9DvoFcxv5AzjsxVhzOVxnttMbAywgqeOdruwEAmnPhOhNv/awAgkwru2w== - dependencies: - prop-types "^15.7.2" - -react-dom@^17.0.2: - version "17.0.2" - resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-17.0.2.tgz#ecffb6845e3ad8dbfcdc498f0d0a939736502c23" - integrity sha512-s4h96KtLDUQlsENhMn1ar8t2bEa+q/YAtj8pPPdIjPDGBDIVNsrD9aXNWqspUe6AzKCIG0C1HZZLqLV7qpOBGA== - dependencies: - loose-envify "^1.1.0" - object-assign "^4.1.1" - scheduler "^0.20.2" - -react-dropzone@^11.3.4: - version "11.4.2" - resolved "https://registry.yarnpkg.com/react-dropzone/-/react-dropzone-11.4.2.tgz#1eb99e9def4cc7520f4f58e85c853ce52c483d56" - integrity sha512-ocYzYn7Qgp0tFc1gQtUTOaHHSzVTwhWHxxY+r7cj2jJTPfMTZB5GWSJHdIVoxsl+EQENpjJ/6Zvcw0BqKZQ+Eg== - dependencies: - attr-accept "^2.2.1" - file-selector "^0.2.2" - prop-types "^15.7.2" - -react-is@17.0.2: - version "17.0.2" - resolved "https://registry.yarnpkg.com/react-is/-/react-is-17.0.2.tgz#e691d4a8e9c789365655539ab372762b0efb54f0" - integrity sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w== - -react-is@^16.7.0, react-is@^16.8.1: - version "16.13.1" - resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" - integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== - -react-new-window@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/react-new-window/-/react-new-window-0.2.1.tgz#510aa91ba0334f0d42ba499c617a37f46c4d84ba" - integrity sha512-3s6W8eipRbjoLGvWpFRPSt2/z5h9FTS01C+ZjaEZX7/cF6ejGc6JVuL4oEo0s73IluaqoLIDB49AK4fSMW8pJw== - dependencies: - prop-types "^15.7.2" - -react-qrcode-logo@^2.5.0: - version "2.5.0" - resolved "https://registry.yarnpkg.com/react-qrcode-logo/-/react-qrcode-logo-2.5.0.tgz#f5215deaed92a1279d6abb3eb6e4fcd822773aa6" - integrity sha512-Z+Ywb2Cw3EK5csfkZHuyNpxZl5BiHxrBPAeRE3bB1qERAUMc/tMzBKpfMEb/Olti/Ic04j/DYt6ncYRLa/wFMA== - dependencies: - lodash.isequal "^4.5.0" - qrcode-generator "^1.4.1" - -react-query@^3.32.3: - version "3.32.3" - resolved "https://registry.yarnpkg.com/react-query/-/react-query-3.32.3.tgz#a15035d0bcd632fffc7044839469e685c2dbcfc9" - integrity sha512-RB/EOSdJkmuypDIARG/mVi2T41WZKz3tUh72HAUu1OA3VoFr2kG2OFZoO3ylMKjUYI4A9bSaD7wtYg4Nwb71gQ== - dependencies: - "@babel/runtime" "^7.5.5" - broadcast-channel "^3.4.1" - match-sorter "^6.0.2" - -react-refresh@0.8.3: - version "0.8.3" - resolved "https://registry.yarnpkg.com/react-refresh/-/react-refresh-0.8.3.tgz#721d4657672d400c5e3c75d063c4a85fb2d5d68f" - integrity sha512-X8jZHc7nCMjaCqoU+V2I0cOhNW+QMBwSUkeXnTi8IPe6zaRWfn60ZzvFDZqWPfmSJfjub7dDW1SP0jaHWLu/hg== - -react-toastify@^8.0.3: - version "8.1.0" - resolved "https://registry.yarnpkg.com/react-toastify/-/react-toastify-8.1.0.tgz#acaca4e8c4415c8474562dd84a14e6f390ed7f17" - integrity sha512-M+Q3rTmEw/53Csr7NsV/YnldJe4c7uERcY7Tma9mvLU98QT2VhIkKwjBzzxZkJRk/oBKyUAtkyMjMgO00hx6gQ== - dependencies: - clsx "^1.1.1" - -react@^17.0.2: - version "17.0.2" - resolved "https://registry.yarnpkg.com/react/-/react-17.0.2.tgz#d0b5cc516d29eb3eee383f75b62864cfb6800037" - integrity sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA== - dependencies: - loose-envify "^1.1.0" - object-assign "^4.1.1" - -readable-stream@^2.0.0, readable-stream@^2.3.0, readable-stream@^2.3.5: - version "2.3.7" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" - integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw== - dependencies: - core-util-is "~1.0.0" - inherits "~2.0.3" - isarray "~1.0.0" - process-nextick-args "~2.0.0" - safe-buffer "~5.1.1" - string_decoder "~1.1.1" - util-deprecate "~1.0.1" - -readable-stream@^3.5.0, readable-stream@^3.6.0: - version "3.6.0" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198" - integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== - dependencies: - inherits "^2.0.3" - string_decoder "^1.1.1" - util-deprecate "^1.0.1" - -readdirp@~3.5.0: - version "3.5.0" - resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.5.0.tgz#9ba74c019b15d365278d2e91bb8c48d7b4d42c9e" - integrity sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ== - dependencies: - picomatch "^2.2.1" - -regenerator-runtime@0.13.4: - version "0.13.4" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.4.tgz#e96bf612a3362d12bb69f7e8f74ffeab25c7ac91" - integrity sha512-plpwicqEzfEyTQohIKktWigcLzmNStMGwbOUbykx51/29Z3JOGYldaaNGK7ngNXV+UcoqvIMmloZ48Sr74sd+g== - -regenerator-runtime@^0.13.4: - version "0.13.9" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz#8925742a98ffd90814988d7566ad30ca3b263b52" - integrity sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA== - -regex-not@^1.0.0, regex-not@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c" - integrity sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A== - dependencies: - extend-shallow "^3.0.2" - safe-regex "^1.1.0" - -regexpp@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.2.0.tgz#0425a2768d8f23bad70ca4b90461fa2f1213e1b2" - integrity sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg== - -remove-accents@0.4.2: - version "0.4.2" - resolved "https://registry.yarnpkg.com/remove-accents/-/remove-accents-0.4.2.tgz#0a43d3aaae1e80db919e07ae254b285d9e1c7bb5" - integrity sha1-CkPTqq4egNuRngeuJUsoXZ4ce7U= - -repeat-element@^1.1.2: - version "1.1.4" - resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.4.tgz#be681520847ab58c7568ac75fbfad28ed42d39e9" - integrity sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ== - -repeat-string@^1.6.1: - version "1.6.1" - resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" - integrity sha1-jcrkcOHIirwtYA//Sndihtp15jc= - -replace-ext@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/replace-ext/-/replace-ext-1.0.1.tgz#2d6d996d04a15855d967443631dd5f77825b016a" - integrity sha512-yD5BHCe7quCgBph4rMQ+0KkIRKwWCrHDOX1p1Gp6HwjPM5kVoCdKGNhN7ydqqsX6lJEnQDKZ/tFMiEdQ1dvPEw== - -resolve-from@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" - integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== - -resolve-url@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" - integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo= - -resolve@^1.12.0: - version "1.20.0" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.20.0.tgz#629a013fb3f70755d6f0b7935cc1c2c5378b1975" - integrity sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A== - dependencies: - is-core-module "^2.2.0" - path-parse "^1.0.6" - -responselike@1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/responselike/-/responselike-1.0.2.tgz#918720ef3b631c5642be068f15ade5a46f4ba1e7" - integrity sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec= - dependencies: - lowercase-keys "^1.0.0" - -ret@~0.1.10: - version "0.1.15" - resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" - integrity sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg== - -reusify@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" - integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== - -rimraf@3.0.2, rimraf@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" - integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== - dependencies: - glob "^7.1.3" - -rimraf@^2.5.4: - version "2.7.1" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" - integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== - dependencies: - glob "^7.1.3" - -ripemd160@^2.0.0, ripemd160@^2.0.1: - version "2.0.2" - resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.2.tgz#a1c1a6f624751577ba5d07914cbc92850585890c" - integrity sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA== - dependencies: - hash-base "^3.0.0" - inherits "^2.0.1" - -run-parallel@^1.1.9: - version "1.2.0" - resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" - integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== - dependencies: - queue-microtask "^1.2.2" - -safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: - version "5.1.2" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" - integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== - -safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@^5.2.0, safe-buffer@~5.2.0: - version "5.2.1" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" - integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== - -safe-regex@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e" - integrity sha1-QKNmnzsHfR6UPURinhV91IAjvy4= - dependencies: - ret "~0.1.10" - -"safer-buffer@>= 2.1.2 < 3", "safer-buffer@>= 2.1.2 < 3.0.0", safer-buffer@^2.1.0: - version "2.1.2" - resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" - integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== - -scheduler@^0.20.2: - version "0.20.2" - resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.20.2.tgz#4baee39436e34aa93b4874bddcbf0fe8b8b50e91" - integrity sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ== - dependencies: - loose-envify "^1.1.0" - object-assign "^4.1.1" - -schema-utils@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-1.0.0.tgz#0b79a93204d7b600d4b2850d1f66c2a34951c770" - integrity sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g== - dependencies: - ajv "^6.1.0" - ajv-errors "^1.0.0" - ajv-keywords "^3.1.0" - -schema-utils@^2.6.5: - version "2.7.1" - resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-2.7.1.tgz#1ca4f32d1b24c590c203b8e7a50bf0ea4cd394d7" - integrity sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg== - dependencies: - "@types/json-schema" "^7.0.5" - ajv "^6.12.4" - ajv-keywords "^3.5.2" - -schema-utils@^3.0.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-3.1.1.tgz#bc74c4b6b6995c1d88f76a8b77bea7219e0c8281" - integrity sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw== - dependencies: - "@types/json-schema" "^7.0.8" - ajv "^6.12.5" - ajv-keywords "^3.5.2" - -seek-bzip@^1.0.5: - version "1.0.6" - resolved "https://registry.yarnpkg.com/seek-bzip/-/seek-bzip-1.0.6.tgz#35c4171f55a680916b52a07859ecf3b5857f21c4" - integrity sha512-e1QtP3YL5tWww8uKaOCQ18UxIT2laNBXHjV/S2WYCiK4udiv8lkG89KRIoCjUagnAmCBurjF4zEVX2ByBbnCjQ== - dependencies: - commander "^2.8.1" - -semver-regex@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/semver-regex/-/semver-regex-2.0.0.tgz#a93c2c5844539a770233379107b38c7b4ac9d338" - integrity sha512-mUdIBBvdn0PLOeP3TEkMH7HHeUP3GjsXCwKarjv/kGmUFOYg1VqEemKhoQpWMu6X2I8kHeuVdGibLGkVK+/5Qw== - -semver-truncate@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/semver-truncate/-/semver-truncate-1.1.2.tgz#57f41de69707a62709a7e0104ba2117109ea47e8" - integrity sha1-V/Qd5pcHpicJp+AQS6IRcQnqR+g= - dependencies: - semver "^5.3.0" - -semver@^5.3.0, semver@^5.5.0, semver@^5.6.0: - version "5.7.1" - resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" - integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== - -semver@^6.0.0, semver@^6.3.0: - version "6.3.0" - resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" - integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== - -semver@^7.2.1, semver@^7.3.5: - version "7.3.5" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.5.tgz#0b621c879348d8998e4b0e4be94b3f12e6018ef7" - integrity sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ== - dependencies: - lru-cache "^6.0.0" - -set-value@^2.0.0, set-value@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.1.tgz#a18d40530e6f07de4228c7defe4227af8cad005b" - integrity sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw== - dependencies: - extend-shallow "^2.0.1" - is-extendable "^0.1.1" - is-plain-object "^2.0.3" - split-string "^3.0.1" - -setimmediate@^1.0.4: - version "1.0.5" - resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" - integrity sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU= - -setprototypeof@1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.1.tgz#7e95acb24aa92f5885e0abef5ba131330d4ae683" - integrity sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw== - -sha.js@^2.4.0, sha.js@^2.4.8: - version "2.4.11" - resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.11.tgz#37a5cf0b81ecbc6943de109ba2960d1b26584ae7" - integrity sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ== - dependencies: - inherits "^2.0.1" - safe-buffer "^5.0.1" - -shebang-command@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" - integrity sha1-RKrGW2lbAzmJaMOfNj/uXer98eo= - dependencies: - shebang-regex "^1.0.0" - -shebang-command@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" - integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== - dependencies: - shebang-regex "^3.0.0" - -shebang-regex@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" - integrity sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM= - -shebang-regex@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" - integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== - -shell-quote@1.7.3: - version "1.7.3" - resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.7.3.tgz#aa40edac170445b9a431e17bb62c0b881b9c4123" - integrity sha512-Vpfqwm4EnqGdlsBFNmHhxhElJYrdfcxPThu+ryKS5J8L/fhAwLazFZtq+S+TWZ9ANj2piSQLGj6NQg+lKPmxrw== - -side-channel@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf" - integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw== - dependencies: - call-bind "^1.0.0" - get-intrinsic "^1.0.2" - object-inspect "^1.9.0" - -signal-exit@^3.0.0, signal-exit@^3.0.2: - version "3.0.5" - resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.5.tgz#9e3e8cc0c75a99472b44321033a7702e7738252f" - integrity sha512-KWcOiKeQj6ZyXx7zq4YxSMgHRlod4czeBQZrPb8OKcohcqAXShm7E20kEMle9WBt26hFcAf0qLOcp5zmY7kOqQ== - -slash@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55" - integrity sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU= - -slash@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" - integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== - -snapdragon-node@^2.0.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b" - integrity sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw== - dependencies: - define-property "^1.0.0" - isobject "^3.0.0" - snapdragon-util "^3.0.1" - -snapdragon-util@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/snapdragon-util/-/snapdragon-util-3.0.1.tgz#f956479486f2acd79700693f6f7b805e45ab56e2" - integrity sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ== - dependencies: - kind-of "^3.2.0" - -snapdragon@^0.8.1: - version "0.8.2" - resolved "https://registry.yarnpkg.com/snapdragon/-/snapdragon-0.8.2.tgz#64922e7c565b0e14204ba1aa7d6964278d25182d" - integrity sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg== - dependencies: - base "^0.11.1" - debug "^2.2.0" - define-property "^0.2.5" - extend-shallow "^2.0.1" - map-cache "^0.2.2" - source-map "^0.5.6" - source-map-resolve "^0.5.0" - use "^3.1.0" - -sort-keys-length@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/sort-keys-length/-/sort-keys-length-1.0.1.tgz#9cb6f4f4e9e48155a6aa0671edd336ff1479a188" - integrity sha1-nLb09OnkgVWmqgZx7dM2/xR5oYg= - dependencies: - sort-keys "^1.0.0" - -sort-keys@^1.0.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/sort-keys/-/sort-keys-1.1.2.tgz#441b6d4d346798f1b4e49e8920adfba0e543f9ad" - integrity sha1-RBttTTRnmPG05J6JIK37oOVD+a0= - dependencies: - is-plain-obj "^1.0.0" - -sort-keys@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/sort-keys/-/sort-keys-2.0.0.tgz#658535584861ec97d730d6cf41822e1f56684128" - integrity sha1-ZYU1WEhh7JfXMNbPQYIuH1ZoQSg= - dependencies: - is-plain-obj "^1.0.0" - -source-map-resolve@^0.5.0: - version "0.5.3" - resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.3.tgz#190866bece7553e1f8f267a2ee82c606b5509a1a" - integrity sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw== - dependencies: - atob "^2.1.2" - decode-uri-component "^0.2.0" - resolve-url "^0.2.1" - source-map-url "^0.4.0" - urix "^0.1.0" - -source-map-url@^0.4.0: - version "0.4.1" - resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.1.tgz#0af66605a745a5a2f91cf1bbf8a7afbc283dec56" - integrity sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw== - -source-map@0.7.3: - version "0.7.3" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.7.3.tgz#5302f8169031735226544092e64981f751750383" - integrity sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ== - -source-map@0.8.0-beta.0: - version "0.8.0-beta.0" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.8.0-beta.0.tgz#d4c1bb42c3f7ee925f005927ba10709e0d1d1f11" - integrity sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA== - dependencies: - whatwg-url "^7.0.0" - -source-map@^0.5.0, source-map@^0.5.6, source-map@^0.5.7: - version "0.5.7" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" - integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w= - -source-map@^0.6.1: - version "0.6.1" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" - integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== - -split-string@^3.0.1, split-string@^3.0.2: - version "3.1.0" - resolved "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2" - integrity sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw== - dependencies: - extend-shallow "^3.0.0" - -stable@^0.1.8: - version "0.1.8" - resolved "https://registry.yarnpkg.com/stable/-/stable-0.1.8.tgz#836eb3c8382fe2936feaf544631017ce7d47a3cf" - integrity sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w== - -stacktrace-parser@0.1.10: - version "0.1.10" - resolved "https://registry.yarnpkg.com/stacktrace-parser/-/stacktrace-parser-0.1.10.tgz#29fb0cae4e0d0b85155879402857a1639eb6051a" - integrity sha512-KJP1OCML99+8fhOHxwwzyWrlUuVX5GQ0ZpJTd1DFXhdkrvg1szxfHhawXUZ3g9TkXORQd4/WG68jMlQZ2p8wlg== - dependencies: - type-fest "^0.7.1" - -static-extend@^0.1.1: - version "0.1.2" - resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6" - integrity sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY= - dependencies: - define-property "^0.2.5" - object-copy "^0.1.0" - -"statuses@>= 1.5.0 < 2": - version "1.5.0" - resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" - integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow= - -stream-browserify@3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/stream-browserify/-/stream-browserify-3.0.0.tgz#22b0a2850cdf6503e73085da1fc7b7d0c2122f2f" - integrity sha512-H73RAHsVBapbim0tU2JwwOiXUj+fikfiaoYAKHF3VJfA0pe2BCzkhAHBlLG6REzE+2WNZcxOXjK7lkso+9euLA== - dependencies: - inherits "~2.0.4" - readable-stream "^3.5.0" - -stream-http@3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/stream-http/-/stream-http-3.1.1.tgz#0370a8017cf8d050b9a8554afe608f043eaff564" - integrity sha512-S7OqaYu0EkFpgeGFb/NPOoPLxFko7TPqtEeFg5DXPB4v/KETHG0Ln6fRFrNezoelpaDKmycEmmZ81cC9DAwgYg== - dependencies: - builtin-status-codes "^3.0.0" - inherits "^2.0.4" - readable-stream "^3.6.0" - xtend "^4.0.2" - -stream-parser@^0.3.1: - version "0.3.1" - resolved "https://registry.yarnpkg.com/stream-parser/-/stream-parser-0.3.1.tgz#1618548694420021a1182ff0af1911c129761773" - integrity sha1-FhhUhpRCACGhGC/wrxkRwSl2F3M= - dependencies: - debug "2" - -strict-uri-encode@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz#279b225df1d582b1f54e65addd4352e18faa0713" - integrity sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM= - -string-hash@1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/string-hash/-/string-hash-1.1.3.tgz#e8aafc0ac1855b4666929ed7dd1275df5d6c811b" - integrity sha1-6Kr8CsGFW0Zmkp7X3RJ1311sgRs= - -string.prototype.trimend@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz#e75ae90c2942c63504686c18b287b4a0b1a45f80" - integrity sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.3" - -string.prototype.trimstart@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz#b36399af4ab2999b4c9c648bd7a3fb2bb26feeed" - integrity sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.3" - -string_decoder@1.3.0, string_decoder@^1.1.1: - version "1.3.0" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" - integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== - dependencies: - safe-buffer "~5.2.0" - -string_decoder@~1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" - integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== - dependencies: - safe-buffer "~5.1.0" - -strip-ansi@6.0.1, strip-ansi@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" - integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== - dependencies: - ansi-regex "^5.0.1" - -strip-dirs@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/strip-dirs/-/strip-dirs-2.1.0.tgz#4987736264fc344cf20f6c34aca9d13d1d4ed6c5" - integrity sha512-JOCxOeKLm2CAS73y/U4ZeZPTkE+gNVCzKt7Eox84Iej1LT/2pTWYpZKJuxwQpvX1LiZb1xokNR7RLfuBAa7T3g== - dependencies: - is-natural-number "^4.0.1" - -strip-eof@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" - integrity sha1-u0P/VZim6wXYm1n80SnJgzE2Br8= - -strip-final-newline@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" - integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== - -strip-json-comments@^3.1.0, strip-json-comments@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" - integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== - -strip-outer@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/strip-outer/-/strip-outer-1.0.1.tgz#b2fd2abf6604b9d1e6013057195df836b8a9d631" - integrity sha512-k55yxKHwaXnpYGsOzg4Vl8+tDrWylxDEpknGjhTiZB8dFRU5rTo9CAzeycivxV3s+zlTKwrs6WxMxR95n26kwg== - dependencies: - escape-string-regexp "^1.0.2" - -strnum@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/strnum/-/strnum-1.0.4.tgz#e97e36a7d6ba9f93d0d6b496b2ed0678d422832b" - integrity sha512-lMzNMfDpaQOLt4B2mEbfzYS0+T7dvCXeojnlGf6f1AygvWDMcWyXYaLbyICfjVu29sErR8fnRagQfBW/N/hGgw== - -styled-jsx@5.0.0-beta.3: - version "5.0.0-beta.3" - resolved "https://registry.yarnpkg.com/styled-jsx/-/styled-jsx-5.0.0-beta.3.tgz#400d16179b5dff10d5954ab8be27a9a1b7780dd2" - integrity sha512-HtDDGSFPvmjHIqWf9n8Oo54tAoY/DTplvlyOH2+YOtD80Sp31Ap8ffSmxhgk5EkUoJ7xepdXMGT650mSffWuRA== - dependencies: - "@babel/plugin-syntax-jsx" "7.14.5" - "@babel/types" "7.15.0" - convert-source-map "1.7.0" - loader-utils "1.2.3" - source-map "0.7.3" - string-hash "1.1.3" - stylis "3.5.4" - stylis-rule-sheet "0.0.10" - -stylis-rule-sheet@0.0.10: - version "0.0.10" - resolved "https://registry.yarnpkg.com/stylis-rule-sheet/-/stylis-rule-sheet-0.0.10.tgz#44e64a2b076643f4b52e5ff71efc04d8c3c4a430" - integrity sha512-nTbZoaqoBnmK+ptANthb10ZRZOGC+EmTLLUxeYIuHNkEKcmKgXX1XWKkUBT2Ac4es3NybooPe0SmvKdhKJZAuw== - -stylis@3.5.4: - version "3.5.4" - resolved "https://registry.yarnpkg.com/stylis/-/stylis-3.5.4.tgz#f665f25f5e299cf3d64654ab949a57c768b73fbe" - integrity sha512-8/3pSmthWM7lsPBKv7NXkzn2Uc9W7NotcwGNpJaa3k7WMM1XDCA4MgT5k/8BIexd5ydZdboXtU90XH9Ec4Bv/Q== - -stylis@^4.0.10, stylis@^4.0.3: - version "4.0.10" - resolved "https://registry.yarnpkg.com/stylis/-/stylis-4.0.10.tgz#446512d1097197ab3f02fb3c258358c3f7a14240" - integrity sha512-m3k+dk7QeJw660eIKRRn3xPF6uuvHs/FFzjX3HQ5ove0qYsiygoAhwn5a3IYKaZPo5LrYD0rfVmtv1gNY1uYwg== - -supports-color@^5.3.0: - version "5.5.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" - integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== - dependencies: - has-flag "^3.0.0" - -supports-color@^7.1.0: - version "7.2.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" - integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== - dependencies: - has-flag "^4.0.0" - -supports-color@^8.0.0: - version "8.1.1" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" - integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== - dependencies: - has-flag "^4.0.0" - -svgo@^2.5.0: - version "2.8.0" - resolved "https://registry.yarnpkg.com/svgo/-/svgo-2.8.0.tgz#4ff80cce6710dc2795f0c7c74101e6764cfccd24" - integrity sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg== - dependencies: - "@trysound/sax" "0.2.0" - commander "^7.2.0" - css-select "^4.1.3" - css-tree "^1.1.3" - csso "^4.2.0" - picocolors "^1.0.0" - stable "^0.1.8" - -tar-stream@^1.5.2: - version "1.6.2" - resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-1.6.2.tgz#8ea55dab37972253d9a9af90fdcd559ae435c555" - integrity sha512-rzS0heiNf8Xn7/mpdSVVSMAWAoy9bfb1WOTYC78Z0UQKeKa/CWS8FOq0lKGNa8DWKAn9gxjCvMLYc5PGXYlK2A== - dependencies: - bl "^1.0.0" - buffer-alloc "^1.2.0" - end-of-stream "^1.0.0" - fs-constants "^1.0.0" - readable-stream "^2.3.0" - to-buffer "^1.1.1" - xtend "^4.0.0" - -temp-dir@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/temp-dir/-/temp-dir-1.0.0.tgz#0a7c0ea26d3a39afa7e0ebea9c1fc0bc4daa011d" - integrity sha1-CnwOom06Oa+n4OvqnB/AvE2qAR0= - -tempfile@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/tempfile/-/tempfile-2.0.0.tgz#6b0446856a9b1114d1856ffcbe509cccb0977265" - integrity sha1-awRGhWqbERTRhW/8vlCczLCXcmU= - dependencies: - temp-dir "^1.0.0" - uuid "^3.0.1" - -text-table@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" - integrity sha1-f17oI66AUgfACvLfSoTsP8+lcLQ= - -through@^2.3.8: - version "2.3.8" - resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" - integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= - -timed-out@^4.0.0, timed-out@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/timed-out/-/timed-out-4.0.1.tgz#f32eacac5a175bea25d7fab565ab3ed8741ef56f" - integrity sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8= - -timers-browserify@2.0.12: - version "2.0.12" - resolved "https://registry.yarnpkg.com/timers-browserify/-/timers-browserify-2.0.12.tgz#44a45c11fbf407f34f97bccd1577c652361b00ee" - integrity sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ== - dependencies: - setimmediate "^1.0.4" - -to-buffer@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/to-buffer/-/to-buffer-1.1.1.tgz#493bd48f62d7c43fcded313a03dcadb2e1213a80" - integrity sha512-lx9B5iv7msuFYE3dytT+KE5tap+rNYw+K4jVkb9R/asAb+pbBSM17jtunHplhBe6RRJdZx3Pn2Jph24O32mOVg== - -to-fast-properties@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" - integrity sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4= - -to-object-path@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af" - integrity sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68= - dependencies: - kind-of "^3.0.2" - -to-regex-range@^2.1.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-2.1.1.tgz#7c80c17b9dfebe599e27367e0d4dd5590141db38" - integrity sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg= - dependencies: - is-number "^3.0.0" - repeat-string "^1.6.1" - -to-regex-range@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" - integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== - dependencies: - is-number "^7.0.0" - -to-regex@^3.0.1, to-regex@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/to-regex/-/to-regex-3.0.2.tgz#13cfdd9b336552f30b51f33a8ae1b42a7a7599ce" - integrity sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw== - dependencies: - define-property "^2.0.2" - extend-shallow "^3.0.2" - regex-not "^1.0.2" - safe-regex "^1.1.0" - -toggle-selection@^1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/toggle-selection/-/toggle-selection-1.0.6.tgz#6e45b1263f2017fa0acc7d89d78b15b8bf77da32" - integrity sha1-bkWxJj8gF/oKzH2J14sVuL932jI= - -toidentifier@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.0.tgz#7e1be3470f1e77948bc43d94a3c8f4d7752ba553" - integrity sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw== - -tr46@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/tr46/-/tr46-1.0.1.tgz#a8b13fd6bfd2489519674ccde55ba3693b706d09" - integrity sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk= - dependencies: - punycode "^2.1.0" - -trim-repeated@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/trim-repeated/-/trim-repeated-1.0.0.tgz#e3646a2ea4e891312bf7eace6cfb05380bc01c21" - integrity sha1-42RqLqTokTEr9+rObPsFOAvAHCE= - dependencies: - escape-string-regexp "^1.0.2" - -tslib@^1.8.1: - version "1.14.1" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" - integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== - -tslib@^2.0.3: - version "2.3.1" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.3.1.tgz#e8a335add5ceae51aa261d32a490158ef042ef01" - integrity sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw== - -tsutils@^3.21.0: - version "3.21.0" - resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.21.0.tgz#b48717d394cea6c1e096983eed58e9d61715b623" - integrity sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA== - dependencies: - tslib "^1.8.1" - -tty-browserify@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/tty-browserify/-/tty-browserify-0.0.1.tgz#3f05251ee17904dfd0677546670db9651682b811" - integrity sha512-C3TaO7K81YvjCgQH9Q1S3R3P3BtN3RIM8n+OvX4il1K1zgE8ZhI0op7kClgkxtutIE8hQrcrHBXvIheqKUUCxw== - -tunnel-agent@^0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" - integrity sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0= - dependencies: - safe-buffer "^5.0.1" - -type-check@^0.4.0, type-check@~0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" - integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== - dependencies: - prelude-ls "^1.2.1" - -type-fest@^0.20.2: - version "0.20.2" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" - integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== - -type-fest@^0.7.1: - version "0.7.1" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.7.1.tgz#8dda65feaf03ed78f0a3f9678f1869147f7c5c48" - integrity sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg== - -typescript@^4.2.4: - version "4.4.4" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.4.4.tgz#2cd01a1a1f160704d3101fd5a58ff0f9fcb8030c" - integrity sha512-DqGhF5IKoBl8WNf8C1gu8q0xZSInh9j1kJJMqT3a94w1JzVaBU4EXOSMrz9yDqMT0xt3selp83fuFMQ0uzv6qA== - -unbox-primitive@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.1.tgz#085e215625ec3162574dc8859abee78a59b14471" - integrity sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw== - dependencies: - function-bind "^1.1.1" - has-bigints "^1.0.1" - has-symbols "^1.0.2" - which-boxed-primitive "^1.0.2" - -unbzip2-stream@^1.0.9: - version "1.4.3" - resolved "https://registry.yarnpkg.com/unbzip2-stream/-/unbzip2-stream-1.4.3.tgz#b0da04c4371311df771cdc215e87f2130991ace7" - integrity sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg== - dependencies: - buffer "^5.2.1" - through "^2.3.8" - -union-value@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.1.tgz#0b6fe7b835aecda61c6ea4d4f02c14221e109847" - integrity sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg== - dependencies: - arr-union "^3.1.0" - get-value "^2.0.6" - is-extendable "^0.1.1" - set-value "^2.0.1" - -unload@2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/unload/-/unload-2.2.0.tgz#ccc88fdcad345faa06a92039ec0f80b488880ef7" - integrity sha512-B60uB5TNBLtN6/LsgAf3udH9saB5p7gqJwcFfbOEZ8BcBHnGwCf6G/TGiEqkRAxX7zAFIUtzdrXQSdL3Q/wqNA== - dependencies: - "@babel/runtime" "^7.6.2" - detect-node "^2.0.4" - -unpipe@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" - integrity sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw= - -unset-value@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559" - integrity sha1-g3aHP30jNRef+x5vw6jtDfyKtVk= - dependencies: - has-value "^0.3.1" - isobject "^3.0.0" - -uri-js@^4.2.2: - version "4.4.1" - resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" - integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== - dependencies: - punycode "^2.1.0" - -urix@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72" - integrity sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI= - -url-loader@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/url-loader/-/url-loader-1.1.2.tgz#b971d191b83af693c5e3fea4064be9e1f2d7f8d8" - integrity sha512-dXHkKmw8FhPqu8asTc1puBfe3TehOCo2+RmOOev5suNCIYBcT626kxiWg1NBVkwc4rO8BGa7gP70W7VXuqHrjg== - dependencies: - loader-utils "^1.1.0" - mime "^2.0.3" - schema-utils "^1.0.0" - -url-parse-lax@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/url-parse-lax/-/url-parse-lax-1.0.0.tgz#7af8f303645e9bd79a272e7a14ac68bc0609da73" - integrity sha1-evjzA2Rem9eaJy56FKxovAYJ2nM= - dependencies: - prepend-http "^1.0.1" - -url-parse-lax@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/url-parse-lax/-/url-parse-lax-3.0.0.tgz#16b5cafc07dbe3676c1b1999177823d6503acb0c" - integrity sha1-FrXK/Afb42dsGxmZF3gj1lA6yww= - dependencies: - prepend-http "^2.0.0" - -url-to-options@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/url-to-options/-/url-to-options-1.0.1.tgz#1505a03a289a48cbd7a434efbaeec5055f5633a9" - integrity sha1-FQWgOiiaSMvXpDTvuu7FBV9WM6k= - -use-subscription@1.5.1: - version "1.5.1" - resolved "https://registry.yarnpkg.com/use-subscription/-/use-subscription-1.5.1.tgz#73501107f02fad84c6dd57965beb0b75c68c42d1" - integrity sha512-Xv2a1P/yReAjAbhylMfFplFKj9GssgTwN7RlcTxBujFQcloStWNDQdc4g4NRWH9xS4i/FDk04vQBptAXoF3VcA== - dependencies: - object-assign "^4.1.1" - -use@^3.1.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f" - integrity sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ== - -util-deprecate@^1.0.1, util-deprecate@~1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" - integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= - -util@0.12.4, util@^0.12.0: - version "0.12.4" - resolved "https://registry.yarnpkg.com/util/-/util-0.12.4.tgz#66121a31420df8f01ca0c464be15dfa1d1850253" - integrity sha512-bxZ9qtSlGUWSOy9Qa9Xgk11kSslpuZwaxCg4sNIDj6FLucDab2JxnHwyNTCpHMtK1MjoQiWQ6DiUMZYbSrO+Sw== - dependencies: - inherits "^2.0.3" - is-arguments "^1.0.4" - is-generator-function "^1.0.7" - is-typed-array "^1.1.3" - safe-buffer "^5.1.2" - which-typed-array "^1.1.2" - -uuid@^3.0.1: - version "3.4.0" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee" - integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A== - -v8-compile-cache@^2.0.3: - version "2.3.0" - resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz#2de19618c66dc247dcfb6f99338035d8245a2cee" - integrity sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA== - -vm-browserify@1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-1.1.2.tgz#78641c488b8e6ca91a75f511e7a3b32a86e5dda0" - integrity sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ== - -watchpack@2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-2.3.0.tgz#a41bca3da6afaff31e92a433f4c856a0c25ea0c4" - integrity sha512-MnN0Q1OsvB/GGHETrFeZPQaOelWh/7O+EiFlj8sM9GPjtQkis7k01aAxrg/18kTfoIVcLL+haEVFlXDaSRwKRw== - dependencies: - glob-to-regexp "^0.4.1" - graceful-fs "^4.1.2" - -webidl-conversions@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-4.0.2.tgz#a855980b1f0b6b359ba1d5d9fb39ae941faa63ad" - integrity sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg== - -whatwg-url@^7.0.0: - version "7.1.0" - resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-7.1.0.tgz#c2c492f1eca612988efd3d2266be1b9fc6170d06" - integrity sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg== - dependencies: - lodash.sortby "^4.7.0" - tr46 "^1.0.1" - webidl-conversions "^4.0.2" - -which-boxed-primitive@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz#13757bc89b209b049fe5d86430e21cf40a89a8e6" - integrity sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg== - dependencies: - is-bigint "^1.0.1" - is-boolean-object "^1.1.0" - is-number-object "^1.0.4" - is-string "^1.0.5" - is-symbol "^1.0.3" - -which-typed-array@^1.1.2: - version "1.1.7" - resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.7.tgz#2761799b9a22d4b8660b3c1b40abaa7739691793" - integrity sha512-vjxaB4nfDqwKI0ws7wZpxIlde1XrLX5uB0ZjpfshgmapJMD7jJWhZI+yToJTqaFByF0eNBcYxbjmCzoRP7CfEw== - dependencies: - available-typed-arrays "^1.0.5" - call-bind "^1.0.2" - es-abstract "^1.18.5" - foreach "^2.0.5" - has-tostringtag "^1.0.0" - is-typed-array "^1.1.7" - -which@^1.2.9: - version "1.3.1" - resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" - integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== - dependencies: - isexe "^2.0.0" - -which@^2.0.1: - version "2.0.2" - resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" - integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== - dependencies: - isexe "^2.0.0" - -word-wrap@^1.2.3: - version "1.2.3" - resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" - integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== - -wrappy@1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" - integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= - -xtend@^4.0.0, xtend@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" - integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== - -yallist@^2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" - integrity sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI= - -yallist@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" - integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== - -yaml@^1.7.2: - version "1.10.2" - resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.2.tgz#2301c5ffbf12b467de8da2333a459e29e7920e4b" - integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg== - -yauzl@^2.4.2: - version "2.10.0" - resolved "https://registry.yarnpkg.com/yauzl/-/yauzl-2.10.0.tgz#c7eb17c93e112cb1086fa6d8e51fb0667b79a5f9" - integrity sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk= - dependencies: - buffer-crc32 "~0.2.3" - fd-slicer "~1.1.0" - -yocto-queue@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" - integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== From 7c72b4eef3cf2245ea47a66bf3f5d560dcbd389f Mon Sep 17 00:00:00 2001 From: KocproZ Date: Tue, 11 Feb 2025 17:20:30 +0100 Subject: [PATCH 08/12] Upgrade upload-artifact@v4 --- .github/workflows/CI.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/CI.yml b/.github/workflows/CI.yml index 161e7bdd..6a222e88 100644 --- a/.github/workflows/CI.yml +++ b/.github/workflows/CI.yml @@ -47,7 +47,7 @@ jobs: - name: Package Jar run: cd next-app && ln -s out static && zip -0 -r next-app.jar static - name: Upload artifact - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 with: name: next-app.jar path: next-app/next-app.jar From 175aa91ddd0c3c0e38a5582b78227a1d55caf520 Mon Sep 17 00:00:00 2001 From: KocproZ Date: Tue, 11 Feb 2025 17:29:28 +0100 Subject: [PATCH 09/12] Upgrade cache to v4 --- .github/workflows/CI.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/CI.yml b/.github/workflows/CI.yml index 6a222e88..117d416d 100644 --- a/.github/workflows/CI.yml +++ b/.github/workflows/CI.yml @@ -12,7 +12,7 @@ jobs: - name: Install Dependencies run: cd ./next-app && yarn install --frozen-lockfile - name: Cache node_modules - uses: actions/cache@v2 + uses: actions/cache@v4 with: path: './next-app/node_modules' key: ${{ runner.os }}-next-${{ hashFiles('./next-app/yarn.lock') }} @@ -24,7 +24,7 @@ jobs: - name: Checkout Repo uses: actions/checkout@v2 - name: Cache node_modules - uses: actions/cache@v2 + uses: actions/cache@v4 with: path: './next-app/node_modules' key: ${{ runner.os }}-next-${{ hashFiles('./next-app/yarn.lock') }} @@ -38,7 +38,7 @@ jobs: - name: Checkout Repo uses: actions/checkout@v2 - name: Cache node_modules - uses: actions/cache@v2 + uses: actions/cache@v4 with: path: './next-app/node_modules' key: ${{ runner.os }}-next-${{ hashFiles('./next-app/yarn.lock') }} From fdd2c6058da522224978cdf83fa9a659b27e34a9 Mon Sep 17 00:00:00 2001 From: KocproZ Date: Tue, 11 Feb 2025 17:33:44 +0100 Subject: [PATCH 10/12] Upgrade download-artifact to v4 --- .github/workflows/CI.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/CI.yml b/.github/workflows/CI.yml index 117d416d..b0f7548c 100644 --- a/.github/workflows/CI.yml +++ b/.github/workflows/CI.yml @@ -94,7 +94,7 @@ jobs: java-version: 17 - name: Download artifacts - uses: actions/download-artifact@v3 + uses: actions/download-artifact@v4 with: name: next-app.jar path: next-app @@ -116,7 +116,7 @@ jobs: - uses: actions/checkout@v2 - name: Download artifacts - uses: actions/download-artifact@v3 + uses: actions/download-artifact@v4 with: name: up.jar path: spring-app/build/libs From d4836f461a0d866b17396ca1bfa2a23f21c43a4f Mon Sep 17 00:00:00 2001 From: KocproZ Date: Tue, 11 Feb 2025 17:38:48 +0100 Subject: [PATCH 11/12] Upgrade upload-artifact to v4 --- .github/workflows/CI.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/CI.yml b/.github/workflows/CI.yml index b0f7548c..02bd9baa 100644 --- a/.github/workflows/CI.yml +++ b/.github/workflows/CI.yml @@ -103,7 +103,7 @@ jobs: run: ./gradlew bootjar - name: Upload artifact - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 with: name: up.jar path: spring-app/build/libs/up.jar From de339d12f746f869328f0f335a4347069fada857 Mon Sep 17 00:00:00 2001 From: "Jakub \"Kuboczoch\" Pokorski" Date: Tue, 11 Feb 2025 17:50:46 +0100 Subject: [PATCH 12/12] eslint tsconfig --- next-app/eslint.config.mjs | 55 +++++-- next-app/next.config.ts | 8 +- next-app/package-lock.json | 254 +++++++++++++++++++-------------- next-app/package.json | 23 +-- next-app/public/file.svg | 1 - next-app/public/foreground.jpg | Bin 0 -> 40524 bytes next-app/public/globe.svg | 1 - next-app/public/next.svg | 1 - next-app/public/vercel.svg | 1 - next-app/public/window.svg | 1 - next-app/src/app/layout.tsx | 31 ++-- next-app/src/app/page.tsx | 84 +++++------ next-app/tailwind.config.ts | 14 +- next-app/tsconfig.json | 14 +- 14 files changed, 288 insertions(+), 200 deletions(-) delete mode 100644 next-app/public/file.svg create mode 100644 next-app/public/foreground.jpg delete mode 100644 next-app/public/globe.svg delete mode 100644 next-app/public/next.svg delete mode 100644 next-app/public/vercel.svg delete mode 100644 next-app/public/window.svg diff --git a/next-app/eslint.config.mjs b/next-app/eslint.config.mjs index c85fb67c..a0f3556c 100644 --- a/next-app/eslint.config.mjs +++ b/next-app/eslint.config.mjs @@ -1,16 +1,53 @@ -import { dirname } from "path"; -import { fileURLToPath } from "url"; -import { FlatCompat } from "@eslint/eslintrc"; +import { FlatCompat } from '@eslint/eslintrc' +import { dirname } from 'path' +import { fileURLToPath } from 'url' -const __filename = fileURLToPath(import.meta.url); -const __dirname = dirname(__filename); +const __filename = fileURLToPath(import.meta.url) +const __dirname = dirname(__filename) const compat = new FlatCompat({ baseDirectory: __dirname, -}); +}) const eslintConfig = [ - ...compat.extends("next/core-web-vitals", "next/typescript"), -]; + ...compat.extends('next/core-web-vitals', 'next/typescript'), + ...compat.config({ + plugins: ['import', 'prettier'], + rules: { + 'prettier/prettier': [ + 'error', + { + semi: false, + bracketSpacing: true, + jsxSingleQuote: true, + printWidth: 80, + singleQuote: true, + trailingComma: 'all', + tabWidth: 2, + useTabs: false, + endOfLine: 'lf', + parser: 'typescript', + }, + ], + 'import/order': [ + 'error', + { + pathGroupsExcludedImportTypes: ['builtin'], + groups: [ + ['builtin', 'external'], + 'internal', + ['parent', 'sibling', 'index'], + ], + 'newlines-between': 'always', + alphabetize: { + order: 'asc', + caseInsensitive: true, + }, + warnOnUnassignedImports: true, + }, + ], + }, + }), +] -export default eslintConfig; +export default eslintConfig diff --git a/next-app/next.config.ts b/next-app/next.config.ts index f5f4b272..c6395f3f 100644 --- a/next-app/next.config.ts +++ b/next-app/next.config.ts @@ -1,7 +1,7 @@ -import type { NextConfig } from "next"; +import type { NextConfig } from 'next' const nextConfig: NextConfig = { - output: 'export' -}; + output: 'export', +} -export default nextConfig; +export default nextConfig diff --git a/next-app/package-lock.json b/next-app/package-lock.json index 18c4e0c3..f8719844 100644 --- a/next-app/package-lock.json +++ b/next-app/package-lock.json @@ -8,18 +8,25 @@ "name": "next-app", "version": "0.1.0", "dependencies": { + "eslint-plugin-react-perf": "^3.3.3", "next": "15.1.6", "react": "^19.0.0", "react-dom": "^19.0.0" }, "devDependencies": { "@eslint/eslintrc": "^3", - "@types/node": "^20", - "@types/react": "^19", + "@next/eslint-plugin-next": "^15.1.6", + "@types/node": "^20.17.17", + "@types/react": "^19.0.8", "@types/react-dom": "^19", - "eslint": "^9", + "@typescript-eslint/parser": "^8.24.0", + "eslint": "^9.20.0", "eslint-config-next": "15.1.6", + "eslint-plugin-import": "^2.31.0", + "eslint-plugin-prettier": "^5.2.3", + "eslint-plugin-react-hooks": "^5.1.0", "postcss": "^8", + "prettier": "^3.5.0", "tailwindcss": "^3.4.1", "typescript": "^5" } @@ -40,7 +47,6 @@ "version": "4.4.1", "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.1.tgz", "integrity": "sha512-s3O3waFUrMV8P/XaF/+ZTp1X9XBZW1a4B97ZnjQF2KYWaFD2A8KyFBsrsfSjEmjn3RGWAIuvlneuZm3CUK3jbA==", - "dev": true, "dependencies": { "eslint-visitor-keys": "^3.4.3" }, @@ -58,7 +64,6 @@ "version": "3.4.3", "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", - "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, @@ -70,7 +75,6 @@ "version": "4.12.1", "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz", "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==", - "dev": true, "engines": { "node": "^12.0.0 || ^14.0.0 || >=16.0.0" } @@ -79,7 +83,6 @@ "version": "0.19.2", "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.19.2.tgz", "integrity": "sha512-GNKqxfHG2ySmJOBSHg7LxeUx4xpuCoFjacmlCoYWEbaPXLwvfIjixRI12xCQZeULksQb23uiA8F40w5TojpV7w==", - "dev": true, "dependencies": { "@eslint/object-schema": "^2.1.6", "debug": "^4.3.1", @@ -93,7 +96,6 @@ "version": "0.11.0", "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.11.0.tgz", "integrity": "sha512-DWUB2pksgNEb6Bz2fggIy1wh6fGgZP4Xyy/Mt0QZPiloKKXerbqq9D3SBQTlCRYOrcRPu4vuz+CGjwdfqxnoWA==", - "dev": true, "dependencies": { "@types/json-schema": "^7.0.15" }, @@ -105,7 +107,6 @@ "version": "3.2.0", "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.2.0.tgz", "integrity": "sha512-grOjVNN8P3hjJn/eIETF1wwd12DdnwFDoyceUJLYYdkpbwq3nLi+4fqrTAONx7XDALqlL220wC/RHSC/QTI/0w==", - "dev": true, "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", @@ -128,7 +129,6 @@ "version": "9.20.0", "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.20.0.tgz", "integrity": "sha512-iZA07H9io9Wn836aVTytRaNqh00Sad+EamwOVJT12GTLw1VGMFV/4JaME+JjLtr9fiGaoWgYnS54wrfWsSs4oQ==", - "dev": true, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } @@ -137,7 +137,6 @@ "version": "2.1.6", "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.6.tgz", "integrity": "sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==", - "dev": true, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } @@ -146,7 +145,6 @@ "version": "0.2.5", "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.2.5.tgz", "integrity": "sha512-lB05FkqEdUg2AA0xEbUz0SnkXT1LcCTa438W4IWTUh4hdOnVbQyOJ81OrDXsJk/LSiJHubgGEFoR5EHq1NsH1A==", - "dev": true, "dependencies": { "@eslint/core": "^0.10.0", "levn": "^0.4.1" @@ -159,7 +157,6 @@ "version": "0.10.0", "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.10.0.tgz", "integrity": "sha512-gFHJ+xBOo4G3WRlR1e/3G8A6/KZAH6zcE/hkLRCZTi/B9avAG365QhFA8uOGzTMqgTghpn7/fSnscW++dpMSAw==", - "dev": true, "dependencies": { "@types/json-schema": "^7.0.15" }, @@ -171,7 +168,6 @@ "version": "0.19.1", "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==", - "dev": true, "engines": { "node": ">=18.18.0" } @@ -180,7 +176,6 @@ "version": "0.16.6", "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.6.tgz", "integrity": "sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==", - "dev": true, "dependencies": { "@humanfs/core": "^0.19.1", "@humanwhocodes/retry": "^0.3.0" @@ -193,7 +188,6 @@ "version": "0.3.1", "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.3.1.tgz", "integrity": "sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==", - "dev": true, "engines": { "node": ">=18.18" }, @@ -206,7 +200,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", - "dev": true, "engines": { "node": ">=12.22" }, @@ -219,7 +212,6 @@ "version": "0.4.1", "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.1.tgz", "integrity": "sha512-c7hNEllBlenFTHBky65mhq8WD2kbN9Q6gk0bTk8lSBvc554jpXSkST1iePudpt7+A/AQvuHs9EMqjHDXMY1lrA==", - "dev": true, "engines": { "node": ">=18.18" }, @@ -321,6 +313,7 @@ "resolved": "https://registry.npmjs.org/@next/eslint-plugin-next/-/eslint-plugin-next-15.1.6.tgz", "integrity": "sha512-+slMxhTgILUntZDGNgsKEYHUvpn72WP1YTlkmEhS51vnVd7S9jEEy0n9YAMcI21vUG4akTw9voWH02lrClt/yw==", "dev": true, + "license": "MIT", "dependencies": { "fast-glob": "3.3.1" } @@ -499,6 +492,19 @@ "node": ">=14" } }, + "node_modules/@pkgr/core": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.1.1.tgz", + "integrity": "sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/unts" + } + }, "node_modules/@rtsao/scc": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@rtsao/scc/-/scc-1.1.0.tgz", @@ -527,14 +533,12 @@ "node_modules/@types/estree": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", - "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==", - "dev": true + "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==" }, "node_modules/@types/json-schema": { "version": "7.0.15", "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", - "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", - "dev": true + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==" }, "node_modules/@types/json5": { "version": "0.0.29", @@ -547,6 +551,7 @@ "resolved": "https://registry.npmjs.org/@types/node/-/node-20.17.17.tgz", "integrity": "sha512-/WndGO4kIfMicEQLTi/mDANUu/iVUhT7KboZPdEqqHQ4aTS+3qT3U5gIqWDFV+XouorjfgGqvKILJeHhuQgFYg==", "dev": true, + "license": "MIT", "dependencies": { "undici-types": "~6.19.2" } @@ -556,6 +561,7 @@ "resolved": "https://registry.npmjs.org/@types/react/-/react-19.0.8.tgz", "integrity": "sha512-9P/o1IGdfmQxrujGbIMDyYaaCykhLKc0NGCtYcECNUr9UAaDe4gwvV9bR6tvd5Br1SG0j+PBpbKr2UYY8CwqSw==", "dev": true, + "license": "MIT", "dependencies": { "csstype": "^3.0.2" } @@ -574,6 +580,7 @@ "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.24.0.tgz", "integrity": "sha512-aFcXEJJCI4gUdXgoo/j9udUYIHgF23MFkg09LFz2dzEmU0+1Plk4rQWv/IYKvPHAtlkkGoB3m5e6oUp+JPsNaQ==", "dev": true, + "license": "MIT", "dependencies": { "@eslint-community/regexpp": "^4.10.0", "@typescript-eslint/scope-manager": "8.24.0", @@ -603,6 +610,7 @@ "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.24.0.tgz", "integrity": "sha512-MFDaO9CYiard9j9VepMNa9MTcqVvSny2N4hkY6roquzj8pdCBRENhErrteaQuu7Yjn1ppk0v1/ZF9CG3KIlrTA==", "dev": true, + "license": "MIT", "dependencies": { "@typescript-eslint/scope-manager": "8.24.0", "@typescript-eslint/types": "8.24.0", @@ -797,7 +805,6 @@ "version": "8.14.0", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz", "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==", - "dev": true, "bin": { "acorn": "bin/acorn" }, @@ -809,7 +816,6 @@ "version": "5.3.2", "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "dev": true, "peerDependencies": { "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } @@ -818,7 +824,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", @@ -846,7 +851,6 @@ "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" }, @@ -885,8 +889,7 @@ "node_modules/argparse": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" }, "node_modules/aria-query": { "version": "5.3.2", @@ -1097,8 +1100,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/binary-extensions": { "version": "2.3.0", @@ -1116,7 +1118,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" @@ -1196,7 +1197,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" } @@ -1233,7 +1233,6 @@ "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" @@ -1303,7 +1302,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "devOptional": true, "dependencies": { "color-name": "~1.1.4" }, @@ -1314,8 +1312,7 @@ "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==", - "devOptional": true + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, "node_modules/color-string": { "version": "1.9.1", @@ -1339,14 +1336,12 @@ "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/cross-spawn": { "version": "7.0.6", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", - "dev": true, "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", @@ -1435,7 +1430,6 @@ "version": "4.4.0", "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", - "dev": true, "dependencies": { "ms": "^2.1.3" }, @@ -1451,8 +1445,7 @@ "node_modules/deep-is": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==" }, "node_modules/define-data-property": { "version": "1.1.4", @@ -1727,7 +1720,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true, "engines": { "node": ">=10" }, @@ -1739,7 +1731,7 @@ "version": "9.20.0", "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.20.0.tgz", "integrity": "sha512-aL4F8167Hg4IvsW89ejnpTwx+B/UQRzJPGgbIOl+4XqffWsahVVsLEWoZvnrVuwpWmnRd7XeXmQI1zlKcFDteA==", - "dev": true, + "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.12.1", @@ -1935,6 +1927,7 @@ "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.31.0.tgz", "integrity": "sha512-ixmkI62Rbc2/w8Vfxyh1jQRTdRTF52VxwRVHl/ykPAmqG+Nb7/kNn+byLP0LxPgI7zWA16Jt82SybJInmMia3A==", "dev": true, + "license": "MIT", "dependencies": { "@rtsao/scc": "^1.1.0", "array-includes": "^3.1.8", @@ -2010,6 +2003,37 @@ "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9" } }, + "node_modules/eslint-plugin-prettier": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.2.3.tgz", + "integrity": "sha512-qJ+y0FfCp/mQYQ/vWQ3s7eUlFEL4PyKfAJxsnYTJ4YT73nsJBWqmEpFryxV9OeUiqmsTsYJ5Y+KDNaeP31wrRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "prettier-linter-helpers": "^1.0.0", + "synckit": "^0.9.1" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint-plugin-prettier" + }, + "peerDependencies": { + "@types/eslint": ">=8.0.0", + "eslint": ">=8.0.0", + "eslint-config-prettier": "*", + "prettier": ">=3.0.0" + }, + "peerDependenciesMeta": { + "@types/eslint": { + "optional": true + }, + "eslint-config-prettier": { + "optional": true + } + } + }, "node_modules/eslint-plugin-react": { "version": "7.37.4", "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.37.4.tgz", @@ -2047,6 +2071,7 @@ "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-5.1.0.tgz", "integrity": "sha512-mpJRtPgHN2tNAvZ35AMfqeB3Xqeo273QxrHJsbBEPWODRM4r0yB6jfoROqKEYrOn27UtRPpcpHc2UqyBSuUNTw==", "dev": true, + "license": "MIT", "engines": { "node": ">=10" }, @@ -2054,6 +2079,18 @@ "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0" } }, + "node_modules/eslint-plugin-react-perf": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-perf/-/eslint-plugin-react-perf-3.3.3.tgz", + "integrity": "sha512-EzPdxsRJg5IllCAH9ny/3nK7sv9251tvKmi/d3Ouv5KzI8TB3zNhzScxL9wnh9Hvv8GYC5LEtzTauynfOEYiAw==", + "license": "MIT", + "engines": { + "node": ">=6.9.1" + }, + "peerDependencies": { + "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 || ^9.0.0" + } + }, "node_modules/eslint-plugin-react/node_modules/resolve": { "version": "2.0.0-next.5", "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz", @@ -2084,7 +2121,6 @@ "version": "8.2.0", "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.2.0.tgz", "integrity": "sha512-PHlWUfG6lvPc3yvP5A4PNyBL1W8fkDUccmI21JUu/+GKZBoH/W5u6usENXUrWFRsyoW5ACUjFGgAFQp5gUlb/A==", - "dev": true, "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^5.2.0" @@ -2100,7 +2136,6 @@ "version": "4.2.0", "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz", "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==", - "dev": true, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, @@ -2112,7 +2147,6 @@ "version": "10.3.0", "resolved": "https://registry.npmjs.org/espree/-/espree-10.3.0.tgz", "integrity": "sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==", - "dev": true, "dependencies": { "acorn": "^8.14.0", "acorn-jsx": "^5.3.2", @@ -2129,7 +2163,6 @@ "version": "1.6.0", "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", - "dev": true, "dependencies": { "estraverse": "^5.1.0" }, @@ -2141,7 +2174,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" }, @@ -2153,7 +2185,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" } @@ -2162,7 +2193,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" } @@ -2170,8 +2200,14 @@ "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.3.0", + "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.3.0.tgz", + "integrity": "sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==", + "dev": true, + "license": "Apache-2.0" }, "node_modules/fast-glob": { "version": "3.3.1", @@ -2204,14 +2240,12 @@ "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", "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", - "dev": true + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==" }, "node_modules/fastq": { "version": "1.19.0", @@ -2226,7 +2260,6 @@ "version": "8.0.0", "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", - "dev": true, "dependencies": { "flat-cache": "^4.0.0" }, @@ -2250,7 +2283,6 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, "dependencies": { "locate-path": "^6.0.0", "path-exists": "^4.0.0" @@ -2266,7 +2298,6 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", - "dev": true, "dependencies": { "flatted": "^3.2.9", "keyv": "^4.5.4" @@ -2278,8 +2309,7 @@ "node_modules/flatted": { "version": "3.3.2", "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.2.tgz", - "integrity": "sha512-AiwGJM8YcNOaobumgtng+6NHuOqC3A7MixFeDafM3X9cIUM+xUXoS5Vfgf+OihAYe20fxqNM9yPBXJzRtZ/4eA==", - "dev": true + "integrity": "sha512-AiwGJM8YcNOaobumgtng+6NHuOqC3A7MixFeDafM3X9cIUM+xUXoS5Vfgf+OihAYe20fxqNM9yPBXJzRtZ/4eA==" }, "node_modules/for-each": { "version": "0.3.4", @@ -2440,7 +2470,6 @@ "version": "6.0.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dev": true, "dependencies": { "is-glob": "^4.0.3" }, @@ -2476,7 +2505,6 @@ "version": "14.0.0", "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", - "dev": true, "engines": { "node": ">=18" }, @@ -2540,7 +2568,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" } @@ -2615,7 +2642,6 @@ "version": "5.3.2", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", - "dev": true, "engines": { "node": ">= 4" } @@ -2624,7 +2650,6 @@ "version": "3.3.1", "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", - "dev": true, "dependencies": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" @@ -2640,7 +2665,6 @@ "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "dev": true, "engines": { "node": ">=0.8.19" } @@ -2817,7 +2841,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" } @@ -2868,7 +2891,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" }, @@ -3058,8 +3080,7 @@ "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/iterator.prototype": { "version": "1.1.5", @@ -3097,7 +3118,7 @@ "version": "1.21.7", "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.7.tgz", "integrity": "sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==", - "dev": true, + "devOptional": true, "bin": { "jiti": "bin/jiti.js" } @@ -3112,7 +3133,6 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, "dependencies": { "argparse": "^2.0.1" }, @@ -3123,20 +3143,17 @@ "node_modules/json-buffer": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", - "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", - "dev": true + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==" }, "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", "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", - "dev": true + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==" }, "node_modules/json5": { "version": "1.0.2", @@ -3169,7 +3186,6 @@ "version": "4.5.4", "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", - "dev": true, "dependencies": { "json-buffer": "3.0.1" } @@ -3196,7 +3212,6 @@ "version": "0.4.1", "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", - "dev": true, "dependencies": { "prelude-ls": "^1.2.1", "type-check": "~0.4.0" @@ -3227,7 +3242,6 @@ "version": "6.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, "dependencies": { "p-locate": "^5.0.0" }, @@ -3241,8 +3255,7 @@ "node_modules/lodash.merge": { "version": "4.6.2", "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==" }, "node_modules/loose-envify": { "version": "1.4.0", @@ -3297,7 +3310,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" }, @@ -3326,8 +3338,7 @@ "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/mz": { "version": "2.7.0", @@ -3360,8 +3371,7 @@ "node_modules/natural-compare": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", - "dev": true + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==" }, "node_modules/next": { "version": "15.1.6", @@ -3579,7 +3589,6 @@ "version": "0.9.4", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", - "dev": true, "dependencies": { "deep-is": "^0.1.3", "fast-levenshtein": "^2.0.6", @@ -3613,7 +3622,6 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, "dependencies": { "yocto-queue": "^0.1.0" }, @@ -3628,7 +3636,6 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dev": true, "dependencies": { "p-limit": "^3.0.2" }, @@ -3649,7 +3656,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" }, @@ -3661,7 +3667,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" } @@ -3670,7 +3675,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" } @@ -3888,11 +3892,39 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", - "dev": true, "engines": { "node": ">= 0.8.0" } }, + "node_modules/prettier": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.5.0.tgz", + "integrity": "sha512-quyMrVt6svPS7CjQ9gKb3GLEX/rl3BCL2oa/QkNcXv4YNVBC9olt3s+H7ukto06q7B1Qz46PbrKLO34PR6vXcA==", + "dev": true, + "license": "MIT", + "bin": { + "prettier": "bin/prettier.cjs" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "node_modules/prettier-linter-helpers": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", + "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-diff": "^1.1.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, "node_modules/prop-types": { "version": "15.8.1", "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", @@ -3908,7 +3940,6 @@ "version": "2.3.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", - "dev": true, "engines": { "node": ">=6" } @@ -4045,7 +4076,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" } @@ -4250,7 +4280,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" }, @@ -4262,7 +4291,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" } @@ -4598,7 +4626,6 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true, "engines": { "node": ">=8" }, @@ -4654,7 +4681,6 @@ "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" }, @@ -4674,6 +4700,23 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/synckit": { + "version": "0.9.2", + "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.9.2.tgz", + "integrity": "sha512-vrozgXDQwYO72vHjUb/HnFbQx1exDjoKzqx23aXEg2a9VIg2TSFZ8FmeZpTjUCFMYw7mpX4BE2SFu8wI7asYsw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@pkgr/core": "^0.1.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/unts" + } + }, "node_modules/tailwindcss": { "version": "3.4.17", "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.17.tgz", @@ -4820,7 +4863,6 @@ "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", - "dev": true, "dependencies": { "prelude-ls": "^1.2.1" }, @@ -4943,7 +4985,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" } @@ -4958,7 +4999,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" }, @@ -5057,7 +5097,6 @@ "version": "1.2.5", "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -5166,7 +5205,6 @@ "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "dev": true, "engines": { "node": ">=10" }, diff --git a/next-app/package.json b/next-app/package.json index 279bf821..116d8b6d 100644 --- a/next-app/package.json +++ b/next-app/package.json @@ -9,19 +9,26 @@ "lint": "next lint" }, "dependencies": { + "eslint-plugin-react-perf": "^3.3.3", + "next": "15.1.6", "react": "^19.0.0", - "react-dom": "^19.0.0", - "next": "15.1.6" + "react-dom": "^19.0.0" }, "devDependencies": { - "typescript": "^5", - "@types/node": "^20", - "@types/react": "^19", + "@eslint/eslintrc": "^3", + "@next/eslint-plugin-next": "^15.1.6", + "@types/node": "^20.17.17", + "@types/react": "^19.0.8", "@types/react-dom": "^19", + "@typescript-eslint/parser": "^8.24.0", + "eslint": "^9.20.0", + "eslint-config-next": "15.1.6", + "eslint-plugin-import": "^2.31.0", + "eslint-plugin-prettier": "^5.2.3", + "eslint-plugin-react-hooks": "^5.1.0", "postcss": "^8", + "prettier": "^3.5.0", "tailwindcss": "^3.4.1", - "eslint": "^9", - "eslint-config-next": "15.1.6", - "@eslint/eslintrc": "^3" + "typescript": "^5" } } diff --git a/next-app/public/file.svg b/next-app/public/file.svg deleted file mode 100644 index 004145cd..00000000 --- a/next-app/public/file.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/next-app/public/foreground.jpg b/next-app/public/foreground.jpg new file mode 100644 index 0000000000000000000000000000000000000000..09146954c633a65cd3f65468bb3697c6218495eb GIT binary patch literal 40524 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 \ No newline at end of file diff --git a/next-app/public/next.svg b/next-app/public/next.svg deleted file mode 100644 index 5174b28c..00000000 --- a/next-app/public/next.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/next-app/public/vercel.svg b/next-app/public/vercel.svg deleted file mode 100644 index 77053960..00000000 --- a/next-app/public/vercel.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/next-app/public/window.svg b/next-app/public/window.svg deleted file mode 100644 index b2b2a44f..00000000 --- a/next-app/public/window.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/next-app/src/app/layout.tsx b/next-app/src/app/layout.tsx index f7fa87eb..e98b3ab8 100644 --- a/next-app/src/app/layout.tsx +++ b/next-app/src/app/layout.tsx @@ -1,34 +1,35 @@ -import type { Metadata } from "next"; -import { Geist, Geist_Mono } from "next/font/google"; -import "./globals.css"; +import type { Metadata } from 'next' +import { Geist, Geist_Mono } from 'next/font/google' + +import './globals.css' const geistSans = Geist({ - variable: "--font-geist-sans", - subsets: ["latin"], -}); + variable: '--font-geist-sans', + subsets: ['latin'], +}) const geistMono = Geist_Mono({ - variable: "--font-geist-mono", - subsets: ["latin"], -}); + variable: '--font-geist-mono', + subsets: ['latin'], +}) export const metadata: Metadata = { - title: "Create Next App", - description: "Generated by create next app", -}; + title: 'Create Next App', + description: 'Generated by create next app', +} export default function RootLayout({ children, }: Readonly<{ - children: React.ReactNode; + children: React.ReactNode }>) { return ( - + {children} - ); + ) } diff --git a/next-app/src/app/page.tsx b/next-app/src/app/page.tsx index 3eee0141..63d5fbaf 100644 --- a/next-app/src/app/page.tsx +++ b/next-app/src/app/page.tsx @@ -1,21 +1,21 @@ -import Image from "next/image"; +import Image from 'next/image' export default function Home() { return ( -
-
+
+
Next.js logo -
    -
  1. - Get started by editing{" "} - +
      +
    1. + Get started by editing{' '} + src/app/page.tsx . @@ -23,73 +23,73 @@ export default function Home() {
    2. Save and see your changes instantly.
    -
-
- ); + ) } diff --git a/next-app/tailwind.config.ts b/next-app/tailwind.config.ts index 109807be..342c2847 100644 --- a/next-app/tailwind.config.ts +++ b/next-app/tailwind.config.ts @@ -1,18 +1,18 @@ -import type { Config } from "tailwindcss"; +import type { Config } from 'tailwindcss' export default { content: [ - "./src/pages/**/*.{js,ts,jsx,tsx,mdx}", - "./src/components/**/*.{js,ts,jsx,tsx,mdx}", - "./src/app/**/*.{js,ts,jsx,tsx,mdx}", + './src/pages/**/*.{js,ts,jsx,tsx,mdx}', + './src/components/**/*.{js,ts,jsx,tsx,mdx}', + './src/app/**/*.{js,ts,jsx,tsx,mdx}', ], theme: { extend: { colors: { - background: "var(--background)", - foreground: "var(--foreground)", + background: 'var(--background)', + foreground: 'var(--foreground)', }, }, }, plugins: [], -} satisfies Config; +} satisfies Config diff --git a/next-app/tsconfig.json b/next-app/tsconfig.json index c1334095..95162107 100644 --- a/next-app/tsconfig.json +++ b/next-app/tsconfig.json @@ -5,6 +5,16 @@ "allowJs": true, "skipLibCheck": true, "strict": true, + "strictNullChecks": true, + "strictBindCallApply": true, + "strictFunctionTypes": true, + "strictPropertyInitialization": true, + "noImplicitAny": true, + "noImplicitThis": true, + "noUncheckedIndexedAccess": true, + "forceConsistentCasingInFileNames": true, + "importsNotUsedAsValues": "error", + "noErrorTruncation": true, "noEmit": true, "esModuleInterop": true, "module": "esnext", @@ -20,8 +30,8 @@ ], "paths": { "@/*": ["./src/*"] - } + }, }, "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"], - "exclude": ["node_modules"] + "exclude": ["node_modules", "eslint.config.mjs"] }