diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..e86e21f --- /dev/null +++ b/.gitignore @@ -0,0 +1,387 @@ +# Created by https://www.toptal.com/developers/gitignore/api/linux,windows,java,gradle,maven,intellij,intellij+iml,intellij+all,netbeans,visualstudiocode,kotlin +# Edit at https://www.toptal.com/developers/gitignore?templates=linux,windows,java,gradle,maven,intellij,intellij+iml,intellij+all,netbeans,visualstudiocode,kotlin + +### Intellij ### +# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio, WebStorm and Rider +# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839 + +# User-specific stuff +.idea/**/workspace.xml +.idea/**/tasks.xml +.idea/**/usage.statistics.xml +.idea/**/dictionaries +.idea/**/shelf + +# AWS User-specific +.idea/**/aws.xml + +# Generated files +.idea/**/contentModel.xml + +# Sensitive or high-churn files +.idea/**/dataSources/ +.idea/**/dataSources.ids +.idea/**/dataSources.local.xml +.idea/**/sqlDataSources.xml +.idea/**/dynamic.xml +.idea/**/uiDesigner.xml +.idea/**/dbnavigator.xml + +# Gradle +.idea/**/gradle.xml +.idea/**/libraries + +# Gradle and Maven with auto-import +# When using Gradle or Maven with auto-import, you should exclude module files, +# since they will be recreated, and may cause churn. Uncomment if using +# auto-import. +# .idea/artifacts +# .idea/compiler.xml +# .idea/jarRepositories.xml +# .idea/modules.xml +# .idea/*.iml +# .idea/modules +# *.iml +# *.ipr + +# CMake +cmake-build-*/ + +# Mongo Explorer plugin +.idea/**/mongoSettings.xml + +# File-based project format +*.iws + +# IntelliJ +out/ + +# mpeltonen/sbt-idea plugin +.idea_modules/ + +# JIRA plugin +atlassian-ide-plugin.xml + +# Cursive Clojure plugin +.idea/replstate.xml + +# SonarLint plugin +.idea/sonarlint/ + +# Crashlytics plugin (for Android Studio and IntelliJ) +com_crashlytics_export_strings.xml +crashlytics.properties +crashlytics-build.properties +fabric.properties + +# Editor-based Rest Client +.idea/httpRequests + +# Android studio 3.1+ serialized cache file +.idea/caches/build_file_checksums.ser + +### Intellij Patch ### +# Comment Reason: https://github.com/joeblau/gitignore.io/issues/186#issuecomment-215987721 + +# *.iml +# modules.xml +# .idea/misc.xml +# *.ipr + +# Sonarlint plugin +# https://plugins.jetbrains.com/plugin/7973-sonarlint +.idea/**/sonarlint/ + +# SonarQube Plugin +# https://plugins.jetbrains.com/plugin/7238-sonarqube-community-plugin +.idea/**/sonarIssues.xml + +# Markdown Navigator plugin +# https://plugins.jetbrains.com/plugin/7896-markdown-navigator-enhanced +.idea/**/markdown-navigator.xml +.idea/**/markdown-navigator-enh.xml +.idea/**/markdown-navigator/ + +# Cache file creation bug +# See https://youtrack.jetbrains.com/issue/JBR-2257 +.idea/$CACHE_FILE$ + +# CodeStream plugin +# https://plugins.jetbrains.com/plugin/12206-codestream +.idea/codestream.xml + +# Azure Toolkit for IntelliJ plugin +# https://plugins.jetbrains.com/plugin/8053-azure-toolkit-for-intellij +.idea/**/azureSettings.xml + +### Intellij+all ### +# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio, WebStorm and Rider +# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839 + +# User-specific stuff + +# AWS User-specific + +# Generated files + +# Sensitive or high-churn files + +# Gradle + +# Gradle and Maven with auto-import +# When using Gradle or Maven with auto-import, you should exclude module files, +# since they will be recreated, and may cause churn. Uncomment if using +# auto-import. +# .idea/artifacts +# .idea/compiler.xml +# .idea/jarRepositories.xml +# .idea/modules.xml +# .idea/*.iml +# .idea/modules +# *.iml +# *.ipr + +# CMake + +# Mongo Explorer plugin + +# File-based project format + +# IntelliJ + +# mpeltonen/sbt-idea plugin + +# JIRA plugin + +# Cursive Clojure plugin + +# SonarLint plugin + +# Crashlytics plugin (for Android Studio and IntelliJ) + +# Editor-based Rest Client + +# Android studio 3.1+ serialized cache file + +### Intellij+all Patch ### +# Ignore everything but code style settings and run configurations +# that are supposed to be shared within teams. + +.idea/* + +!.idea/codeStyles +!.idea/runConfigurations + +### Intellij+iml ### +# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio, WebStorm and Rider +# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839 + +# User-specific stuff + +# AWS User-specific + +# Generated files + +# Sensitive or high-churn files + +# Gradle + +# Gradle and Maven with auto-import +# When using Gradle or Maven with auto-import, you should exclude module files, +# since they will be recreated, and may cause churn. Uncomment if using +# auto-import. +# .idea/artifacts +# .idea/compiler.xml +# .idea/jarRepositories.xml +# .idea/modules.xml +# .idea/*.iml +# .idea/modules +# *.iml +# *.ipr + +# CMake + +# Mongo Explorer plugin + +# File-based project format + +# IntelliJ + +# mpeltonen/sbt-idea plugin + +# JIRA plugin + +# Cursive Clojure plugin + +# SonarLint plugin + +# Crashlytics plugin (for Android Studio and IntelliJ) + +# Editor-based Rest Client + +# Android studio 3.1+ serialized cache file + +### Intellij+iml Patch ### +# Reason: https://github.com/joeblau/gitignore.io/issues/186#issuecomment-249601023 + +*.iml +modules.xml +.idea/misc.xml +*.ipr + +### Java ### +# Compiled class file +*.class + +# Log file +*.log + +# BlueJ files +*.ctxt + +# Mobile Tools for Java (J2ME) +.mtj.tmp/ + +# Package Files # +*.jar +*.war +*.nar +*.ear +*.zip +*.tar.gz +*.rar + +# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml +hs_err_pid* +replay_pid* + +### Kotlin ### +# Compiled class file + +# Log file + +# BlueJ files + +# Mobile Tools for Java (J2ME) + +# Package Files # + +# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml + +### Linux ### +*~ + +# temporary files which can be created if a process still has a handle open of a deleted file +.fuse_hidden* + +# KDE directory preferences +.directory + +# Linux trash folder which might appear on any partition or disk +.Trash-* + +# .nfs files are created when an open file is removed but is still being accessed +.nfs* + +### Maven ### +target/ +pom.xml.tag +pom.xml.releaseBackup +pom.xml.versionsBackup +pom.xml.next +release.properties +dependency-reduced-pom.xml +buildNumber.properties +.mvn/timing.properties +# https://github.com/takari/maven-wrapper#usage-without-binary-jar +.mvn/wrapper/maven-wrapper.jar + +# Eclipse m2e generated files +# Eclipse Core +.project +# JDT-specific (Eclipse Java Development Tools) +.classpath + +### NetBeans ### +**/nbproject/private/ +**/nbproject/Makefile-*.mk +**/nbproject/Package-*.bash +build/ +nbbuild/ +dist/ +nbdist/ +.nb-gradle/ + +### VisualStudioCode ### +.vscode/* +!.vscode/settings.json +!.vscode/tasks.json +!.vscode/launch.json +!.vscode/extensions.json +!.vscode/*.code-snippets + +# Local History for Visual Studio Code +.history/ + +# Built Visual Studio Code Extensions +*.vsix + +### VisualStudioCode Patch ### +# Ignore all local history of files +.history +.ionide + +# Support for Project snippet scope +.vscode/*.code-snippets + +# Ignore code-workspaces +*.code-workspace + +### Windows ### +# Windows thumbnail cache files +Thumbs.db +Thumbs.db:encryptable +ehthumbs.db +ehthumbs_vista.db + +# Dump file +*.stackdump + +# Folder config file +[Dd]esktop.ini + +# Recycle Bin used on file shares +$RECYCLE.BIN/ + +# Windows Installer files +*.cab +*.msi +*.msix +*.msm +*.msp + +# Windows shortcuts +*.lnk + +### Gradle ### +.gradle +**/build/ +!src/**/build/ + +# Ignore Gradle GUI config +gradle-app.setting + +# Avoid ignoring Gradle wrapper jar file (.jar files are usually ignored) +!gradle-wrapper.jar + +# Avoid ignore Gradle wrappper properties +!gradle-wrapper.properties + +# Cache of project +.gradletasknamecache + +# Eclipse Gradle plugin generated files +# Eclipse Core +# JDT-specific (Eclipse Java Development Tools) + +# End of https://www.toptal.com/developers/gitignore/api/linux,windows,java,gradle,maven,intellij,intellij+iml,intellij+all,netbeans,visualstudiocode,kotlin diff --git a/background/.gitignore b/background/.gitignore new file mode 100644 index 0000000..e86e21f --- /dev/null +++ b/background/.gitignore @@ -0,0 +1,387 @@ +# Created by https://www.toptal.com/developers/gitignore/api/linux,windows,java,gradle,maven,intellij,intellij+iml,intellij+all,netbeans,visualstudiocode,kotlin +# Edit at https://www.toptal.com/developers/gitignore?templates=linux,windows,java,gradle,maven,intellij,intellij+iml,intellij+all,netbeans,visualstudiocode,kotlin + +### Intellij ### +# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio, WebStorm and Rider +# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839 + +# User-specific stuff +.idea/**/workspace.xml +.idea/**/tasks.xml +.idea/**/usage.statistics.xml +.idea/**/dictionaries +.idea/**/shelf + +# AWS User-specific +.idea/**/aws.xml + +# Generated files +.idea/**/contentModel.xml + +# Sensitive or high-churn files +.idea/**/dataSources/ +.idea/**/dataSources.ids +.idea/**/dataSources.local.xml +.idea/**/sqlDataSources.xml +.idea/**/dynamic.xml +.idea/**/uiDesigner.xml +.idea/**/dbnavigator.xml + +# Gradle +.idea/**/gradle.xml +.idea/**/libraries + +# Gradle and Maven with auto-import +# When using Gradle or Maven with auto-import, you should exclude module files, +# since they will be recreated, and may cause churn. Uncomment if using +# auto-import. +# .idea/artifacts +# .idea/compiler.xml +# .idea/jarRepositories.xml +# .idea/modules.xml +# .idea/*.iml +# .idea/modules +# *.iml +# *.ipr + +# CMake +cmake-build-*/ + +# Mongo Explorer plugin +.idea/**/mongoSettings.xml + +# File-based project format +*.iws + +# IntelliJ +out/ + +# mpeltonen/sbt-idea plugin +.idea_modules/ + +# JIRA plugin +atlassian-ide-plugin.xml + +# Cursive Clojure plugin +.idea/replstate.xml + +# SonarLint plugin +.idea/sonarlint/ + +# Crashlytics plugin (for Android Studio and IntelliJ) +com_crashlytics_export_strings.xml +crashlytics.properties +crashlytics-build.properties +fabric.properties + +# Editor-based Rest Client +.idea/httpRequests + +# Android studio 3.1+ serialized cache file +.idea/caches/build_file_checksums.ser + +### Intellij Patch ### +# Comment Reason: https://github.com/joeblau/gitignore.io/issues/186#issuecomment-215987721 + +# *.iml +# modules.xml +# .idea/misc.xml +# *.ipr + +# Sonarlint plugin +# https://plugins.jetbrains.com/plugin/7973-sonarlint +.idea/**/sonarlint/ + +# SonarQube Plugin +# https://plugins.jetbrains.com/plugin/7238-sonarqube-community-plugin +.idea/**/sonarIssues.xml + +# Markdown Navigator plugin +# https://plugins.jetbrains.com/plugin/7896-markdown-navigator-enhanced +.idea/**/markdown-navigator.xml +.idea/**/markdown-navigator-enh.xml +.idea/**/markdown-navigator/ + +# Cache file creation bug +# See https://youtrack.jetbrains.com/issue/JBR-2257 +.idea/$CACHE_FILE$ + +# CodeStream plugin +# https://plugins.jetbrains.com/plugin/12206-codestream +.idea/codestream.xml + +# Azure Toolkit for IntelliJ plugin +# https://plugins.jetbrains.com/plugin/8053-azure-toolkit-for-intellij +.idea/**/azureSettings.xml + +### Intellij+all ### +# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio, WebStorm and Rider +# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839 + +# User-specific stuff + +# AWS User-specific + +# Generated files + +# Sensitive or high-churn files + +# Gradle + +# Gradle and Maven with auto-import +# When using Gradle or Maven with auto-import, you should exclude module files, +# since they will be recreated, and may cause churn. Uncomment if using +# auto-import. +# .idea/artifacts +# .idea/compiler.xml +# .idea/jarRepositories.xml +# .idea/modules.xml +# .idea/*.iml +# .idea/modules +# *.iml +# *.ipr + +# CMake + +# Mongo Explorer plugin + +# File-based project format + +# IntelliJ + +# mpeltonen/sbt-idea plugin + +# JIRA plugin + +# Cursive Clojure plugin + +# SonarLint plugin + +# Crashlytics plugin (for Android Studio and IntelliJ) + +# Editor-based Rest Client + +# Android studio 3.1+ serialized cache file + +### Intellij+all Patch ### +# Ignore everything but code style settings and run configurations +# that are supposed to be shared within teams. + +.idea/* + +!.idea/codeStyles +!.idea/runConfigurations + +### Intellij+iml ### +# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio, WebStorm and Rider +# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839 + +# User-specific stuff + +# AWS User-specific + +# Generated files + +# Sensitive or high-churn files + +# Gradle + +# Gradle and Maven with auto-import +# When using Gradle or Maven with auto-import, you should exclude module files, +# since they will be recreated, and may cause churn. Uncomment if using +# auto-import. +# .idea/artifacts +# .idea/compiler.xml +# .idea/jarRepositories.xml +# .idea/modules.xml +# .idea/*.iml +# .idea/modules +# *.iml +# *.ipr + +# CMake + +# Mongo Explorer plugin + +# File-based project format + +# IntelliJ + +# mpeltonen/sbt-idea plugin + +# JIRA plugin + +# Cursive Clojure plugin + +# SonarLint plugin + +# Crashlytics plugin (for Android Studio and IntelliJ) + +# Editor-based Rest Client + +# Android studio 3.1+ serialized cache file + +### Intellij+iml Patch ### +# Reason: https://github.com/joeblau/gitignore.io/issues/186#issuecomment-249601023 + +*.iml +modules.xml +.idea/misc.xml +*.ipr + +### Java ### +# Compiled class file +*.class + +# Log file +*.log + +# BlueJ files +*.ctxt + +# Mobile Tools for Java (J2ME) +.mtj.tmp/ + +# Package Files # +*.jar +*.war +*.nar +*.ear +*.zip +*.tar.gz +*.rar + +# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml +hs_err_pid* +replay_pid* + +### Kotlin ### +# Compiled class file + +# Log file + +# BlueJ files + +# Mobile Tools for Java (J2ME) + +# Package Files # + +# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml + +### Linux ### +*~ + +# temporary files which can be created if a process still has a handle open of a deleted file +.fuse_hidden* + +# KDE directory preferences +.directory + +# Linux trash folder which might appear on any partition or disk +.Trash-* + +# .nfs files are created when an open file is removed but is still being accessed +.nfs* + +### Maven ### +target/ +pom.xml.tag +pom.xml.releaseBackup +pom.xml.versionsBackup +pom.xml.next +release.properties +dependency-reduced-pom.xml +buildNumber.properties +.mvn/timing.properties +# https://github.com/takari/maven-wrapper#usage-without-binary-jar +.mvn/wrapper/maven-wrapper.jar + +# Eclipse m2e generated files +# Eclipse Core +.project +# JDT-specific (Eclipse Java Development Tools) +.classpath + +### NetBeans ### +**/nbproject/private/ +**/nbproject/Makefile-*.mk +**/nbproject/Package-*.bash +build/ +nbbuild/ +dist/ +nbdist/ +.nb-gradle/ + +### VisualStudioCode ### +.vscode/* +!.vscode/settings.json +!.vscode/tasks.json +!.vscode/launch.json +!.vscode/extensions.json +!.vscode/*.code-snippets + +# Local History for Visual Studio Code +.history/ + +# Built Visual Studio Code Extensions +*.vsix + +### VisualStudioCode Patch ### +# Ignore all local history of files +.history +.ionide + +# Support for Project snippet scope +.vscode/*.code-snippets + +# Ignore code-workspaces +*.code-workspace + +### Windows ### +# Windows thumbnail cache files +Thumbs.db +Thumbs.db:encryptable +ehthumbs.db +ehthumbs_vista.db + +# Dump file +*.stackdump + +# Folder config file +[Dd]esktop.ini + +# Recycle Bin used on file shares +$RECYCLE.BIN/ + +# Windows Installer files +*.cab +*.msi +*.msix +*.msm +*.msp + +# Windows shortcuts +*.lnk + +### Gradle ### +.gradle +**/build/ +!src/**/build/ + +# Ignore Gradle GUI config +gradle-app.setting + +# Avoid ignoring Gradle wrapper jar file (.jar files are usually ignored) +!gradle-wrapper.jar + +# Avoid ignore Gradle wrappper properties +!gradle-wrapper.properties + +# Cache of project +.gradletasknamecache + +# Eclipse Gradle plugin generated files +# Eclipse Core +# JDT-specific (Eclipse Java Development Tools) + +# End of https://www.toptal.com/developers/gitignore/api/linux,windows,java,gradle,maven,intellij,intellij+iml,intellij+all,netbeans,visualstudiocode,kotlin diff --git a/background/build.gradle.kts b/background/build.gradle.kts new file mode 100644 index 0000000..99832a9 --- /dev/null +++ b/background/build.gradle.kts @@ -0,0 +1,34 @@ +plugins { + kotlin("js") +} + +repositories { + google() + mavenLocal() + mavenCentral() + gradlePluginPortal() +} + +dependencies { + implementation(kotlin("stdlib-js")) + implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core-js:1.6.3") + implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.3") + implementation(project(":base")) +} + +kotlin { + js(LEGACY) { + binaries.executable() + useCommonJs() + browser { + webpackTask { + outputFileName = "background.js" + sourceMaps = false + report = true + } + distribution { + directory = File("$projectDir/../build/distributions/") + } + } + } +} \ No newline at end of file diff --git a/background/src/main/kotlin/background.kt b/background/src/main/kotlin/background.kt new file mode 100644 index 0000000..06cc08d --- /dev/null +++ b/background/src/main/kotlin/background.kt @@ -0,0 +1,7 @@ +import common.collect + +fun main() { + browser.runtime.getPlatformInfo().collect { + console.log(it) + } +} \ No newline at end of file diff --git a/base/.gitignore b/base/.gitignore new file mode 100644 index 0000000..e86e21f --- /dev/null +++ b/base/.gitignore @@ -0,0 +1,387 @@ +# Created by https://www.toptal.com/developers/gitignore/api/linux,windows,java,gradle,maven,intellij,intellij+iml,intellij+all,netbeans,visualstudiocode,kotlin +# Edit at https://www.toptal.com/developers/gitignore?templates=linux,windows,java,gradle,maven,intellij,intellij+iml,intellij+all,netbeans,visualstudiocode,kotlin + +### Intellij ### +# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio, WebStorm and Rider +# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839 + +# User-specific stuff +.idea/**/workspace.xml +.idea/**/tasks.xml +.idea/**/usage.statistics.xml +.idea/**/dictionaries +.idea/**/shelf + +# AWS User-specific +.idea/**/aws.xml + +# Generated files +.idea/**/contentModel.xml + +# Sensitive or high-churn files +.idea/**/dataSources/ +.idea/**/dataSources.ids +.idea/**/dataSources.local.xml +.idea/**/sqlDataSources.xml +.idea/**/dynamic.xml +.idea/**/uiDesigner.xml +.idea/**/dbnavigator.xml + +# Gradle +.idea/**/gradle.xml +.idea/**/libraries + +# Gradle and Maven with auto-import +# When using Gradle or Maven with auto-import, you should exclude module files, +# since they will be recreated, and may cause churn. Uncomment if using +# auto-import. +# .idea/artifacts +# .idea/compiler.xml +# .idea/jarRepositories.xml +# .idea/modules.xml +# .idea/*.iml +# .idea/modules +# *.iml +# *.ipr + +# CMake +cmake-build-*/ + +# Mongo Explorer plugin +.idea/**/mongoSettings.xml + +# File-based project format +*.iws + +# IntelliJ +out/ + +# mpeltonen/sbt-idea plugin +.idea_modules/ + +# JIRA plugin +atlassian-ide-plugin.xml + +# Cursive Clojure plugin +.idea/replstate.xml + +# SonarLint plugin +.idea/sonarlint/ + +# Crashlytics plugin (for Android Studio and IntelliJ) +com_crashlytics_export_strings.xml +crashlytics.properties +crashlytics-build.properties +fabric.properties + +# Editor-based Rest Client +.idea/httpRequests + +# Android studio 3.1+ serialized cache file +.idea/caches/build_file_checksums.ser + +### Intellij Patch ### +# Comment Reason: https://github.com/joeblau/gitignore.io/issues/186#issuecomment-215987721 + +# *.iml +# modules.xml +# .idea/misc.xml +# *.ipr + +# Sonarlint plugin +# https://plugins.jetbrains.com/plugin/7973-sonarlint +.idea/**/sonarlint/ + +# SonarQube Plugin +# https://plugins.jetbrains.com/plugin/7238-sonarqube-community-plugin +.idea/**/sonarIssues.xml + +# Markdown Navigator plugin +# https://plugins.jetbrains.com/plugin/7896-markdown-navigator-enhanced +.idea/**/markdown-navigator.xml +.idea/**/markdown-navigator-enh.xml +.idea/**/markdown-navigator/ + +# Cache file creation bug +# See https://youtrack.jetbrains.com/issue/JBR-2257 +.idea/$CACHE_FILE$ + +# CodeStream plugin +# https://plugins.jetbrains.com/plugin/12206-codestream +.idea/codestream.xml + +# Azure Toolkit for IntelliJ plugin +# https://plugins.jetbrains.com/plugin/8053-azure-toolkit-for-intellij +.idea/**/azureSettings.xml + +### Intellij+all ### +# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio, WebStorm and Rider +# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839 + +# User-specific stuff + +# AWS User-specific + +# Generated files + +# Sensitive or high-churn files + +# Gradle + +# Gradle and Maven with auto-import +# When using Gradle or Maven with auto-import, you should exclude module files, +# since they will be recreated, and may cause churn. Uncomment if using +# auto-import. +# .idea/artifacts +# .idea/compiler.xml +# .idea/jarRepositories.xml +# .idea/modules.xml +# .idea/*.iml +# .idea/modules +# *.iml +# *.ipr + +# CMake + +# Mongo Explorer plugin + +# File-based project format + +# IntelliJ + +# mpeltonen/sbt-idea plugin + +# JIRA plugin + +# Cursive Clojure plugin + +# SonarLint plugin + +# Crashlytics plugin (for Android Studio and IntelliJ) + +# Editor-based Rest Client + +# Android studio 3.1+ serialized cache file + +### Intellij+all Patch ### +# Ignore everything but code style settings and run configurations +# that are supposed to be shared within teams. + +.idea/* + +!.idea/codeStyles +!.idea/runConfigurations + +### Intellij+iml ### +# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio, WebStorm and Rider +# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839 + +# User-specific stuff + +# AWS User-specific + +# Generated files + +# Sensitive or high-churn files + +# Gradle + +# Gradle and Maven with auto-import +# When using Gradle or Maven with auto-import, you should exclude module files, +# since they will be recreated, and may cause churn. Uncomment if using +# auto-import. +# .idea/artifacts +# .idea/compiler.xml +# .idea/jarRepositories.xml +# .idea/modules.xml +# .idea/*.iml +# .idea/modules +# *.iml +# *.ipr + +# CMake + +# Mongo Explorer plugin + +# File-based project format + +# IntelliJ + +# mpeltonen/sbt-idea plugin + +# JIRA plugin + +# Cursive Clojure plugin + +# SonarLint plugin + +# Crashlytics plugin (for Android Studio and IntelliJ) + +# Editor-based Rest Client + +# Android studio 3.1+ serialized cache file + +### Intellij+iml Patch ### +# Reason: https://github.com/joeblau/gitignore.io/issues/186#issuecomment-249601023 + +*.iml +modules.xml +.idea/misc.xml +*.ipr + +### Java ### +# Compiled class file +*.class + +# Log file +*.log + +# BlueJ files +*.ctxt + +# Mobile Tools for Java (J2ME) +.mtj.tmp/ + +# Package Files # +*.jar +*.war +*.nar +*.ear +*.zip +*.tar.gz +*.rar + +# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml +hs_err_pid* +replay_pid* + +### Kotlin ### +# Compiled class file + +# Log file + +# BlueJ files + +# Mobile Tools for Java (J2ME) + +# Package Files # + +# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml + +### Linux ### +*~ + +# temporary files which can be created if a process still has a handle open of a deleted file +.fuse_hidden* + +# KDE directory preferences +.directory + +# Linux trash folder which might appear on any partition or disk +.Trash-* + +# .nfs files are created when an open file is removed but is still being accessed +.nfs* + +### Maven ### +target/ +pom.xml.tag +pom.xml.releaseBackup +pom.xml.versionsBackup +pom.xml.next +release.properties +dependency-reduced-pom.xml +buildNumber.properties +.mvn/timing.properties +# https://github.com/takari/maven-wrapper#usage-without-binary-jar +.mvn/wrapper/maven-wrapper.jar + +# Eclipse m2e generated files +# Eclipse Core +.project +# JDT-specific (Eclipse Java Development Tools) +.classpath + +### NetBeans ### +**/nbproject/private/ +**/nbproject/Makefile-*.mk +**/nbproject/Package-*.bash +build/ +nbbuild/ +dist/ +nbdist/ +.nb-gradle/ + +### VisualStudioCode ### +.vscode/* +!.vscode/settings.json +!.vscode/tasks.json +!.vscode/launch.json +!.vscode/extensions.json +!.vscode/*.code-snippets + +# Local History for Visual Studio Code +.history/ + +# Built Visual Studio Code Extensions +*.vsix + +### VisualStudioCode Patch ### +# Ignore all local history of files +.history +.ionide + +# Support for Project snippet scope +.vscode/*.code-snippets + +# Ignore code-workspaces +*.code-workspace + +### Windows ### +# Windows thumbnail cache files +Thumbs.db +Thumbs.db:encryptable +ehthumbs.db +ehthumbs_vista.db + +# Dump file +*.stackdump + +# Folder config file +[Dd]esktop.ini + +# Recycle Bin used on file shares +$RECYCLE.BIN/ + +# Windows Installer files +*.cab +*.msi +*.msix +*.msm +*.msp + +# Windows shortcuts +*.lnk + +### Gradle ### +.gradle +**/build/ +!src/**/build/ + +# Ignore Gradle GUI config +gradle-app.setting + +# Avoid ignoring Gradle wrapper jar file (.jar files are usually ignored) +!gradle-wrapper.jar + +# Avoid ignore Gradle wrappper properties +!gradle-wrapper.properties + +# Cache of project +.gradletasknamecache + +# Eclipse Gradle plugin generated files +# Eclipse Core +# JDT-specific (Eclipse Java Development Tools) + +# End of https://www.toptal.com/developers/gitignore/api/linux,windows,java,gradle,maven,intellij,intellij+iml,intellij+all,netbeans,visualstudiocode,kotlin diff --git a/base/build.gradle.kts b/base/build.gradle.kts new file mode 100644 index 0000000..861764d --- /dev/null +++ b/base/build.gradle.kts @@ -0,0 +1,33 @@ +plugins { + kotlin("js") +} + +repositories { + google() + mavenLocal() + mavenCentral() + gradlePluginPortal() +} + +dependencies { + implementation(kotlin("stdlib-js")) + implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core-js:1.6.3") + implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.3") +} + +kotlin { + js(LEGACY) { + binaries.executable() + useCommonJs() + browser { + webpackTask { + outputFileName = "base.js" + sourceMaps = false + report = true + } + distribution { + directory = File("$projectDir/../build/distributions/") + } + } + } +} diff --git a/base/src/main/kotlin/browser/action/Constructor.kt b/base/src/main/kotlin/browser/action/Constructor.kt new file mode 100644 index 0000000..c124e2f --- /dev/null +++ b/base/src/main/kotlin/browser/action/Constructor.kt @@ -0,0 +1,12 @@ +@file:Suppress("UNCHECKED_CAST_TO_EXTERNAL_INTERFACE") + +package browser.action + +import browser.action.details.* + +inline fun BadgeBackgroundDetails(block: BadgeBackgroundDetails.() -> Unit) = (js("{}") as BadgeBackgroundDetails).apply(block) +inline fun BadgeDetails(block: BadgeDetails.() -> Unit) = (js("{}") as BadgeDetails).apply(block) +inline fun IconDetails(block: IconDetails.() -> Unit) = (js("{}") as IconDetails).apply(block) +inline fun PopupDetails(block: PopupDetails.() -> Unit) = (js("{}") as PopupDetails).apply(block) +inline fun TabDetails(block: TabDetails.() -> Unit) = (js("{}") as TabDetails).apply(block) +inline fun TitleDetails(block: TitleDetails.() -> Unit) = (js("{}") as TitleDetails).apply(block) \ No newline at end of file diff --git a/base/src/main/kotlin/browser/action/Import.kt b/base/src/main/kotlin/browser/action/Import.kt new file mode 100644 index 0000000..f620e39 --- /dev/null +++ b/base/src/main/kotlin/browser/action/Import.kt @@ -0,0 +1,121 @@ +@file:JsModule("webextension-polyfill") +@file:JsQualifier("action") + +package browser.action + +import browser.action.details.* +import browser.events.Event +import browser.tabs.Tab +import kotlin.js.Promise + +/** + * Sets the title of the browser action. This title appears in the tooltip. + */ +external fun setTitle( + details: TitleDetails +): Promise? + +/** + * Gets the title of the browser action. + */ +external fun getTitle( + details: TabDetails +): Promise? + +/** + * Sets the icon for the browser action. + * The icon can be specified as the path to an image file, as the pixel data from a canvas element, or as a dictionary of one of those. + * Either the [details path] or the [details imageData] property must be specified. + */ +external fun setIcon( + details: IconDetails, + callback: (() -> Unit)? +) + +/** + * Sets the icon for the browser action. + * The icon can be specified as the path to an image file, as the pixel data from a canvas element, or as a dictionary of one of those. + * Either the [details path] or the [details imageData] property must be specified. + */ +external fun setIcon( + details: IconDetails +): Promise? + +/** + * Sets the HTML document to be opened as a popup when the user clicks the browser action icon. + */ +external fun setPopup( + details: PopupDetails +) : Promise? + +/** + * Gets the HTML document that is set as the popup for this browser action. + */ +external fun getPopup( + details: TabDetails +): Promise? + +/** + * Sets the badge text for the browser action. + * The badge is displayed on top of the icon. + */ +external fun setBadgeText( + details: BadgeDetails +): Promise? + +/** + * Gets the badge text of the browser action. If no tab is specified, the non-tab-specific badge text is returned. + */ +external fun getBadgeText( + details: TabDetails +): Promise? + +/** + * Sets the background color for the badge. + */ +external fun setBadgeBackgroundColor( + details: BadgeBackgroundDetails +): Promise? + +/** + * Gets the background color of the browser action. + */ +external fun getBadgeBackgroundColor( + details: TabDetails +): Promise?>? + +/** + * Enables the browser action for a tab. + * Defaults to enabled. + * + * @param tabId the ID of the tab for which to modify the browser action. + */ +external fun enable( + tabId: Int? = definedExternally +): Promise? + +/** + * Disables the browser action for a tab. + * + * @param tabId the ID of the tab for which to modify the browser action. + */ +external fun disable( + tabId: Int? = definedExternally +): Promise? + +/** + * Opens the extension popup window in the active window but does not grant tab permissions. + */ +external fun openPopup( + callback: (Any?) -> Unit +) + +/** + * Opens the extension popup window in the active window but does not grant tab permissions. + */ +external fun openPopup(): Promise? + +/** + * Fired when a browser action icon is clicked. Does not fire if the browser action has a popup. + */ +external val onClicked: Event = definedExternally \ No newline at end of file diff --git a/base/src/main/kotlin/browser/action/details/BadgeBackgroundDetails.kt b/base/src/main/kotlin/browser/action/details/BadgeBackgroundDetails.kt new file mode 100644 index 0000000..7a86529 --- /dev/null +++ b/base/src/main/kotlin/browser/action/details/BadgeBackgroundDetails.kt @@ -0,0 +1,20 @@ +@file:JsModule("webextension-polyfill") +@file:JsQualifier("action") + +package browser.action.details + +external interface BadgeBackgroundDetails { + + /** + * An array of four integers in the range 0-255 that make up the RGBA color of the badge. + * Can also be a string with a CSS hex color value; for example, #FF0000 or #F00 (red). + * Renders colors at full opacity. + */ + var color: Any + + /** + * Limits the change to when a particular tab is selected. + * Automatically resets when the tab is closed. + */ + var tabId: Int? +} \ No newline at end of file diff --git a/base/src/main/kotlin/browser/action/details/BadgeDetails.kt b/base/src/main/kotlin/browser/action/details/BadgeDetails.kt new file mode 100644 index 0000000..50c068b --- /dev/null +++ b/base/src/main/kotlin/browser/action/details/BadgeDetails.kt @@ -0,0 +1,19 @@ +@file:JsModule("webextension-polyfill") +@file:JsQualifier("action") + +package browser.action.details + +external interface BadgeDetails { + /** + * Any number of characters can be passed, but only about four can fit into the space. + * If an empty string ('') is passed, the badge text is cleared. + * If [tabId] is specified and [text] is null, the text for the specified tab is cleared and defaults to the global badge text. + */ + var text: String? + + /** + * Limits the change to when a particular tab is selected. + * Automatically resets when the tab is closed. + */ + var tabId: Int? +} \ No newline at end of file diff --git a/base/src/main/kotlin/browser/action/details/IconDetails.kt b/base/src/main/kotlin/browser/action/details/IconDetails.kt new file mode 100644 index 0000000..e3c5c4c --- /dev/null +++ b/base/src/main/kotlin/browser/action/details/IconDetails.kt @@ -0,0 +1,29 @@ +@file:JsModule("webextension-polyfill") +@file:JsQualifier("action") + +package browser.action.details + +external interface IconDetails { + /** + * Either an ImageData object or a dictionary {size -> ImageData} representing an icon to be set. + * If the icon is specified as a dictionary, the image used is chosen depending on the screen's pixel density. + * If the number of image pixels that fit into one screen space unit equals scale, then an image with size scale * n is selected, where n is the size of the icon in the UI. + * At least one image must be specified. + * Note that 'details.imageData = foo' is equivalent to 'details.imageData = {'16': foo}' + */ + var imageData: Any? + + /** + * Either a relative image path or a dictionary {size -> relative image path} pointing to an icon to be set. + * If the icon is specified as a dictionary, the image used is chosen depending on the screen's pixel density. + * If the number of image pixels that fit into one screen space unit equals scale, then an image with size scale * n is selected, where n is the size of the icon in the UI. + * At least one image must be specified. Note that 'details.path = foo' is equivalent to 'details.path = {'16': foo}' + */ + var path: Any? + + /** + * Limits the change to when a particular tab is selected. + * Automatically resets when the tab is closed. + */ + var tabId: Int? +} \ No newline at end of file diff --git a/base/src/main/kotlin/browser/action/details/PopupDetails.kt b/base/src/main/kotlin/browser/action/details/PopupDetails.kt new file mode 100644 index 0000000..782266a --- /dev/null +++ b/base/src/main/kotlin/browser/action/details/PopupDetails.kt @@ -0,0 +1,16 @@ +@file:JsModule("webextension-polyfill") +@file:JsQualifier("action") + +package browser.action.details + +external interface PopupDetails { + /** + * Limits the change to when a particular tab is selected. Automatically resets when the tab is closed. + */ + var tabId: Int? + + /** + * The relative path to the HTML file to show in a popup. If set to the empty string (''), no popup is shown. + */ + var popup: String +} \ No newline at end of file diff --git a/base/src/main/kotlin/browser/action/details/TabDetails.kt b/base/src/main/kotlin/browser/action/details/TabDetails.kt new file mode 100644 index 0000000..d4aeedd --- /dev/null +++ b/base/src/main/kotlin/browser/action/details/TabDetails.kt @@ -0,0 +1,11 @@ +@file:JsModule("webextension-polyfill") +@file:JsQualifier("action") + +package browser.action.details + +external interface TabDetails { + /** + * The ID of the tab to query state for. If no tab is specified, the non-tab-specific state is returned. + */ + var tabId: Int? +} \ No newline at end of file diff --git a/base/src/main/kotlin/browser/action/details/TitleDetails.kt b/base/src/main/kotlin/browser/action/details/TitleDetails.kt new file mode 100644 index 0000000..7afcb22 --- /dev/null +++ b/base/src/main/kotlin/browser/action/details/TitleDetails.kt @@ -0,0 +1,17 @@ +@file:JsModule("webextension-polyfill") +@file:JsQualifier("action") + +package browser.action.details + +external interface TitleDetails { + /** + * The string the browser action should display when moused over. + */ + var title: String + + /** + * Limits the change to when a particular tab is selected. + * Automatically resets when the tab is closed. + */ + var tabId: Int? +} \ No newline at end of file diff --git a/base/src/main/kotlin/browser/events/Constructor.kt b/base/src/main/kotlin/browser/events/Constructor.kt new file mode 100644 index 0000000..76c7f4b --- /dev/null +++ b/base/src/main/kotlin/browser/events/Constructor.kt @@ -0,0 +1,6 @@ +@file:Suppress("UNCHECKED_CAST_TO_EXTERNAL_INTERFACE") + +package browser.events + +inline fun Rule(block: Rule.() -> Unit) = (js("{}") as Rule).apply(block) +inline fun UrlFilter(block: UrlFilter.() -> Unit) = (js("{}") as UrlFilter).apply(block) \ No newline at end of file diff --git a/base/src/main/kotlin/browser/events/Event.kt b/base/src/main/kotlin/browser/events/Event.kt new file mode 100644 index 0000000..20ebeaf --- /dev/null +++ b/base/src/main/kotlin/browser/events/Event.kt @@ -0,0 +1,110 @@ +@file:JsModule("webextension-polyfill") +@file:JsQualifier("events") + +package browser.events + +/** + * An object which allows the addition and removal of listeners for a Chrome event. + */ +external interface Event { + /** + * Registers an event listener [callback] to an event. + * @param callback Called when an event occurs. The parameters of this function depend on the type of event. + */ + fun addListener(callback: (T) -> R) + + /** + * De-registers an event listener [callback] from an event. + * @param callback Listener that shall be unregistered. + */ + fun removeListener(callback: (T) -> R) + + /** + * @param callback Listener whose registration status shall be tested. + * @return True if [callback] is registered to the event. + */ + fun hasListener(callback: (T) -> R): Boolean + + /** + * @return True if any event listeners are registered to the event. + */ + fun hasListeners(): Boolean + + /** + * Registers rules to handle events. + * + * @param eventName Name of the event this function affects. + * @param webViewInstanceId If provided, this is an integer that uniquely identifies the associated with this function call. + * @param rules [Rule]s to be registered. These do not replace previously registered rules. + * @param callback Called with registered rules. Rules that were registered, the optional parameters are filled with values. + */ + fun addRules( + eventName: String? = definedExternally, + webViewInstanceId: Int? = definedExternally, + rules: Array>, + callback: ((Array>) -> Unit)? = definedExternally + ) + + /** + * Registers rules to handle events. + * + * @param rules [Rule]s to be registered. These do not replace previously registered rules. + * @param callback Called with registered rules. Rules that were registered, the optional parameters are filled with values. + */ + fun addRules( + rules: Array>, + callback: ((Array>) -> Unit)? = definedExternally + ) + + /** + * Returns currently registered rules. + * + * @param eventName Name of the event this function affects. + * @param webViewInstanceId If provided, this is an integer that uniquely identifies the associated with this function call. + * @param ruleIdentifiers If an array is passed, only rules with identifiers contained in this array are returned. + * @param callback Called with registered rules. Rules that were registered, the optional parameters are filled with values. + */ + fun getRules( + eventName: String? = definedExternally, + webViewInstanceId: Int? = definedExternally, + ruleIdentifiers: Array? = definedExternally, + callback: (Array>) -> Unit + ) + + /** + * Returns currently registered rules. + * + * @param ruleIdentifiers If an array is passed, only rules with identifiers contained in this array are returned. + * @param callback Called with registered rules. Rules that were registered, the optional parameters are filled with values. + */ + fun getRules( + ruleIdentifiers: Array? = definedExternally, + callback: (Array>) -> Unit + ) + + /** + * Unregisters currently registered rules. + * + * @param eventName Name of the event this function affects. + * @param webViewInstanceId If provided, this is an integer that uniquely identifies the associated with this function call. + * @param ruleIdentifiers If an array is passed, only rules with identifiers contained in this array are unregistered. + * @param callback Called when rules were unregistered. + */ + fun removeRules( + eventName: String? = definedExternally, + webViewInstanceId: Int? = definedExternally, + ruleIdentifiers: Array? = definedExternally, + callback: (() -> Unit)? = definedExternally + ) + + /** + * Unregisters currently registered rules. + * + * @param ruleIdentifiers If an array is passed, only rules with identifiers contained in this array are unregistered. + * @param callback Called when rules were unregistered. + */ + fun removeRules( + ruleIdentifiers: Array? = definedExternally, + callback: (() -> Unit)? = definedExternally + ) +} \ No newline at end of file diff --git a/base/src/main/kotlin/browser/events/Rule.kt b/base/src/main/kotlin/browser/events/Rule.kt new file mode 100644 index 0000000..026be9d --- /dev/null +++ b/base/src/main/kotlin/browser/events/Rule.kt @@ -0,0 +1,34 @@ +@file:JsModule("webextension-polyfill") +@file:JsQualifier("events") + +package browser.events + +/** + * Description of a declarative rule for handling events. + */ +external interface Rule { + /** + * Optional identifier that allows referencing this rule. + */ + var id: String? + + /** + * Tags can be used to annotate rules and perform operations on sets of rules. + */ + var tags: Array? + + /** + * List of conditions that can trigger the actions. + */ + var conditions: Array + + /** + * List of actions that are triggered if one of the conditions is fulfilled. + */ + var actions: Array + + /** + * Optional priority of this rule. Defaults to 100. + */ + var priority: Int? +} \ No newline at end of file diff --git a/base/src/main/kotlin/browser/events/UrlFilter.kt b/base/src/main/kotlin/browser/events/UrlFilter.kt new file mode 100644 index 0000000..5f81e55 --- /dev/null +++ b/base/src/main/kotlin/browser/events/UrlFilter.kt @@ -0,0 +1,130 @@ +@file:JsModule("webextension-polyfill") +@file:JsQualifier("events") + +package browser.events + +/** + * Filters URLs for various criteria. + * All criteria are case-sensitive. + * @see event filtering + */ +external interface UrlFilter { + /** + * Matches if the host name of the URL contains a specified string. + * To test whether a host name component has a prefix 'foo', use hostContains: '.foo'. + * This matches 'www.foobar.com' and 'foo.com', because an implicit dot is added at the beginning of the host name. + * Similarly, hostContains can be used to match against component suffix ('foo.') and to exactly match against components ('.foo.'). + * Suffix- and exact-matching for the last components need to be done separately using hostSuffix, because no implicit dot is added at the end of the host name. + */ + var hostContains: String? + + /** + * Matches if the host name of the URL is equal to a specified string. + */ + var hostEquals: String? + + /** + * Matches if the host name of the URL starts with a specified string. + */ + var hostPrefix: String? + + /** + * Matches if the host name of the URL ends with a specified string. + */ + var hostSuffix: String? + + /** + * Matches if the path segment of the URL contains a specified string. + */ + var pathContains: String? + + /** + * Matches if the path segment of the URL is equal to a specified string. + */ + var pathEquals: String? + + /** + * Matches if the path segment of the URL starts with a specified string. + */ + var pathPrefix: String? + + /** + * Matches if the path segment of the URL ends with a specified string. + */ + var pathSuffix: String? + + /** + * Matches if the query segment of the URL contains a specified string. + */ + var queryContains: String? + + /** + * Matches if the query segment of the URL is equal to a specified string. + */ + var queryEquals: String? + + /** + * Matches if the query segment of the URL starts with a specified string. + */ + var queryPrefix: String? + + /** + * Matches if the query segment of the URL ends with a specified string. + */ + var querySuffix: String? + + /** + * Matches if the URL (without fragment identifier) contains a specified string. + * Port numbers are stripped from the URL if they match the default port number. + */ + var urlContains: String? + + /** + * Matches if the URL (without fragment identifier) is equal to a specified string. + * Port numbers are stripped from the URL if they match the default port number. + */ + var urlEquals: String? + + /** + * Matches if the URL (without fragment identifier) matches a specified regular expression. + * Port numbers are stripped from the URL if they match the default port number. + * The regular expressions use the RE2 syntax. + * + * @see RE2 syntax + */ + var urlMatches: String? + + /** + * Matches if the URL without query segment and fragment identifier matches a specified regular expression. + * Port numbers are stripped from the URL if they match the default port number. + * The regular expressions use the RE2 syntax. + * + * @see RE2 syntax + */ + var originAndPathMatches: String? + + /** + * Matches if the URL (without fragment identifier) starts with a specified string. + * Port numbers are stripped from the URL if they match the default port number. + */ + var urlPrefix: String? + + /** + * Matches if the URL (without fragment identifier) ends with a specified string. + * Port numbers are stripped from the URL if they match the default port number. + */ + var urlSuffix: String? + + /** + * Matches if the scheme of the URL is equal to any of the schemes specified in the array. + */ + var schemes: Array? + + /** + * Matches if the port of the URL is contained in any of the specified port lists. + * For example [80, 443, [1000, 1200]] matches all requests on port 80, 443 and in the range 1000-1200. + * + * Pass the arguments as Int and Array of Int or IntArray e.g. ports = arrayOf(80, 443, arrayOf(1000, 1200)) + */ + var ports: Array +} \ No newline at end of file diff --git a/base/src/main/kotlin/browser/extensionTypes/CSSOrigin.kt b/base/src/main/kotlin/browser/extensionTypes/CSSOrigin.kt new file mode 100644 index 0000000..80e849d --- /dev/null +++ b/base/src/main/kotlin/browser/extensionTypes/CSSOrigin.kt @@ -0,0 +1,13 @@ +package browser.extensionTypes + +/** + * The origin of injected CSS. + * + * @see origin + */ +enum class CSSOrigin(private val value: String) { + author("author"), + user("user"); + + override fun toString(): String = value +} \ No newline at end of file diff --git a/base/src/main/kotlin/browser/extensionTypes/Constructor.kt b/base/src/main/kotlin/browser/extensionTypes/Constructor.kt new file mode 100644 index 0000000..8f7feff --- /dev/null +++ b/base/src/main/kotlin/browser/extensionTypes/Constructor.kt @@ -0,0 +1,11 @@ +@file:Suppress("UNCHECKED_CAST_TO_EXTERNAL_INTERFACE") + +package browser.extensionTypes + +import browser.extensionTypes.details.DeleteInjectDetails +import browser.extensionTypes.details.ImageDetails +import browser.extensionTypes.details.InjectDetails + +inline fun ImageDetails(block: ImageDetails.() -> Unit) = (js("{}") as ImageDetails).apply(block) +inline fun InjectDetails(block: InjectDetails.() -> Unit) = (js("{}") as InjectDetails).apply(block) +inline fun DeleteInjectDetails(block: DeleteInjectDetails.() -> Unit) = (js("{}") as DeleteInjectDetails).apply(block) \ No newline at end of file diff --git a/base/src/main/kotlin/browser/extensionTypes/DocumentLifecycle.kt b/base/src/main/kotlin/browser/extensionTypes/DocumentLifecycle.kt new file mode 100644 index 0000000..41078ea --- /dev/null +++ b/base/src/main/kotlin/browser/extensionTypes/DocumentLifecycle.kt @@ -0,0 +1,13 @@ +package browser.extensionTypes + +/** + * The document lifecycle of the frame. + */ +enum class DocumentLifecycle(private val value: String) { + prerender("prerender"), + active("active"), + cached("cached"), + pending_deletion("pending_deletion"); + + override fun toString(): String = value +} \ No newline at end of file diff --git a/base/src/main/kotlin/browser/extensionTypes/ExecutionWorld.kt b/base/src/main/kotlin/browser/extensionTypes/ExecutionWorld.kt new file mode 100644 index 0000000..44e2b70 --- /dev/null +++ b/base/src/main/kotlin/browser/extensionTypes/ExecutionWorld.kt @@ -0,0 +1,12 @@ +package browser.extensionTypes + +/** + * The JavaScript world for a script to execute within. + * Can either be an isolated world, unique to this extension, or the main world of the DOM which is shared with the page's JavaScript. + */ +enum class ExecutionWorld(private val value: String) { + ISOLATED("ISOLATED"), + MAIN("MAIN"); + + override fun toString(): String = value +} \ No newline at end of file diff --git a/base/src/main/kotlin/browser/extensionTypes/FrameType.kt b/base/src/main/kotlin/browser/extensionTypes/FrameType.kt new file mode 100644 index 0000000..82ce825 --- /dev/null +++ b/base/src/main/kotlin/browser/extensionTypes/FrameType.kt @@ -0,0 +1,12 @@ +package browser.extensionTypes + +/** + * The type of frame. + */ +enum class FrameType(private val value: String) { + outermost_frame("outermost_frame"), + fenced_frame("fenced_frame"), + sub_frame("sub_frame"); + + override fun toString(): String = value +} \ No newline at end of file diff --git a/base/src/main/kotlin/browser/extensionTypes/ImageFormat.kt b/base/src/main/kotlin/browser/extensionTypes/ImageFormat.kt new file mode 100644 index 0000000..7530fb7 --- /dev/null +++ b/base/src/main/kotlin/browser/extensionTypes/ImageFormat.kt @@ -0,0 +1,11 @@ +package browser.extensionTypes + +/** + * The format of an image. + */ +enum class ImageFormat(private val value: String) { + jpeg("jpeg"), + png("png"); + + override fun toString(): String = value +} \ No newline at end of file diff --git a/base/src/main/kotlin/browser/extensionTypes/RunAt.kt b/base/src/main/kotlin/browser/extensionTypes/RunAt.kt new file mode 100644 index 0000000..5d74bb3 --- /dev/null +++ b/base/src/main/kotlin/browser/extensionTypes/RunAt.kt @@ -0,0 +1,12 @@ +package browser.extensionTypes + +/** + * The soonest that the JavaScript or CSS will be injected into the tab. + */ +enum class RunAt(private val value: String) { + document_start("document_start"), + document_end("documeent_end"), + document_idle("document_idle"); + + override fun toString(): String = value +} \ No newline at end of file diff --git a/base/src/main/kotlin/browser/extensionTypes/details/DeleteInjectDetails.kt b/base/src/main/kotlin/browser/extensionTypes/details/DeleteInjectDetails.kt new file mode 100644 index 0000000..52f00c5 --- /dev/null +++ b/base/src/main/kotlin/browser/extensionTypes/details/DeleteInjectDetails.kt @@ -0,0 +1,50 @@ +@file:JsModule("webextension-polyfill") +@file:JsQualifier("extensionTypes") + +package browser.extensionTypes.details + +import browser.extensionTypes.CSSOrigin + +/** + * Details of the CSS to remove. + * Either the code or the file property must be set, but both may not be set at the same time. + */ +external interface DeleteInjectDetails { + /** + * CSS code to remove. + */ + var code: String? + + /** + * CSS file to remove. + */ + var file: String? + + /** + * If allFrames is true, implies that the CSS should be removed from all frames of current page. + * By default, it's false and is only removed from the top frame. + * If true and frameId is set, then the code is removed from the selected frame and all of its child frames. + */ + var allFrames: Boolean? + + /** + * The frame from where the CSS should be removed. + * Defaults to 0 (the top-level frame). + * + * @see frame + */ + var frameId: Int? + + /** + * If matchAboutBlank is true, then the code is also removed from about:blank and about:srcdoc frames if your extension has access to its parent document. + * By default, it is false. + */ + var matchAboutBlank: Boolean? + + /** + * The origin of the CSS to remove. Defaults to author. + * + * @see origin + */ + var cssOrigin: CSSOrigin? +} \ No newline at end of file diff --git a/base/src/main/kotlin/browser/extensionTypes/details/ImageDetails.kt b/base/src/main/kotlin/browser/extensionTypes/details/ImageDetails.kt new file mode 100644 index 0000000..190f728 --- /dev/null +++ b/base/src/main/kotlin/browser/extensionTypes/details/ImageDetails.kt @@ -0,0 +1,21 @@ +@file:JsModule("webextension-polyfill") +@file:JsQualifier("extensionTypes") + +package browser.extensionTypes.details + +import browser.extensionTypes.ImageFormat + +external interface ImageDetails { + /** + * The format of the resulting image. + * Default is jpeg. + */ + var format: ImageFormat? + + /** + * When format is jpeg, controls the quality of the resulting image. + * This value is ignored for PNG images. + * As quality is decreased, the resulting image will have more visual artifacts, and the number of bytes needed to store it will decrease. + */ + var quality: Int? +} \ No newline at end of file diff --git a/base/src/main/kotlin/browser/extensionTypes/details/InjectDetails.kt b/base/src/main/kotlin/browser/extensionTypes/details/InjectDetails.kt new file mode 100644 index 0000000..4f62ac9 --- /dev/null +++ b/base/src/main/kotlin/browser/extensionTypes/details/InjectDetails.kt @@ -0,0 +1,64 @@ +@file:JsModule("webextension-polyfill") +@file:JsQualifier("extensionTypes") + +package browser.extensionTypes.details + +import browser.extensionTypes.CSSOrigin +import browser.extensionTypes.RunAt + +/** + * Details of the script or CSS to inject. + * Either the code or the file property must be set, but both may not be set at the same time. + */ +external interface InjectDetails { + /** + * JavaScript or CSS code to inject. + * + * Warning: Be careful using the code parameter. + * Incorrect use of it may open your extension to cross site scripting attacks. + * + * @see cross site scripting + */ + var code: String? + + /** + * JavaScript or CSS file to inject. + */ + var file: String? + + /** + * If allFrames is true, implies that the JavaScript or CSS should be injected into all frames of current page. + * By default, it's false and is only injected into the top frame. + * If true and frameId is set, then the code is inserted in the selected frame and all of its child frames. + */ + var allFrames: Boolean? + + /** + * The frame where the script or CSS should be injected. + * Defaults to 0 (the top-level frame). + * + * @see frame + */ + var frameId: Int? + + /** + * If matchAboutBlank is true, then the code is also injected in about:blank and about:srcdoc frames if your extension has access to its parent document. + * Code cannot be inserted in top-level about:-frames. By default it is false. + */ + var matchAboutBlank: Boolean? + + /** + * The soonest that the JavaScript or CSS will be injected into the tab. + * Defaults to document_idle. + */ + var runAt: RunAt? + + /** + * The origin of the CSS to inject. + * This may only be specified for CSS, not JavaScript. + * Defaults to author. + * + * @see origin + */ + var cssOrigin: CSSOrigin? +} \ No newline at end of file diff --git a/base/src/main/kotlin/browser/runtime/Constructor.kt b/base/src/main/kotlin/browser/runtime/Constructor.kt new file mode 100644 index 0000000..11f355f --- /dev/null +++ b/base/src/main/kotlin/browser/runtime/Constructor.kt @@ -0,0 +1,7 @@ +@file:Suppress("UNCHECKED_CAST_TO_EXTERNAL_INTERFACE") + +package browser.runtime + +import browser.runtime.infos.ConnectInfos + +inline fun ConnectInfo(block: ConnectInfos.() -> Unit) = (js("{}") as ConnectInfos).apply(block) \ No newline at end of file diff --git a/base/src/main/kotlin/browser/runtime/Import.kt b/base/src/main/kotlin/browser/runtime/Import.kt new file mode 100644 index 0000000..bc628bf --- /dev/null +++ b/base/src/main/kotlin/browser/runtime/Import.kt @@ -0,0 +1,258 @@ +@file:JsModule("webextension-polyfill") +@file:JsQualifier("runtime") + +package browser.runtime + +import browser.events.Event +import browser.runtime.details.InstalledDetails +import browser.runtime.details.UpdateAvailableDetails +import browser.runtime.infos.ConnectInfos +import browser.runtime.infos.LastErrorInfos +import browser.runtime.infos.PlatformInfos +import browser.runtime.listeners.OnMessageListener +import browser.runtime.listeners.RequestUpdateCheckListener +import browser.runtime.options.SendMessageOptions +import browser.windows.Window +import kotlin.js.Promise + +/** + * This will be defined during an API method callback if there was an error + */ +external var lastError: LastErrorInfos = definedExternally + +/** + * The ID of the extension/app. + */ +external val id: String = definedExternally + +/** + * Retrieves the JavaScript 'window' object for the background page running inside the current extension/app. + * If the background page is an event page, the system will ensure it is loaded before calling the callback. + * If there is no background page, an error is set. + */ +external fun getBackgroundPage(): Promise? + +/** + * Open your Extension's options page, if possible. + * The precise behavior may depend on your manifest's options_ui or options_page key, or what Chrome happens to support at the time. + * For example, the page may be opened in a new tab, within chrome://extensions, within an App, or it may just focus an open options page. + * It will never cause the caller page to reload. + * If your Extension does not declare an options page, or Chrome failed to create one for some other reason, the callback will set lastError + * + * @see options_ui + * @see options_page + */ +external fun openOptionsPage(): Promise? + +/** + * Returns details about the app or extension from the manifest. + * The object returned is a serialization of the full manifest file. + * + * @see manifest file + * @return The manifest details. + */ +external fun getManifest(): Any + +/** + * Converts a relative path within an app/extension install directory to a fully-qualified URL. + * + * @param path A path to a resource within an app/extension expressed relative to its install directory. + * + * @return The fully-qualified URL to the resource. + */ +external fun getURL( + path: String +): String + +/** + * Sets the URL to be visited upon uninstallation. + * This may be used to clean up server-side data, do analytics, and implement surveys. + * Maximum 255 characters. + * + * @param url URL to be opened after the extension is uninstalled. + * This URL must have an http: or https: scheme. + * Set an empty string to not open a new tab upon uninstallation. + */ +external fun setUninstallURL( + url: String +): Promise? + +/** + * Reloads the app or extension. + * This method is not supported in kiosk mode. + * For kiosk mode, use chrome.runtime.restart() method. + */ +external fun reload() + +/** + * Requests an immediate update check be done for this app/extension. + * + * Important: Most extensions/apps should not use this method, since Chrome already does automatic checks every few hours, and you can listen for the runtime.onUpdateAvailable event without needing to call requestUpdateCheck. + * + * This method is only appropriate to call in very limited circumstances, such as if your extension/app talks to a backend service, and the backend service has determined that the client extension/app version is very far out of date and you'd like to prompt a user to update. + * Most other uses of requestUpdateCheck, such as calling it unconditionally based on a repeating timer, probably only serve to waste client, network, and server resources. + */ +external fun requestUpdateCheck(): Promise? + +/** + * Restart the ChromeOS device when the app runs in kiosk mode. + * Otherwise, it's no-op. + */ +external fun restart() + +/** + * Restart the ChromeOS device when the app runs in kiosk mode after the given seconds. + * If called again before the time ends, the reboot will be delayed. + * If called with a value of -1, the reboot will be cancelled. + * It's a no-op in non-kiosk mode. + * It's only allowed to be called repeatedly by the first extension to invoke this API. + */ +external fun restartAfterDelay( + seconds: Int +): Promise? + +/** + * Attempts to connect to connect listeners within an extension/app (such as the background page), or other extensions/apps. + * This is useful for content scripts connecting to their extension processes, inter-app/extension communication, and web messaging. + * Note that this does not connect to any listeners in a content script. + * Extensions may connect to content scripts embedded in tabs via tabs.connect. + * + * @see web messaging + * @return Port through which messages can be sent and received. + * The port's Port onDisconnect event is fired if the extension/app does not exist. + */ +external fun connect( + extensionId: String? = definedExternally, + connectInfo: ConnectInfos? = definedExternally +): Port? + +/** + * Connects to a native application in the host machine. + * See Native Messaging for more information. + * + * @param application The name of the registered application to connect to. + * + * @see Native Messaging + */ +external fun connectNative( + application: String +): Port? + +/** + * Sends a single message to event listeners within your extension/app or a different extension/app. + * Similar to runtime.connect but only sends a single message, with an optional response. + * If sending to your extension, the runtime.onMessage event will be fired in every frame of your extension (except for the sender's frame), or $(ref:runtime.onMessageExternal), if a different extension. + * Note that extensions cannot send messages to content scripts using this method. + * To send messages to content scripts, use tabs.sendMessage. + * + * @param extensionId The ID of the extension/app to send the message to. + * If omitted, the message will be sent to your own extension/app. + * Required if sending messages from a web page for web messaging. + * @param message The message to send. This message should be a JSON-ifiable object. + * + * @see web messaging + * @return The JSON response object sent by the handler of the message. + * If an error occurs while connecting to the extension, the callback will be called with no arguments and runtime.lastError will be set to the error message. + */ +external fun sendMessage( + extensionId: String? = definedExternally, + message: Any, + options: SendMessageOptions? = definedExternally +): Promise? + +/** + * Send a single message to a native application. + * + * @param application The name of the native messaging host. + * @param message The message that will be passed to the native messaging host. + * + * @return The response message sent by the native messaging host. + * If an error occurs while connecting to the native messaging host, the callback will be called with no arguments and runtime.lastError will be set to the error message. + */ +external fun sendNativeMessage( + application: String, + message: Any +): Promise? + +/** + * Returns information about the current platform. + */ +external fun getPlatformInfo(): Promise? + +/** + * Returns a DirectoryEntry for the package directory. + */ +external fun getPackageDirectoryEntry(): Promise? // ToDo("replace with directory entry if ever existing") + +/** + * Fired when a profile that has this extension installed first starts up. + * This event is not fired when an incognito profile is started, even if this extension is operating in 'split' incognito mode. + */ +external val onStartup: Event = definedExternally + +/** + * Fired when the extension is first installed, when the extension is updated to a new version, and when Chrome is updated to a new version. + */ +external val onInstalled: Event = definedExternally + +/** + * Sent to the event page just before it is unloaded. + * This gives the extension opportunity to do some clean up. + * Note that since the page is unloading, any asynchronous operations started while handling this event are not guaranteed to complete. + * If more activity for the event page occurs before it gets unloaded the onSuspendCanceled event will be sent and the page won't be unloaded. + */ +external val onSuspend: Event = definedExternally + +/** + * Sent after onSuspend to indicate that the app won't be unloaded after all. + */ +external val onSuspendCanceled: Event = definedExternally + +/** + * Fired when an update is available, but isn't installed immediately because the app is currently running. + * If you do nothing, the update will be installed the next time the background page gets unloaded, if you want it to be installed sooner you can explicitly call chrome.runtime.reload(). + * If your extension is using a persistent background page, the background page of course never gets unloaded, so unless you call chrome.runtime.reload() manually in response to this event the update will not get installed until the next time Chrome itself restarts. + * If no handlers are listening for this event, and your extension has a persistent background page, it behaves as if chrome.runtime.reload() is called in response to this event. + */ +external val onUpdateAvailable: Event = definedExternally + +/** + * Fired when a Chrome update is available, but isn't installed immediately because a browser restart is required. + */ +@Deprecated("Please use runtime.onRestartRequired.", level = DeprecationLevel.WARNING) +external val onBrowserUpdateAvailable: Event = definedExternally + +/** + * Fired when a connection is made from either an extension process or a content script (by runtime.connect). + */ +external val onConnect: Event = definedExternally + +/** + * Fired when a connection is made from another extension (by runtime.connect). + */ +external val onConnectExternal: Event = definedExternally + +/** + * Fired when a connection is made from a native application. + * Currently only supported on Chrome OS. + */ +external val onConnectNative: Event = definedExternally + +/** + * Fired when a message is sent from either an extension process (by runtime.sendMessage) or a content script (by tabs.sendMessage). + */ +external val onMessage: Event = definedExternally + +/** + * Fired when a message is sent from another extension/app (by runtime.sendMessage). + * Cannot be used in a content script. + */ +external val onMessageExternal: Event = definedExternally + +/** + * Fired when an app or the device that it runs on needs to be restarted. + * The app should close all its windows at its earliest convenient time to let the restart to happen. + * If the app does nothing, a restart will be enforced after a 24-hour grace period has passed. + * Currently, this event is only fired for Chrome OS kiosk apps. + */ +external val onRestartRequired: Event = definedExternally \ No newline at end of file diff --git a/base/src/main/kotlin/browser/runtime/MessageSender.kt b/base/src/main/kotlin/browser/runtime/MessageSender.kt new file mode 100644 index 0000000..febaf9b --- /dev/null +++ b/base/src/main/kotlin/browser/runtime/MessageSender.kt @@ -0,0 +1,78 @@ +@file:JsModule("webextension-polyfill") +@file:JsQualifier("runtime") + +package browser.runtime + +import browser.extensionTypes.DocumentLifecycle +import browser.tabs.Tab + +/** + * An object containing information about the script context that sent a message or request. + */ +external interface MessageSender { + /** + * The tabs.Tab which opened the connection, if any. + * This property will only be present when the connection was opened from a tab (including content scripts), and only if the receiver is an extension, not an app. + */ + var tab: Tab? + + /** + * The frame that opened the connection. + * 0 for top-level frames, positive for child frames. + * This will only be set when tab is set. + * + * @see frame + */ + var frameId: Int? + + /** + * The guest process id of the requesting webview, if available. + * Only available for component extensions. + */ + var guestProcessId: Int? + + /** + * The guest render frame routing id of the requesting webview, if available. + * Only available for component extensions. + */ + var guestRenderFrameRoutingId: Int? + + /** + * The ID of the extension or app that opened the connection, if any. + */ + var id: String? + + /** + * The URL of the page or frame that opened the connection. + * If the sender is in an iframe, it will be iframe's URL not the URL of the page which hosts it. + */ + var url: String? + + /** + * The name of the native application that opened the connection, if any. + */ + var nativeApplication: String? + + /** + * The TLS channel ID of the page or frame that opened the connection, if requested by the extension or app, and if available. + */ + var tlsChannelId: String? + + /** + * The origin of the page or frame that opened the connection. + * It can vary from the url property (e.g., about:blank) or can be opaque (e.g., sandboxed iframes). + * This is useful for identifying if the origin can be trusted if we can't immediately tell from the URL. + */ + var origin: String? + + /** + * A UUID of the document that opened the connection. + */ + var documentId: String? + + /** + * The lifecycle the document that opened the connection is in at the time the port was created. + * Note that the lifecycle state of the document may have changed since port creation. + */ + var documentLifecycle: String? +} \ No newline at end of file diff --git a/base/src/main/kotlin/browser/runtime/OnInstalledReason.kt b/base/src/main/kotlin/browser/runtime/OnInstalledReason.kt new file mode 100644 index 0000000..867e175 --- /dev/null +++ b/base/src/main/kotlin/browser/runtime/OnInstalledReason.kt @@ -0,0 +1,13 @@ +package browser.runtime + +/** + * The reason that this event is being dispatched. + */ +enum class OnInstalledReason(private val value: String) { + install("install"), + update("update"), + chrome_update("chrome_update"), + shared_module_update("shared_module_update"); + + override fun toString(): String = value +} \ No newline at end of file diff --git a/base/src/main/kotlin/browser/runtime/OnRestartRequiredReason.kt b/base/src/main/kotlin/browser/runtime/OnRestartRequiredReason.kt new file mode 100644 index 0000000..d5a032b --- /dev/null +++ b/base/src/main/kotlin/browser/runtime/OnRestartRequiredReason.kt @@ -0,0 +1,15 @@ +package browser.runtime + +/** + * The reason that the event is being dispatched. + * 'app_update' is used when the restart is needed because the application is updated to a newer version. + * 'os_update' is used when the restart is needed because the browser/OS is updated to a newer version. + * 'periodic' is used when the system runs for more than the permitted uptime set in the enterprise policy. + */ +enum class OnRestartRequiredReason(private val value: String) { + app_update("app_update"), + os_update("os_update"), + periodic("periodic"); + + override fun toString(): String = value +} \ No newline at end of file diff --git a/base/src/main/kotlin/browser/runtime/PlatformArch.kt b/base/src/main/kotlin/browser/runtime/PlatformArch.kt new file mode 100644 index 0000000..5dd12ef --- /dev/null +++ b/base/src/main/kotlin/browser/runtime/PlatformArch.kt @@ -0,0 +1,15 @@ +package browser.runtime + +/** + * he machine's processor architecture. + */ +enum class PlatformArch(private val value: String) { + arm("arm"), + arm64("arm64"), + x86_32("x86-32"), + x86_64("x86-64"), + mips("mips"), + mips64("mips64"); + + override fun toString(): String = value +} \ No newline at end of file diff --git a/base/src/main/kotlin/browser/runtime/PlatformNaclArch.kt b/base/src/main/kotlin/browser/runtime/PlatformNaclArch.kt new file mode 100644 index 0000000..ea39fd9 --- /dev/null +++ b/base/src/main/kotlin/browser/runtime/PlatformNaclArch.kt @@ -0,0 +1,15 @@ +package browser.runtime + +/** + * The native client architecture. + * This may be different from arch on some platforms. + */ +enum class PlatformNaclArch(private val value: String) { + arm("arm"), + x86_32("x86-32"), + x86_64("x86-64"), + mips("mips"), + mips64("mips64"); + + override fun toString(): String = value +} \ No newline at end of file diff --git a/base/src/main/kotlin/browser/runtime/PlatformOs.kt b/base/src/main/kotlin/browser/runtime/PlatformOs.kt new file mode 100644 index 0000000..7548e6f --- /dev/null +++ b/base/src/main/kotlin/browser/runtime/PlatformOs.kt @@ -0,0 +1,16 @@ +package browser.runtime + +/** + * The operating system Chrome is running on. + */ +enum class PlatformOs(private val value: String) { + mac("mac"), + win("win"), + android("android"), + cros("cros"), + linux("linux"), + openbsd("openbsd"), + fuchsia("fuchsia"); + + override fun toString(): String = value +} \ No newline at end of file diff --git a/base/src/main/kotlin/browser/runtime/Port.kt b/base/src/main/kotlin/browser/runtime/Port.kt new file mode 100644 index 0000000..5d3e546 --- /dev/null +++ b/base/src/main/kotlin/browser/runtime/Port.kt @@ -0,0 +1,55 @@ +@file:JsModule("webextension-polyfill") +@file:JsQualifier("runtime") + +package browser.runtime + +import browser.events.Event +import browser.runtime.listeners.MessageListener + +/** + * An object which allows two way communication with other pages. + * See Long-lived connections for more information. + * + * @see Long-lived connections + */ +external interface Port { + /** + * The name of the port, as specified in the call to runtime.connect. + */ + var name: String + + /** + * Immediately disconnect the port. + * Calling disconnect() on an already-disconnected port has no effect. + * When a port is disconnected, no new events will be dispatched to this port. + */ + fun disconnect() + + /** + * Send a message to the other end of the port. + * If the port is disconnected, an error is thrown. + * + * @param message The message to send. This object should be JSON-ifiable. + */ + fun postMessage(message: Any) + + /** + * This property will only be present on ports passed to runtime.onConnect / runtime.onConnectExternal / runtime.onConnectExternal listeners. + */ + var sender: MessageSender? + + /** + * Fired when the port is disconnected from the other end(s). + * runtime.lastError may be set if the port was disconnected by an error. + * If the port is closed via Port.disconnect [disconnect], then this event is only fired on the other end. + * This event is fired at most once (see also Port lifetime). + * + * @see Port lifetime + */ + var onDisconnect: Event + + /** + * This event is fired when Port.postMessage [postMessage] is called by the other end of the port. + */ + var onMessage: Event +} \ No newline at end of file diff --git a/base/src/main/kotlin/browser/runtime/RequestUpdateCheckStatus.kt b/base/src/main/kotlin/browser/runtime/RequestUpdateCheckStatus.kt new file mode 100644 index 0000000..79bcce7 --- /dev/null +++ b/base/src/main/kotlin/browser/runtime/RequestUpdateCheckStatus.kt @@ -0,0 +1,12 @@ +package browser.runtime + +/** + * Result of the update check. + */ +enum class RequestUpdateCheckStatus(private val value: String) { + throttled("throttled"), + no_update("no_update"), + update_available("update_available"); + + override fun toString(): String = value +} \ No newline at end of file diff --git a/base/src/main/kotlin/browser/runtime/details/InstalledDetails.kt b/base/src/main/kotlin/browser/runtime/details/InstalledDetails.kt new file mode 100644 index 0000000..9efda86 --- /dev/null +++ b/base/src/main/kotlin/browser/runtime/details/InstalledDetails.kt @@ -0,0 +1,25 @@ +@file:JsModule("webextension-polyfill") +@file:JsQualifier("runtime") + +package browser.runtime.details + +import browser.runtime.OnInstalledReason + +external interface InstalledDetails { + /** + * The reason that this event is being dispatched. + */ + var reason: OnInstalledReason? + + /** + * Indicates the previous version of the extension, which has just been updated. + * This is present only if 'reason' is 'update'. + */ + var previousVersion: String? + + /** + * Indicates the ID of the imported shared module extension which updated. + * This is present only if 'reason' is 'shared_module_update'. + */ + var id: String? +} \ No newline at end of file diff --git a/base/src/main/kotlin/browser/runtime/details/RequestUpdateCheckDetails.kt b/base/src/main/kotlin/browser/runtime/details/RequestUpdateCheckDetails.kt new file mode 100644 index 0000000..d64863f --- /dev/null +++ b/base/src/main/kotlin/browser/runtime/details/RequestUpdateCheckDetails.kt @@ -0,0 +1,14 @@ +@file:JsModule("webextension-polyfill") +@file:JsQualifier("runtime") + +package browser.runtime.details + +/** + * If an update is available, this contains more information about the available update. + */ +external interface RequestUpdateCheckDetails { + /** + * The version of the available update. + */ + val version: String? +} \ No newline at end of file diff --git a/base/src/main/kotlin/browser/runtime/details/UpdateAvailableDetails.kt b/base/src/main/kotlin/browser/runtime/details/UpdateAvailableDetails.kt new file mode 100644 index 0000000..c58653b --- /dev/null +++ b/base/src/main/kotlin/browser/runtime/details/UpdateAvailableDetails.kt @@ -0,0 +1,15 @@ +@file:JsModule("webextension-polyfill") +@file:JsQualifier("runtime") + +package browser.runtime.details + +/** + * The manifest details of the available update. + */ +external interface UpdateAvailableDetails { + + /** + * The version number of the available update. + */ + var version: String? +} \ No newline at end of file diff --git a/base/src/main/kotlin/browser/runtime/infos/ConnectInfos.kt b/base/src/main/kotlin/browser/runtime/infos/ConnectInfos.kt new file mode 100644 index 0000000..5dc3044 --- /dev/null +++ b/base/src/main/kotlin/browser/runtime/infos/ConnectInfos.kt @@ -0,0 +1,16 @@ +@file:JsModule("webextension-polyfill") +@file:JsQualifier("runtime") + +package browser.runtime.infos + +external interface ConnectInfos { + /** + * Will be passed into onConnect for processes that are listening for the connection event. + */ + var name: String? + + /** + * Whether the TLS channel ID will be passed into onConnectExternal for processes that are listening for the connection event. + */ + var includeTlsChannelId: Boolean? +} \ No newline at end of file diff --git a/base/src/main/kotlin/browser/runtime/infos/LastErrorInfos.kt b/base/src/main/kotlin/browser/runtime/infos/LastErrorInfos.kt new file mode 100644 index 0000000..270b92f --- /dev/null +++ b/base/src/main/kotlin/browser/runtime/infos/LastErrorInfos.kt @@ -0,0 +1,14 @@ +@file:JsModule("webextension-polyfill") +@file:JsQualifier("runtime") + +package browser.runtime.infos + +/** + * This will be defined during an API method callback if there was an error + */ +external interface LastErrorInfos { + /** + * Details about the error which occurred. + */ + var message: String? +} \ No newline at end of file diff --git a/base/src/main/kotlin/browser/runtime/infos/PlatformInfos.kt b/base/src/main/kotlin/browser/runtime/infos/PlatformInfos.kt new file mode 100644 index 0000000..31c1668 --- /dev/null +++ b/base/src/main/kotlin/browser/runtime/infos/PlatformInfos.kt @@ -0,0 +1,29 @@ +@file:JsModule("webextension-polyfill") +@file:JsQualifier("runtime") + +package browser.runtime.infos + +import browser.runtime.PlatformArch +import browser.runtime.PlatformNaclArch +import browser.runtime.PlatformOs + +/** + * An object containing information about the current platform. + */ +external interface PlatformInfos { + /** + * The operating system Chrome is running on. + */ + var os: PlatformOs? + + /** + * The machine's processor architecture. + */ + var arch: PlatformArch? + + /** + * The native client architecture. + * This may be different from arch on some platforms. + */ + var nacl_arch: PlatformNaclArch? +} \ No newline at end of file diff --git a/base/src/main/kotlin/browser/runtime/listeners/MessageListener.kt b/base/src/main/kotlin/browser/runtime/listeners/MessageListener.kt new file mode 100644 index 0000000..5ad3b93 --- /dev/null +++ b/base/src/main/kotlin/browser/runtime/listeners/MessageListener.kt @@ -0,0 +1,18 @@ +@file:JsModule("webextension-polyfill") +@file:JsQualifier("runtime") + +package browser.runtime.listeners + +import browser.runtime.Port + +external interface MessageListener { + /** + * The message received on the port. + */ + val message: Any + + /** + * The port that received the message. + */ + val port: Port +} \ No newline at end of file diff --git a/base/src/main/kotlin/browser/runtime/listeners/OnMessageListener.kt b/base/src/main/kotlin/browser/runtime/listeners/OnMessageListener.kt new file mode 100644 index 0000000..7cdebab --- /dev/null +++ b/base/src/main/kotlin/browser/runtime/listeners/OnMessageListener.kt @@ -0,0 +1,23 @@ +@file:JsModule("webextension-polyfill") +@file:JsQualifier("runtime") + +package browser.runtime.listeners + +import browser.runtime.MessageSender + +external interface OnMessageListener { + /** + * The message sent by the calling script. + */ + val message: Any? + + val sender: MessageSender? + + /** + * Function to call (at most once) when you have a response. + * The argument should be any JSON-ifiable object. + * If you have more than one onMessage listener in the same document, then only one may send a response. + * This function becomes invalid when the event listener returns, unless you return true from the event listener to indicate you wish to send a response asynchronously (this will keep the message channel open to the other end until sendResponse is called). + */ + val sendResponse: (Any) -> Unit +} \ No newline at end of file diff --git a/base/src/main/kotlin/browser/runtime/listeners/RequestUpdateCheckListener.kt b/base/src/main/kotlin/browser/runtime/listeners/RequestUpdateCheckListener.kt new file mode 100644 index 0000000..d535d7d --- /dev/null +++ b/base/src/main/kotlin/browser/runtime/listeners/RequestUpdateCheckListener.kt @@ -0,0 +1,19 @@ +@file:JsModule("webextension-polyfill") +@file:JsQualifier("runtime") + +package browser.runtime.listeners + +import browser.runtime.RequestUpdateCheckStatus +import browser.runtime.details.RequestUpdateCheckDetails + +external interface RequestUpdateCheckListener { + /** + * Result of the update check. + */ + val status: RequestUpdateCheckStatus + + /** + * If an update is available, this contains more information about the available update. + */ + val details: RequestUpdateCheckDetails? +} \ No newline at end of file diff --git a/base/src/main/kotlin/browser/runtime/options/SendMessageOptions.kt b/base/src/main/kotlin/browser/runtime/options/SendMessageOptions.kt new file mode 100644 index 0000000..39fccc9 --- /dev/null +++ b/base/src/main/kotlin/browser/runtime/options/SendMessageOptions.kt @@ -0,0 +1,11 @@ +@file:JsModule("webextension-polyfill") +@file:JsQualifier("runtime") + +package browser.runtime.options + +external interface SendMessageOptions { + /** + * Whether the TLS channel ID will be passed into onMessageExternal for processes that are listening for the connection event. + */ + var includeTlsChannelId: Boolean? +} \ No newline at end of file diff --git a/base/src/main/kotlin/browser/tabs/Constructor.kt b/base/src/main/kotlin/browser/tabs/Constructor.kt new file mode 100644 index 0000000..2d5d8c8 --- /dev/null +++ b/base/src/main/kotlin/browser/tabs/Constructor.kt @@ -0,0 +1,22 @@ +@file:Suppress("UNCHECKED_CAST_TO_EXTERNAL_INTERFACE") + +package browser.tabs + +import browser.tabs.infos.ConnectInfos +import browser.tabs.infos.HighlightInfos +import browser.tabs.infos.QueryInfos +import browser.tabs.options.GroupOptions +import browser.tabs.options.MessageOptions +import browser.tabs.properties.* + +inline fun ConnectInfo(block: ConnectInfos.() -> Unit) = (js("{}") as ConnectInfos).apply(block) +inline fun MessageOption(block: MessageOptions.() -> Unit) = (js("{}") as MessageOptions).apply(block) +inline fun CreateProperty(block: CreateProperties.() -> Unit) = (js("{}") as CreateProperties).apply(block) +inline fun QueryInfo(block: QueryInfos.() -> Unit) = (js("{}") as QueryInfos).apply(block) +inline fun HighlightInfo(block: HighlightInfos.() -> Unit) = (js("{}") as HighlightInfos).apply(block) +inline fun UpdateProperty(block: UpdateProperties.() -> Unit) = (js("{}") as UpdateProperties).apply(block) +inline fun MoveProperty(block: MoveProperties.() -> Unit) = (js("{}") as MoveProperties).apply(block) +inline fun ReloadProperty(block: ReloadProperties.() -> Unit) = (js("{}") as ReloadProperties).apply(block) +inline fun GroupOption(block: GroupOptions.() -> Unit) = (js("{}") as GroupOptions).apply(block) +inline fun CreateGroupProperty(block: CreateGroupProperties.() -> Unit) = (js("{}") as CreateGroupProperties).apply(block) +inline fun ZoomSettings(block: ZoomSettings.() -> Unit) = (js("{}") as ZoomSettings).apply(block) \ No newline at end of file diff --git a/base/src/main/kotlin/browser/tabs/Import.kt b/base/src/main/kotlin/browser/tabs/Import.kt new file mode 100644 index 0000000..079c1a3 --- /dev/null +++ b/base/src/main/kotlin/browser/tabs/Import.kt @@ -0,0 +1,457 @@ +@file:JsModule("webextension-polyfill") +@file:JsQualifier("tabs") + +package browser.tabs + +import browser.events.Event +import browser.extensionTypes.details.DeleteInjectDetails +import browser.extensionTypes.details.ImageDetails +import browser.extensionTypes.details.InjectDetails +import browser.runtime.Port +import browser.tabs.infos.* +import browser.tabs.listeners.* +import browser.tabs.options.GroupOptions +import browser.tabs.options.MessageOptions +import browser.tabs.properties.CreateProperties +import browser.tabs.properties.MoveProperties +import browser.tabs.properties.ReloadProperties +import browser.tabs.properties.UpdateProperties +import browser.windows.Window +import kotlin.js.Promise + +/** + * The maximum number of times that captureVisibleTab can be called per second. + * captureVisibleTab is expensive and should not be called too often. + */ +external val MAX_CAPTURE_VISIBLE_TAB_CALLS_PER_SECOND: Number + +/** + * An ID that represents the absence of a browser tab. + */ +external val TAB_ID_NONE: Number + +/** + * Retrieves details about the specified tab. + */ +external fun get( + tabId: Int +): Promise? + +/** + * Gets the tab that this script call is being made from. + * May be undefined if called from a non-tab context (for example, a background page or popup view). + */ +external fun getCurrent(): Promise? + +/** + * Connects to the content script(s) in the specified tab. + * The runtime.onConnect event is fired in each content script running in the specified tab for the current extension. + * For more details, see Content Script Messaging. + * + * @see Content Script Messaging + * @return A port that can be used to communicate with the content scripts running in the specified tab. + * The port's runtime.Port event is fired if the tab closes or does not exist. + */ +external fun connect( + tabId: Int, + connectInfo: ConnectInfos? = definedExternally +): Promise? + +/** + * Sends a single request to the content script(s) in the specified tab, with an optional callback to run when a response is sent back. + * The extension.onRequest event is fired in each content script running in the specified tab for the current extension. + * + * @return The JSON response object sent by the handler of the request. + * If an error occurs while connecting to the specified tab, the callback is called with no arguments and runtime.lastError is set to the error message. + */ +@Deprecated("Please use runtime.sendMessage", level = DeprecationLevel.WARNING) +external fun sendRequest( + tabId: Int, + request: Any +): Promise? + +/** + * Sends a single message to the content script(s) in the specified tab, with an optional callback to run when a response is sent back. + * The runtime.onMessage event is fired in each content script running in the specified tab for the current extension. + * + * @param message The message to send. This message should be a JSON-ifiable object. + * + * @return The JSON response object sent by the handler of the message. + * If an error occurs while connecting to the specified tab, the callback is called with no arguments and runtime.lastError is set to the error message. + */ +external fun sendMessage( + tabId: Int, + message: Any, + options: MessageOptions? = definedExternally +): Promise? + +/** + * Gets the tab that is selected in the specified window. + * + * @param windowId Defaults to the current window. + * + * @see current window + */ +@Deprecated("Please use tabs.query {active: true}.", level = DeprecationLevel.WARNING) +external fun getSelected( + windowId: Int? = definedExternally +): Promise? + +/** + * Gets details about all tabs in the specified window. + * + * @param windowId Defaults to the current window. + * + * @see current window + */ +@Deprecated("Please use tabs.query {windowId: windowId}.", level = DeprecationLevel.WARNING) +external fun getAllInWindow( + windowId: Int? = definedExternally +): Promise?>? + +/** + * Creates a new tab. + * + * @return The created tab. + */ +external fun create( + createProperties: CreateProperties +): Promise? + +/** + * Duplicates a tab. + * + * @param tabId The ID of the tab to duplicate. + * + * @return Details about the duplicated tab. + * The tabs.Tab object does not contain url, pendingUrl, title, and favIconUrl if the tabs permission has not been requested. + */ +external fun duplicate( + tabId: Int +): Promise? + +/** + * Gets all tabs that have the specified properties, or all tabs if no properties are specified. + */ +external fun query( + queryInfo: QueryInfos +): Promise?>? + +/** + * Highlights the given tabs and focuses on the first of group. + * Will appear to do nothing if the specified tab is currently active. + * + * @return Contains details about the window whose tabs were highlighted. + */ +external fun highlight( + highlightInfo: HighlightInfos +): Promise? + +/** + * Modifies the properties of a tab. + * Properties that are not specified in [updateProperties] are not modified. + * + * @return Details about the updated tab. + * The tabs.Tab object does not contain url, pendingUrl, title, and favIconUrl if the tabs permission has not been requested. + */ +external fun update( + tabId: Int? = definedExternally, + updateProperties: UpdateProperties +): Promise? + +/** + * Moves one or more tabs to a new position within its window, or to a new window. + * Note that tabs can only be moved to and from normal (window.type === \"normal\") windows. + * + * @param tabIds The tab ID or list of tab IDs to move. + * + * @return Details about the moved tabs. + * Either instance of Tab or array of Tab + */ +external fun move( + tabIds: Any, + moveProperties: MoveProperties +): Promise? + +/** + * Reload a tab. + * + * @param tabId The ID of the tab to reload; defaults to the selected tab of the current window. + */ +external fun reload( + tabId: Int? = definedExternally, + reloadProperties: ReloadProperties? = definedExternally +): Promise? + +/** + * Closes one or more tabs. + * + * @param tabIds The tab ID or list of tab IDs to move. + */ +external fun remove( + tabIds: Any +): Promise? + +/** + * Adds one or more tabs to a specified group, or if no group is specified, adds the given tabs to a newly created group. + * + * @return The ID of the group that the tabs were added to. + */ +external fun group( + options: GroupOptions +): Promise? + +/** + * Removes one or more tabs from their respective groups. + * If any groups become empty, they are deleted. + * + * @param tabIds The tab ID or list of tab IDs to remove from their respective groups. + */ +external fun ungroup( + tabIds: Any +): Promise? + +/** + * Detects the primary language of the content in a tab. + * + * @param tabId Defaults to the active tab of the current window. + * + * @see current window + * @return An ISO language code such as en or fr. + * For a complete list of languages supported by this method, see kLanguageInfoTable. + * The second to fourth columns are checked and the first non-NULL value is returned, except for Simplified Chinese for which zh-CN is returned. + * For an unknown/undefined language, und is returned. + */ +external fun detectLanguage( + tabId: Int? = definedExternally +): Promise? + +/** + * Captures the visible area of the currently active tab in the specified window. + * In order to call this method, the extension must have either the all_urls permission or the activeTab permission. + * In addition to sites that extensions can normally access, this method allows extensions to capture sensitive sites that are otherwise restricted, including chrome:-scheme pages, other extensions' pages, and data: URLs. + * These sensitive sites can only be captured with the activeTab permission. + * File URLs may be captured only if the extension has been granted file access. + * + * @param windowId The target window. Defaults to the current window. + * + * @see current window + * @return A data URL that encodes an image of the visible area of the captured tab. + * May be assigned to the 'src' property of an HTML img element for display. + */ +external fun captureVisibleTab( + windowId: Int? = definedExternally, + options: ImageDetails? = definedExternally +): Promise? + +/** + * Injects JavaScript code into a page. + * For details, see the programmatic injection section of the content scripts doc. + * + * @param tabId The ID of the tab in which to run the script; defaults to the active tab of the current window. + * @param details Details of the script to run. + * Either the code or the file property must be set, but both may not be set at the same time. + * + * @see programmatic injection + * @return Called after all the JavaScript has been executed. + * The result of the script in every injected frame. + */ +@Deprecated("Replaced by scripting.executeScript in Manifest V3.", level = DeprecationLevel.WARNING) +external fun executeScript( + tabId: Int? = definedExternally, + details: InjectDetails +): Promise?>? + +/** + * Injects CSS into a page. + * Styles inserted with this method can be removed with scripting.removeCSS. + * For details, see the programmatic injection section of the content scripts doc. + * + * @param tabId The ID of the tab in which to insert the CSS; defaults to the active tab of the current window. + * @param details Details of the CSS text to insert. + * Either the code or the file property must be set, but both may not be set at the same time. + * + * @see programmatic injection + * @return Called when all the CSS has been inserted. + */ +@Deprecated("Replaced by scripting.insertCSS in Manifest V3.", level = DeprecationLevel.WARNING) +external fun insertCSS( + tabId: Int? = definedExternally, + details: InjectDetails +): Promise? + +/** + * Removes from a page CSS that was previously injected by a call to scripting.insertCSS. + * + * @param tabId The ID of the tab from which to remove the CSS; defaults to the active tab of the current window. + * @param details Details of the CSS text to remove. + * Either the code or the file property must be set, but both may not be set at the same time. + * + * @return Called when all the CSS has been removed. + */ +@Deprecated("Replaced by scripting.removeCSS in Manifest V3.", level = DeprecationLevel.WARNING) +external fun removeCSS( + tabId: Int? = definedExternally, + details: DeleteInjectDetails +): Promise? + +/** + * Zooms a specified tab. + * + * @param tabId The ID of the tab to zoom; defaults to the active tab of the current window. + * @param zoomFactor The new zoom factor. + * A value of 0 sets the tab to its current default zoom factor. + * Values greater than 0 specify a (possibly non-default) zoom factor for the tab. + * + * @return Called after the zoom factor has been changed. + */ +external fun setZoom( + tabId: Int? = definedExternally, + zoomFactor: Number +): Promise? + +/** + * Gets the current zoom factor of a specified tab. + * + * @param tabId The ID of the tab to get the current zoom factor from; defaults to the active tab of the current window. + * + * @return Called with the tab's current zoom factor after it has been fetched. + * The tab's current zoom factor. + */ +external fun getZoom( + tabId: Int? = definedExternally +): Promise? + +/** + * Sets the zoom settings for a specified tab, which define how zoom changes are handled. + * These settings are reset to defaults upon navigating the tab. + * + * @param tabId The ID of the tab to change the zoom settings for; defaults to the active tab of the current window. + * @param zoomSettings Defines how zoom changes are handled and at what scope. + * + * @return Called after the zoom settings are changed. + */ +external fun setZoomSettings( + tabId: Int? = definedExternally, + zoomSettings: ZoomSettings +): Promise? + +/** + * Gets the current zoom settings of a specified tab. + * + * @param tabId The ID of the tab to get the current zoom settings from; defaults to the active tab of the current window. + * + * @return Called with the tab's current zoom settings. + * The tab's current zoom settings. + */ +external fun getZoomSettings( + tabId: Int? = definedExternally, +): Promise? + +/** + * Discards a tab from memory. + * Discarded tabs are still visible on the tab strip and are reloaded when activated. + * + * @param tabId The ID of the tab to be discarded. + * If specified, the tab is discarded unless it is active or already discarded. + * If omitted, the browser discards the least important tab. + * This can fail if no discardable tabs exist. + * + * @return Called after the operation is completed. + * The discarded tab, if it was successfully discarded; undefined otherwise. + */ +external fun discard( + tabId: Int? = definedExternally +): Promise? + +/** + * Go forward to the next page, if one is available. + * + * @param tabId The ID of the tab to navigate forward; defaults to the selected tab of the current window. + */ +external fun goForward( + tabId: Int? = definedExternally +): Promise? + +/** + * Go back to the previous page, if one is available. + * + * @param tabId The ID of the tab to navigate back; defaults to the selected tab of the current window. + */ +external fun goBack( + tabId: Int? = definedExternally +): Promise? + +/** + * Fired when a tab is created. + * Note that the tab's URL and tab group membership may not be set at the time this event is fired, but you can listen to onUpdated events so as to be notified when a URL is set or the tab is added to a tab group. + */ +external val onCreated: Event = definedExternally + +/** + * Fired when a tab is updated. + */ +external val onUpdated: Event = definedExternally + +/** + * Fired when a tab is moved within a window. + * Only one move event is fired, representing the tab the user directly moved. + * Move events are not fired for the other tabs that must move in response to the manually-moved tab. + * This event is not fired when a tab is moved between windows; for details, see tabs.onDetached. + */ +external val onMoved: Event = definedExternally + +/** + * Fires when the selected tab in a window changes. + */ +@Deprecated("Please use tabs.onActivated.", level = DeprecationLevel.WARNING) +external val onSelectionChanged: Event = definedExternally + +/** + * Fires when the selected tab in a window changes. + * Note that the tab's URL may not be set at the time this event fired, but you can listen to tabs.onUpdated events so as to be notified when a URL is set. + */ +@Deprecated("Please use tabs.onActivated.", level = DeprecationLevel.WARNING) +external val onActiveChanged: Event = definedExternally + +/** + * Fires when the active tab in a window changes. + * Note that the tab's URL may not be set at the time this event fired, but you can listen to onUpdated events so as to be notified when a URL is set. + */ +external val onActivated: Event = definedExternally + +/** + * Fired when the highlighted or selected tabs in a window changes. + */ +@Deprecated("Please use tabs.onHighlighted.", level = DeprecationLevel.WARNING) +external val onHighlightChanged: Event = definedExternally + +/** + * Fired when the highlighted or selected tabs in a window changes. + */ +external val onHighlighted: Event = definedExternally + +/** + * Fired when a tab is detached from a window; for example, because it was moved between windows. + */ +external val onDetached: Event = definedExternally + +/** + * Fired when a tab is attached to a window; for example, because it was moved between windows. + */ +external val onAttached: Event = definedExternally + +/** + * Fired when a tab is closed. + */ +external val onRemoved: Event = definedExternally + +/** + * Fired when a tab is replaced with another tab due to prerendering or instant. + */ +external val onReplaced: Event = definedExternally + +/** + * Fired when a tab is zoomed. + */ +external val onZoomChange: Event = definedExternally \ No newline at end of file diff --git a/base/src/main/kotlin/browser/tabs/MutedInfoReason.kt b/base/src/main/kotlin/browser/tabs/MutedInfoReason.kt new file mode 100644 index 0000000..58e28e3 --- /dev/null +++ b/base/src/main/kotlin/browser/tabs/MutedInfoReason.kt @@ -0,0 +1,16 @@ +package browser.tabs + +/** + * An event that caused a muted state change. + * + * @property user A user input action set the muted state. + * @property capture Tab capture was started, forcing a muted state change. + * @property extension An extension, identified by the extensionId field, set the muted state. + */ +enum class MutedInfoReason(private val value: String) { + user("user"), + capture("capture"), + extension("extension"); + + override fun toString(): String = value +} \ No newline at end of file diff --git a/base/src/main/kotlin/browser/tabs/Tab.kt b/base/src/main/kotlin/browser/tabs/Tab.kt new file mode 100644 index 0000000..630a60d --- /dev/null +++ b/base/src/main/kotlin/browser/tabs/Tab.kt @@ -0,0 +1,133 @@ +@file:JsModule("webextension-polyfill") +@file:JsQualifier("tabs") + +package browser.tabs + +import browser.tabs.infos.MutedInfos + +external interface Tab { + /** + * The ID of the tab. Tab IDs are unique within a browser session. + * Under some circumstances a tab may not be assigned an ID; for example, when querying foreign tabs using the sessions API, in which case a session ID may be present. + * Tab ID can also be set to [TAB_ID_NONE] for apps and devtools windows. + */ + var id: Int? + + /** + * The zero-based index of the tab within its window. + */ + var index: Int + + /** + * The ID of the group that the tab belongs to. + */ + var groupId: Int + + /** + * The ID of the window that contains the tab. + */ + var windowId: Int + + /** + * The ID of the tab that opened this tab, if any. + * This property is only present if the opener tab still exists. + */ + var openerTabId: Int? + + /** + * Whether the tab is selected. + */ + @Deprecated("Please use highlighted", level = DeprecationLevel.WARNING) + var selected: Boolean + + /** + * Whether the tab is highlighted. + */ + var highlighted: Boolean + + /** + * Whether the tab is active in its window. + * Does not necessarily mean the window is focused. + */ + var active: Boolean + + /** + * Whether the tab is pinned. + */ + var pinned: Boolean + + /** + * Whether the tab has produced sound over the past couple of seconds (but it might not be heard if also muted). + * Equivalent to whether the 'speaker audio' indicator is showing. + */ + var audible: Boolean? + + /** + * Whether the tab is discarded. + * A discarded tab is one whose content has been unloaded from memory, but is still visible in the tab strip. + * Its content is reloaded the next time it is activated. + */ + var discarded: Boolean + + /** + * Whether the tab can be discarded automatically by the browser when resources are low. + */ + var autoDiscardable: Boolean + + /** + * The tab's muted state and the reason for the last state change. + */ + var mutedInfo: MutedInfos? + + /** + * The last committed URL of the main frame of the tab. + * This property is only present if the extension's manifest includes the tabs permission and may be an empty string if the tab has not yet committed. + * + * @see pendingUrl + */ + var url: String? + + /** + * The URL the tab is navigating to, before it has committed. + * This property is only present if the extension's manifest includes the tabs permission and there is a pending navigation. + */ + var pendingUrl: String? + + /** + * The title of the tab. + * This property is only present if the extension's manifest includes the tabs permission. + */ + var title: String? + + /** + * The URL of the tab's favicon. + * This property is only present if the extension's manifest includes the tabs permission. + * It may also be an empty string if the tab is loading. + */ + var favIconUrl: String? + + /** + * The tab's loading status. + */ + var status: TabStatus? + + /** + * Whether the tab is in an incognito window. + */ + var incognito: Boolean + + /** + * The width of the tab in pixels. + */ + var width: Int? + + /** + * The height of the tab in pixels. + */ + var height: Int? + + /** + * The session ID used to uniquely identify a tab obtained from the sessions API. + */ + var sessionId: String? +} \ No newline at end of file diff --git a/base/src/main/kotlin/browser/tabs/TabStatus.kt b/base/src/main/kotlin/browser/tabs/TabStatus.kt new file mode 100644 index 0000000..3e30613 --- /dev/null +++ b/base/src/main/kotlin/browser/tabs/TabStatus.kt @@ -0,0 +1,12 @@ +package browser.tabs + +/** + * The tab's loading status. + */ +enum class TabStatus(private val value: String) { + unloaded("unloaded"), + loading("loading"), + complete("complete"); + + override fun toString(): String = value +} \ No newline at end of file diff --git a/base/src/main/kotlin/browser/tabs/ZoomSettings.kt b/base/src/main/kotlin/browser/tabs/ZoomSettings.kt new file mode 100644 index 0000000..5f70aa3 --- /dev/null +++ b/base/src/main/kotlin/browser/tabs/ZoomSettings.kt @@ -0,0 +1,24 @@ +@file:JsModule("webextension-polyfill") +@file:JsQualifier("tabs") + +package browser.tabs + +/** + * Defines how zoom changes in a tab are handled and at what scope. + */ +external interface ZoomSettings { + /** + * Defines how zoom changes are handled, i.e., which entity is responsible for the actual scaling of the page; defaults to automatic. + */ + var mode: ZoomSettingsMode? + + /** + * Defines whether zoom changes persist for the page's origin, or only take effect in this tab; defaults to per-origin when in automatic mode, and per-tab otherwise. + */ + var scope: ZoomSettingsScope? + + /** + * Used to return the default zoom level for the current tab in calls to tabs.getZoomSettings. + */ + var defaultZoomFactor: Number? +} \ No newline at end of file diff --git a/base/src/main/kotlin/browser/tabs/ZoomSettingsMode.kt b/base/src/main/kotlin/browser/tabs/ZoomSettingsMode.kt new file mode 100644 index 0000000..1f546f1 --- /dev/null +++ b/base/src/main/kotlin/browser/tabs/ZoomSettingsMode.kt @@ -0,0 +1,19 @@ +package browser.tabs + +/** + * Defines how zoom changes are handled, i.e., which entity is responsible for the actual scaling of the page; defaults to automatic. + * + * @property automatic Zoom changes are handled automatically by the browser. + * @property manual Overrides the automatic handling of zoom changes. + * The onZoomChange event will still be dispatched, and it is the extension's responsibility to listen for this event and manually scale the page. + * This mode does not support per-origin zooming, and thus ignores the scope zoom setting and assumes per-tab. + * @property disabled Disables all zooming in the tab. + * The tab reverts to the default zoom level, and all attempted zoom changes are ignored. + */ +enum class ZoomSettingsMode(private val value: String) { + automatic("automatic"), + manual("manual"), + disabled("disabled"); + + override fun toString(): String = value +} \ No newline at end of file diff --git a/base/src/main/kotlin/browser/tabs/ZoomSettingsScope.kt b/base/src/main/kotlin/browser/tabs/ZoomSettingsScope.kt new file mode 100644 index 0000000..483595f --- /dev/null +++ b/base/src/main/kotlin/browser/tabs/ZoomSettingsScope.kt @@ -0,0 +1,17 @@ +package browser.tabs + +/** + * Defines whether zoom changes persist for the page's origin, or only take effect in this tab; defaults to per-origin when in automatic mode, and per-tab otherwise. + * + * @property per_origin Zoom changes persist in the zoomed page's origin, i.e., all other tabs navigated to that same origin are zoomed as well. + * Moreover, per-origin zoom changes are saved with the origin, meaning that when navigating to other pages in the same origin, they are all zoomed to the same zoom factor. + * The per-origin scope is only available in the automatic mode. + * @property per_tab Zoom changes only take effect in this tab, and zoom changes in other tabs do not affect the zooming of this tab. + * Also, per-tab zoom changes are reset on navigation; navigating a tab always loads pages with their per-origin zoom factors. + */ +enum class ZoomSettingsScope(private val value: String) { + per_origin("per-origin"), + per_tab("per-tab"); + + override fun toString(): String = value +} \ No newline at end of file diff --git a/base/src/main/kotlin/browser/tabs/infos/ActiveInfos.kt b/base/src/main/kotlin/browser/tabs/infos/ActiveInfos.kt new file mode 100644 index 0000000..2f03d96 --- /dev/null +++ b/base/src/main/kotlin/browser/tabs/infos/ActiveInfos.kt @@ -0,0 +1,16 @@ +@file:JsModule("webextension-polyfill") +@file:JsQualifier("tabs") + +package browser.tabs.infos + +external interface ActiveInfos { + /** + * The ID of the tab that has become active. + */ + var tabId: Int? + + /** + * The ID of the window the active tab changed inside of. + */ + var windowId: Int? +} \ No newline at end of file diff --git a/base/src/main/kotlin/browser/tabs/infos/AttachInfos.kt b/base/src/main/kotlin/browser/tabs/infos/AttachInfos.kt new file mode 100644 index 0000000..cb3f689 --- /dev/null +++ b/base/src/main/kotlin/browser/tabs/infos/AttachInfos.kt @@ -0,0 +1,9 @@ +@file:JsModule("webextension-polyfill") +@file:JsQualifier("tabs") + +package browser.tabs.infos + +external interface AttachInfos { + var newWindowId: Int? + var newPosition: Int? +} \ No newline at end of file diff --git a/base/src/main/kotlin/browser/tabs/infos/ChangeInfos.kt b/base/src/main/kotlin/browser/tabs/infos/ChangeInfos.kt new file mode 100644 index 0000000..800f468 --- /dev/null +++ b/base/src/main/kotlin/browser/tabs/infos/ChangeInfos.kt @@ -0,0 +1,61 @@ +@file:JsModule("webextension-polyfill") +@file:JsQualifier("tabs") + +package browser.tabs.infos + +import browser.tabs.TabStatus + +/** + * Lists the changes to the state of the tab that was updated. + */ +external interface ChangeInfos { + /** + * The tab's loading status. + */ + var status: TabStatus? + + /** + * The tab's URL if it has changed. + */ + var url: String? + + /** + * The tab's new group. + */ + var groupId: Int? + + /** + * The tab's new pinned state. + */ + var pinned: Boolean? + + /** + * The tab's new audible state. + */ + var audible: Boolean? + + /** + * The tab's new discarded state. + */ + var discarded: Boolean? + + /** + * The tab's new auto-discardable state. + */ + var autoDiscardable: Boolean? + + /** + * The tab's new muted state and the reason for the change. + */ + var mutedInfo: MutedInfos? + + /** + * The tab's new favicon URL. + */ + var favIconUrl: String? + + /** + * The tab's new title. + */ + var title: String? +} \ No newline at end of file diff --git a/base/src/main/kotlin/browser/tabs/infos/ConnectInfos.kt b/base/src/main/kotlin/browser/tabs/infos/ConnectInfos.kt new file mode 100644 index 0000000..3d5cdd0 --- /dev/null +++ b/base/src/main/kotlin/browser/tabs/infos/ConnectInfos.kt @@ -0,0 +1,25 @@ +@file:JsModule("webextension-polyfill") +@file:JsQualifier("tabs") + +package browser.tabs.infos + +external interface ConnectInfos { + /** + * Is passed into onConnect for content scripts that are listening for the connection event. + */ + var name: String? + + /** + * Open a port to a specific frame identified by frameId instead of all frames in the tab. + * + * @see frame + */ + var frameId: Int? + + /** + * Open a port to a specific document identified by documentId instead of all frames in the tab. + * + * @see document + */ + var documentId: String? +} \ No newline at end of file diff --git a/base/src/main/kotlin/browser/tabs/infos/DetachInfos.kt b/base/src/main/kotlin/browser/tabs/infos/DetachInfos.kt new file mode 100644 index 0000000..2681707 --- /dev/null +++ b/base/src/main/kotlin/browser/tabs/infos/DetachInfos.kt @@ -0,0 +1,9 @@ +@file:JsModule("webextension-polyfill") +@file:JsQualifier("tabs") + +package browser.tabs.infos + +external interface DetachInfos { + var oldWindowId: Int? + var oldPosition: Int? +} \ No newline at end of file diff --git a/base/src/main/kotlin/browser/tabs/infos/HighlightInfos.kt b/base/src/main/kotlin/browser/tabs/infos/HighlightInfos.kt new file mode 100644 index 0000000..aabebad --- /dev/null +++ b/base/src/main/kotlin/browser/tabs/infos/HighlightInfos.kt @@ -0,0 +1,18 @@ +@file:JsModule("webextension-polyfill") +@file:JsQualifier("tabs") + +package browser.tabs.infos + +external interface HighlightInfos { + /** + * The window that contains the tabs. + */ + var windowId: Int? + + /** + * One or more tab indices to highlight. + * + * Either set it to int or array of int + */ + var tabs: Any +} \ No newline at end of file diff --git a/base/src/main/kotlin/browser/tabs/infos/MoveInfos.kt b/base/src/main/kotlin/browser/tabs/infos/MoveInfos.kt new file mode 100644 index 0000000..f02da55 --- /dev/null +++ b/base/src/main/kotlin/browser/tabs/infos/MoveInfos.kt @@ -0,0 +1,10 @@ +@file:JsModule("webextension-polyfill") +@file:JsQualifier("tabs") + +package browser.tabs.infos + +external interface MoveInfos { + var windowId: Int? + var fromIndex: Int? + var toIndex: Int? +} \ No newline at end of file diff --git a/base/src/main/kotlin/browser/tabs/infos/MutedInfos.kt b/base/src/main/kotlin/browser/tabs/infos/MutedInfos.kt new file mode 100644 index 0000000..2e24ebc --- /dev/null +++ b/base/src/main/kotlin/browser/tabs/infos/MutedInfos.kt @@ -0,0 +1,30 @@ +@file:JsModule("webextension-polyfill") +@file:JsQualifier("tabs") + +package browser.tabs.infos + +import browser.tabs.MutedInfoReason + +/** + * The tab's muted state and the reason for the last state change. + */ +external interface MutedInfos { + /** + * Whether the tab is muted (prevented from playing sound). + * The tab may be muted even if it has not played or is not currently playing sound. + * Equivalent to whether the 'muted' audio indicator is showing. + */ + var muted: Boolean + + /** + * The reason the tab was muted or unmuted. + * Not set if the tab's mute state has never been changed. + */ + var reason: MutedInfoReason? + + /** + * The ID of the extension that changed the muted state. + * Not set if an extension was not the reason the muted state last changed. + */ + var extensionId: String? +} \ No newline at end of file diff --git a/base/src/main/kotlin/browser/tabs/infos/QueryInfos.kt b/base/src/main/kotlin/browser/tabs/infos/QueryInfos.kt new file mode 100644 index 0000000..931be24 --- /dev/null +++ b/base/src/main/kotlin/browser/tabs/infos/QueryInfos.kt @@ -0,0 +1,102 @@ +@file:JsModule("webextension-polyfill") +@file:JsQualifier("tabs") + +package browser.tabs.infos + +import browser.tabs.TabStatus +import browser.windows.WindowType + +external interface QueryInfos { + /** + * Whether the tabs are active in their windows. + */ + var active: Boolean? + + /** + * Whether the tabs are pinned. + */ + var pinned: Boolean? + + /** + * Whether the tabs are audible. + */ + var audible: Boolean? + + /** + * Whether the tabs are muted. + */ + var muted: Boolean? + + /** + * Whether the tabs are highlighted. + */ + var highlighted: Boolean? + + /** + * Whether the tabs are discarded. + * A discarded tab is one whose content has been unloaded from memory, but is still visible in the tab strip. + * Its content is reloaded the next time it is activated. + */ + var discarded: Boolean? + + /** + * Whether the tabs can be discarded automatically by the browser when resources are low. + */ + var autoDiscardable: Boolean? + + /** + * Whether the tabs are in the current window. + * + * @see current window + */ + var currentWindow: Boolean? + + /** + * Whether the tabs are in the last focused window. + */ + var lastFocusedWindow: Boolean? + + /** + * The tab loading status. + */ + var status: TabStatus? + + /** + * Match page titles against a pattern. + * This property is ignored if the extension does not have the tabs permission. + */ + var title: String? + + /** + * Match tabs against one or more URL patterns. + * Fragment identifiers are not matched. + * This property is ignored if the extension does not have the tabs permission. + * + * Either set to string or to array of string + * + * @see URL patterns + */ + var url: Any? + + /** + * The ID of the group that the tabs are in, or tabGroups.TAB_GROUP_ID_NONE for ungrouped tabs. + */ + var groupId: Int? + + /** + * The ID of the parent window, or windows.WINDOW_ID_CURRENT for the current window. + * + * @see current window + */ + var windowId: Int? + + /** + * The type of window the tabs are in. + */ + var windowType: WindowType? + + /** + * The position of the tabs within their windows. + */ + var index: Int? +} \ No newline at end of file diff --git a/base/src/main/kotlin/browser/tabs/infos/RemoveInfos.kt b/base/src/main/kotlin/browser/tabs/infos/RemoveInfos.kt new file mode 100644 index 0000000..13a2081 --- /dev/null +++ b/base/src/main/kotlin/browser/tabs/infos/RemoveInfos.kt @@ -0,0 +1,16 @@ +@file:JsModule("webextension-polyfill") +@file:JsQualifier("tabs") + +package browser.tabs.infos + +external interface RemoveInfos { + /** + * The window whose tab is closed. + */ + var windowId: Int? + + /** + * True when the tab was closed because its parent window was closed. + */ + var isWindowClosing: Boolean? +} \ No newline at end of file diff --git a/base/src/main/kotlin/browser/tabs/infos/SelectInfos.kt b/base/src/main/kotlin/browser/tabs/infos/SelectInfos.kt new file mode 100644 index 0000000..9e491dd --- /dev/null +++ b/base/src/main/kotlin/browser/tabs/infos/SelectInfos.kt @@ -0,0 +1,11 @@ +@file:JsModule("webextension-polyfill") +@file:JsQualifier("tabs") + +package browser.tabs.infos + +external interface SelectInfos { + /** + * The ID of the window the selected tab changed inside of. + */ + var windowId: Int? +} \ No newline at end of file diff --git a/base/src/main/kotlin/browser/tabs/infos/ZoomChangeInfos.kt b/base/src/main/kotlin/browser/tabs/infos/ZoomChangeInfos.kt new file mode 100644 index 0000000..6b49a1d --- /dev/null +++ b/base/src/main/kotlin/browser/tabs/infos/ZoomChangeInfos.kt @@ -0,0 +1,13 @@ +@file:JsModule("webextension-polyfill") +@file:JsQualifier("tabs") + +package browser.tabs.infos + +import browser.tabs.ZoomSettings + +external interface ZoomChangeInfos { + var tabId: Int? + var oldZoomFactor: Number? + var newZoomFactor: Number? + var zoomSettings: ZoomSettings? +} \ No newline at end of file diff --git a/base/src/main/kotlin/browser/tabs/listeners/ActiveChangedListener.kt b/base/src/main/kotlin/browser/tabs/listeners/ActiveChangedListener.kt new file mode 100644 index 0000000..9355025 --- /dev/null +++ b/base/src/main/kotlin/browser/tabs/listeners/ActiveChangedListener.kt @@ -0,0 +1,14 @@ +@file:JsModule("webextension-polyfill") +@file:JsQualifier("tabs") + +package browser.tabs.listeners + +import browser.tabs.infos.SelectInfos + +external interface ActiveChangedListener { + /** + * The ID of the tab that has become active. + */ + val tabId: Int + val selectInfo: SelectInfos +} \ No newline at end of file diff --git a/base/src/main/kotlin/browser/tabs/listeners/AttachedListener.kt b/base/src/main/kotlin/browser/tabs/listeners/AttachedListener.kt new file mode 100644 index 0000000..f411c98 --- /dev/null +++ b/base/src/main/kotlin/browser/tabs/listeners/AttachedListener.kt @@ -0,0 +1,11 @@ +@file:JsModule("webextension-polyfill") +@file:JsQualifier("tabs") + +package browser.tabs.listeners + +import browser.tabs.infos.AttachInfos + +external interface AttachedListener { + val tabId: Int + val attachInfo: AttachInfos +} \ No newline at end of file diff --git a/base/src/main/kotlin/browser/tabs/listeners/DetachedListener.kt b/base/src/main/kotlin/browser/tabs/listeners/DetachedListener.kt new file mode 100644 index 0000000..94c73be --- /dev/null +++ b/base/src/main/kotlin/browser/tabs/listeners/DetachedListener.kt @@ -0,0 +1,11 @@ +@file:JsModule("webextension-polyfill") +@file:JsQualifier("tabs") + +package browser.tabs.listeners + +import browser.tabs.infos.DetachInfos + +external interface DetachedListener { + val tabId: Int + val detachInfo: DetachInfos +} \ No newline at end of file diff --git a/base/src/main/kotlin/browser/tabs/listeners/MovedListener.kt b/base/src/main/kotlin/browser/tabs/listeners/MovedListener.kt new file mode 100644 index 0000000..9daa2b9 --- /dev/null +++ b/base/src/main/kotlin/browser/tabs/listeners/MovedListener.kt @@ -0,0 +1,11 @@ +@file:JsModule("webextension-polyfill") +@file:JsQualifier("tabs") + +package browser.tabs.listeners + +import browser.tabs.infos.MoveInfos + +external interface MovedListener { + val tabId: Int + val moveInfo: MoveInfos +} \ No newline at end of file diff --git a/base/src/main/kotlin/browser/tabs/listeners/RemovedListener.kt b/base/src/main/kotlin/browser/tabs/listeners/RemovedListener.kt new file mode 100644 index 0000000..a029301 --- /dev/null +++ b/base/src/main/kotlin/browser/tabs/listeners/RemovedListener.kt @@ -0,0 +1,11 @@ +@file:JsModule("webextension-polyfill") +@file:JsQualifier("tabs") + +package browser.tabs.listeners + +import browser.tabs.infos.RemoveInfos + +external interface RemovedListener { + val tabId: Int + val removeInfo: RemoveInfos +} \ No newline at end of file diff --git a/base/src/main/kotlin/browser/tabs/listeners/ReplacedListener.kt b/base/src/main/kotlin/browser/tabs/listeners/ReplacedListener.kt new file mode 100644 index 0000000..c2f0b0e --- /dev/null +++ b/base/src/main/kotlin/browser/tabs/listeners/ReplacedListener.kt @@ -0,0 +1,9 @@ +@file:JsModule("webextension-polyfill") +@file:JsQualifier("tabs") + +package browser.tabs.listeners + +external interface ReplacedListener { + val addedTabId: Int + val removedTabId: Int +} \ No newline at end of file diff --git a/base/src/main/kotlin/browser/tabs/listeners/SelectionChangeListener.kt b/base/src/main/kotlin/browser/tabs/listeners/SelectionChangeListener.kt new file mode 100644 index 0000000..d97daea --- /dev/null +++ b/base/src/main/kotlin/browser/tabs/listeners/SelectionChangeListener.kt @@ -0,0 +1,14 @@ +@file:JsModule("webextension-polyfill") +@file:JsQualifier("tabs") + +package browser.tabs.listeners + +import browser.tabs.infos.SelectInfos + +external interface SelectionChangeListener { + /** + * The ID of the tab that has become active. + */ + val tabId: Int + val selectInfo: SelectInfos +} \ No newline at end of file diff --git a/base/src/main/kotlin/browser/tabs/listeners/UpdatedListener.kt b/base/src/main/kotlin/browser/tabs/listeners/UpdatedListener.kt new file mode 100644 index 0000000..48267a9 --- /dev/null +++ b/base/src/main/kotlin/browser/tabs/listeners/UpdatedListener.kt @@ -0,0 +1,13 @@ +@file:JsModule("webextension-polyfill") +@file:JsQualifier("tabs") + +package browser.tabs.listeners + +import browser.tabs.Tab +import browser.tabs.infos.ChangeInfos + +external interface UpdatedListener { + val tabId: Int + val changeInfo: ChangeInfos + val tab: Tab +} \ No newline at end of file diff --git a/base/src/main/kotlin/browser/tabs/options/GroupOptions.kt b/base/src/main/kotlin/browser/tabs/options/GroupOptions.kt new file mode 100644 index 0000000..e3d3dd4 --- /dev/null +++ b/base/src/main/kotlin/browser/tabs/options/GroupOptions.kt @@ -0,0 +1,25 @@ +@file:JsModule("webextension-polyfill") +@file:JsQualifier("tabs") + +package browser.tabs.options + +import browser.tabs.properties.CreateGroupProperties + +external interface GroupOptions { + /** + * The tab ID or list of tab IDs to add to the specified group. + */ + var tabIds: Any + + /** + * The ID of the group to add the tabs to. + * If not specified, a new group will be created. + */ + var groupId: Int? + + /** + * Configurations for creating a group. + * Cannot be used if groupId is already specified. + */ + var createProperties: CreateGroupProperties? +} \ No newline at end of file diff --git a/base/src/main/kotlin/browser/tabs/options/MessageOptions.kt b/base/src/main/kotlin/browser/tabs/options/MessageOptions.kt new file mode 100644 index 0000000..c72208a --- /dev/null +++ b/base/src/main/kotlin/browser/tabs/options/MessageOptions.kt @@ -0,0 +1,20 @@ +@file:JsModule("webextension-polyfill") +@file:JsQualifier("tabs") + +package browser.tabs.options + +external interface MessageOptions { + /** + * Send a message to a specific frame identified by frameId instead of all frames in the tab. + * + * @see frame + */ + var frameId: Int? + + /** + * Send a message to a specific document identified by documentId instead of all frames in the tab. + * + * @see document + */ + var documentId: String? +} \ No newline at end of file diff --git a/base/src/main/kotlin/browser/tabs/properties/CreateGroupProperties.kt b/base/src/main/kotlin/browser/tabs/properties/CreateGroupProperties.kt new file mode 100644 index 0000000..b45020d --- /dev/null +++ b/base/src/main/kotlin/browser/tabs/properties/CreateGroupProperties.kt @@ -0,0 +1,11 @@ +@file:JsModule("webextension-polyfill") +@file:JsQualifier("tabs") + +package browser.tabs.properties + +external interface CreateGroupProperties { + /** + * The window of the new group. Defaults to the current window. + */ + var windowId: Int? +} \ No newline at end of file diff --git a/base/src/main/kotlin/browser/tabs/properties/CreateProperties.kt b/base/src/main/kotlin/browser/tabs/properties/CreateProperties.kt new file mode 100644 index 0000000..6238c1c --- /dev/null +++ b/base/src/main/kotlin/browser/tabs/properties/CreateProperties.kt @@ -0,0 +1,54 @@ +@file:JsModule("webextension-polyfill") +@file:JsQualifier("tabs") + +package browser.tabs.properties + +external interface CreateProperties { + /** + * The window in which to create the new tab. + * Defaults to the current window. + * + * @see current window + */ + var windowId: Int? + + /** + * The position the tab should take in the window. + * The provided value is clamped to between zero and the number of tabs in the window. + */ + var index: Int? + + /** + * The URL to initially navigate the tab to. + * Fully-qualified URLs must include a scheme (i.e., 'http://www.google.com', not 'www.google.com'). + * Relative URLs are relative to the current page within the extension. + * Defaults to the New Tab Page. + */ + var url: String? + + /** + * Whether the tab should become the active tab in the window. + * Does not affect whether the window is focused (see windows.update). + * Defaults to true. + */ + var active: Boolean? + + /** + * Whether the tab should become the selected tab in the window. + * Defaults to true + */ + @Deprecated("Please use active.", level = DeprecationLevel.WARNING) + var selected: Boolean? + + /** + * Whether the tab should be pinned. + * Defaults to false + */ + var pinned: Boolean? + + /** + * The ID of the tab that opened this tab. + * If specified, the opener tab must be in the same window as the newly created tab. + */ + val openerTabId: Int? +} \ No newline at end of file diff --git a/base/src/main/kotlin/browser/tabs/properties/MoveProperties.kt b/base/src/main/kotlin/browser/tabs/properties/MoveProperties.kt new file mode 100644 index 0000000..37fcebf --- /dev/null +++ b/base/src/main/kotlin/browser/tabs/properties/MoveProperties.kt @@ -0,0 +1,17 @@ +@file:JsModule("webextension-polyfill") +@file:JsQualifier("tabs") + +package browser.tabs.properties + +external interface MoveProperties { + /** + * Defaults to the window the tab is currently in. + */ + var windowId: Int? + + /** + * The position to move the window to. + * Use -1 to place the tab at the end of the window. + */ + var index: Int? +} \ No newline at end of file diff --git a/base/src/main/kotlin/browser/tabs/properties/ReloadProperties.kt b/base/src/main/kotlin/browser/tabs/properties/ReloadProperties.kt new file mode 100644 index 0000000..1a598e8 --- /dev/null +++ b/base/src/main/kotlin/browser/tabs/properties/ReloadProperties.kt @@ -0,0 +1,11 @@ +@file:JsModule("webextension-polyfill") +@file:JsQualifier("tabs") + +package browser.tabs.properties + +external interface ReloadProperties { + /** + * Whether to bypass local caching. Defaults to false. + */ + var bypassCache: Boolean? +} \ No newline at end of file diff --git a/base/src/main/kotlin/browser/tabs/properties/UpdateProperties.kt b/base/src/main/kotlin/browser/tabs/properties/UpdateProperties.kt new file mode 100644 index 0000000..7a827e8 --- /dev/null +++ b/base/src/main/kotlin/browser/tabs/properties/UpdateProperties.kt @@ -0,0 +1,50 @@ +@file:JsModule("webextension-polyfill") +@file:JsQualifier("tabs") + +package browser.tabs.properties + +external interface UpdateProperties { + /** + * A URL to navigate the tab to. + * JavaScript URLs are not supported; use scripting.executeScript instead. + */ + var url: String? + + /** + * Whether the tab should be active. + * Does not affect whether the window is focused (see windows.update). + */ + var active: Boolean? + + /** + * Adds or removes the tab from the current selection. + */ + var highlighted: Boolean? + + /** + * Whether the tab should be selected. + */ + @Deprecated("Please use highlighted.", level = DeprecationLevel.WARNING) + var selected: Boolean? + + /** + * Whether the tab should be pinned. + */ + var pinned: Boolean? + + /** + * Whether the tab should be muted. + */ + var muted: Boolean? + + /** + * The ID of the tab that opened this tab. + * If specified, the opener tab must be in the same window as this tab. + */ + var openerTabId: Int? + + /** + * Whether the tab should be discarded automatically by the browser when resources are low. + */ + var autoDiscardable: Boolean? +} \ No newline at end of file diff --git a/base/src/main/kotlin/browser/webRequest/AuthCredentials.kt b/base/src/main/kotlin/browser/webRequest/AuthCredentials.kt new file mode 100644 index 0000000..1b60ea9 --- /dev/null +++ b/base/src/main/kotlin/browser/webRequest/AuthCredentials.kt @@ -0,0 +1,9 @@ +@file:JsModule("webextension-polyfill") +@file:JsQualifier("webRequest") + +package browser.webRequest + +external interface AuthCredentials { + var username: String? + var password: String? +} \ No newline at end of file diff --git a/base/src/main/kotlin/browser/webRequest/BlockingResponse.kt b/base/src/main/kotlin/browser/webRequest/BlockingResponse.kt new file mode 100644 index 0000000..9fc1c4f --- /dev/null +++ b/base/src/main/kotlin/browser/webRequest/BlockingResponse.kt @@ -0,0 +1,46 @@ +@file:JsModule("webextension-polyfill") +@file:JsQualifier("webRequest") + +package browser.webRequest + +/** + * Returns value for event handlers that have the 'blocking' extraInfoSpec applied. + * Allows the event handler to modify network requests. + */ +external interface BlockingResponse { + /** + * If true, the request is cancelled. + * This prevents the request from being sent. + * This can be used as a response to the onBeforeRequest, onBeforeSendHeaders, onHeadersReceived and onAuthRequired events. + */ + var cancel: Boolean? + + /** + * Only used as a response to the onBeforeRequest and onHeadersReceived events. + * If set, the original request is prevented from being sent/completed and is instead redirected to the given URL. + * Redirections to non-HTTP schemes such as data: are allowed. + * Redirects initiated by a redirect action use the original request method for the redirect, with one exception: + * If the redirect is initiated at the onHeadersReceived stage, then the redirect will be issued using the GET method. + * Redirects from URLs with ws:// and wss:// schemes are ignored. + */ + var redirectUrl: String? + + /** + * Only used as a response to the onBeforeSendHeaders event. + * If set, the request is made with these request headers instead. + */ + var requestHeaders: HttpHeaders? + + /** + * Only used as a response to the onHeadersReceived event. + * If set, the server is assumed to have responded with these response headers instead. + * Only return responseHeaders if you really want to modify the headers in order to limit the number of conflicts (only one extension may modify responseHeaders for each request). + */ + var responseHeaders: HttpHeaders? + + /** + * Only used as a response to the onAuthRequired event. + * If set, the request is made using the supplied credentials. + */ + var authCredentials: AuthCredentials? +} \ No newline at end of file diff --git a/base/src/main/kotlin/browser/webRequest/Constructor.kt b/base/src/main/kotlin/browser/webRequest/Constructor.kt new file mode 100644 index 0000000..e571466 --- /dev/null +++ b/base/src/main/kotlin/browser/webRequest/Constructor.kt @@ -0,0 +1,15 @@ +@file:Suppress("UNCHECKED_CAST_TO_EXTERNAL_INTERFACE") + +package browser.webRequest + +import browser.webRequest.details.BeforeRequestDetails +import browser.webRequest.details.BeforeSendHeadersDetails +import browser.webRequest.details.HeadersReceivedDetails +import browser.webRequest.details.SendHeadersDetails + +inline fun BeforeRequestDetails(block: BeforeRequestDetails.() -> Unit) = (js("{}") as BeforeRequestDetails).apply(block) +inline fun BeforeSendHeadersDetails(block: BeforeSendHeadersDetails.() -> Unit) = (js("{}") as BeforeSendHeadersDetails).apply(block) +inline fun SendHeadersDetails(block: SendHeadersDetails.() -> Unit) = (js("{}") as SendHeadersDetails).apply(block) +inline fun HeadersReceivedDetails(block: HeadersReceivedDetails.() -> Unit) = (js("{}") as HeadersReceivedDetails).apply(block) + +typealias HttpHeaders = Array \ No newline at end of file diff --git a/base/src/main/kotlin/browser/webRequest/HttpHeader.kt b/base/src/main/kotlin/browser/webRequest/HttpHeader.kt new file mode 100644 index 0000000..9944723 --- /dev/null +++ b/base/src/main/kotlin/browser/webRequest/HttpHeader.kt @@ -0,0 +1,25 @@ +@file:JsModule("webextension-polyfill") +@file:JsQualifier("webRequest") + +package browser.webRequest + +/** + * An array of HTTP headers. + * Each header is represented as a dictionary containing the keys name and either value or binaryValue. + */ +external interface HttpHeader { + /** + * Name of the HTTP header. + */ + var name: String? + + /** + * Value of the HTTP header if it can be represented by UTF-8. + */ + var value: String? + + /** + * Value of the HTTP header if it cannot be represented by UTF-8, stored as individual byte values (0..255). + */ + var binaryValue: Array? +} \ No newline at end of file diff --git a/base/src/main/kotlin/browser/webRequest/IgnoredActionType.kt b/base/src/main/kotlin/browser/webRequest/IgnoredActionType.kt new file mode 100644 index 0000000..2197466 --- /dev/null +++ b/base/src/main/kotlin/browser/webRequest/IgnoredActionType.kt @@ -0,0 +1,10 @@ +package browser.webRequest + +enum class IgnoredActionType(private val value: String) { + redirect("redirect"), + request_headers("request_headers"), + response_headers("response_headers"), + auth_credentials("auth_credentials"); + + override fun toString(): String = value +} \ No newline at end of file diff --git a/base/src/main/kotlin/browser/webRequest/Import.kt b/base/src/main/kotlin/browser/webRequest/Import.kt new file mode 100644 index 0000000..3459180 --- /dev/null +++ b/base/src/main/kotlin/browser/webRequest/Import.kt @@ -0,0 +1,45 @@ +@file:JsModule("webextension-polyfill") +@file:JsQualifier("webRequest") + +package browser.webRequest + +import browser.events.Event +import browser.webRequest.details.BeforeRequestDetails +import browser.webRequest.details.BeforeSendHeadersDetails +import browser.webRequest.details.HeadersReceivedDetails +import browser.webRequest.details.SendHeadersDetails +import kotlin.js.Promise + +/** + * The maximum number of times that handlerBehaviorChanged can be called per 10 minute sustained interval. + * handlerBehaviorChanged is an expensive function call that shouldn't be called often. + */ +external val MAX_HANDLER_BEHAVIOR_CHANGED_CALLS_PER_10_MINUTES: Number = definedExternally + +/** + * Needs to be called when the behavior of the webRequest handlers has changed to prevent incorrect handling due to caching. + * This function call is expensive. + * Don't call it often. + */ +external fun handlerBehaviorChanged(): Promise? + +/** + * Fired when a request is about to occur. + */ +external val onBeforeRequest: Event = definedExternally + +/** + * Fired before sending an HTTP request, once the request headers are available. + * This may occur after a TCP connection is made to the server, but before any HTTP data is sent. + */ +external val onBeforeSendHeaders: Event = definedExternally + +/** + * Fired just before a request is going to be sent to the server (modifications of previous onBeforeSendHeaders callbacks are visible by the time onSendHeaders is fired). + */ +external val onSendHeaders: Event = definedExternally + +/** + * Fired when HTTP response headers of a request have been received. + */ +external val onHeadersReceived: Event = definedExternally \ No newline at end of file diff --git a/base/src/main/kotlin/browser/webRequest/RequestBody.kt b/base/src/main/kotlin/browser/webRequest/RequestBody.kt new file mode 100644 index 0000000..c8035a5 --- /dev/null +++ b/base/src/main/kotlin/browser/webRequest/RequestBody.kt @@ -0,0 +1,26 @@ +@file:JsModule("webextension-polyfill") +@file:JsQualifier("webRequest") + +package browser.webRequest + +/** + * Contains the HTTP request body data. + * Only provided if extraInfoSpec contains 'requestBody'. + */ +external interface RequestBody { + /** + * Errors when obtaining request body data. + */ + var error: String? + + /** + * If the request method is POST and the body is a sequence of key-value pairs encoded in UTF8, encoded as either multipart/form-data, or application/x-www-form-urlencoded, this dictionary is present and for each key contains the list of all values for that key. If the data is of another media type, or if it is malformed, the dictionary is not present. + * An example value of this dictionary is {'key': ['value1', 'value2']}. + */ + var formData: Any? + + /** + * If the request method is PUT or POST, and the body is not already parsed in formData, then the unparsed request body elements are contained in this array. + */ + var raw: Array? +} \ No newline at end of file diff --git a/base/src/main/kotlin/browser/webRequest/RequestFilter.kt b/base/src/main/kotlin/browser/webRequest/RequestFilter.kt new file mode 100644 index 0000000..7083d44 --- /dev/null +++ b/base/src/main/kotlin/browser/webRequest/RequestFilter.kt @@ -0,0 +1,23 @@ +@file:JsModule("webextension-polyfill") +@file:JsQualifier("webRequest") + +package browser.webRequest + +/** + * An object describing filters to apply to webRequest events. + */ +external interface RequestFilter { + /** + * A list of URLs or URL patterns. Requests that cannot match any of the URLs will be filtered out. + */ + var urls: Array? + + /** + * A list of request types. Requests that cannot match any of the types will be filtered out. + */ + var types: Array? + + var tabId: Int? + + var windowId: Int? +} \ No newline at end of file diff --git a/base/src/main/kotlin/browser/webRequest/ResourceType.kt b/base/src/main/kotlin/browser/webRequest/ResourceType.kt new file mode 100644 index 0000000..179fb48 --- /dev/null +++ b/base/src/main/kotlin/browser/webRequest/ResourceType.kt @@ -0,0 +1,19 @@ +package browser.webRequest + +enum class ResourceType(private val value: String) { + main_frame("main_frame"), + sub_frame("sub_frame"), + stylesheet("stylesheet"), + script("script"), + image("image"), + font("font"), + `object`("object"), + xmlhttprequest("xmlhttprequest"), + ping("ping"), + csp_report("csp_report"), + media("media"), + websocket("websocket"), + other("other"); + + override fun toString(): String = value +} \ No newline at end of file diff --git a/base/src/main/kotlin/browser/webRequest/UploadData.kt b/base/src/main/kotlin/browser/webRequest/UploadData.kt new file mode 100644 index 0000000..e92f3d3 --- /dev/null +++ b/base/src/main/kotlin/browser/webRequest/UploadData.kt @@ -0,0 +1,19 @@ +@file:JsModule("webextension-polyfill") +@file:JsQualifier("webRequest") + +package browser.webRequest + +/** + * Contains data uploaded in a URL request. + */ +external interface UploadData { + /** + * An ArrayBuffer with a copy of the data. + */ + var bytes: Any? + + /** + * A string with the file's path and name. + */ + var file: String? +} \ No newline at end of file diff --git a/base/src/main/kotlin/browser/webRequest/details/BeforeRequestDetails.kt b/base/src/main/kotlin/browser/webRequest/details/BeforeRequestDetails.kt new file mode 100644 index 0000000..8ca1ff8 --- /dev/null +++ b/base/src/main/kotlin/browser/webRequest/details/BeforeRequestDetails.kt @@ -0,0 +1,86 @@ +@file:JsModule("webextension-polyfill") +@file:JsQualifier("webRequest") + +package browser.webRequest.details + +import browser.webRequest.RequestBody +import browser.webRequest.ResourceType + +external interface BeforeRequestDetails { + /** + * The ID of the request. + * Request IDs are unique within a browser session. + * As a result, they could be used to relate different events of the same request. + */ + var requestId: String? + + var url: String? + + /** + * Standard HTTP method. + */ + var method: String? + + /** + * The value 0 indicates that the request happens in the main frame; a positive value indicates the ID of a subframe in which the request happens. + * If the document of a (sub-)frame is loaded (type is main_frame or sub_frame), frameId indicates the ID of this frame, not the ID of the outer frame. + * Frame IDs are unique within a tab. + */ + var frameId: Int? + + /** + * ID of frame that wraps the frame which sent the request. + * Set to -1 if no parent frame exists. + */ + var parentFrameId: Int? + + /** + * The UUID of the document making the request. + */ + var documentId: String? + + /** + * The UUID of the parent document owning this frame. + * This is not set if there is no parent. + */ + var parentDocumentId: String? + + /** + * The lifecycle the document is in. + */ + var documentLifecycle: String? + + /** + * The type of frame the request occurred in. + */ + var frameType: String? + + /** + * Contains the HTTP request body data. + * Only provided if extraInfoSpec contains 'requestBody'. + */ + var requestBody: RequestBody? + + /** + * The ID of the tab in which the request takes place. + * Set to -1 if the request isn't related to a tab. + */ + var tabId: Int? + + /** + * How the requested resource will be used. + */ + var type: ResourceType? + + /** + * The origin where the request was initiated. + * This does not change through redirects. + * If this is an opaque origin, the string 'null' will be used. + */ + var initiator: String? + + /** + * The time when this signal is triggered, in milliseconds since the epoch. + */ + var timeStamp: Number? +} \ No newline at end of file diff --git a/base/src/main/kotlin/browser/webRequest/details/BeforeSendHeadersDetails.kt b/base/src/main/kotlin/browser/webRequest/details/BeforeSendHeadersDetails.kt new file mode 100644 index 0000000..2614f72 --- /dev/null +++ b/base/src/main/kotlin/browser/webRequest/details/BeforeSendHeadersDetails.kt @@ -0,0 +1,85 @@ +@file:JsModule("webextension-polyfill") +@file:JsQualifier("webRequest") + +package browser.webRequest.details + +import browser.webRequest.HttpHeaders +import browser.webRequest.ResourceType + +external interface BeforeSendHeadersDetails { + /** + * The ID of the request. + * Request IDs are unique within a browser session. + * As a result, they could be used to relate different events of the same request. + */ + var requestId: String? + + var url: String? + + /** + * Standard HTTP method. + */ + var method: String? + + /** + * The value 0 indicates that the request happens in the main frame; a positive value indicates the ID of a subframe in which the request happens. + * If the document of a (sub-)frame is loaded (type is main_frame or sub_frame), frameId indicates the ID of this frame, not the ID of the outer frame. + * Frame IDs are unique within a tab. + */ + var frameId: Int? + + /** + * ID of frame that wraps the frame which sent the request. + * Set to -1 if no parent frame exists. + */ + var parentFrameId: Int? + + /** + * The UUID of the document making the request. + */ + var documentId: String? + + /** + * The UUID of the parent document owning this frame. + * This is not set if there is no parent. + */ + var parentDocumentId: String? + + /** + * The lifecycle the document is in. + */ + var documentLifecycle: String? + + /** + * The type of frame the request occurred in. + */ + var frameType: String? + + /** + * The ID of the tab in which the request takes place. + * Set to -1 if the request isn't related to a tab. + */ + var tabId: Int? + + /** + * The origin where the request was initiated. + * This does not change through redirects. + * If this is an opaque origin, the string 'null' will be used. + */ + var initiator: String? + + /** + * How the requested resource will be used. + */ + var type: ResourceType? + + /** + * The time when this signal is triggered, in milliseconds since the epoch. + */ + var timeStamp: Number? + + /** + * The HTTP request headers that are going to be sent out with this request. + */ + var requestHeaders: HttpHeaders? +} \ No newline at end of file diff --git a/base/src/main/kotlin/browser/webRequest/details/HeadersReceivedDetails.kt b/base/src/main/kotlin/browser/webRequest/details/HeadersReceivedDetails.kt new file mode 100644 index 0000000..de5f2bc --- /dev/null +++ b/base/src/main/kotlin/browser/webRequest/details/HeadersReceivedDetails.kt @@ -0,0 +1,96 @@ +@file:JsModule("webextension-polyfill") +@file:JsQualifier("webRequest") + +package browser.webRequest.details + +import browser.webRequest.HttpHeader +import browser.webRequest.HttpHeaders +import browser.webRequest.ResourceType + +external interface HeadersReceivedDetails { + /** + * The ID of the request. + * Request IDs are unique within a browser session. + * As a result, they could be used to relate different events of the same request. + */ + var requestId: String? + + var url: String? + + /** + * Standard HTTP method. + */ + var method: String? + + /** + * The value 0 indicates that the request happens in the main frame; a positive value indicates the ID of a subframe in which the request happens. + * If the document of a (sub-)frame is loaded (type is main_frame or sub_frame), frameId indicates the ID of this frame, not the ID of the outer frame. + * Frame IDs are unique within a tab. + */ + var frameId: Int? + + /** + * ID of frame that wraps the frame which sent the request. + * Set to -1 if no parent frame exists. + */ + var parentFrameId: Int? + + /** + * The UUID of the document making the request. + */ + var documentId: String? + + /** + * The UUID of the parent document owning this frame. + * This is not set if there is no parent. + */ + var parentDocumentId: String? + + /** + * The lifecycle the document is in. + */ + var documentLifecycle: String? + + /** + * The type of frame the request occurred in. + */ + var frameType: String? + + /** + * The ID of the tab in which the request takes place. + * Set to -1 if the request isn't related to a tab. + */ + var tabId: Int? + + /** + * How the requested resource will be used. + */ + var type: ResourceType? + + /** + * The origin where the request was initiated. + * This does not change through redirects. + * If this is an opaque origin, the string 'null' will be used. + */ + var initiator: String? + + /** + * The time when this signal is triggered, in milliseconds since the epoch. + */ + var timeStamp: Number? + + /** + * HTTP status line of the response or the 'HTTP/0.9 200 OK' string for HTTP/0.9 responses (i.e., responses that lack a status line). + */ + var statusLine: String? + + /** + * The HTTP response headers that have been received with this response. + */ + var responseHeaders: HttpHeaders? + + /** + * Standard HTTP status code returned by the server. + */ + var statusCode: Int? +} \ No newline at end of file diff --git a/base/src/main/kotlin/browser/webRequest/details/SendHeadersDetails.kt b/base/src/main/kotlin/browser/webRequest/details/SendHeadersDetails.kt new file mode 100644 index 0000000..538f9ee --- /dev/null +++ b/base/src/main/kotlin/browser/webRequest/details/SendHeadersDetails.kt @@ -0,0 +1,86 @@ +@file:JsModule("webextension-polyfill") +@file:JsQualifier("webRequest") + +package browser.webRequest.details + +import browser.webRequest.HttpHeader +import browser.webRequest.HttpHeaders +import browser.webRequest.ResourceType + +external interface SendHeadersDetails { + /** + * The ID of the request. + * Request IDs are unique within a browser session. + * As a result, they could be used to relate different events of the same request. + */ + var requestId: String? + + var url: String? + + /** + * Standard HTTP method. + */ + var method: String? + + /** + * The value 0 indicates that the request happens in the main frame; a positive value indicates the ID of a subframe in which the request happens. + * If the document of a (sub-)frame is loaded (type is main_frame or sub_frame), frameId indicates the ID of this frame, not the ID of the outer frame. + * Frame IDs are unique within a tab. + */ + var frameId: Int? + + /** + * ID of frame that wraps the frame which sent the request. + * Set to -1 if no parent frame exists. + */ + var parentFrameId: Int? + + /** + * The UUID of the document making the request. + */ + var documentId: String? + + /** + * The UUID of the parent document owning this frame. + * This is not set if there is no parent. + */ + var parentDocumentId: String? + + /** + * The lifecycle the document is in. + */ + var documentLifecycle: String? + + /** + * The type of frame the request occurred in. + */ + var frameType: String? + + /** + * The ID of the tab in which the request takes place. + * Set to -1 if the request isn't related to a tab. + */ + var tabId: Int? + + /** + * How the requested resource will be used. + */ + var type: ResourceType? + + /** + * The origin where the request was initiated. + * This does not change through redirects. + * If this is an opaque origin, the string 'null' will be used. + */ + var initiator: String? + + /** + * The time when this signal is triggered, in milliseconds since the epoch. + */ + var timeStamp: Number? + + /** + * The HTTP request headers that are going to be sent out with this request. + */ + var requestHeaders: HttpHeaders? +} \ No newline at end of file diff --git a/base/src/main/kotlin/browser/webRequest/options/OnAuthRequiredOptions.kt b/base/src/main/kotlin/browser/webRequest/options/OnAuthRequiredOptions.kt new file mode 100644 index 0000000..c438466 --- /dev/null +++ b/base/src/main/kotlin/browser/webRequest/options/OnAuthRequiredOptions.kt @@ -0,0 +1,10 @@ +package browser.webRequest.options + +enum class OnAuthRequiredOptions(private val value: String) { + responseHeaders("responseHeaders"), + blocking("blocking"), + asyncBlocking("asyncBlocking"), + extraHeaders("extraHeaders"); + + override fun toString(): String = value +} \ No newline at end of file diff --git a/base/src/main/kotlin/browser/webRequest/options/OnBeforeRedirectOptions.kt b/base/src/main/kotlin/browser/webRequest/options/OnBeforeRedirectOptions.kt new file mode 100644 index 0000000..44d10c3 --- /dev/null +++ b/base/src/main/kotlin/browser/webRequest/options/OnBeforeRedirectOptions.kt @@ -0,0 +1,8 @@ +package browser.webRequest.options + +enum class OnBeforeRedirectOptions(private val value: String) { + responseHeaders("responseHeaders"), + extraHeaders("extraHeaders"); + + override fun toString(): String = value +} \ No newline at end of file diff --git a/base/src/main/kotlin/browser/webRequest/options/OnBeforeRequestOptions.kt b/base/src/main/kotlin/browser/webRequest/options/OnBeforeRequestOptions.kt new file mode 100644 index 0000000..7a286a0 --- /dev/null +++ b/base/src/main/kotlin/browser/webRequest/options/OnBeforeRequestOptions.kt @@ -0,0 +1,9 @@ +package browser.webRequest.options + +enum class OnBeforeRequestOptions(private val value: String) { + blocking("blocking"), + requestBody("requestBody"), + extraHeaders("extraHeaders"); + + override fun toString(): String = value +} \ No newline at end of file diff --git a/base/src/main/kotlin/browser/webRequest/options/OnBeforeSendHeaderOptions.kt b/base/src/main/kotlin/browser/webRequest/options/OnBeforeSendHeaderOptions.kt new file mode 100644 index 0000000..5df28da --- /dev/null +++ b/base/src/main/kotlin/browser/webRequest/options/OnBeforeSendHeaderOptions.kt @@ -0,0 +1,9 @@ +package browser.webRequest.options + +enum class OnBeforeSendHeaderOptions(private val value: String) { + requestHeaders("requestHeaders"), + blocking("blocking"), + extraHeaders("extraHeaders"); + + override fun toString(): String = value +} \ No newline at end of file diff --git a/base/src/main/kotlin/browser/webRequest/options/OnCompletedOptions.kt b/base/src/main/kotlin/browser/webRequest/options/OnCompletedOptions.kt new file mode 100644 index 0000000..120cc3a --- /dev/null +++ b/base/src/main/kotlin/browser/webRequest/options/OnCompletedOptions.kt @@ -0,0 +1,8 @@ +package browser.webRequest.options + +enum class OnCompletedOptions(private val value: String) { + responseHeaders("responseHeaders"), + extraHeaders("extraHeaders"); + + override fun toString(): String = value +} \ No newline at end of file diff --git a/base/src/main/kotlin/browser/webRequest/options/OnErrorOccurredOptions.kt b/base/src/main/kotlin/browser/webRequest/options/OnErrorOccurredOptions.kt new file mode 100644 index 0000000..2110bcc --- /dev/null +++ b/base/src/main/kotlin/browser/webRequest/options/OnErrorOccurredOptions.kt @@ -0,0 +1,7 @@ +package browser.webRequest.options + +enum class OnErrorOccurredOptions(private val value: String) { + extraHeaders("extraHeaders"); + + override fun toString(): String = value +} \ No newline at end of file diff --git a/base/src/main/kotlin/browser/webRequest/options/OnHeadersReceivedOptions.kt b/base/src/main/kotlin/browser/webRequest/options/OnHeadersReceivedOptions.kt new file mode 100644 index 0000000..599e068 --- /dev/null +++ b/base/src/main/kotlin/browser/webRequest/options/OnHeadersReceivedOptions.kt @@ -0,0 +1,9 @@ +package browser.webRequest.options + +enum class OnHeadersReceivedOptions(private val value: String) { + blocking("blocking"), + responseHeaders("responseHeaders"), + extraHeaders("extraHeaders"); + + override fun toString(): String = value +} \ No newline at end of file diff --git a/base/src/main/kotlin/browser/webRequest/options/OnResponseStartedOptions.kt b/base/src/main/kotlin/browser/webRequest/options/OnResponseStartedOptions.kt new file mode 100644 index 0000000..a364e53 --- /dev/null +++ b/base/src/main/kotlin/browser/webRequest/options/OnResponseStartedOptions.kt @@ -0,0 +1,8 @@ +package browser.webRequest.options + +enum class OnResponseStartedOptions(private val value: String) { + responseHeaders("responseHeaders"), + extraHeaders("extraHeaders"); + + override fun toString(): String = value +} \ No newline at end of file diff --git a/base/src/main/kotlin/browser/webRequest/options/OnSendHeadersOptions.kt b/base/src/main/kotlin/browser/webRequest/options/OnSendHeadersOptions.kt new file mode 100644 index 0000000..6230516 --- /dev/null +++ b/base/src/main/kotlin/browser/webRequest/options/OnSendHeadersOptions.kt @@ -0,0 +1,8 @@ +package browser.webRequest.options + +enum class OnSendHeadersOptions(private val value: String) { + requestHeaders("requestHeaders"), + extraHeaders("extraHeaders"); + + override fun toString(): String = value +} \ No newline at end of file diff --git a/base/src/main/kotlin/browser/windows/Constructor.kt b/base/src/main/kotlin/browser/windows/Constructor.kt new file mode 100644 index 0000000..5588b5a --- /dev/null +++ b/base/src/main/kotlin/browser/windows/Constructor.kt @@ -0,0 +1,11 @@ +@file:Suppress("UNCHECKED_CAST_TO_EXTERNAL_INTERFACE") + +package browser.windows + +import browser.windows.data.CreateData +import browser.windows.infos.UpdateInfos +import browser.windows.options.QueryOptions + +inline fun QueryOption(block: QueryOptions.() -> Unit) = (js("{}") as QueryOptions).apply(block) +inline fun CreateData(block: CreateData.() -> Unit) = (js("{}") as CreateData).apply(block) +inline fun UpdateInfo(block: UpdateInfos.() -> Unit) = (js("{}") as UpdateInfos).apply(block) \ No newline at end of file diff --git a/base/src/main/kotlin/browser/windows/CreateType.kt b/base/src/main/kotlin/browser/windows/CreateType.kt new file mode 100644 index 0000000..cd356cc --- /dev/null +++ b/base/src/main/kotlin/browser/windows/CreateType.kt @@ -0,0 +1,13 @@ +package browser.windows + +/** + * Specifies what type of browser window to create. + * 'panel' is deprecated and is available only to existing whitelisted extensions on Chrome OS. + */ +enum class CreateType(private val value: String) { + normal("normal"), + popup("popup"), + panel("panel"); + + override fun toString(): String = value +} \ No newline at end of file diff --git a/base/src/main/kotlin/browser/windows/Import.kt b/base/src/main/kotlin/browser/windows/Import.kt new file mode 100644 index 0000000..9364eb7 --- /dev/null +++ b/base/src/main/kotlin/browser/windows/Import.kt @@ -0,0 +1,100 @@ +@file:JsModule("webextension-polyfill") +@file:JsQualifier("tabs") + +package browser.windows + +import browser.events.Event +import browser.windows.data.CreateData +import browser.windows.infos.UpdateInfos +import browser.windows.options.QueryOptions +import kotlin.js.Promise + +/** + * The windowId value that represents the absence of a Chrome browser window. + */ +external val WINDOW_ID_NONE: Number = definedExternally + +/** + * The windowId value that represents the current window. + * + * @see current window + */ +external val WINDOW_ID_CURRENT: Number = definedExternally + +/** + * Gets details about a window. + */ +external fun get( + windowId: Int, + queryOptions: QueryOptions? = definedExternally +): Promise? + +/** + * Gets the current window. + * + * @see current window + */ +external fun getCurrent( + queryOptions: QueryOptions? = definedExternally +): Promise? + +/** + * Gets the window that was most recently focused — typically the window 'on top'. + */ +external fun getLastFocused( + queryOptions: QueryOptions? = definedExternally +): Promise? + +/** + * Gets all windows. + */ +external fun getAll( + queryOptions: QueryOptions? = definedExternally +): Promise?>? + +/** + * Creates (opens) a new browser window with any optional sizing, position, or default URL provided. + * + * @return Contains details about the created window. + */ +external fun create( + createData: CreateData? = definedExternally +): Promise? + +/** + * Updates the properties of a window. + * Specify only the properties that to be changed; unspecified properties are unchanged. + */ +external fun update( + updateInfo: UpdateInfos +): Promise? + +/** + * Removes (closes) a window and all the tabs inside it. + */ +external fun remove( + windowId: Int +): Promise? + +/** + * Fired when a window is created. + */ +external val onCreated: Event = definedExternally + +/** + * Fired when a window is removed (closed). + */ +external val onRemoved: Event = definedExternally + +/** + * Fired when the currently focused window changes. + * Returns chrome.windows.WINDOW_ID_NONE if all Chrome windows have lost focus. + * + * Note: On some Linux window managers, WINDOW_ID_NONE is always sent immediately preceding a switch from one Chrome window to another. + */ +external val onFocusChanged: Event = definedExternally + +/** + * Fired when a window has been resized; this event is only dispatched when the new bounds are committed, and not for in-progress changes. + */ +external val onBoundsChanged: Event = definedExternally \ No newline at end of file diff --git a/base/src/main/kotlin/browser/windows/Window.kt b/base/src/main/kotlin/browser/windows/Window.kt new file mode 100644 index 0000000..f46bc0b --- /dev/null +++ b/base/src/main/kotlin/browser/windows/Window.kt @@ -0,0 +1,74 @@ +@file:JsModule("webextension-polyfill") +@file:JsQualifier("windows") + +package browser.windows + +import browser.tabs.Tab + +external interface Window { + /** + * The ID of the window. + * Window IDs are unique within a browser session. + * In some circumstances a window may not be assigned an ID property; for example, when querying windows using the sessions API, in which case a session ID may be present. + */ + var id: Int? + + /** + * Whether the window is currently the focused window. + */ + var focused: Boolean + + /** + * The offset of the window from the top edge of the screen in pixels. + * In some circumstances a window may not be assigned a top property; for example, when querying closed windows from the sessions API. + */ + var top: Int? + + /** + * The offset of the window from the left edge of the screen in pixels. + * In some circumstances a window may not be assigned a left property; for example, when querying closed windows from the sessions API. + */ + var left: Int? + + /** + * The width of the window, including the frame, in pixels. + * In some circumstances a window may not be assigned a width property; for example, when querying closed windows from the sessions API. + */ + var width: Int? + + /** + * The height of the window, including the frame, in pixels. + * In some circumstances a window may not be assigned a height property; for example, when querying closed windows from the sessions API. + */ + var height: Int? + + /** + * Array of tabs.Tab objects representing the current tabs in the window. + */ + var tabs: Array? + + /** + * Whether the window is incognito. + */ + var incognito: Boolean + + /** + * The type of browser window this is. + */ + var type: WindowType? + + /** + * The state of this browser window. + */ + var state: WindowState? + + /** + * Whether the window is set to be always on top. + */ + var alwaysOnTop: Boolean + + /** + * The session ID used to uniquely identify a window, obtained from the sessions API. + */ + var sessionId: String? +} \ No newline at end of file diff --git a/base/src/main/kotlin/browser/windows/WindowState.kt b/base/src/main/kotlin/browser/windows/WindowState.kt new file mode 100644 index 0000000..c4b51d3 --- /dev/null +++ b/base/src/main/kotlin/browser/windows/WindowState.kt @@ -0,0 +1,15 @@ +package browser.windows + +/** + * The state of this browser window. + * In some circumstances a window may not be assigned a state property; for example, when querying closed windows from the sessions API. + */ +enum class WindowState(private val value: String) { + normal("normal"), + minimized("minimized"), + maximized("maximized"), + fullscreen("fullscreen"), + locked_fullscreen("locked-fullscreen"); + + override fun toString(): String = value +} \ No newline at end of file diff --git a/base/src/main/kotlin/browser/windows/WindowType.kt b/base/src/main/kotlin/browser/windows/WindowType.kt new file mode 100644 index 0000000..3d3f914 --- /dev/null +++ b/base/src/main/kotlin/browser/windows/WindowType.kt @@ -0,0 +1,14 @@ +package browser.windows + +/** + * The type of window. + */ +enum class WindowType(private val value: String) { + normal("normal"), + popup("popup"), + panel("panel"), + app("app"), + devtools("devtools"); + + override fun toString(): String = value +} \ No newline at end of file diff --git a/base/src/main/kotlin/browser/windows/data/CreateData.kt b/base/src/main/kotlin/browser/windows/data/CreateData.kt new file mode 100644 index 0000000..6c45ca0 --- /dev/null +++ b/base/src/main/kotlin/browser/windows/data/CreateData.kt @@ -0,0 +1,78 @@ +@file:JsModule("webextension-polyfill") +@file:JsQualifier("windows") + +package browser.windows.data + +import browser.windows.CreateType +import browser.windows.WindowState + +external interface CreateData { + /** + * A URL or array of URLs to open as tabs in the window. + * Fully-qualified URLs must include a scheme, e.g., 'http://www.google.com', not 'www.google.com'. + * Non-fully-qualified URLs are considered relative within the extension. + * Defaults to the New Tab Page. + * + * Either set it to string or array of string + */ + var url: Any? + + /** + * The ID of the tab to add to the new window. + */ + var tabId: Int? + + /** + * The number of pixels to position the new window from the left edge of the screen. + * If not specified, the new window is offset naturally from the last focused window. + * This value is ignored for panels. + */ + var left: Int? + + /** + * The number of pixels to position the new window from the top edge of the screen. + * If not specified, the new window is offset naturally from the last focused window. + * This value is ignored for panels. + */ + var top: Int? + + /** + * The width in pixels of the new window, including the frame. + * If not specified, defaults to a natural width. + */ + var width: Int? + + /** + * The height in pixels of the new window, including the frame. + * If not specified, defaults to a natural height. + */ + var height: Int? + + /** + * If true, opens an active window. If false<, opens an inactive window. + */ + var focused: Boolean? + + /** + * Whether the new window should be an incognito window. + */ + var incognito: Boolean? + + /** + * Specifies what type of browser window to create. + */ + var type: CreateType? + + /** + * The initial state of the window. + * The minimized, maximized, and fullscreen states cannot be combined with left, top, width, or height. + */ + var state: WindowState? + + /** + * If true, the newly-created window's 'window.opener' is set to the caller and is in the same unit of related browsing contexts as the caller. + * + * @see unit of related browsing contexts + */ + var setSelfAsOpener: Boolean? +} \ No newline at end of file diff --git a/base/src/main/kotlin/browser/windows/infos/UpdateInfos.kt b/base/src/main/kotlin/browser/windows/infos/UpdateInfos.kt new file mode 100644 index 0000000..06abe01 --- /dev/null +++ b/base/src/main/kotlin/browser/windows/infos/UpdateInfos.kt @@ -0,0 +1,52 @@ +@file:JsModule("webextension-polyfill") +@file:JsQualifier("windows") + +package browser.windows.infos + +import browser.windows.WindowState + +external interface UpdateInfos { + /** + * The offset from the left edge of the screen to move the window to in pixels. + * This value is ignored for panels. + */ + var left: Int? + + /** + * The offset from the top edge of the screen to move the window to in pixels. + * This value is ignored for panels. + */ + var top: Int? + + /** + * The width to resize the window to in pixels. + * This value is ignored for panels. + */ + var width: Int? + + /** + * The height to resize the window to in pixels. + * This value is ignored for panels. + */ + var height: Int? + + /** + * If true, brings the window to the front; cannot be combined with the state 'minimized'. + * If false, brings the next window in the z-order to the front; cannot be combined with the state 'fullscreen' or 'maximized'. + */ + var focused: Boolean? + + /** + * If true, causes the window to be displayed in a manner that draws the user's attention to the window, without changing the focused window. + * The effect lasts until the user changes focus to the window. + * This option has no effect if the window already has focus. + * Set to false to cancel a previous drawAttention request. + */ + var drawAttention: Boolean? + + /** + * The new state of the window. + * The 'minimized', 'maximized', and 'fullscreen' states cannot be combined with 'left', 'top', 'width', or 'height'. + */ + var state: WindowState? +} \ No newline at end of file diff --git a/base/src/main/kotlin/browser/windows/options/QueryOptions.kt b/base/src/main/kotlin/browser/windows/options/QueryOptions.kt new file mode 100644 index 0000000..7a271de --- /dev/null +++ b/base/src/main/kotlin/browser/windows/options/QueryOptions.kt @@ -0,0 +1,20 @@ +@file:JsModule("webextension-polyfill") +@file:JsQualifier("windows") + +package browser.windows.options + +import browser.windows.WindowType + +external interface QueryOptions { + /** + * If true, the windows.Window object has a tabs property that contains a list of the tabs.Tab objects. + * The Tab objects only contain the url, pendingUrl, title, and favIconUrl properties if the extension's manifest file includes the tabs permission. + */ + var populate: Boolean? + + /** + * If set, the windows.Window returned is filtered based on its type. + * If unset, the default filter is set to ['normal', 'popup']. + */ + var windowTypes: Array? +} \ No newline at end of file diff --git a/base/src/main/kotlin/common/ExtendAny.kt b/base/src/main/kotlin/common/ExtendAny.kt new file mode 100644 index 0000000..b75a8f9 --- /dev/null +++ b/base/src/main/kotlin/common/ExtendAny.kt @@ -0,0 +1,14 @@ +package common + +import kotlin.js.Promise + +fun Any?.isNullOrEmpty(): Boolean = when (this) { + null -> true + is Collection<*> -> this.isNullOrEmpty() + is Array<*> -> this.isNullOrEmpty() + else -> { + this == undefined || ((this is String || jsTypeOf(this).equals("string", true)) && (this.toString().isEmpty() || this.toString().isBlank())) + } +} + +fun Promise?.collect(listener: (T) -> Unit) = this?.then(listener) \ No newline at end of file diff --git a/build.gradle.kts b/build.gradle.kts new file mode 100644 index 0000000..143e91c --- /dev/null +++ b/build.gradle.kts @@ -0,0 +1,82 @@ +import org.jetbrains.kotlin.gradle.targets.js.yarn.YarnPlugin +import org.jetbrains.kotlin.gradle.targets.js.yarn.YarnRootExtension + +plugins { + kotlin("js") version "1.7.10" +} + +group = "dev.datlag.kromex" +version = "1.0.0" + +allprojects { + repositories { + google() + mavenLocal() + mavenCentral() + gradlePluginPortal() + } +} + +repositories { + google() + mavenLocal() + mavenCentral() + gradlePluginPortal() +} + +dependencies { + implementation(kotlin("stdlib-js")) + + runtimeOnly(npm("webextension-polyfill", "0.9.0")) + implementation(devNpm("webpack-bundle-analyzer", "4.5.0")) + + compileOnly(project(":background")) + compileOnly(project(":content")) + compileOnly(project(":popup")) +} + +kotlin { + js(LEGACY) { + browser { + commonWebpackConfig { + cssSupport.enabled = true + } + } + } +} + +rootProject.plugins.withType { + rootProject.the().download = true +} + +tasks { + val extensionFolder = "build/extension" + val copyBundleFile = register("copyBundleFile") { + from("build/distributions") { + include("*.js") + } + into(extensionFolder) + } + val copyResources = register("copyResources") { + val resourceFolder = "src/main/resources" + from( + "$resourceFolder/manifest.json", + "$resourceFolder/icons", + "$resourceFolder/html", + "$$resourceFolder/css" + ) + into(extensionFolder) + } + val copyPolyfill = register("copyPolyfill") { + from("build/js/node_modules/webextension-polyfill/dist") { + include("browser-polyfill.min.js") + include("browser-polyfill.min.js.map") + } + into(extensionFolder) + } + val extension = register("extension") { + dependsOn(copyResources, copyPolyfill, copyBundleFile) + from(extensionFolder) + into("build") + } +} \ No newline at end of file diff --git a/content/.gitignore b/content/.gitignore new file mode 100644 index 0000000..e86e21f --- /dev/null +++ b/content/.gitignore @@ -0,0 +1,387 @@ +# Created by https://www.toptal.com/developers/gitignore/api/linux,windows,java,gradle,maven,intellij,intellij+iml,intellij+all,netbeans,visualstudiocode,kotlin +# Edit at https://www.toptal.com/developers/gitignore?templates=linux,windows,java,gradle,maven,intellij,intellij+iml,intellij+all,netbeans,visualstudiocode,kotlin + +### Intellij ### +# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio, WebStorm and Rider +# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839 + +# User-specific stuff +.idea/**/workspace.xml +.idea/**/tasks.xml +.idea/**/usage.statistics.xml +.idea/**/dictionaries +.idea/**/shelf + +# AWS User-specific +.idea/**/aws.xml + +# Generated files +.idea/**/contentModel.xml + +# Sensitive or high-churn files +.idea/**/dataSources/ +.idea/**/dataSources.ids +.idea/**/dataSources.local.xml +.idea/**/sqlDataSources.xml +.idea/**/dynamic.xml +.idea/**/uiDesigner.xml +.idea/**/dbnavigator.xml + +# Gradle +.idea/**/gradle.xml +.idea/**/libraries + +# Gradle and Maven with auto-import +# When using Gradle or Maven with auto-import, you should exclude module files, +# since they will be recreated, and may cause churn. Uncomment if using +# auto-import. +# .idea/artifacts +# .idea/compiler.xml +# .idea/jarRepositories.xml +# .idea/modules.xml +# .idea/*.iml +# .idea/modules +# *.iml +# *.ipr + +# CMake +cmake-build-*/ + +# Mongo Explorer plugin +.idea/**/mongoSettings.xml + +# File-based project format +*.iws + +# IntelliJ +out/ + +# mpeltonen/sbt-idea plugin +.idea_modules/ + +# JIRA plugin +atlassian-ide-plugin.xml + +# Cursive Clojure plugin +.idea/replstate.xml + +# SonarLint plugin +.idea/sonarlint/ + +# Crashlytics plugin (for Android Studio and IntelliJ) +com_crashlytics_export_strings.xml +crashlytics.properties +crashlytics-build.properties +fabric.properties + +# Editor-based Rest Client +.idea/httpRequests + +# Android studio 3.1+ serialized cache file +.idea/caches/build_file_checksums.ser + +### Intellij Patch ### +# Comment Reason: https://github.com/joeblau/gitignore.io/issues/186#issuecomment-215987721 + +# *.iml +# modules.xml +# .idea/misc.xml +# *.ipr + +# Sonarlint plugin +# https://plugins.jetbrains.com/plugin/7973-sonarlint +.idea/**/sonarlint/ + +# SonarQube Plugin +# https://plugins.jetbrains.com/plugin/7238-sonarqube-community-plugin +.idea/**/sonarIssues.xml + +# Markdown Navigator plugin +# https://plugins.jetbrains.com/plugin/7896-markdown-navigator-enhanced +.idea/**/markdown-navigator.xml +.idea/**/markdown-navigator-enh.xml +.idea/**/markdown-navigator/ + +# Cache file creation bug +# See https://youtrack.jetbrains.com/issue/JBR-2257 +.idea/$CACHE_FILE$ + +# CodeStream plugin +# https://plugins.jetbrains.com/plugin/12206-codestream +.idea/codestream.xml + +# Azure Toolkit for IntelliJ plugin +# https://plugins.jetbrains.com/plugin/8053-azure-toolkit-for-intellij +.idea/**/azureSettings.xml + +### Intellij+all ### +# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio, WebStorm and Rider +# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839 + +# User-specific stuff + +# AWS User-specific + +# Generated files + +# Sensitive or high-churn files + +# Gradle + +# Gradle and Maven with auto-import +# When using Gradle or Maven with auto-import, you should exclude module files, +# since they will be recreated, and may cause churn. Uncomment if using +# auto-import. +# .idea/artifacts +# .idea/compiler.xml +# .idea/jarRepositories.xml +# .idea/modules.xml +# .idea/*.iml +# .idea/modules +# *.iml +# *.ipr + +# CMake + +# Mongo Explorer plugin + +# File-based project format + +# IntelliJ + +# mpeltonen/sbt-idea plugin + +# JIRA plugin + +# Cursive Clojure plugin + +# SonarLint plugin + +# Crashlytics plugin (for Android Studio and IntelliJ) + +# Editor-based Rest Client + +# Android studio 3.1+ serialized cache file + +### Intellij+all Patch ### +# Ignore everything but code style settings and run configurations +# that are supposed to be shared within teams. + +.idea/* + +!.idea/codeStyles +!.idea/runConfigurations + +### Intellij+iml ### +# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio, WebStorm and Rider +# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839 + +# User-specific stuff + +# AWS User-specific + +# Generated files + +# Sensitive or high-churn files + +# Gradle + +# Gradle and Maven with auto-import +# When using Gradle or Maven with auto-import, you should exclude module files, +# since they will be recreated, and may cause churn. Uncomment if using +# auto-import. +# .idea/artifacts +# .idea/compiler.xml +# .idea/jarRepositories.xml +# .idea/modules.xml +# .idea/*.iml +# .idea/modules +# *.iml +# *.ipr + +# CMake + +# Mongo Explorer plugin + +# File-based project format + +# IntelliJ + +# mpeltonen/sbt-idea plugin + +# JIRA plugin + +# Cursive Clojure plugin + +# SonarLint plugin + +# Crashlytics plugin (for Android Studio and IntelliJ) + +# Editor-based Rest Client + +# Android studio 3.1+ serialized cache file + +### Intellij+iml Patch ### +# Reason: https://github.com/joeblau/gitignore.io/issues/186#issuecomment-249601023 + +*.iml +modules.xml +.idea/misc.xml +*.ipr + +### Java ### +# Compiled class file +*.class + +# Log file +*.log + +# BlueJ files +*.ctxt + +# Mobile Tools for Java (J2ME) +.mtj.tmp/ + +# Package Files # +*.jar +*.war +*.nar +*.ear +*.zip +*.tar.gz +*.rar + +# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml +hs_err_pid* +replay_pid* + +### Kotlin ### +# Compiled class file + +# Log file + +# BlueJ files + +# Mobile Tools for Java (J2ME) + +# Package Files # + +# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml + +### Linux ### +*~ + +# temporary files which can be created if a process still has a handle open of a deleted file +.fuse_hidden* + +# KDE directory preferences +.directory + +# Linux trash folder which might appear on any partition or disk +.Trash-* + +# .nfs files are created when an open file is removed but is still being accessed +.nfs* + +### Maven ### +target/ +pom.xml.tag +pom.xml.releaseBackup +pom.xml.versionsBackup +pom.xml.next +release.properties +dependency-reduced-pom.xml +buildNumber.properties +.mvn/timing.properties +# https://github.com/takari/maven-wrapper#usage-without-binary-jar +.mvn/wrapper/maven-wrapper.jar + +# Eclipse m2e generated files +# Eclipse Core +.project +# JDT-specific (Eclipse Java Development Tools) +.classpath + +### NetBeans ### +**/nbproject/private/ +**/nbproject/Makefile-*.mk +**/nbproject/Package-*.bash +build/ +nbbuild/ +dist/ +nbdist/ +.nb-gradle/ + +### VisualStudioCode ### +.vscode/* +!.vscode/settings.json +!.vscode/tasks.json +!.vscode/launch.json +!.vscode/extensions.json +!.vscode/*.code-snippets + +# Local History for Visual Studio Code +.history/ + +# Built Visual Studio Code Extensions +*.vsix + +### VisualStudioCode Patch ### +# Ignore all local history of files +.history +.ionide + +# Support for Project snippet scope +.vscode/*.code-snippets + +# Ignore code-workspaces +*.code-workspace + +### Windows ### +# Windows thumbnail cache files +Thumbs.db +Thumbs.db:encryptable +ehthumbs.db +ehthumbs_vista.db + +# Dump file +*.stackdump + +# Folder config file +[Dd]esktop.ini + +# Recycle Bin used on file shares +$RECYCLE.BIN/ + +# Windows Installer files +*.cab +*.msi +*.msix +*.msm +*.msp + +# Windows shortcuts +*.lnk + +### Gradle ### +.gradle +**/build/ +!src/**/build/ + +# Ignore Gradle GUI config +gradle-app.setting + +# Avoid ignoring Gradle wrapper jar file (.jar files are usually ignored) +!gradle-wrapper.jar + +# Avoid ignore Gradle wrappper properties +!gradle-wrapper.properties + +# Cache of project +.gradletasknamecache + +# Eclipse Gradle plugin generated files +# Eclipse Core +# JDT-specific (Eclipse Java Development Tools) + +# End of https://www.toptal.com/developers/gitignore/api/linux,windows,java,gradle,maven,intellij,intellij+iml,intellij+all,netbeans,visualstudiocode,kotlin diff --git a/content/build.gradle.kts b/content/build.gradle.kts new file mode 100644 index 0000000..223e52b --- /dev/null +++ b/content/build.gradle.kts @@ -0,0 +1,33 @@ +plugins { + kotlin("js") +} + +repositories { + google() + mavenLocal() + mavenCentral() + gradlePluginPortal() +} + +dependencies { + implementation(kotlin("stdlib-js")) + implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core-js:1.6.3") + implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.3") + implementation(project(":base")) +} + +kotlin { + js(LEGACY) { + binaries.executable() + browser { + webpackTask { + outputFileName = "content_script.js" + sourceMaps = false + report = true + } + distribution { + directory = File("$projectDir/../build/distributions/") + } + } + } +} diff --git a/content/src/main/kotlin/content.kt b/content/src/main/kotlin/content.kt new file mode 100644 index 0000000..e97bc7e --- /dev/null +++ b/content/src/main/kotlin/content.kt @@ -0,0 +1,2 @@ +fun main() { +} \ No newline at end of file diff --git a/gradle.properties b/gradle.properties new file mode 100644 index 0000000..8af57df --- /dev/null +++ b/gradle.properties @@ -0,0 +1,2 @@ +kotlin.code.style=official +kotlin.js.generate.executable.default=false diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000..41d9927 Binary files /dev/null and b/gradle/wrapper/gradle-wrapper.jar differ diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 0000000..aa991fc --- /dev/null +++ b/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,5 @@ +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-7.4.2-bin.zip +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists diff --git a/gradlew b/gradlew new file mode 100755 index 0000000..1b6c787 --- /dev/null +++ b/gradlew @@ -0,0 +1,234 @@ +#!/bin/sh + +# +# Copyright © 2015-2021 the original authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +############################################################################## +# +# Gradle start up script for POSIX generated by Gradle. +# +# Important for running: +# +# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is +# noncompliant, but you have some other compliant shell such as ksh or +# bash, then to run this script, type that shell name before the whole +# command line, like: +# +# ksh Gradle +# +# Busybox and similar reduced shells will NOT work, because this script +# requires all of these POSIX shell features: +# * functions; +# * expansions «$var», «${var}», «${var:-default}», «${var+SET}», +# «${var#prefix}», «${var%suffix}», and «$( cmd )»; +# * compound commands having a testable exit status, especially «case»; +# * various built-in commands including «command», «set», and «ulimit». +# +# Important for patching: +# +# (2) This script targets any POSIX shell, so it avoids extensions provided +# by Bash, Ksh, etc; in particular arrays are avoided. +# +# The "traditional" practice of packing multiple parameters into a +# space-separated string is a well documented source of bugs and security +# problems, so this is (mostly) avoided, by progressively accumulating +# options in "$@", and eventually passing that to Java. +# +# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS, +# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly; +# see the in-line comments for details. +# +# There are tweaks for specific operating systems such as AIX, CygWin, +# Darwin, MinGW, and NonStop. +# +# (3) This script is generated from the Groovy template +# https://github.com/gradle/gradle/blob/master/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt +# within the Gradle project. +# +# You can find Gradle at https://github.com/gradle/gradle/. +# +############################################################################## + +# Attempt to set APP_HOME + +# Resolve links: $0 may be a link +app_path=$0 + +# Need this for daisy-chained symlinks. +while + APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path + [ -h "$app_path" ] +do + ls=$( ls -ld "$app_path" ) + link=${ls#*' -> '} + case $link in #( + /*) app_path=$link ;; #( + *) app_path=$APP_HOME$link ;; + esac +done + +APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit + +APP_NAME="Gradle" +APP_BASE_NAME=${0##*/} + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD=maximum + +warn () { + echo "$*" +} >&2 + +die () { + echo + echo "$*" + echo + exit 1 +} >&2 + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "$( uname )" in #( + CYGWIN* ) cygwin=true ;; #( + Darwin* ) darwin=true ;; #( + MSYS* | MINGW* ) msys=true ;; #( + NONSTOP* ) nonstop=true ;; +esac + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD=$JAVA_HOME/jre/sh/java + else + JAVACMD=$JAVA_HOME/bin/java + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD=java + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi + +# Increase the maximum file descriptors if we can. +if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then + case $MAX_FD in #( + max*) + MAX_FD=$( ulimit -H -n ) || + warn "Could not query maximum file descriptor limit" + esac + case $MAX_FD in #( + '' | soft) :;; #( + *) + ulimit -n "$MAX_FD" || + warn "Could not set maximum file descriptor limit to $MAX_FD" + esac +fi + +# Collect all arguments for the java command, stacking in reverse order: +# * args from the command line +# * the main class name +# * -classpath +# * -D...appname settings +# * --module-path (only if needed) +# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables. + +# For Cygwin or MSYS, switch paths to Windows format before running java +if "$cygwin" || "$msys" ; then + APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) + CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) + + JAVACMD=$( cygpath --unix "$JAVACMD" ) + + # Now convert the arguments - kludge to limit ourselves to /bin/sh + for arg do + if + case $arg in #( + -*) false ;; # don't mess with options #( + /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath + [ -e "$t" ] ;; #( + *) false ;; + esac + then + arg=$( cygpath --path --ignore --mixed "$arg" ) + fi + # Roll the args list around exactly as many times as the number of + # args, so each arg winds up back in the position where it started, but + # possibly modified. + # + # NB: a `for` loop captures its iteration list before it begins, so + # changing the positional parameters here affects neither the number of + # iterations, nor the values presented in `arg`. + shift # remove old arg + set -- "$@" "$arg" # push replacement arg + done +fi + +# Collect all arguments for the java command; +# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of +# shell script including quotes and variable substitutions, so put them in +# double quotes to make sure that they get re-expanded; and +# * put everything else in single quotes, so that it's not re-expanded. + +set -- \ + "-Dorg.gradle.appname=$APP_BASE_NAME" \ + -classpath "$CLASSPATH" \ + org.gradle.wrapper.GradleWrapperMain \ + "$@" + +# Use "xargs" to parse quoted args. +# +# With -n1 it outputs one arg per line, with the quotes and backslashes removed. +# +# In Bash we could simply go: +# +# readarray ARGS < <( xargs -n1 <<<"$var" ) && +# set -- "${ARGS[@]}" "$@" +# +# but POSIX shell has neither arrays nor command substitution, so instead we +# post-process each arg (as a line of input to sed) to backslash-escape any +# character that might be a shell metacharacter, then use eval to reverse +# that process (while maintaining the separation between arguments), and wrap +# the whole thing up as a single "set" statement. +# +# This will of course break if any of these variables contains a newline or +# an unmatched quote. +# + +eval "set -- $( + printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" | + xargs -n1 | + sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' | + tr '\n' ' ' + )" '"$@"' + +exec "$JAVACMD" "$@" diff --git a/gradlew.bat b/gradlew.bat new file mode 100644 index 0000000..ac1b06f --- /dev/null +++ b/gradlew.bat @@ -0,0 +1,89 @@ +@rem +@rem Copyright 2015 the original author or authors. +@rem +@rem Licensed under the Apache License, Version 2.0 (the "License"); +@rem you may not use this file except in compliance with the License. +@rem You may obtain a copy of the License at +@rem +@rem https://www.apache.org/licenses/LICENSE-2.0 +@rem +@rem Unless required by applicable law or agreed to in writing, software +@rem distributed under the License is distributed on an "AS IS" BASIS, +@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@rem See the License for the specific language governing permissions and +@rem limitations under the License. +@rem + +@if "%DEBUG%" == "" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%" == "" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Resolve any "." and ".." in APP_HOME to make it shorter. +for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if "%ERRORLEVEL%" == "0" goto execute + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto execute + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* + +:end +@rem End local scope for the variables with windows NT shell +if "%ERRORLEVEL%"=="0" goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 +exit /b 1 + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/kotlin-js-store/yarn.lock b/kotlin-js-store/yarn.lock new file mode 100644 index 0000000..bb8e086 --- /dev/null +++ b/kotlin-js-store/yarn.lock @@ -0,0 +1,2921 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@colors/colors@1.5.0": + version "1.5.0" + resolved "https://registry.yarnpkg.com/@colors/colors/-/colors-1.5.0.tgz#bb504579c1cae923e6576a4f5da43d25f97bdbd9" + integrity sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ== + +"@discoveryjs/json-ext@^0.5.0": + version "0.5.7" + resolved "https://registry.yarnpkg.com/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz#1d572bfbbe14b7704e0ba0f39b74815b84870d70" + integrity sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw== + +"@jridgewell/gen-mapping@^0.3.0": + version "0.3.2" + resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz#c1aedc61e853f2bb9f5dfe6d4442d3b565b253b9" + integrity sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A== + dependencies: + "@jridgewell/set-array" "^1.0.1" + "@jridgewell/sourcemap-codec" "^1.4.10" + "@jridgewell/trace-mapping" "^0.3.9" + +"@jridgewell/resolve-uri@^3.0.3": + version "3.1.0" + resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz#2203b118c157721addfe69d47b70465463066d78" + integrity sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w== + +"@jridgewell/set-array@^1.0.1": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.1.2.tgz#7c6cf998d6d20b914c0a55a91ae928ff25965e72" + integrity sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw== + +"@jridgewell/source-map@^0.3.2": + version "0.3.2" + resolved "https://registry.yarnpkg.com/@jridgewell/source-map/-/source-map-0.3.2.tgz#f45351aaed4527a298512ec72f81040c998580fb" + integrity sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw== + dependencies: + "@jridgewell/gen-mapping" "^0.3.0" + "@jridgewell/trace-mapping" "^0.3.9" + +"@jridgewell/sourcemap-codec@^1.4.10": + version "1.4.14" + resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz#add4c98d341472a289190b424efbdb096991bb24" + integrity sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw== + +"@jridgewell/trace-mapping@^0.3.7", "@jridgewell/trace-mapping@^0.3.9": + version "0.3.14" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.14.tgz#b231a081d8f66796e475ad588a1ef473112701ed" + integrity sha512-bJWEfQ9lPTvm3SneWwRFVLzrh6nhjwqw7TUFFBEMzwvg7t7PCDenf2lDwqo4NQXzdpgBXyFgDWnQA+2vkruksQ== + dependencies: + "@jridgewell/resolve-uri" "^3.0.3" + "@jridgewell/sourcemap-codec" "^1.4.10" + +"@leichtgewicht/ip-codec@^2.0.1": + version "2.0.4" + resolved "https://registry.yarnpkg.com/@leichtgewicht/ip-codec/-/ip-codec-2.0.4.tgz#b2ac626d6cb9c8718ab459166d4bb405b8ffa78b" + integrity sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A== + +"@polka/url@^1.0.0-next.20": + version "1.0.0-next.21" + resolved "https://registry.yarnpkg.com/@polka/url/-/url-1.0.0-next.21.tgz#5de5a2385a35309427f6011992b544514d559aa1" + integrity sha512-a5Sab1C4/icpTZVzZc5Ghpz88yQtGOyNqYXcZgOssB2uuAr+wF/MvN6bgtW32q7HHrvBki+BsZ0OuNv6EV3K9g== + +"@types/body-parser@*": + version "1.19.2" + resolved "https://registry.yarnpkg.com/@types/body-parser/-/body-parser-1.19.2.tgz#aea2059e28b7658639081347ac4fab3de166e6f0" + integrity sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g== + dependencies: + "@types/connect" "*" + "@types/node" "*" + +"@types/bonjour@^3.5.9": + version "3.5.10" + resolved "https://registry.yarnpkg.com/@types/bonjour/-/bonjour-3.5.10.tgz#0f6aadfe00ea414edc86f5d106357cda9701e275" + integrity sha512-p7ienRMiS41Nu2/igbJxxLDWrSZ0WxM8UQgCeO9KhoVF7cOVFkrKsiDr1EsJIla8vV3oEEjGcz11jc5yimhzZw== + dependencies: + "@types/node" "*" + +"@types/component-emitter@^1.2.10": + version "1.2.11" + resolved "https://registry.yarnpkg.com/@types/component-emitter/-/component-emitter-1.2.11.tgz#50d47d42b347253817a39709fef03ce66a108506" + integrity sha512-SRXjM+tfsSlA9VuG8hGO2nft2p8zjXCK1VcC6N4NXbBbYbSia9kzCChYQajIjzIqOOOuh5Ock6MmV2oux4jDZQ== + +"@types/connect-history-api-fallback@^1.3.5": + version "1.3.5" + resolved "https://registry.yarnpkg.com/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.3.5.tgz#d1f7a8a09d0ed5a57aee5ae9c18ab9b803205dae" + integrity sha512-h8QJa8xSb1WD4fpKBDcATDNGXghFj6/3GRWG6dhmRcu0RX1Ubasur2Uvx5aeEwlf0MwblEC2bMzzMQntxnw/Cw== + dependencies: + "@types/express-serve-static-core" "*" + "@types/node" "*" + +"@types/connect@*": + version "3.4.35" + resolved "https://registry.yarnpkg.com/@types/connect/-/connect-3.4.35.tgz#5fcf6ae445e4021d1fc2219a4873cc73a3bb2ad1" + integrity sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ== + dependencies: + "@types/node" "*" + +"@types/cookie@^0.4.1": + version "0.4.1" + resolved "https://registry.yarnpkg.com/@types/cookie/-/cookie-0.4.1.tgz#bfd02c1f2224567676c1545199f87c3a861d878d" + integrity sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q== + +"@types/cors@^2.8.12": + version "2.8.12" + resolved "https://registry.yarnpkg.com/@types/cors/-/cors-2.8.12.tgz#6b2c510a7ad7039e98e7b8d3d6598f4359e5c080" + integrity sha512-vt+kDhq/M2ayberEtJcIN/hxXy1Pk+59g2FV/ZQceeaTyCtCucjL2Q7FXlFjtWn4n15KCr1NE2lNNFhp0lEThw== + +"@types/eslint-scope@^3.7.3": + version "3.7.4" + resolved "https://registry.yarnpkg.com/@types/eslint-scope/-/eslint-scope-3.7.4.tgz#37fc1223f0786c39627068a12e94d6e6fc61de16" + integrity sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA== + dependencies: + "@types/eslint" "*" + "@types/estree" "*" + +"@types/eslint@*": + version "8.4.5" + resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-8.4.5.tgz#acdfb7dd36b91cc5d812d7c093811a8f3d9b31e4" + integrity sha512-dhsC09y1gpJWnK+Ff4SGvCuSnk9DaU0BJZSzOwa6GVSg65XtTugLBITDAAzRU5duGBoXBHpdR/9jHGxJjNflJQ== + dependencies: + "@types/estree" "*" + "@types/json-schema" "*" + +"@types/estree@*": + version "0.0.52" + resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.52.tgz#7f1f57ad5b741f3d5b210d3b1f145640d89bf8fe" + integrity sha512-BZWrtCU0bMVAIliIV+HJO1f1PR41M7NKjfxrFJwwhKI1KwhwOxYw1SXg9ao+CIMt774nFuGiG6eU+udtbEI9oQ== + +"@types/estree@^0.0.51": + version "0.0.51" + resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.51.tgz#cfd70924a25a3fd32b218e5e420e6897e1ac4f40" + integrity sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ== + +"@types/express-serve-static-core@*", "@types/express-serve-static-core@^4.17.18": + version "4.17.29" + resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.17.29.tgz#2a1795ea8e9e9c91b4a4bbe475034b20c1ec711c" + integrity sha512-uMd++6dMKS32EOuw1Uli3e3BPgdLIXmezcfHv7N4c1s3gkhikBplORPpMq3fuWkxncZN1reb16d5n8yhQ80x7Q== + dependencies: + "@types/node" "*" + "@types/qs" "*" + "@types/range-parser" "*" + +"@types/express@*", "@types/express@^4.17.13": + version "4.17.13" + resolved "https://registry.yarnpkg.com/@types/express/-/express-4.17.13.tgz#a76e2995728999bab51a33fabce1d705a3709034" + integrity sha512-6bSZTPaTIACxn48l50SR+axgrqm6qXFIxrdAKaG6PaJk3+zuUr35hBlgT7vOmJcum+OEaIBLtHV/qloEAFITeA== + dependencies: + "@types/body-parser" "*" + "@types/express-serve-static-core" "^4.17.18" + "@types/qs" "*" + "@types/serve-static" "*" + +"@types/http-proxy@^1.17.8": + version "1.17.9" + resolved "https://registry.yarnpkg.com/@types/http-proxy/-/http-proxy-1.17.9.tgz#7f0e7931343761efde1e2bf48c40f02f3f75705a" + integrity sha512-QsbSjA/fSk7xB+UXlCT3wHBy5ai9wOcNDWwZAtud+jXhwOM3l+EYZh8Lng4+/6n8uar0J7xILzqftJdJ/Wdfkw== + dependencies: + "@types/node" "*" + +"@types/json-schema@*", "@types/json-schema@^7.0.8", "@types/json-schema@^7.0.9": + version "7.0.11" + resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.11.tgz#d421b6c527a3037f7c84433fd2c4229e016863d3" + integrity sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ== + +"@types/mime@^1": + version "1.3.2" + resolved "https://registry.yarnpkg.com/@types/mime/-/mime-1.3.2.tgz#93e25bf9ee75fe0fd80b594bc4feb0e862111b5a" + integrity sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw== + +"@types/node@*", "@types/node@>=10.0.0": + version "18.0.3" + resolved "https://registry.yarnpkg.com/@types/node/-/node-18.0.3.tgz#463fc47f13ec0688a33aec75d078a0541a447199" + integrity sha512-HzNRZtp4eepNitP+BD6k2L6DROIDG4Q0fm4x+dwfsr6LGmROENnok75VGw40628xf+iR24WeMFcHuuBDUAzzsQ== + +"@types/qs@*": + version "6.9.7" + resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.7.tgz#63bb7d067db107cc1e457c303bc25d511febf6cb" + integrity sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw== + +"@types/range-parser@*": + version "1.2.4" + resolved "https://registry.yarnpkg.com/@types/range-parser/-/range-parser-1.2.4.tgz#cd667bcfdd025213aafb7ca5915a932590acdcdc" + integrity sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw== + +"@types/retry@0.12.0": + version "0.12.0" + resolved "https://registry.yarnpkg.com/@types/retry/-/retry-0.12.0.tgz#2b35eccfcee7d38cd72ad99232fbd58bffb3c84d" + integrity sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA== + +"@types/serve-index@^1.9.1": + version "1.9.1" + resolved "https://registry.yarnpkg.com/@types/serve-index/-/serve-index-1.9.1.tgz#1b5e85370a192c01ec6cec4735cf2917337a6278" + integrity sha512-d/Hs3nWDxNL2xAczmOVZNj92YZCS6RGxfBPjKzuu/XirCgXdpKEb88dYNbrYGint6IVWLNP+yonwVAuRC0T2Dg== + dependencies: + "@types/express" "*" + +"@types/serve-static@*", "@types/serve-static@^1.13.10": + version "1.13.10" + resolved "https://registry.yarnpkg.com/@types/serve-static/-/serve-static-1.13.10.tgz#f5e0ce8797d2d7cc5ebeda48a52c96c4fa47a8d9" + integrity sha512-nCkHGI4w7ZgAdNkrEu0bv+4xNV/XDqW+DydknebMOQwkpDGx8G+HTlj7R7ABI8i8nKxVw0wtKPi1D+lPOkh4YQ== + dependencies: + "@types/mime" "^1" + "@types/node" "*" + +"@types/sockjs@^0.3.33": + version "0.3.33" + resolved "https://registry.yarnpkg.com/@types/sockjs/-/sockjs-0.3.33.tgz#570d3a0b99ac995360e3136fd6045113b1bd236f" + integrity sha512-f0KEEe05NvUnat+boPTZ0dgaLZ4SfSouXUgv5noUiefG2ajgKjmETo9ZJyuqsl7dfl2aHlLJUiki6B4ZYldiiw== + dependencies: + "@types/node" "*" + +"@types/ws@^8.5.1": + version "8.5.3" + resolved "https://registry.yarnpkg.com/@types/ws/-/ws-8.5.3.tgz#7d25a1ffbecd3c4f2d35068d0b283c037003274d" + integrity sha512-6YOoWjruKj1uLf3INHH7D3qTXwFfEsg1kf3c0uDdSBJwfa/llkwIjrAGV7j7mVgGNbzTQ3HiHKKDXl6bJPD97w== + dependencies: + "@types/node" "*" + +"@ungap/promise-all-settled@1.1.2": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz#aa58042711d6e3275dd37dc597e5d31e8c290a44" + integrity sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q== + +"@webassemblyjs/ast@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.11.1.tgz#2bfd767eae1a6996f432ff7e8d7fc75679c0b6a7" + integrity sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw== + dependencies: + "@webassemblyjs/helper-numbers" "1.11.1" + "@webassemblyjs/helper-wasm-bytecode" "1.11.1" + +"@webassemblyjs/floating-point-hex-parser@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz#f6c61a705f0fd7a6aecaa4e8198f23d9dc179e4f" + integrity sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ== + +"@webassemblyjs/helper-api-error@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz#1a63192d8788e5c012800ba6a7a46c705288fd16" + integrity sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg== + +"@webassemblyjs/helper-buffer@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz#832a900eb444884cde9a7cad467f81500f5e5ab5" + integrity sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA== + +"@webassemblyjs/helper-numbers@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.1.tgz#64d81da219fbbba1e3bd1bfc74f6e8c4e10a62ae" + integrity sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ== + dependencies: + "@webassemblyjs/floating-point-hex-parser" "1.11.1" + "@webassemblyjs/helper-api-error" "1.11.1" + "@xtuc/long" "4.2.2" + +"@webassemblyjs/helper-wasm-bytecode@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz#f328241e41e7b199d0b20c18e88429c4433295e1" + integrity sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q== + +"@webassemblyjs/helper-wasm-section@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz#21ee065a7b635f319e738f0dd73bfbda281c097a" + integrity sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg== + dependencies: + "@webassemblyjs/ast" "1.11.1" + "@webassemblyjs/helper-buffer" "1.11.1" + "@webassemblyjs/helper-wasm-bytecode" "1.11.1" + "@webassemblyjs/wasm-gen" "1.11.1" + +"@webassemblyjs/ieee754@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz#963929e9bbd05709e7e12243a099180812992614" + integrity sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ== + dependencies: + "@xtuc/ieee754" "^1.2.0" + +"@webassemblyjs/leb128@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.11.1.tgz#ce814b45574e93d76bae1fb2644ab9cdd9527aa5" + integrity sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw== + dependencies: + "@xtuc/long" "4.2.2" + +"@webassemblyjs/utf8@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.11.1.tgz#d1f8b764369e7c6e6bae350e854dec9a59f0a3ff" + integrity sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ== + +"@webassemblyjs/wasm-edit@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz#ad206ebf4bf95a058ce9880a8c092c5dec8193d6" + integrity sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA== + dependencies: + "@webassemblyjs/ast" "1.11.1" + "@webassemblyjs/helper-buffer" "1.11.1" + "@webassemblyjs/helper-wasm-bytecode" "1.11.1" + "@webassemblyjs/helper-wasm-section" "1.11.1" + "@webassemblyjs/wasm-gen" "1.11.1" + "@webassemblyjs/wasm-opt" "1.11.1" + "@webassemblyjs/wasm-parser" "1.11.1" + "@webassemblyjs/wast-printer" "1.11.1" + +"@webassemblyjs/wasm-gen@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz#86c5ea304849759b7d88c47a32f4f039ae3c8f76" + integrity sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA== + dependencies: + "@webassemblyjs/ast" "1.11.1" + "@webassemblyjs/helper-wasm-bytecode" "1.11.1" + "@webassemblyjs/ieee754" "1.11.1" + "@webassemblyjs/leb128" "1.11.1" + "@webassemblyjs/utf8" "1.11.1" + +"@webassemblyjs/wasm-opt@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz#657b4c2202f4cf3b345f8a4c6461c8c2418985f2" + integrity sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw== + dependencies: + "@webassemblyjs/ast" "1.11.1" + "@webassemblyjs/helper-buffer" "1.11.1" + "@webassemblyjs/wasm-gen" "1.11.1" + "@webassemblyjs/wasm-parser" "1.11.1" + +"@webassemblyjs/wasm-parser@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz#86ca734534f417e9bd3c67c7a1c75d8be41fb199" + integrity sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA== + dependencies: + "@webassemblyjs/ast" "1.11.1" + "@webassemblyjs/helper-api-error" "1.11.1" + "@webassemblyjs/helper-wasm-bytecode" "1.11.1" + "@webassemblyjs/ieee754" "1.11.1" + "@webassemblyjs/leb128" "1.11.1" + "@webassemblyjs/utf8" "1.11.1" + +"@webassemblyjs/wast-printer@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz#d0c73beda8eec5426f10ae8ef55cee5e7084c2f0" + integrity sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg== + dependencies: + "@webassemblyjs/ast" "1.11.1" + "@xtuc/long" "4.2.2" + +"@webpack-cli/configtest@^1.2.0": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@webpack-cli/configtest/-/configtest-1.2.0.tgz#7b20ce1c12533912c3b217ea68262365fa29a6f5" + integrity sha512-4FB8Tj6xyVkyqjj1OaTqCjXYULB9FMkqQ8yGrZjRDrYh0nOE+7Lhs45WioWQQMV+ceFlE368Ukhe6xdvJM9Egg== + +"@webpack-cli/info@^1.5.0": + version "1.5.0" + resolved "https://registry.yarnpkg.com/@webpack-cli/info/-/info-1.5.0.tgz#6c78c13c5874852d6e2dd17f08a41f3fe4c261b1" + integrity sha512-e8tSXZpw2hPl2uMJY6fsMswaok5FdlGNRTktvFk2sD8RjH0hE2+XistawJx1vmKteh4NmGmNUrp+Tb2w+udPcQ== + dependencies: + envinfo "^7.7.3" + +"@webpack-cli/serve@^1.7.0": + version "1.7.0" + resolved "https://registry.yarnpkg.com/@webpack-cli/serve/-/serve-1.7.0.tgz#e1993689ac42d2b16e9194376cfb6753f6254db1" + integrity sha512-oxnCNGj88fL+xzV+dacXs44HcDwf1ovs3AuEzvP7mqXw7fQntqIhQ1BRmynh4qEKQSSSRSWVyXRjmTbZIX9V2Q== + +"@xtuc/ieee754@^1.2.0": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@xtuc/ieee754/-/ieee754-1.2.0.tgz#eef014a3145ae477a1cbc00cd1e552336dceb790" + integrity sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA== + +"@xtuc/long@4.2.2": + version "4.2.2" + resolved "https://registry.yarnpkg.com/@xtuc/long/-/long-4.2.2.tgz#d291c6a4e97989b5c61d9acf396ae4fe133a718d" + integrity sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ== + +abab@^2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.6.tgz#41b80f2c871d19686216b82309231cfd3cb3d291" + integrity sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA== + +accepts@~1.3.4, accepts@~1.3.5, accepts@~1.3.8: + version "1.3.8" + resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.8.tgz#0bf0be125b67014adcb0b0921e62db7bffe16b2e" + integrity sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw== + dependencies: + mime-types "~2.1.34" + negotiator "0.6.3" + +acorn-import-assertions@^1.7.6: + version "1.8.0" + resolved "https://registry.yarnpkg.com/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz#ba2b5939ce62c238db6d93d81c9b111b29b855e9" + integrity sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw== + +acorn-walk@^8.0.0: + version "8.2.0" + resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.2.0.tgz#741210f2e2426454508853a2f44d0ab83b7f69c1" + integrity sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA== + +acorn@^8.0.4, acorn@^8.4.1, acorn@^8.5.0: + version "8.7.1" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.7.1.tgz#0197122c843d1bf6d0a5e83220a788f278f63c30" + integrity sha512-Xx54uLJQZ19lKygFXOWsscKUbsBZW0CPykPhVQdhIeIwrbPmJzqeASDInc8nKBnp/JT6igTs82qPXz069H8I/A== + +ajv-formats@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/ajv-formats/-/ajv-formats-2.1.1.tgz#6e669400659eb74973bbf2e33327180a0996b520" + integrity sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA== + dependencies: + ajv "^8.0.0" + +ajv-keywords@^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-keywords@^5.0.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-5.1.0.tgz#69d4d385a4733cdbeab44964a1170a88f87f0e16" + integrity sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw== + dependencies: + fast-deep-equal "^3.1.3" + +ajv@^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" + +ajv@^8.0.0, ajv@^8.8.0: + version "8.11.0" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.11.0.tgz#977e91dd96ca669f54a11e23e378e33b884a565f" + integrity sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg== + dependencies: + fast-deep-equal "^3.1.1" + json-schema-traverse "^1.0.0" + require-from-string "^2.0.2" + uri-js "^4.2.2" + +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-html-community@^0.0.8: + version "0.0.8" + resolved "https://registry.yarnpkg.com/ansi-html-community/-/ansi-html-community-0.0.8.tgz#69fbc4d6ccbe383f9736934ae34c3f8290f1bf41" + integrity sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw== + +ansi-regex@^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@^4.0.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.2: + 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" + +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== + +array-flatten@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" + integrity sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg== + +array-flatten@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-2.1.2.tgz#24ef80a28c1a893617e2149b0c6d0d788293b099" + integrity sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ== + +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== + +base64id@2.0.0, base64id@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/base64id/-/base64id-2.0.0.tgz#2770ac6bc47d312af97a8bf9a634342e0cd25cb6" + integrity sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog== + +batch@0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/batch/-/batch-0.6.1.tgz#dc34314f4e679318093fc760272525f94bf25c16" + integrity sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw== + +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== + +body-parser@1.20.0, body-parser@^1.19.0: + version "1.20.0" + resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.20.0.tgz#3de69bd89011c11573d7bfee6a64f11b6bd27cc5" + integrity sha512-DfJ+q6EPcGKZD1QWUjSpqp+Q7bDQTsQIF4zfUAtZ6qk+H/3/QRhg9CEp39ss+/T2vw0+HaidC0ecJj/DRLIaKg== + dependencies: + bytes "3.1.2" + content-type "~1.0.4" + debug "2.6.9" + depd "2.0.0" + destroy "1.2.0" + http-errors "2.0.0" + iconv-lite "0.4.24" + on-finished "2.4.1" + qs "6.10.3" + raw-body "2.5.1" + type-is "~1.6.18" + unpipe "1.0.0" + +bonjour-service@^1.0.11: + version "1.0.13" + resolved "https://registry.yarnpkg.com/bonjour-service/-/bonjour-service-1.0.13.tgz#4ac003dc1626023252d58adf2946f57e5da450c1" + integrity sha512-LWKRU/7EqDUC9CTAQtuZl5HzBALoCYwtLhffW3et7vZMwv3bWLpJf8bRYlMD5OCcDpTfnPgNCV4yo9ZIaJGMiA== + dependencies: + array-flatten "^2.1.2" + dns-equal "^1.0.0" + fast-deep-equal "^3.1.3" + multicast-dns "^7.2.5" + +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" + +brace-expansion@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.0.1.tgz#1edc459e0f0c548486ecf9fc99f2221364b9a0ae" + integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA== + dependencies: + balanced-match "^1.0.0" + +braces@^3.0.2, 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" + +browser-stdout@1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.1.tgz#baa559ee14ced73452229bad7326467c61fabd60" + integrity sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw== + +browserslist@^4.14.5: + version "4.21.1" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.21.1.tgz#c9b9b0a54c7607e8dc3e01a0d311727188011a00" + integrity sha512-Nq8MFCSrnJXSc88yliwlzQe3qNe3VntIjhsArW9IJOEPSHNx23FalwApUVbzAWABLhYJJ7y8AynWI/XM8OdfjQ== + dependencies: + caniuse-lite "^1.0.30001359" + electron-to-chromium "^1.4.172" + node-releases "^2.0.5" + update-browserslist-db "^1.0.4" + +buffer-from@^1.0.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" + integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== + +bytes@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048" + integrity sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw== + +bytes@3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.2.tgz#8b0beeb98605adf1b128fa4386403c009e0221a5" + integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg== + +call-bind@^1.0.0: + 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" + +camelcase@^6.0.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" + integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== + +caniuse-lite@^1.0.30001359: + version "1.0.30001363" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001363.tgz#26bec2d606924ba318235944e1193304ea7c4f15" + integrity sha512-HpQhpzTGGPVMnCjIomjt+jvyUu8vNFo3TaDiZ/RcoTrlOq/5+tC8zHdsbgFB6MxmaY+jCpsH09aD80Bb4Ow3Sg== + +chalk@^4.1.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.3, chokidar@^3.5.1, chokidar@^3.5.3: + version "3.5.3" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.3.tgz#1cf37c8707b932bd1af1ae22c0432e2acd1903bd" + integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw== + dependencies: + anymatch "~3.1.2" + braces "~3.0.2" + glob-parent "~5.1.2" + is-binary-path "~2.1.0" + is-glob "~4.0.1" + normalize-path "~3.0.0" + readdirp "~3.6.0" + optionalDependencies: + fsevents "~2.3.2" + +chrome-trace-event@^1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz#1015eced4741e15d06664a957dbbf50d041e26ac" + integrity sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg== + +cliui@^7.0.2: + version "7.0.4" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-7.0.4.tgz#a0265ee655476fc807aea9df3df8df7783808b4f" + integrity sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ== + dependencies: + string-width "^4.2.0" + strip-ansi "^6.0.0" + wrap-ansi "^7.0.0" + +clone-deep@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/clone-deep/-/clone-deep-4.0.1.tgz#c19fd9bdbbf85942b4fd979c84dcf7d5f07c2387" + integrity sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ== + dependencies: + is-plain-object "^2.0.4" + kind-of "^6.0.2" + shallow-clone "^3.0.0" + +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.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@^2.0.10, colorette@^2.0.14: + version "2.0.19" + resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.19.tgz#cdf044f47ad41a0f4b56b3a0d5b4e6e1a2d5a798" + integrity sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ== + +commander@^2.20.0: + 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.0.0, commander@^7.2.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-7.2.0.tgz#a36cb57d0b501ce108e4d20559a150a391d97ab7" + integrity sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw== + +component-emitter@~1.3.0: + 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== + +compressible@~2.0.16: + version "2.0.18" + resolved "https://registry.yarnpkg.com/compressible/-/compressible-2.0.18.tgz#af53cca6b070d4c3c0750fbd77286a6d7cc46fba" + integrity sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg== + dependencies: + mime-db ">= 1.43.0 < 2" + +compression@^1.7.4: + version "1.7.4" + resolved "https://registry.yarnpkg.com/compression/-/compression-1.7.4.tgz#95523eff170ca57c29a0ca41e6fe131f41e5bb8f" + integrity sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ== + dependencies: + accepts "~1.3.5" + bytes "3.0.0" + compressible "~2.0.16" + debug "2.6.9" + on-headers "~1.0.2" + safe-buffer "5.1.2" + vary "~1.1.2" + +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== + +connect-history-api-fallback@^1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz#8b32089359308d111115d81cad3fceab888f97bc" + integrity sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg== + +connect@^3.7.0: + version "3.7.0" + resolved "https://registry.yarnpkg.com/connect/-/connect-3.7.0.tgz#5d49348910caa5e07a01800b030d0c35f20484f8" + integrity sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ== + dependencies: + debug "2.6.9" + finalhandler "1.1.2" + parseurl "~1.3.3" + utils-merge "1.0.1" + +content-disposition@0.5.4: + version "0.5.4" + resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.4.tgz#8b82b4efac82512a02bb0b1dcec9d2c5e8eb5bfe" + integrity sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ== + dependencies: + safe-buffer "5.2.1" + +content-type@~1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b" + integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA== + +cookie-signature@1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" + integrity sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ== + +cookie@0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.5.0.tgz#d1f5d71adec6558c58f389987c366aa47e994f8b" + integrity sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw== + +cookie@~0.4.1: + version "0.4.2" + resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.2.tgz#0e41f24de5ecf317947c82fc789e06a884824432" + integrity sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA== + +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== + +cors@~2.8.5: + version "2.8.5" + resolved "https://registry.yarnpkg.com/cors/-/cors-2.8.5.tgz#eac11da51592dd86b9f06f6e7ac293b3df875d29" + integrity sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g== + dependencies: + object-assign "^4" + vary "^1" + +cross-spawn@^7.0.3: + version "7.0.3" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" + integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== + dependencies: + path-key "^3.1.0" + shebang-command "^2.0.0" + which "^2.0.1" + +css-loader@6.7.1: + version "6.7.1" + resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-6.7.1.tgz#e98106f154f6e1baf3fc3bc455cb9981c1d5fd2e" + integrity sha512-yB5CNFa14MbPJcomwNh3wLThtkZgcNyI2bNMRt8iE5Z8Vwl7f8vQXFAzn2HDOJvtDq2NTZBUGMSUNNyrv3/+cw== + dependencies: + icss-utils "^5.1.0" + postcss "^8.4.7" + postcss-modules-extract-imports "^3.0.0" + postcss-modules-local-by-default "^4.0.0" + postcss-modules-scope "^3.0.0" + postcss-modules-values "^4.0.0" + postcss-value-parser "^4.2.0" + semver "^7.3.5" + +cssesc@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee" + integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== + +custom-event@~1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/custom-event/-/custom-event-1.0.1.tgz#5d02a46850adf1b4a317946a3928fccb5bfd0425" + integrity sha512-GAj5FOq0Hd+RsCGVJxZuKaIDXDf3h6GQoNEjFgbLLI/trgtavwUbSnZ5pVfg27DVCaWjIohryS0JFwIJyT2cMg== + +date-format@^4.0.10, date-format@^4.0.11: + version "4.0.11" + resolved "https://registry.yarnpkg.com/date-format/-/date-format-4.0.11.tgz#ae0d1e069d7f0687938fd06f98c12f3a6276e526" + integrity sha512-VS20KRyorrbMCQmpdl2hg5KaOUsda1RbnsJg461FfrcyCUg+pkd0b40BSW4niQyTheww4DBXQnS7HwSrKkipLw== + +debug@2.6.9: + 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.3.4, debug@^4.1.0, debug@^4.3.4, debug@~4.3.1, debug@~4.3.2: + version "4.3.4" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" + integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== + dependencies: + ms "2.1.2" + +decamelize@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-4.0.0.tgz#aa472d7bf660eb15f3494efd531cab7f2a709837" + integrity sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ== + +default-gateway@^6.0.3: + version "6.0.3" + resolved "https://registry.yarnpkg.com/default-gateway/-/default-gateway-6.0.3.tgz#819494c888053bdb743edbf343d6cdf7f2943a71" + integrity sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg== + dependencies: + execa "^5.0.0" + +define-lazy-prop@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz#3f7ae421129bcaaac9bc74905c98a0009ec9ee7f" + integrity sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og== + +depd@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" + integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== + +depd@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" + integrity sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ== + +destroy@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.2.0.tgz#4803735509ad8be552934c67df614f94e66fa015" + integrity sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg== + +detect-node@^2.0.4: + version "2.1.0" + resolved "https://registry.yarnpkg.com/detect-node/-/detect-node-2.1.0.tgz#c9c70775a49c3d03bc2c06d9a73be550f978f8b1" + integrity sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g== + +di@^0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/di/-/di-0.0.1.tgz#806649326ceaa7caa3306d75d985ea2748ba913c" + integrity sha512-uJaamHkagcZtHPqCIHZxnFrXlunQXgBOsZSUOWwFw31QJCAbyTBoHMW75YOTur5ZNx8pIeAKgf6GWIgaqqiLhA== + +diff@5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/diff/-/diff-5.0.0.tgz#7ed6ad76d859d030787ec35855f5b1daf31d852b" + integrity sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w== + +dns-equal@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/dns-equal/-/dns-equal-1.0.0.tgz#b39e7f1da6eb0a75ba9c17324b34753c47e0654d" + integrity sha512-z+paD6YUQsk+AbGCEM4PrOXSss5gd66QfcVBFTKR/HpFL9jCqikS94HYwKww6fQyO7IxrIIyUu+g0Ka9tUS2Cg== + +dns-packet@^5.2.2: + version "5.4.0" + resolved "https://registry.yarnpkg.com/dns-packet/-/dns-packet-5.4.0.tgz#1f88477cf9f27e78a213fb6d118ae38e759a879b" + integrity sha512-EgqGeaBB8hLiHLZtp/IbaDQTL8pZ0+IvwzSHA6d7VyMDM+B9hgddEMa9xjK5oYnw0ci0JQ6g2XCD7/f6cafU6g== + dependencies: + "@leichtgewicht/ip-codec" "^2.0.1" + +dom-serialize@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/dom-serialize/-/dom-serialize-2.2.1.tgz#562ae8999f44be5ea3076f5419dcd59eb43ac95b" + integrity sha512-Yra4DbvoW7/Z6LBN560ZwXMjoNOSAN2wRsKFGc4iBeso+mpIA6qj1vfdf9HpMaKAqG6wXTy+1SYEzmNpKXOSsQ== + dependencies: + custom-event "~1.0.0" + ent "~2.2.0" + extend "^3.0.0" + void-elements "^2.0.0" + +dukat@0.5.8-rc.4: + version "0.5.8-rc.4" + resolved "https://registry.yarnpkg.com/dukat/-/dukat-0.5.8-rc.4.tgz#90384dcb50b14c26f0e99dae92b2dea44f5fce21" + integrity sha512-ZnMt6DGBjlVgK2uQamXfd7uP/AxH7RqI0BL9GLrrJb2gKdDxvJChWy+M9AQEaL+7/6TmxzJxFOsRiInY9oGWTA== + dependencies: + google-protobuf "3.12.2" + typescript "3.9.5" + +duplexer@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/duplexer/-/duplexer-0.1.2.tgz#3abe43aef3835f8ae077d136ddce0f276b0400e6" + integrity sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg== + +ee-first@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" + integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow== + +electron-to-chromium@^1.4.172: + version "1.4.185" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.185.tgz#3432d7944f1c5fe20664bb45d9cced2151405ce2" + integrity sha512-9kV/isoOGpKkBt04yYNaSWIBn3187Q5VZRtoReq8oz5NY/A4XmU6cAoqgQlDp7kKJCZMRjWZ8nsQyxfpFHvfyw== + +emoji-regex@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" + integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== + +encodeurl@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" + integrity sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w== + +engine.io-parser@~5.0.3: + version "5.0.4" + resolved "https://registry.yarnpkg.com/engine.io-parser/-/engine.io-parser-5.0.4.tgz#0b13f704fa9271b3ec4f33112410d8f3f41d0fc0" + integrity sha512-+nVFp+5z1E3HcToEnO7ZIj3g+3k9389DvWtvJZz0T6/eOCPIyyxehFcedoYrZQrp0LgQbD9pPXhpMBKMd5QURg== + +engine.io@~6.2.0: + version "6.2.0" + resolved "https://registry.yarnpkg.com/engine.io/-/engine.io-6.2.0.tgz#003bec48f6815926f2b1b17873e576acd54f41d0" + integrity sha512-4KzwW3F3bk+KlzSOY57fj/Jx6LyRQ1nbcyIadehl+AnXjKT7gDO0ORdRi/84ixvMKTym6ZKuxvbzN62HDDU1Lg== + dependencies: + "@types/cookie" "^0.4.1" + "@types/cors" "^2.8.12" + "@types/node" ">=10.0.0" + accepts "~1.3.4" + base64id "2.0.0" + cookie "~0.4.1" + cors "~2.8.5" + debug "~4.3.1" + engine.io-parser "~5.0.3" + ws "~8.2.3" + +enhanced-resolve@^5.9.3: + version "5.10.0" + resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.10.0.tgz#0dc579c3bb2a1032e357ac45b8f3a6f3ad4fb1e6" + integrity sha512-T0yTFjdpldGY8PmuXXR0PyQ1ufZpEGiHVrp7zHKB7jdR4qlmZHhONVM5AQOAWXuF/w3dnHbEQVrNptJgt7F+cQ== + dependencies: + graceful-fs "^4.2.4" + tapable "^2.2.0" + +ent@~2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/ent/-/ent-2.2.0.tgz#e964219325a21d05f44466a2f686ed6ce5f5dd1d" + integrity sha512-GHrMyVZQWvTIdDtpiEXdHZnFQKzeO09apj8Cbl4pKWy4i0Oprcq17usfDt5aO63swf0JOeMWjWQE/LzgSRuWpA== + +envinfo@^7.7.3: + version "7.8.1" + resolved "https://registry.yarnpkg.com/envinfo/-/envinfo-7.8.1.tgz#06377e3e5f4d379fea7ac592d5ad8927e0c4d475" + integrity sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw== + +es-module-lexer@^0.9.0: + version "0.9.3" + resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-0.9.3.tgz#6f13db00cc38417137daf74366f535c8eb438f19" + integrity sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ== + +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-html@~1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" + integrity sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow== + +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-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" + +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.2.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" + integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== + +etag@~1.8.1: + version "1.8.1" + resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" + integrity sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg== + +eventemitter3@^4.0.0: + version "4.0.7" + resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.7.tgz#2de9b68f6528d5644ef5c59526a1b4a07306169f" + integrity sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw== + +events@^3.2.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400" + integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== + +execa@^5.0.0: + version "5.1.1" + resolved "https://registry.yarnpkg.com/execa/-/execa-5.1.1.tgz#f80ad9cbf4298f7bd1d4c9555c21e93741c411dd" + integrity sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg== + dependencies: + cross-spawn "^7.0.3" + get-stream "^6.0.0" + human-signals "^2.1.0" + is-stream "^2.0.0" + merge-stream "^2.0.0" + npm-run-path "^4.0.1" + onetime "^5.1.2" + signal-exit "^3.0.3" + strip-final-newline "^2.0.0" + +express@^4.17.3: + version "4.18.1" + resolved "https://registry.yarnpkg.com/express/-/express-4.18.1.tgz#7797de8b9c72c857b9cd0e14a5eea80666267caf" + integrity sha512-zZBcOX9TfehHQhtupq57OF8lFZ3UZi08Y97dwFCkD8p9d/d2Y3M+ykKcwaMDEL+4qyUolgBDX6AblpR3fL212Q== + dependencies: + accepts "~1.3.8" + array-flatten "1.1.1" + body-parser "1.20.0" + content-disposition "0.5.4" + content-type "~1.0.4" + cookie "0.5.0" + cookie-signature "1.0.6" + debug "2.6.9" + depd "2.0.0" + encodeurl "~1.0.2" + escape-html "~1.0.3" + etag "~1.8.1" + finalhandler "1.2.0" + fresh "0.5.2" + http-errors "2.0.0" + merge-descriptors "1.0.1" + methods "~1.1.2" + on-finished "2.4.1" + parseurl "~1.3.3" + path-to-regexp "0.1.7" + proxy-addr "~2.0.7" + qs "6.10.3" + range-parser "~1.2.1" + safe-buffer "5.2.1" + send "0.18.0" + serve-static "1.15.0" + setprototypeof "1.2.0" + statuses "2.0.1" + type-is "~1.6.18" + utils-merge "1.0.1" + vary "~1.1.2" + +extend@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" + integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== + +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-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== + +fastest-levenshtein@^1.0.12: + version "1.0.12" + resolved "https://registry.yarnpkg.com/fastest-levenshtein/-/fastest-levenshtein-1.0.12.tgz#9990f7d3a88cc5a9ffd1f1745745251700d497e2" + integrity sha512-On2N+BpYJ15xIC974QNVuYGMOlEVt4s0EOI3wwMqOmK1fdDY+FN/zltPV8vosq4ad4c/gJ1KHScUn/6AWIgiow== + +faye-websocket@^0.11.3: + version "0.11.4" + resolved "https://registry.yarnpkg.com/faye-websocket/-/faye-websocket-0.11.4.tgz#7f0d9275cfdd86a1c963dc8b65fcc451edcbb1da" + integrity sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g== + dependencies: + websocket-driver ">=0.5.1" + +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" + +finalhandler@1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.2.tgz#b7e7d000ffd11938d0fdb053506f6ebabe9f587d" + integrity sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA== + dependencies: + debug "2.6.9" + encodeurl "~1.0.2" + escape-html "~1.0.3" + on-finished "~2.3.0" + parseurl "~1.3.3" + statuses "~1.5.0" + unpipe "~1.0.0" + +finalhandler@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.2.0.tgz#7d23fe5731b207b4640e4fcd00aec1f9207a7b32" + integrity sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg== + dependencies: + debug "2.6.9" + encodeurl "~1.0.2" + escape-html "~1.0.3" + on-finished "2.4.1" + parseurl "~1.3.3" + statuses "2.0.1" + unpipe "~1.0.0" + +find-up@5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" + integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== + dependencies: + locate-path "^6.0.0" + path-exists "^4.0.0" + +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" + +flat@^5.0.2: + version "5.0.2" + resolved "https://registry.yarnpkg.com/flat/-/flat-5.0.2.tgz#8ca6fe332069ffa9d324c327198c598259ceb241" + integrity sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ== + +flatted@^3.2.5: + version "3.2.6" + resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.6.tgz#022e9218c637f9f3fc9c35ab9c9193f05add60b2" + integrity sha512-0sQoMh9s0BYsm+12Huy/rkKxVu4R1+r96YX5cG44rHV0pQ6iC3Q+mkoMFaGWObMFYQxCVT+ssG1ksneA2MI9KQ== + +follow-redirects@^1.0.0: + version "1.15.1" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.1.tgz#0ca6a452306c9b276e4d3127483e29575e207ad5" + integrity sha512-yLAMQs+k0b2m7cVxpS1VKJVvoz7SS9Td1zss3XRwXj+ZDH00RJgnuLx7E44wx02kQLrdM3aOOy+FpzS7+8OizA== + +format-util@1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/format-util/-/format-util-1.0.5.tgz#1ffb450c8a03e7bccffe40643180918cc297d271" + integrity sha512-varLbTj0e0yVyRpqQhuWV+8hlePAgaoFRhNFj50BNjEIrw1/DphHSObtqwskVCPWNgzwPoQrZAbfa/SBiicNeg== + +forwarded@0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811" + integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow== + +fresh@0.5.2: + version "0.5.2" + resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" + integrity sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q== + +fs-extra@^10.1.0: + version "10.1.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-10.1.0.tgz#02873cfbc4084dde127eaa5f9905eef2325d1abf" + integrity sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ== + dependencies: + graceful-fs "^4.2.0" + jsonfile "^6.0.1" + universalify "^2.0.0" + +fs-monkey@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/fs-monkey/-/fs-monkey-1.0.3.tgz#ae3ac92d53bb328efe0e9a1d9541f6ad8d48e2d3" + integrity sha512-cybjIfiiE+pTWicSCLFHSrXZ6EilF30oh91FDP9S2B051prEa7QWfrVTQm10/dDpswBDXZugPa1Ogu8Yh+HV0Q== + +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== + +fsevents@~2.3.2: + version "2.3.2" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" + integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== + +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== + +get-caller-file@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" + integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== + +get-intrinsic@^1.0.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.1.2.tgz#336975123e05ad0b7ba41f152ee4aadbea6cf598" + integrity sha512-Jfm3OyCxHh9DJyc28qGk+JmfkpO41A4XkneDSujN9MDXrm4oDKdHvndhZ2dN94+ERNfkYJWDclW6k2L/ZGHjXA== + dependencies: + function-bind "^1.1.1" + has "^1.0.3" + has-symbols "^1.0.3" + +get-stream@^6.0.0: + version "6.0.1" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7" + integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== + +glob-parent@~5.1.2: + 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-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.2.0: + 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" + +glob@^7.1.3, glob@^7.1.7: + version "7.2.3" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" + integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.1.1" + once "^1.3.0" + path-is-absolute "^1.0.0" + +google-protobuf@3.12.2: + version "3.12.2" + resolved "https://registry.yarnpkg.com/google-protobuf/-/google-protobuf-3.12.2.tgz#50ce9f9b6281235724eb243d6a83e969a2176e53" + integrity sha512-4CZhpuRr1d6HjlyrxoXoocoGFnRYgKULgMtikMddA9ztRyYR59Aondv2FioyxWVamRo0rF2XpYawkTCBEQOSkA== + +graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.4, graceful-fs@^4.2.6, graceful-fs@^4.2.9: + version "4.2.10" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.10.tgz#147d3a006da4ca3ce14728c7aefc287c367d7a6c" + integrity sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA== + +gzip-size@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/gzip-size/-/gzip-size-6.0.0.tgz#065367fd50c239c0671cbcbad5be3e2eeb10e462" + integrity sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q== + dependencies: + duplexer "^0.1.2" + +handle-thing@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/handle-thing/-/handle-thing-2.0.1.tgz#857f79ce359580c340d43081cc648970d0bb234e" + integrity sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg== + +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-symbols@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" + integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== + +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" + +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== + +hpack.js@^2.1.6: + version "2.1.6" + resolved "https://registry.yarnpkg.com/hpack.js/-/hpack.js-2.1.6.tgz#87774c0949e513f42e84575b3c45681fade2a0b2" + integrity sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ== + dependencies: + inherits "^2.0.1" + obuf "^1.0.0" + readable-stream "^2.0.1" + wbuf "^1.1.0" + +html-entities@^2.3.2: + version "2.3.3" + resolved "https://registry.yarnpkg.com/html-entities/-/html-entities-2.3.3.tgz#117d7626bece327fc8baace8868fa6f5ef856e46" + integrity sha512-DV5Ln36z34NNTDgnz0EWGBLZENelNAtkiFA4kyNOG2tDI6Mz1uSWiq1wAKdyjnJwyDiDO7Fa2SO1CTxPXL8VxA== + +http-deceiver@^1.2.7: + version "1.2.7" + resolved "https://registry.yarnpkg.com/http-deceiver/-/http-deceiver-1.2.7.tgz#fa7168944ab9a519d337cb0bec7284dc3e723d87" + integrity sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw== + +http-errors@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-2.0.0.tgz#b7774a1486ef73cf7667ac9ae0858c012c57b9d3" + integrity sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ== + dependencies: + depd "2.0.0" + inherits "2.0.4" + setprototypeof "1.2.0" + statuses "2.0.1" + toidentifier "1.0.1" + +http-errors@~1.6.2: + version "1.6.3" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.3.tgz#8b55680bb4be283a0b5bf4ea2e38580be1d9320d" + integrity sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A== + dependencies: + depd "~1.1.2" + inherits "2.0.3" + setprototypeof "1.1.0" + statuses ">= 1.4.0 < 2" + +http-parser-js@>=0.5.1: + version "0.5.8" + resolved "https://registry.yarnpkg.com/http-parser-js/-/http-parser-js-0.5.8.tgz#af23090d9ac4e24573de6f6aecc9d84a48bf20e3" + integrity sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q== + +http-proxy-middleware@^2.0.3: + version "2.0.6" + resolved "https://registry.yarnpkg.com/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz#e1a4dd6979572c7ab5a4e4b55095d1f32a74963f" + integrity sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw== + dependencies: + "@types/http-proxy" "^1.17.8" + http-proxy "^1.18.1" + is-glob "^4.0.1" + is-plain-obj "^3.0.0" + micromatch "^4.0.2" + +http-proxy@^1.18.1: + version "1.18.1" + resolved "https://registry.yarnpkg.com/http-proxy/-/http-proxy-1.18.1.tgz#401541f0534884bbf95260334e72f88ee3976549" + integrity sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ== + dependencies: + eventemitter3 "^4.0.0" + follow-redirects "^1.0.0" + requires-port "^1.0.0" + +human-signals@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0" + integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== + +iconv-lite@0.4.24: + 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.3: + 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" + +icss-utils@^5.0.0, icss-utils@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/icss-utils/-/icss-utils-5.1.0.tgz#c6be6858abd013d768e98366ae47e25d5887b1ae" + integrity sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA== + +import-local@^3.0.2: + version "3.1.0" + resolved "https://registry.yarnpkg.com/import-local/-/import-local-3.1.0.tgz#b4479df8a5fd44f6cdce24070675676063c95cb4" + integrity sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg== + dependencies: + pkg-dir "^4.2.0" + resolve-cwd "^3.0.0" + +inflight@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== + dependencies: + once "^1.3.0" + wrappy "1" + +inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.3: + version "2.0.4" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== + +inherits@2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" + integrity sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw== + +interpret@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/interpret/-/interpret-2.2.0.tgz#1a78a0b5965c40a5416d007ad6f50ad27c417df9" + integrity sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw== + +ipaddr.js@1.9.1: + version "1.9.1" + resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" + integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== + +ipaddr.js@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-2.0.1.tgz#eca256a7a877e917aeb368b0a7497ddf42ef81c0" + integrity sha512-1qTgH9NG+IIJ4yfKs2e6Pp1bZg8wbDbKHT21HrLIeYBTRLgMYKnMTPAuI3Lcs61nfx5h1xlXnbJtH1kX5/d/ng== + +is-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-core-module@^2.9.0: + version "2.9.0" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.9.0.tgz#e1c34429cd51c6dd9e09e0799e396e27b19a9c69" + integrity sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A== + dependencies: + has "^1.0.3" + +is-docker@^2.0.0, is-docker@^2.1.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-2.2.1.tgz#33eeabe23cfe86f14bde4408a02c0cfb853acdaa" + integrity sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ== + +is-extglob@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" + integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== + +is-fullwidth-code-point@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" + integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== + +is-glob@^4.0.1, is-glob@~4.0.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-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-plain-obj@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-2.1.0.tgz#45e42e37fccf1f40da8e5f76ee21515840c09287" + integrity sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA== + +is-plain-obj@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-3.0.0.tgz#af6f2ea14ac5a646183a5bbdb5baabbc156ad9d7" + integrity sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA== + +is-plain-object@^2.0.4: + version "2.0.4" + resolved "https://registry.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-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-unicode-supported@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz#3f26c76a809593b52bfa2ecb5710ed2779b522a7" + integrity sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw== + +is-wsl@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-2.2.0.tgz#74a4c76e77ca9fd3f932f290c17ea326cd157271" + integrity sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww== + dependencies: + is-docker "^2.0.0" + +isarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" + integrity sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ== + +isbinaryfile@^4.0.8: + version "4.0.10" + resolved "https://registry.yarnpkg.com/isbinaryfile/-/isbinaryfile-4.0.10.tgz#0c5b5e30c2557a2f06febd37b7322946aaee42b3" + integrity sha512-iHrqe5shvBUcFbmZq9zOQHBoeOhZJu6RQGrDpBgenUm/Am+F3JM2MgQj+rK3Z601fzrL5gLZWtAPH2OBaSVcyw== + +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== + +isobject@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" + integrity sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg== + +jest-worker@^27.4.5: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-27.5.1.tgz#8d146f0900e8973b106b6f73cc1e9a8cb86f8db0" + integrity sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg== + dependencies: + "@types/node" "*" + merge-stream "^2.0.0" + supports-color "^8.0.0" + +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" + +json-parse-even-better-errors@^2.3.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" + integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== + +json-schema-traverse@^0.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-schema-traverse@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz#ae7bcb3656ab77a73ba5c49bf654f38e6b6860e2" + integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug== + +jsonfile@^6.0.1: + version "6.1.0" + resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.1.0.tgz#bc55b2634793c679ec6403094eb13698a6ec0aae" + integrity sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ== + dependencies: + universalify "^2.0.0" + optionalDependencies: + graceful-fs "^4.1.6" + +karma-chrome-launcher@3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/karma-chrome-launcher/-/karma-chrome-launcher-3.1.1.tgz#baca9cc071b1562a1db241827257bfe5cab597ea" + integrity sha512-hsIglcq1vtboGPAN+DGCISCFOxW+ZVnIqhDQcCMqqCp+4dmJ0Qpq5QAjkbA0X2L9Mi6OBkHi2Srrbmm7pUKkzQ== + dependencies: + which "^1.2.1" + +karma-mocha@2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/karma-mocha/-/karma-mocha-2.0.1.tgz#4b0254a18dfee71bdbe6188d9a6861bf86b0cd7d" + integrity sha512-Tzd5HBjm8his2OA4bouAsATYEpZrp9vC7z5E5j4C5Of5Rrs1jY67RAwXNcVmd/Bnk1wgvQRou0zGVLey44G4tQ== + dependencies: + minimist "^1.2.3" + +karma-sourcemap-loader@0.3.8: + version "0.3.8" + resolved "https://registry.yarnpkg.com/karma-sourcemap-loader/-/karma-sourcemap-loader-0.3.8.tgz#d4bae72fb7a8397328a62b75013d2df937bdcf9c" + integrity sha512-zorxyAakYZuBcHRJE+vbrK2o2JXLFWK8VVjiT/6P+ltLBUGUvqTEkUiQ119MGdOrK7mrmxXHZF1/pfT6GgIZ6g== + dependencies: + graceful-fs "^4.1.2" + +karma-webpack@5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/karma-webpack/-/karma-webpack-5.0.0.tgz#2a2c7b80163fe7ffd1010f83f5507f95ef39f840" + integrity sha512-+54i/cd3/piZuP3dr54+NcFeKOPnys5QeM1IY+0SPASwrtHsliXUiCL50iW+K9WWA7RvamC4macvvQ86l3KtaA== + dependencies: + glob "^7.1.3" + minimatch "^3.0.4" + webpack-merge "^4.1.5" + +karma@6.4.0: + version "6.4.0" + resolved "https://registry.yarnpkg.com/karma/-/karma-6.4.0.tgz#82652dfecdd853ec227b74ed718a997028a99508" + integrity sha512-s8m7z0IF5g/bS5ONT7wsOavhW4i4aFkzD4u4wgzAQWT4HGUeWI3i21cK2Yz6jndMAeHETp5XuNsRoyGJZXVd4w== + dependencies: + "@colors/colors" "1.5.0" + body-parser "^1.19.0" + braces "^3.0.2" + chokidar "^3.5.1" + connect "^3.7.0" + di "^0.0.1" + dom-serialize "^2.2.1" + glob "^7.1.7" + graceful-fs "^4.2.6" + http-proxy "^1.18.1" + isbinaryfile "^4.0.8" + lodash "^4.17.21" + log4js "^6.4.1" + mime "^2.5.2" + minimatch "^3.0.4" + mkdirp "^0.5.5" + qjobs "^1.2.0" + range-parser "^1.2.1" + rimraf "^3.0.2" + socket.io "^4.4.1" + source-map "^0.6.1" + tmp "^0.2.1" + ua-parser-js "^0.7.30" + yargs "^16.1.1" + +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== + +loader-runner@^4.2.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-4.3.0.tgz#c1b4a163b99f614830353b16755e7149ac2314e1" + integrity sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg== + +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" + +locate-path@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" + integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== + dependencies: + p-locate "^5.0.0" + +lodash@^4.17.15, lodash@^4.17.20, lodash@^4.17.21: + version "4.17.21" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" + integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== + +log-symbols@4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.1.0.tgz#3fbdbb95b4683ac9fc785111e792e558d4abd503" + integrity sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg== + dependencies: + chalk "^4.1.0" + is-unicode-supported "^0.1.0" + +log4js@^6.4.1: + version "6.6.0" + resolved "https://registry.yarnpkg.com/log4js/-/log4js-6.6.0.tgz#e8fd00143d1e0ecf1d10959bb69b90b1b30137f3" + integrity sha512-3v8R7fd45UB6THucSht6wN2/7AZEruQbXdjygPZcxt5TA/msO6si9CN5MefUuKXbYnJHTBnYcx4famwcyQd+sA== + dependencies: + date-format "^4.0.11" + debug "^4.3.4" + flatted "^3.2.5" + rfdc "^1.3.0" + streamroller "^3.1.1" + +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" + +media-typer@0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" + integrity sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ== + +memfs@^3.4.3: + version "3.4.7" + resolved "https://registry.yarnpkg.com/memfs/-/memfs-3.4.7.tgz#e5252ad2242a724f938cb937e3c4f7ceb1f70e5a" + integrity sha512-ygaiUSNalBX85388uskeCyhSAoOSgzBbtVCr9jA2RROssFL9Q19/ZXFqS+2Th2sr1ewNIWgFdLzLC3Yl1Zv+lw== + dependencies: + fs-monkey "^1.0.3" + +merge-descriptors@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" + integrity sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w== + +merge-stream@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" + integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== + +methods@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" + integrity sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w== + +micromatch@^4.0.2: + version "4.0.5" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.5.tgz#bc8999a7cbbf77cdc89f132f6e467051b49090c6" + integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA== + dependencies: + braces "^3.0.2" + picomatch "^2.3.1" + +mime-db@1.52.0, "mime-db@>= 1.43.0 < 2": + version "1.52.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" + integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== + +mime-types@^2.1.27, mime-types@^2.1.31, mime-types@~2.1.17, mime-types@~2.1.24, mime-types@~2.1.34: + version "2.1.35" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" + integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== + dependencies: + mime-db "1.52.0" + +mime@1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" + integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== + +mime@^2.5.2: + 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== + +minimalistic-assert@^1.0.0: + 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== + +minimatch@5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-5.0.1.tgz#fb9022f7528125187c92bd9e9b6366be1cf3415b" + integrity sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g== + dependencies: + brace-expansion "^2.0.1" + +minimatch@^3.0.4, minimatch@^3.1.1: + version "3.1.2" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" + integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== + dependencies: + brace-expansion "^1.1.7" + +minimist@^1.2.3, minimist@^1.2.6: + version "1.2.6" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.6.tgz#8637a5b759ea0d6e98702cfb3a9283323c93af44" + integrity sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q== + +mkdirp@^0.5.5: + version "0.5.6" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.6.tgz#7def03d2432dcae4ba1d611445c48396062255f6" + integrity sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw== + dependencies: + minimist "^1.2.6" + +mocha@10.0.0: + version "10.0.0" + resolved "https://registry.yarnpkg.com/mocha/-/mocha-10.0.0.tgz#205447d8993ec755335c4b13deba3d3a13c4def9" + integrity sha512-0Wl+elVUD43Y0BqPZBzZt8Tnkw9CMUdNYnUsTfOM1vuhJVZL+kiesFYsqwBkEEuEixaiPe5ZQdqDgX2jddhmoA== + dependencies: + "@ungap/promise-all-settled" "1.1.2" + ansi-colors "4.1.1" + browser-stdout "1.3.1" + chokidar "3.5.3" + debug "4.3.4" + diff "5.0.0" + escape-string-regexp "4.0.0" + find-up "5.0.0" + glob "7.2.0" + he "1.2.0" + js-yaml "4.1.0" + log-symbols "4.1.0" + minimatch "5.0.1" + ms "2.1.3" + nanoid "3.3.3" + serialize-javascript "6.0.0" + strip-json-comments "3.1.1" + supports-color "8.1.1" + workerpool "6.2.1" + yargs "16.2.0" + yargs-parser "20.2.4" + yargs-unparser "2.0.0" + +mrmime@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/mrmime/-/mrmime-1.0.1.tgz#5f90c825fad4bdd41dc914eff5d1a8cfdaf24f27" + integrity sha512-hzzEagAgDyoU1Q6yg5uI+AorQgdvMCur3FcKf7NhMKWsaYg+RnbTyHRa/9IlLF9rf455MOCtcqqrQQ83pPP7Uw== + +ms@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" + integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A== + +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== + +ms@2.1.3: + version "2.1.3" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" + integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== + +multicast-dns@^7.2.5: + version "7.2.5" + resolved "https://registry.yarnpkg.com/multicast-dns/-/multicast-dns-7.2.5.tgz#77eb46057f4d7adbd16d9290fa7299f6fa64cced" + integrity sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg== + dependencies: + dns-packet "^5.2.2" + thunky "^1.0.2" + +nanoid@3.3.3: + version "3.3.3" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.3.tgz#fd8e8b7aa761fe807dba2d1b98fb7241bb724a25" + integrity sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w== + +nanoid@^3.3.4: + version "3.3.4" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.4.tgz#730b67e3cd09e2deacf03c027c81c9d9dbc5e8ab" + integrity sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw== + +negotiator@0.6.3: + version "0.6.3" + resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd" + integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg== + +neo-async@^2.6.2: + version "2.6.2" + resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f" + integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== + +node-forge@^1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-1.3.1.tgz#be8da2af243b2417d5f646a770663a92b7e9ded3" + integrity sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA== + +node-releases@^2.0.5: + version "2.0.6" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.6.tgz#8a7088c63a55e493845683ebf3c828d8c51c5503" + integrity sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg== + +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== + +npm-run-path@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea" + integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== + dependencies: + path-key "^3.0.0" + +object-assign@^4: + version "4.1.1" + resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" + integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== + +object-inspect@^1.9.0: + version "1.12.2" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.2.tgz#c0641f26394532f28ab8d796ab954e43c009a8ea" + integrity sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ== + +obuf@^1.0.0, obuf@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/obuf/-/obuf-1.1.2.tgz#09bea3343d41859ebd446292d11c9d4db619084e" + integrity sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg== + +on-finished@2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.4.1.tgz#58c8c44116e54845ad57f14ab10b03533184ac3f" + integrity sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg== + dependencies: + ee-first "1.1.1" + +on-finished@~2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" + integrity sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww== + dependencies: + ee-first "1.1.1" + +on-headers@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/on-headers/-/on-headers-1.0.2.tgz#772b0ae6aaa525c399e489adfad90c403eb3c28f" + integrity sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA== + +once@^1.3.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== + dependencies: + wrappy "1" + +onetime@^5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" + integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== + dependencies: + mimic-fn "^2.1.0" + +open@^8.0.9: + version "8.4.0" + resolved "https://registry.yarnpkg.com/open/-/open-8.4.0.tgz#345321ae18f8138f82565a910fdc6b39e8c244f8" + integrity sha512-XgFPPM+B28FtCCgSb9I+s9szOC1vZRSwgWsRUA5ylIxRTgKozqjOCrVOqGsYABPYK5qnfqClxZTFBa8PKt2v6Q== + dependencies: + define-lazy-prop "^2.0.0" + is-docker "^2.1.1" + is-wsl "^2.2.0" + +opener@^1.5.2: + version "1.5.2" + resolved "https://registry.yarnpkg.com/opener/-/opener-1.5.2.tgz#5d37e1f35077b9dcac4301372271afdeb2a13598" + integrity sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A== + +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-limit@^3.0.2: + version "3.1.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" + integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== + dependencies: + yocto-queue "^0.1.0" + +p-locate@^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-locate@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" + integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== + dependencies: + p-limit "^3.0.2" + +p-retry@^4.5.0: + version "4.6.2" + resolved "https://registry.yarnpkg.com/p-retry/-/p-retry-4.6.2.tgz#9baae7184057edd4e17231cee04264106e092a16" + integrity sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ== + dependencies: + "@types/retry" "0.12.0" + retry "^0.13.1" + +p-try@^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== + +parseurl@~1.3.2, parseurl@~1.3.3: + version "1.3.3" + resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" + integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== + +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 sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== + +path-key@^3.0.0, path-key@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" + integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== + +path-parse@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" + integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== + +path-to-regexp@0.1.7: + version "0.1.7" + resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" + integrity sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ== + +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.3.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" + integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== + +pkg-dir@^4.2.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" + +postcss-modules-extract-imports@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz#cda1f047c0ae80c97dbe28c3e76a43b88025741d" + integrity sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw== + +postcss-modules-local-by-default@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.0.tgz#ebbb54fae1598eecfdf691a02b3ff3b390a5a51c" + integrity sha512-sT7ihtmGSF9yhm6ggikHdV0hlziDTX7oFoXtuVWeDd3hHObNkcHRo9V3yg7vCAY7cONyxJC/XXCmmiHHcvX7bQ== + dependencies: + icss-utils "^5.0.0" + postcss-selector-parser "^6.0.2" + postcss-value-parser "^4.1.0" + +postcss-modules-scope@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/postcss-modules-scope/-/postcss-modules-scope-3.0.0.tgz#9ef3151456d3bbfa120ca44898dfca6f2fa01f06" + integrity sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg== + dependencies: + postcss-selector-parser "^6.0.4" + +postcss-modules-values@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz#d7c5e7e68c3bb3c9b27cbf48ca0bb3ffb4602c9c" + integrity sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ== + dependencies: + icss-utils "^5.0.0" + +postcss-selector-parser@^6.0.2, postcss-selector-parser@^6.0.4: + version "6.0.10" + resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.10.tgz#79b61e2c0d1bfc2602d549e11d0876256f8df88d" + integrity sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w== + dependencies: + cssesc "^3.0.0" + util-deprecate "^1.0.2" + +postcss-value-parser@^4.1.0, postcss-value-parser@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz#723c09920836ba6d3e5af019f92bc0971c02e514" + integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ== + +postcss@^8.4.7: + version "8.4.14" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.14.tgz#ee9274d5622b4858c1007a74d76e42e56fd21caf" + integrity sha512-E398TUmfAYFPBSdzgeieK2Y1+1cpdxJx8yXbK/m57nRhKSmk1GB2tO4lbLBtlkfPQTDKfe4Xqv1ASWPpayPEig== + dependencies: + nanoid "^3.3.4" + picocolors "^1.0.0" + source-map-js "^1.0.2" + +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== + +proxy-addr@~2.0.7: + version "2.0.7" + resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.7.tgz#f19fe69ceab311eeb94b42e70e8c2070f9ba1025" + integrity sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg== + dependencies: + forwarded "0.2.0" + ipaddr.js "1.9.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== + +qjobs@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/qjobs/-/qjobs-1.2.0.tgz#c45e9c61800bd087ef88d7e256423bdd49e5d071" + integrity sha512-8YOJEHtxpySA3fFDyCRxA+UUV+fA+rTWnuWvylOK/NCjhY+b4ocCtmu8TtsWb+mYeU+GCHf/S66KZF/AsteKHg== + +qs@6.10.3: + version "6.10.3" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.10.3.tgz#d6cde1b2ffca87b5aa57889816c5f81535e22e8e" + integrity sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ== + dependencies: + side-channel "^1.0.4" + +randombytes@^2.1.0: + 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" + +range-parser@^1.2.1, range-parser@~1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" + integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== + +raw-body@2.5.1: + version "2.5.1" + resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.5.1.tgz#fe1b1628b181b700215e5fd42389f98b71392857" + integrity sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig== + dependencies: + bytes "3.1.2" + http-errors "2.0.0" + iconv-lite "0.4.24" + unpipe "1.0.0" + +readable-stream@^2.0.1: + 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.0.6: + 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.6.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" + integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== + dependencies: + picomatch "^2.2.1" + +rechoir@^0.7.0: + version "0.7.1" + resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.7.1.tgz#9478a96a1ca135b5e88fc027f03ee92d6c645686" + integrity sha512-/njmZ8s1wVeR6pjTZ+0nCnv8SpZNRMT2D1RLOJQESlYFDBvwpTA4KWJpZ+sBJ4+vhjILRcK7JIFdGCdxEAAitg== + dependencies: + resolve "^1.9.0" + +require-directory@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" + integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== + +require-from-string@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" + integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== + +requires-port@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" + integrity sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ== + +resolve-cwd@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-3.0.0.tgz#0f0075f1bb2544766cf73ba6a6e2adfebcb13f2d" + integrity sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg== + dependencies: + resolve-from "^5.0.0" + +resolve-from@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69" + integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== + +resolve@^1.9.0: + version "1.22.1" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.1.tgz#27cb2ebb53f91abb49470a928bba7558066ac177" + integrity sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw== + dependencies: + is-core-module "^2.9.0" + path-parse "^1.0.7" + supports-preserve-symlinks-flag "^1.0.0" + +retry@^0.13.1: + version "0.13.1" + resolved "https://registry.yarnpkg.com/retry/-/retry-0.13.1.tgz#185b1587acf67919d63b357349e03537b2484658" + integrity sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg== + +rfdc@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/rfdc/-/rfdc-1.3.0.tgz#d0b7c441ab2720d05dc4cf26e01c89631d9da08b" + integrity sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA== + +rimraf@^3.0.0, rimraf@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" + integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== + dependencies: + glob "^7.1.3" + +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.2.1, safe-buffer@>=5.1.0, safe-buffer@^5.1.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== + +"safer-buffer@>= 2.1.2 < 3", "safer-buffer@>= 2.1.2 < 3.0.0": + version "2.1.2" + resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" + integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== + +schema-utils@^3.1.0, schema-utils@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-3.1.1.tgz#bc74c4b6b6995c1d88f76a8b77bea7219e0c8281" + integrity sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw== + dependencies: + "@types/json-schema" "^7.0.8" + ajv "^6.12.5" + ajv-keywords "^3.5.2" + +schema-utils@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-4.0.0.tgz#60331e9e3ae78ec5d16353c467c34b3a0a1d3df7" + integrity sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg== + dependencies: + "@types/json-schema" "^7.0.9" + ajv "^8.8.0" + ajv-formats "^2.1.1" + ajv-keywords "^5.0.0" + +select-hose@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/select-hose/-/select-hose-2.0.0.tgz#625d8658f865af43ec962bfc376a37359a4994ca" + integrity sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg== + +selfsigned@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/selfsigned/-/selfsigned-2.0.1.tgz#8b2df7fa56bf014d19b6007655fff209c0ef0a56" + integrity sha512-LmME957M1zOsUhG+67rAjKfiWFox3SBxE/yymatMZsAx+oMrJ0YQ8AToOnyCm7xbeg2ep37IHLxdu0o2MavQOQ== + dependencies: + node-forge "^1" + +semver@^7.3.5: + version "7.3.7" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.7.tgz#12c5b649afdbf9049707796e22a4028814ce523f" + integrity sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g== + dependencies: + lru-cache "^6.0.0" + +send@0.18.0: + version "0.18.0" + resolved "https://registry.yarnpkg.com/send/-/send-0.18.0.tgz#670167cc654b05f5aa4a767f9113bb371bc706be" + integrity sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg== + dependencies: + debug "2.6.9" + depd "2.0.0" + destroy "1.2.0" + encodeurl "~1.0.2" + escape-html "~1.0.3" + etag "~1.8.1" + fresh "0.5.2" + http-errors "2.0.0" + mime "1.6.0" + ms "2.1.3" + on-finished "2.4.1" + range-parser "~1.2.1" + statuses "2.0.1" + +serialize-javascript@6.0.0, serialize-javascript@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-6.0.0.tgz#efae5d88f45d7924141da8b5c3a7a7e663fefeb8" + integrity sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag== + dependencies: + randombytes "^2.1.0" + +serve-index@^1.9.1: + version "1.9.1" + resolved "https://registry.yarnpkg.com/serve-index/-/serve-index-1.9.1.tgz#d3768d69b1e7d82e5ce050fff5b453bea12a9239" + integrity sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw== + dependencies: + accepts "~1.3.4" + batch "0.6.1" + debug "2.6.9" + escape-html "~1.0.3" + http-errors "~1.6.2" + mime-types "~2.1.17" + parseurl "~1.3.2" + +serve-static@1.15.0: + version "1.15.0" + resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.15.0.tgz#faaef08cffe0a1a62f60cad0c4e513cff0ac9540" + integrity sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g== + dependencies: + encodeurl "~1.0.2" + escape-html "~1.0.3" + parseurl "~1.3.3" + send "0.18.0" + +setprototypeof@1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.0.tgz#d0bd85536887b6fe7c0d818cb962d9d91c54e656" + integrity sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ== + +setprototypeof@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424" + integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw== + +shallow-clone@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/shallow-clone/-/shallow-clone-3.0.1.tgz#8f2981ad92531f55035b01fb230769a40e02efa3" + integrity sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA== + dependencies: + kind-of "^6.0.2" + +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@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" + integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== + +side-channel@^1.0.4: + version "1.0.4" + resolved "https://registry.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.3: + version "3.0.7" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" + integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== + +sirv@^1.0.7: + version "1.0.19" + resolved "https://registry.yarnpkg.com/sirv/-/sirv-1.0.19.tgz#1d73979b38c7fe91fcba49c85280daa9c2363b49" + integrity sha512-JuLThK3TnZG1TAKDwNIqNq6QA2afLOCcm+iE8D1Kj3GA40pSPsxQjjJl0J8X3tsR7T+CP1GavpzLwYkgVLWrZQ== + dependencies: + "@polka/url" "^1.0.0-next.20" + mrmime "^1.0.0" + totalist "^1.0.0" + +socket.io-adapter@~2.4.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/socket.io-adapter/-/socket.io-adapter-2.4.0.tgz#b50a4a9ecdd00c34d4c8c808224daa1a786152a6" + integrity sha512-W4N+o69rkMEGVuk2D/cvca3uYsvGlMwsySWV447y99gUPghxq42BxqLNMndb+a1mm/5/7NeXVQS7RLa2XyXvYg== + +socket.io-parser@~4.0.4: + version "4.0.5" + resolved "https://registry.yarnpkg.com/socket.io-parser/-/socket.io-parser-4.0.5.tgz#cb404382c32324cc962f27f3a44058cf6e0552df" + integrity sha512-sNjbT9dX63nqUFIOv95tTVm6elyIU4RvB1m8dOeZt+IgWwcWklFDOdmGcfo3zSiRsnR/3pJkjY5lfoGqEe4Eig== + dependencies: + "@types/component-emitter" "^1.2.10" + component-emitter "~1.3.0" + debug "~4.3.1" + +socket.io@^4.4.1: + version "4.5.1" + resolved "https://registry.yarnpkg.com/socket.io/-/socket.io-4.5.1.tgz#aa7e73f8a6ce20ee3c54b2446d321bbb6b1a9029" + integrity sha512-0y9pnIso5a9i+lJmsCdtmTTgJFFSvNQKDnPQRz28mGNnxbmqYg2QPtJTLFxhymFZhAIn50eHAKzJeiNaKr+yUQ== + dependencies: + accepts "~1.3.4" + base64id "~2.0.0" + debug "~4.3.2" + engine.io "~6.2.0" + socket.io-adapter "~2.4.0" + socket.io-parser "~4.0.4" + +sockjs@^0.3.24: + version "0.3.24" + resolved "https://registry.yarnpkg.com/sockjs/-/sockjs-0.3.24.tgz#c9bc8995f33a111bea0395ec30aa3206bdb5ccce" + integrity sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ== + dependencies: + faye-websocket "^0.11.3" + uuid "^8.3.2" + websocket-driver "^0.7.4" + +source-map-js@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.0.2.tgz#adbc361d9c62df380125e7f161f71c826f1e490c" + integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw== + +source-map-loader@4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/source-map-loader/-/source-map-loader-4.0.0.tgz#bdc6b118bc6c87ee4d8d851f2d4efcc5abdb2ef5" + integrity sha512-i3KVgM3+QPAHNbGavK+VBq03YoJl24m9JWNbLgsjTj8aJzXG9M61bantBTNBt7CNwY2FYf+RJRYJ3pzalKjIrw== + dependencies: + abab "^2.0.6" + iconv-lite "^0.6.3" + source-map-js "^1.0.2" + +source-map-support@~0.5.20: + version "0.5.21" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f" + integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== + dependencies: + buffer-from "^1.0.0" + source-map "^0.6.0" + +source-map@^0.6.0, 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== + +spdy-transport@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/spdy-transport/-/spdy-transport-3.0.0.tgz#00d4863a6400ad75df93361a1608605e5dcdcf31" + integrity sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw== + dependencies: + debug "^4.1.0" + detect-node "^2.0.4" + hpack.js "^2.1.6" + obuf "^1.1.2" + readable-stream "^3.0.6" + wbuf "^1.7.3" + +spdy@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/spdy/-/spdy-4.0.2.tgz#b74f466203a3eda452c02492b91fb9e84a27677b" + integrity sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA== + dependencies: + debug "^4.1.0" + handle-thing "^2.0.0" + http-deceiver "^1.2.7" + select-hose "^2.0.0" + spdy-transport "^3.0.0" + +statuses@2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.1.tgz#55cb000ccf1d48728bd23c685a063998cf1a1b63" + integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== + +"statuses@>= 1.4.0 < 2", statuses@~1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" + integrity sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA== + +streamroller@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/streamroller/-/streamroller-3.1.1.tgz#679aae10a4703acdf2740755307df0a05ad752e6" + integrity sha512-iPhtd9unZ6zKdWgMeYGfSBuqCngyJy1B/GPi/lTpwGpa3bajuX30GjUVd0/Tn/Xhg0mr4DOSENozz9Y06qyonQ== + dependencies: + date-format "^4.0.10" + debug "^4.3.4" + fs-extra "^10.1.0" + +string-width@^4.1.0, string-width@^4.2.0: + version "4.2.3" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" + +string_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.0, strip-ansi@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" + +strip-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.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== + +style-loader@3.3.1: + version "3.3.1" + resolved "https://registry.yarnpkg.com/style-loader/-/style-loader-3.3.1.tgz#057dfa6b3d4d7c7064462830f9113ed417d38575" + integrity sha512-GPcQ+LDJbrcxHORTRes6Jy2sfvK2kS6hpSfI/fXhPt+spVzxF6LJ1dHLN9zIGmVaaP044YKaIatFaufENRiDoQ== + +supports-color@8.1.1, supports-color@^8.0.0: + version "8.1.1" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" + integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== + dependencies: + has-flag "^4.0.0" + +supports-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-preserve-symlinks-flag@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" + integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== + +tapable@^2.1.1, tapable@^2.2.0: + version "2.2.1" + resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.2.1.tgz#1967a73ef4060a82f12ab96af86d52fdb76eeca0" + integrity sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ== + +terser-webpack-plugin@^5.1.3: + version "5.3.3" + resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-5.3.3.tgz#8033db876dd5875487213e87c627bca323e5ed90" + integrity sha512-Fx60G5HNYknNTNQnzQ1VePRuu89ZVYWfjRAeT5rITuCY/1b08s49e5kSQwHDirKZWuoKOBRFS98EUUoZ9kLEwQ== + dependencies: + "@jridgewell/trace-mapping" "^0.3.7" + jest-worker "^27.4.5" + schema-utils "^3.1.1" + serialize-javascript "^6.0.0" + terser "^5.7.2" + +terser@^5.7.2: + version "5.14.1" + resolved "https://registry.yarnpkg.com/terser/-/terser-5.14.1.tgz#7c95eec36436cb11cf1902cc79ac564741d19eca" + integrity sha512-+ahUAE+iheqBTDxXhTisdA8hgvbEG1hHOQ9xmNjeUJSoi6DU/gMrKNcfZjHkyY6Alnuyc+ikYJaxxfHkT3+WuQ== + dependencies: + "@jridgewell/source-map" "^0.3.2" + acorn "^8.5.0" + commander "^2.20.0" + source-map-support "~0.5.20" + +thunky@^1.0.2: + version "1.1.0" + resolved "https://registry.yarnpkg.com/thunky/-/thunky-1.1.0.tgz#5abaf714a9405db0504732bbccd2cedd9ef9537d" + integrity sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA== + +tmp@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.2.1.tgz#8457fc3037dcf4719c251367a1af6500ee1ccf14" + integrity sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ== + dependencies: + rimraf "^3.0.0" + +to-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" + +toidentifier@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.1.tgz#3be34321a88a820ed1bd80dfaa33e479fbb8dd35" + integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== + +totalist@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/totalist/-/totalist-1.1.0.tgz#a4d65a3e546517701e3e5c37a47a70ac97fe56df" + integrity sha512-gduQwd1rOdDMGxFG1gEvhV88Oirdo2p+KjoYFU7k2g+i7n6AFFbDQ5kMPUsW0pNbfQsB/cwXvT1i4Bue0s9g5g== + +type-is@~1.6.18: + version "1.6.18" + resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" + integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== + dependencies: + media-typer "0.3.0" + mime-types "~2.1.24" + +typescript@3.9.5: + version "3.9.5" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.9.5.tgz#586f0dba300cde8be52dd1ac4f7e1009c1b13f36" + integrity sha512-hSAifV3k+i6lEoCJ2k6R2Z/rp/H3+8sdmcn5NrS3/3kE7+RyZXm9aqvxWqjEXHAd8b0pShatpcdMTvEdvAJltQ== + +ua-parser-js@^0.7.30: + version "0.7.31" + resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.31.tgz#649a656b191dffab4f21d5e053e27ca17cbff5c6" + integrity sha512-qLK/Xe9E2uzmYI3qLeOmI0tEOt+TBBQyUIAh4aAgU05FVYzeZrKUdkAZfBNVGRaHVgV0TDkdEngJSw/SyQchkQ== + +universalify@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.0.tgz#75a4984efedc4b08975c5aeb73f530d02df25717" + integrity sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ== + +unpipe@1.0.0, unpipe@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" + integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ== + +update-browserslist-db@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.4.tgz#dbfc5a789caa26b1db8990796c2c8ebbce304824" + integrity sha512-jnmO2BEGUjsMOe/Fg9u0oczOe/ppIDZPebzccl1yDWGLFP16Pa1/RM5wEoKYPG2zstNcDuAStejyxsOuKINdGA== + dependencies: + escalade "^3.1.1" + picocolors "^1.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" + +util-deprecate@^1.0.1, util-deprecate@^1.0.2, util-deprecate@~1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== + +utils-merge@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" + integrity sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA== + +uuid@^8.3.2: + version "8.3.2" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" + integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== + +vary@^1, vary@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" + integrity sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg== + +void-elements@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/void-elements/-/void-elements-2.0.1.tgz#c066afb582bb1cb4128d60ea92392e94d5e9dbec" + integrity sha512-qZKX4RnBzH2ugr8Lxa7x+0V6XD9Sb/ouARtiasEQCHB1EVU4NXtmHsDDrx1dO4ne5fc3J6EW05BP1Dl0z0iung== + +watchpack@^2.3.1: + version "2.4.0" + resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-2.4.0.tgz#fa33032374962c78113f93c7f2fb4c54c9862a5d" + integrity sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg== + dependencies: + glob-to-regexp "^0.4.1" + graceful-fs "^4.1.2" + +wbuf@^1.1.0, wbuf@^1.7.3: + version "1.7.3" + resolved "https://registry.yarnpkg.com/wbuf/-/wbuf-1.7.3.tgz#c1d8d149316d3ea852848895cb6a0bfe887b87df" + integrity sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA== + dependencies: + minimalistic-assert "^1.0.0" + +webextension-polyfill@0.9.0: + version "0.9.0" + resolved "https://registry.yarnpkg.com/webextension-polyfill/-/webextension-polyfill-0.9.0.tgz#de6c1941d0ef1b0858b20e9c7b46bbc042c5a960" + integrity sha512-LTtHb0yR49xa9irkstDxba4GATDAcDw3ncnFH9RImoFwDlW47U95ME5sn5IiQX2ghfaECaf6xyXM8yvClIBkkw== + +webpack-bundle-analyzer@4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/webpack-bundle-analyzer/-/webpack-bundle-analyzer-4.5.0.tgz#1b0eea2947e73528754a6f9af3e91b2b6e0f79d5" + integrity sha512-GUMZlM3SKwS8Z+CKeIFx7CVoHn3dXFcUAjT/dcZQQmfSZGvitPfMob2ipjai7ovFFqPvTqkEZ/leL4O0YOdAYQ== + dependencies: + acorn "^8.0.4" + acorn-walk "^8.0.0" + chalk "^4.1.0" + commander "^7.2.0" + gzip-size "^6.0.0" + lodash "^4.17.20" + opener "^1.5.2" + sirv "^1.0.7" + ws "^7.3.1" + +webpack-cli@4.10.0: + version "4.10.0" + resolved "https://registry.yarnpkg.com/webpack-cli/-/webpack-cli-4.10.0.tgz#37c1d69c8d85214c5a65e589378f53aec64dab31" + integrity sha512-NLhDfH/h4O6UOy+0LSso42xvYypClINuMNBVVzX4vX98TmTaTUxwRbXdhucbFMd2qLaCTcLq/PdYrvi8onw90w== + dependencies: + "@discoveryjs/json-ext" "^0.5.0" + "@webpack-cli/configtest" "^1.2.0" + "@webpack-cli/info" "^1.5.0" + "@webpack-cli/serve" "^1.7.0" + colorette "^2.0.14" + commander "^7.0.0" + cross-spawn "^7.0.3" + fastest-levenshtein "^1.0.12" + import-local "^3.0.2" + interpret "^2.2.0" + rechoir "^0.7.0" + webpack-merge "^5.7.3" + +webpack-dev-middleware@^5.3.1: + version "5.3.3" + resolved "https://registry.yarnpkg.com/webpack-dev-middleware/-/webpack-dev-middleware-5.3.3.tgz#efae67c2793908e7311f1d9b06f2a08dcc97e51f" + integrity sha512-hj5CYrY0bZLB+eTO+x/j67Pkrquiy7kWepMHmUMoPsmcUaeEnQJqFzHJOyxgWlq746/wUuA64p9ta34Kyb01pA== + dependencies: + colorette "^2.0.10" + memfs "^3.4.3" + mime-types "^2.1.31" + range-parser "^1.2.1" + schema-utils "^4.0.0" + +webpack-dev-server@4.9.2: + version "4.9.2" + resolved "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-4.9.2.tgz#c188db28c7bff12f87deda2a5595679ebbc3c9bc" + integrity sha512-H95Ns95dP24ZsEzO6G9iT+PNw4Q7ltll1GfJHV4fKphuHWgKFzGHWi4alTlTnpk1SPPk41X+l2RB7rLfIhnB9Q== + dependencies: + "@types/bonjour" "^3.5.9" + "@types/connect-history-api-fallback" "^1.3.5" + "@types/express" "^4.17.13" + "@types/serve-index" "^1.9.1" + "@types/serve-static" "^1.13.10" + "@types/sockjs" "^0.3.33" + "@types/ws" "^8.5.1" + ansi-html-community "^0.0.8" + bonjour-service "^1.0.11" + chokidar "^3.5.3" + colorette "^2.0.10" + compression "^1.7.4" + connect-history-api-fallback "^1.6.0" + default-gateway "^6.0.3" + express "^4.17.3" + graceful-fs "^4.2.6" + html-entities "^2.3.2" + http-proxy-middleware "^2.0.3" + ipaddr.js "^2.0.1" + open "^8.0.9" + p-retry "^4.5.0" + rimraf "^3.0.2" + schema-utils "^4.0.0" + selfsigned "^2.0.1" + serve-index "^1.9.1" + sockjs "^0.3.24" + spdy "^4.0.2" + webpack-dev-middleware "^5.3.1" + ws "^8.4.2" + +webpack-merge@^4.1.5: + version "4.2.2" + resolved "https://registry.yarnpkg.com/webpack-merge/-/webpack-merge-4.2.2.tgz#a27c52ea783d1398afd2087f547d7b9d2f43634d" + integrity sha512-TUE1UGoTX2Cd42j3krGYqObZbOD+xF7u28WB7tfUordytSjbWTIjK/8V0amkBfTYN4/pB/GIDlJZZ657BGG19g== + dependencies: + lodash "^4.17.15" + +webpack-merge@^5.7.3: + version "5.8.0" + resolved "https://registry.yarnpkg.com/webpack-merge/-/webpack-merge-5.8.0.tgz#2b39dbf22af87776ad744c390223731d30a68f61" + integrity sha512-/SaI7xY0831XwP6kzuwhKWVKDP9t1QY1h65lAFLbZqMPIuYcD9QAW4u9STIbU9kaJbPBB/geU/gLr1wDjOhQ+Q== + dependencies: + clone-deep "^4.0.1" + wildcard "^2.0.0" + +webpack-sources@^3.2.3: + version "3.2.3" + resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-3.2.3.tgz#2d4daab8451fd4b240cc27055ff6a0c2ccea0cde" + integrity sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w== + +webpack@5.73.0: + version "5.73.0" + resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.73.0.tgz#bbd17738f8a53ee5760ea2f59dce7f3431d35d38" + integrity sha512-svjudQRPPa0YiOYa2lM/Gacw0r6PvxptHj4FuEKQ2kX05ZLkjbVc5MnPs6its5j7IZljnIqSVo/OsY2X0IpHGA== + dependencies: + "@types/eslint-scope" "^3.7.3" + "@types/estree" "^0.0.51" + "@webassemblyjs/ast" "1.11.1" + "@webassemblyjs/wasm-edit" "1.11.1" + "@webassemblyjs/wasm-parser" "1.11.1" + acorn "^8.4.1" + acorn-import-assertions "^1.7.6" + browserslist "^4.14.5" + chrome-trace-event "^1.0.2" + enhanced-resolve "^5.9.3" + es-module-lexer "^0.9.0" + eslint-scope "5.1.1" + events "^3.2.0" + glob-to-regexp "^0.4.1" + graceful-fs "^4.2.9" + json-parse-even-better-errors "^2.3.1" + loader-runner "^4.2.0" + mime-types "^2.1.27" + neo-async "^2.6.2" + schema-utils "^3.1.0" + tapable "^2.1.1" + terser-webpack-plugin "^5.1.3" + watchpack "^2.3.1" + webpack-sources "^3.2.3" + +websocket-driver@>=0.5.1, websocket-driver@^0.7.4: + version "0.7.4" + resolved "https://registry.yarnpkg.com/websocket-driver/-/websocket-driver-0.7.4.tgz#89ad5295bbf64b480abcba31e4953aca706f5760" + integrity sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg== + dependencies: + http-parser-js ">=0.5.1" + safe-buffer ">=5.1.0" + websocket-extensions ">=0.1.1" + +websocket-extensions@>=0.1.1: + version "0.1.4" + resolved "https://registry.yarnpkg.com/websocket-extensions/-/websocket-extensions-0.1.4.tgz#7f8473bc839dfd87608adb95d7eb075211578a42" + integrity sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg== + +which@^1.2.1: + 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" + +wildcard@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/wildcard/-/wildcard-2.0.0.tgz#a77d20e5200c6faaac979e4b3aadc7b3dd7f8fec" + integrity sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw== + +workerpool@6.2.1: + version "6.2.1" + resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-6.2.1.tgz#46fc150c17d826b86a008e5a4508656777e9c343" + integrity sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw== + +wrap-ansi@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" + integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + +wrappy@1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== + +ws@^7.3.1: + version "7.5.8" + resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.8.tgz#ac2729881ab9e7cbaf8787fe3469a48c5c7f636a" + integrity sha512-ri1Id1WinAX5Jqn9HejiGb8crfRio0Qgu8+MtL36rlTA6RLsMdWt1Az/19A2Qij6uSHUMphEFaTKa4WG+UNHNw== + +ws@^8.4.2: + version "8.8.0" + resolved "https://registry.yarnpkg.com/ws/-/ws-8.8.0.tgz#8e71c75e2f6348dbf8d78005107297056cb77769" + integrity sha512-JDAgSYQ1ksuwqfChJusw1LSJ8BizJ2e/vVu5Lxjq3YvNJNlROv1ui4i+c/kUUrPheBvQl4c5UbERhTwKa6QBJQ== + +ws@~8.2.3: + version "8.2.3" + resolved "https://registry.yarnpkg.com/ws/-/ws-8.2.3.tgz#63a56456db1b04367d0b721a0b80cae6d8becbba" + integrity sha512-wBuoj1BDpC6ZQ1B7DWQBYVLphPWkm8i9Y0/3YdHjHKHiohOJ1ws+3OccDWtH+PoC9DZD5WOTrJvNbWvjS6JWaA== + +y18n@^5.0.5: + version "5.0.8" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" + integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== + +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== + +yargs-parser@20.2.4: + version "20.2.4" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.4.tgz#b42890f14566796f85ae8e3a25290d205f154a54" + integrity sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA== + +yargs-parser@^20.2.2: + version "20.2.9" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee" + integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w== + +yargs-unparser@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/yargs-unparser/-/yargs-unparser-2.0.0.tgz#f131f9226911ae5d9ad38c432fe809366c2325eb" + integrity sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA== + dependencies: + camelcase "^6.0.0" + decamelize "^4.0.0" + flat "^5.0.2" + is-plain-obj "^2.1.0" + +yargs@16.2.0, yargs@^16.1.1: + version "16.2.0" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66" + integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw== + dependencies: + cliui "^7.0.2" + escalade "^3.1.1" + get-caller-file "^2.0.5" + require-directory "^2.1.1" + string-width "^4.2.0" + y18n "^5.0.5" + yargs-parser "^20.2.2" + +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== diff --git a/popup/.gitignore b/popup/.gitignore new file mode 100644 index 0000000..e86e21f --- /dev/null +++ b/popup/.gitignore @@ -0,0 +1,387 @@ +# Created by https://www.toptal.com/developers/gitignore/api/linux,windows,java,gradle,maven,intellij,intellij+iml,intellij+all,netbeans,visualstudiocode,kotlin +# Edit at https://www.toptal.com/developers/gitignore?templates=linux,windows,java,gradle,maven,intellij,intellij+iml,intellij+all,netbeans,visualstudiocode,kotlin + +### Intellij ### +# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio, WebStorm and Rider +# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839 + +# User-specific stuff +.idea/**/workspace.xml +.idea/**/tasks.xml +.idea/**/usage.statistics.xml +.idea/**/dictionaries +.idea/**/shelf + +# AWS User-specific +.idea/**/aws.xml + +# Generated files +.idea/**/contentModel.xml + +# Sensitive or high-churn files +.idea/**/dataSources/ +.idea/**/dataSources.ids +.idea/**/dataSources.local.xml +.idea/**/sqlDataSources.xml +.idea/**/dynamic.xml +.idea/**/uiDesigner.xml +.idea/**/dbnavigator.xml + +# Gradle +.idea/**/gradle.xml +.idea/**/libraries + +# Gradle and Maven with auto-import +# When using Gradle or Maven with auto-import, you should exclude module files, +# since they will be recreated, and may cause churn. Uncomment if using +# auto-import. +# .idea/artifacts +# .idea/compiler.xml +# .idea/jarRepositories.xml +# .idea/modules.xml +# .idea/*.iml +# .idea/modules +# *.iml +# *.ipr + +# CMake +cmake-build-*/ + +# Mongo Explorer plugin +.idea/**/mongoSettings.xml + +# File-based project format +*.iws + +# IntelliJ +out/ + +# mpeltonen/sbt-idea plugin +.idea_modules/ + +# JIRA plugin +atlassian-ide-plugin.xml + +# Cursive Clojure plugin +.idea/replstate.xml + +# SonarLint plugin +.idea/sonarlint/ + +# Crashlytics plugin (for Android Studio and IntelliJ) +com_crashlytics_export_strings.xml +crashlytics.properties +crashlytics-build.properties +fabric.properties + +# Editor-based Rest Client +.idea/httpRequests + +# Android studio 3.1+ serialized cache file +.idea/caches/build_file_checksums.ser + +### Intellij Patch ### +# Comment Reason: https://github.com/joeblau/gitignore.io/issues/186#issuecomment-215987721 + +# *.iml +# modules.xml +# .idea/misc.xml +# *.ipr + +# Sonarlint plugin +# https://plugins.jetbrains.com/plugin/7973-sonarlint +.idea/**/sonarlint/ + +# SonarQube Plugin +# https://plugins.jetbrains.com/plugin/7238-sonarqube-community-plugin +.idea/**/sonarIssues.xml + +# Markdown Navigator plugin +# https://plugins.jetbrains.com/plugin/7896-markdown-navigator-enhanced +.idea/**/markdown-navigator.xml +.idea/**/markdown-navigator-enh.xml +.idea/**/markdown-navigator/ + +# Cache file creation bug +# See https://youtrack.jetbrains.com/issue/JBR-2257 +.idea/$CACHE_FILE$ + +# CodeStream plugin +# https://plugins.jetbrains.com/plugin/12206-codestream +.idea/codestream.xml + +# Azure Toolkit for IntelliJ plugin +# https://plugins.jetbrains.com/plugin/8053-azure-toolkit-for-intellij +.idea/**/azureSettings.xml + +### Intellij+all ### +# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio, WebStorm and Rider +# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839 + +# User-specific stuff + +# AWS User-specific + +# Generated files + +# Sensitive or high-churn files + +# Gradle + +# Gradle and Maven with auto-import +# When using Gradle or Maven with auto-import, you should exclude module files, +# since they will be recreated, and may cause churn. Uncomment if using +# auto-import. +# .idea/artifacts +# .idea/compiler.xml +# .idea/jarRepositories.xml +# .idea/modules.xml +# .idea/*.iml +# .idea/modules +# *.iml +# *.ipr + +# CMake + +# Mongo Explorer plugin + +# File-based project format + +# IntelliJ + +# mpeltonen/sbt-idea plugin + +# JIRA plugin + +# Cursive Clojure plugin + +# SonarLint plugin + +# Crashlytics plugin (for Android Studio and IntelliJ) + +# Editor-based Rest Client + +# Android studio 3.1+ serialized cache file + +### Intellij+all Patch ### +# Ignore everything but code style settings and run configurations +# that are supposed to be shared within teams. + +.idea/* + +!.idea/codeStyles +!.idea/runConfigurations + +### Intellij+iml ### +# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio, WebStorm and Rider +# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839 + +# User-specific stuff + +# AWS User-specific + +# Generated files + +# Sensitive or high-churn files + +# Gradle + +# Gradle and Maven with auto-import +# When using Gradle or Maven with auto-import, you should exclude module files, +# since they will be recreated, and may cause churn. Uncomment if using +# auto-import. +# .idea/artifacts +# .idea/compiler.xml +# .idea/jarRepositories.xml +# .idea/modules.xml +# .idea/*.iml +# .idea/modules +# *.iml +# *.ipr + +# CMake + +# Mongo Explorer plugin + +# File-based project format + +# IntelliJ + +# mpeltonen/sbt-idea plugin + +# JIRA plugin + +# Cursive Clojure plugin + +# SonarLint plugin + +# Crashlytics plugin (for Android Studio and IntelliJ) + +# Editor-based Rest Client + +# Android studio 3.1+ serialized cache file + +### Intellij+iml Patch ### +# Reason: https://github.com/joeblau/gitignore.io/issues/186#issuecomment-249601023 + +*.iml +modules.xml +.idea/misc.xml +*.ipr + +### Java ### +# Compiled class file +*.class + +# Log file +*.log + +# BlueJ files +*.ctxt + +# Mobile Tools for Java (J2ME) +.mtj.tmp/ + +# Package Files # +*.jar +*.war +*.nar +*.ear +*.zip +*.tar.gz +*.rar + +# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml +hs_err_pid* +replay_pid* + +### Kotlin ### +# Compiled class file + +# Log file + +# BlueJ files + +# Mobile Tools for Java (J2ME) + +# Package Files # + +# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml + +### Linux ### +*~ + +# temporary files which can be created if a process still has a handle open of a deleted file +.fuse_hidden* + +# KDE directory preferences +.directory + +# Linux trash folder which might appear on any partition or disk +.Trash-* + +# .nfs files are created when an open file is removed but is still being accessed +.nfs* + +### Maven ### +target/ +pom.xml.tag +pom.xml.releaseBackup +pom.xml.versionsBackup +pom.xml.next +release.properties +dependency-reduced-pom.xml +buildNumber.properties +.mvn/timing.properties +# https://github.com/takari/maven-wrapper#usage-without-binary-jar +.mvn/wrapper/maven-wrapper.jar + +# Eclipse m2e generated files +# Eclipse Core +.project +# JDT-specific (Eclipse Java Development Tools) +.classpath + +### NetBeans ### +**/nbproject/private/ +**/nbproject/Makefile-*.mk +**/nbproject/Package-*.bash +build/ +nbbuild/ +dist/ +nbdist/ +.nb-gradle/ + +### VisualStudioCode ### +.vscode/* +!.vscode/settings.json +!.vscode/tasks.json +!.vscode/launch.json +!.vscode/extensions.json +!.vscode/*.code-snippets + +# Local History for Visual Studio Code +.history/ + +# Built Visual Studio Code Extensions +*.vsix + +### VisualStudioCode Patch ### +# Ignore all local history of files +.history +.ionide + +# Support for Project snippet scope +.vscode/*.code-snippets + +# Ignore code-workspaces +*.code-workspace + +### Windows ### +# Windows thumbnail cache files +Thumbs.db +Thumbs.db:encryptable +ehthumbs.db +ehthumbs_vista.db + +# Dump file +*.stackdump + +# Folder config file +[Dd]esktop.ini + +# Recycle Bin used on file shares +$RECYCLE.BIN/ + +# Windows Installer files +*.cab +*.msi +*.msix +*.msm +*.msp + +# Windows shortcuts +*.lnk + +### Gradle ### +.gradle +**/build/ +!src/**/build/ + +# Ignore Gradle GUI config +gradle-app.setting + +# Avoid ignoring Gradle wrapper jar file (.jar files are usually ignored) +!gradle-wrapper.jar + +# Avoid ignore Gradle wrappper properties +!gradle-wrapper.properties + +# Cache of project +.gradletasknamecache + +# Eclipse Gradle plugin generated files +# Eclipse Core +# JDT-specific (Eclipse Java Development Tools) + +# End of https://www.toptal.com/developers/gitignore/api/linux,windows,java,gradle,maven,intellij,intellij+iml,intellij+all,netbeans,visualstudiocode,kotlin diff --git a/popup/build.gradle.kts b/popup/build.gradle.kts new file mode 100644 index 0000000..76b7fc6 --- /dev/null +++ b/popup/build.gradle.kts @@ -0,0 +1,34 @@ +plugins { + kotlin("js") +} + +repositories { + google() + mavenLocal() + mavenCentral() + gradlePluginPortal() +} + +dependencies { + implementation(kotlin("stdlib-js")) + implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core-js:1.6.3") + implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.3") + implementation(project(":base")) +} + +kotlin { + js(LEGACY) { + binaries.executable() + useCommonJs() + browser { + webpackTask { + outputFileName = "popup.js" + sourceMaps = false + report = true + } + distribution { + directory = File("$projectDir/../build/distributions/") + } + } + } +} \ No newline at end of file diff --git a/popup/src/main/kotlin/popup.kt b/popup/src/main/kotlin/popup.kt new file mode 100644 index 0000000..c45720c --- /dev/null +++ b/popup/src/main/kotlin/popup.kt @@ -0,0 +1,26 @@ +import browser.action.BadgeDetails +import browser.tabs.QueryInfo +import common.collect +import kotlinx.browser.document +import kotlinx.browser.window + +fun main() { + browser.action.setBadgeText(BadgeDetails { + text = "Test" + }) + browser.tabs.query(QueryInfo { + active = true + currentWindow = true + }).collect { + val activeTab = it?.firstOrNull() + console.log(activeTab) + } + window.onload = { + browser.tabs.captureVisibleTab()?.collect { + document.getElementById("capture")?.setAttribute("src", it.toString()) + } + } + browser.tabs.onZoomChange.addListener { + console.log(it) + } +} \ No newline at end of file diff --git a/settings.gradle.kts b/settings.gradle.kts new file mode 100644 index 0000000..5c14f9c --- /dev/null +++ b/settings.gradle.kts @@ -0,0 +1,6 @@ +rootProject.name = "Kromex" + +include("base") +include("background") +include("popup") +include("content") \ No newline at end of file diff --git a/src/main/resources/css/style.css b/src/main/resources/css/style.css new file mode 100644 index 0000000..4b5fb00 --- /dev/null +++ b/src/main/resources/css/style.css @@ -0,0 +1,4 @@ +html, body { + width: 100%; + height: 100%; +} \ No newline at end of file diff --git a/src/main/resources/html/options.html b/src/main/resources/html/options.html new file mode 100644 index 0000000..e69de29 diff --git a/src/main/resources/html/popup.html b/src/main/resources/html/popup.html new file mode 100644 index 0000000..38bb419 --- /dev/null +++ b/src/main/resources/html/popup.html @@ -0,0 +1,16 @@ + + + + + Kromex + + + + + + +

Language

+

Language on your current site:

+ + + diff --git a/src/main/resources/icons/icon.png b/src/main/resources/icons/icon.png new file mode 100644 index 0000000..9a54bbd Binary files /dev/null and b/src/main/resources/icons/icon.png differ diff --git a/src/main/resources/icons/icon16.png b/src/main/resources/icons/icon16.png new file mode 100644 index 0000000..9caa995 Binary files /dev/null and b/src/main/resources/icons/icon16.png differ diff --git a/src/main/resources/icons/icon32.png b/src/main/resources/icons/icon32.png new file mode 100644 index 0000000..9b88775 Binary files /dev/null and b/src/main/resources/icons/icon32.png differ diff --git a/src/main/resources/icons/icon48.png b/src/main/resources/icons/icon48.png new file mode 100644 index 0000000..4684298 Binary files /dev/null and b/src/main/resources/icons/icon48.png differ diff --git a/src/main/resources/icons/icon64.png b/src/main/resources/icons/icon64.png new file mode 100644 index 0000000..19a828b Binary files /dev/null and b/src/main/resources/icons/icon64.png differ diff --git a/src/main/resources/manifest.json b/src/main/resources/manifest.json new file mode 100644 index 0000000..7708c6f --- /dev/null +++ b/src/main/resources/manifest.json @@ -0,0 +1,44 @@ +{ + "manifest_version": 3, + + "name": "Kromex", + "description": "Kromex is an extension template written in Kotlin, mainly made for Chrome", + "version": "1.0.0", + + "options_ui": { + "page": "options.html" + }, + + "action": { + "default_icon": "icon.png", + "default_popup": "popup.html" + }, + + "icons": { + "16": "icon16.png", + "32": "icon32.png", + "48": "icon48.png", + "64": "icon64.png", + "128": "icon.png" + }, + + "content_scripts": [ + { + "matches": ["https://*.github.com/*"], + "js": [ + "browser-polyfill.min.js", + "content_script.js" + ] + } + ], + + "background": { + "service_worker": "background.js" + }, + + "permissions": [ + "tabs", + "activeTab", + "background" + ] +} \ No newline at end of file