Merge "Fix ApprovalCache version"
diff --git a/Documentation/dev-plugins.txt b/Documentation/dev-plugins.txt
index 992d459..fa2b78c 100644
--- a/Documentation/dev-plugins.txt
+++ b/Documentation/dev-plugins.txt
@@ -74,9 +74,9 @@
manifest fields:
----
- Implementation-Title: Example plugin showing examples
- Implementation-Version: 1.0
- Implementation-Vendor: Example, Inc.
+Implementation-Title: Example plugin showing examples
+Implementation-Version: 1.0
+Implementation-Vendor: Example, Inc.
----
=== ApiType
@@ -88,7 +88,7 @@
loading a plugin that needs the plugin API.
----
- Gerrit-ApiType: plugin
+Gerrit-ApiType: plugin
----
=== Explicit Registration
@@ -103,9 +103,9 @@
`@Listen` and `@Export("")` annotations.
----
- Gerrit-Module: tld.example.project.CoreModuleClassName
- Gerrit-SshModule: tld.example.project.SshModuleClassName
- Gerrit-HttpModule: tld.example.project.HttpModuleClassName
+Gerrit-Module: tld.example.project.CoreModuleClassName
+Gerrit-SshModule: tld.example.project.SshModuleClassName
+Gerrit-HttpModule: tld.example.project.HttpModuleClassName
----
=== Batch runtime
@@ -120,7 +120,7 @@
offline reindexing task.
----
- Gerrit-BatchModule: tld.example.project.CoreModuleClassName
+Gerrit-BatchModule: tld.example.project.CoreModuleClassName
----
In this runtime, only the module designated by `Gerrit-BatchModule` is
@@ -132,7 +132,7 @@
A plugin can optionally provide its own plugin name.
----
- Gerrit-PluginName: replication
+Gerrit-PluginName: replication
----
This is useful for plugins that contribute plugin-owned capabilities that
@@ -218,7 +218,7 @@
with no down time.
----
- Gerrit-ReloadMode: restart
+Gerrit-ReloadMode: restart
----
In either mode ('restart' or 'reload') any plugin or extension can
@@ -261,7 +261,7 @@
credentials and possibly verify connectivity to validate them.
----
- Gerrit-InitStep: tld.example.project.MyInitStep
+Gerrit-InitStep: tld.example.project.MyInitStep
----
MyInitStep needs to follow the standard Gerrit InitStep syntax
@@ -278,37 +278,37 @@
[source,java]
----
- public class MyInitStep implements InitStep {
- private final String pluginName;
- private final ConsoleUI ui;
- private final AllProjectsConfig allProjectsConfig;
+public class MyInitStep implements InitStep {
+ private final String pluginName;
+ private final ConsoleUI ui;
+ private final AllProjectsConfig allProjectsConfig;
- @Inject
- public MyInitStep(@PluginName String pluginName, ConsoleUI ui,
- AllProjectsConfig allProjectsConfig) {
- this.pluginName = pluginName;
- this.ui = ui;
- this.allProjectsConfig = allProjectsConfig;
- }
-
- @Override
- public void run() throws Exception {
- }
-
- @Override
- public void postRun() throws Exception {
- ui.message("\n");
- ui.header(pluginName + " Integration");
- boolean enabled = ui.yesno(true, "By default enabled for all projects");
- Config cfg = allProjectsConfig.load().getConfig();
- if (enabled) {
- cfg.setBoolean("plugin", pluginName, "enabled", enabled);
- } else {
- cfg.unset("plugin", pluginName, "enabled");
- }
- allProjectsConfig.save(pluginName, "Initialize " + pluginName + " Integration");
- }
+ @Inject
+ public MyInitStep(@PluginName String pluginName, ConsoleUI ui,
+ AllProjectsConfig allProjectsConfig) {
+ this.pluginName = pluginName;
+ this.ui = ui;
+ this.allProjectsConfig = allProjectsConfig;
}
+
+ @Override
+ public void run() throws Exception {
+ }
+
+ @Override
+ public void postRun() throws Exception {
+ ui.message("\n");
+ ui.header(pluginName + " Integration");
+ boolean enabled = ui.yesno(true, "By default enabled for all projects");
+ Config cfg = allProjectsConfig.load().getConfig();
+ if (enabled) {
+ cfg.setBoolean("plugin", pluginName, "enabled", enabled);
+ } else {
+ cfg.unset("plugin", pluginName, "enabled");
+ }
+ allProjectsConfig.save(pluginName, "Initialize " + pluginName + " Integration");
+ }
+}
----
Bear in mind that the Plugin's InitStep class will be loaded but
@@ -706,9 +706,12 @@
in between, leading to the final operator name. An example
registration looks like this:
- bind(ChangeOperatorFactory.class)
- .annotatedWith(Exports.named("sample"))
- .to(SampleOperator.class);
+[source,java]
+----
+bind(ChangeOperatorFactory.class)
+ .annotatedWith(Exports.named("sample"))
+ .to(SampleOperator.class);
+----
If this is registered in the `myplugin` plugin, then the resulting
operator will be named `sample_myplugin`.
@@ -736,7 +739,7 @@
----
[[search_operands]]
-=== Search Operands ===
+== Search Operands
Plugins can define new search operands to extend change searching.
Plugin methods implementing search operands (returning a
@@ -748,31 +751,33 @@
a module's `configure()` method in the plugin.
The new operand, when used in a search would appear as:
- operatorName:operandName_pluginName
+ `operatorName:operandName_pluginName`
A sample `ChangeHasOperandFactory` class implementing, and registering, a
new `has:sample_pluginName` operand is shown below:
-====
- public class SampleHasOperand implements ChangeHasOperandFactory {
- public static class Module extends AbstractModule {
- @Override
- protected void configure() {
- bind(ChangeHasOperandFactory.class)
- .annotatedWith(Exports.named("sample")
- .to(SampleHasOperand.class);
- }
- }
-
+[source, java]
+----
+public class SampleHasOperand implements ChangeHasOperandFactory {
+ public static class Module extends AbstractModule {
@Override
- public Predicate<ChangeData> create(ChangeQueryBuilder builder)
- throws QueryParseException {
- return new HasSamplePredicate();
+ protected void configure() {
+ bind(ChangeHasOperandFactory.class)
+ .annotatedWith(Exports.named("sample")
+ .to(SampleHasOperand.class);
}
-====
+ }
+
+ @Override
+ public Predicate<ChangeData> create(ChangeQueryBuilder builder)
+ throws QueryParseException {
+ return new HasSamplePredicate();
+ }
+}
+----
[[command_options]]
-=== Command Options ===
+== Command Options
Plugins can provide additional options for each of the gerrit ssh and the
REST API commands by implementing the DynamicBean interface and registering
@@ -801,6 +806,7 @@
logger.atSevere().log("Say Hello in the Log %s", arg);
}
}
+}
----
To provide additional Guice bindings for options to a command in another classloader, bind a
@@ -815,21 +821,21 @@
[source, java]
----
- bind(DynamicOptions.DynamicBean.class)
- .annotatedWith(Exports.named(
- "com.google.gerrit.plugins.otherplugin.command"))
- .to(MyOptionsModulesClassNamesProvider.class);
+bind(DynamicOptions.DynamicBean.class)
+ .annotatedWith(Exports.named(
+ "com.google.gerrit.plugins.otherplugin.command"))
+ .to(MyOptionsModulesClassNamesProvider.class);
- static class MyOptionsModulesClassNamesProvider implements DynamicOptions.ModulesClassNamesProvider {
- {@literal @}Override
- public String getClassName() {
- return "com.googlesource.gerrit.plugins.myplugin.CommandOptions";
- }
- {@literal @}Override
- public Iterable<String> getModulesClassNames()() {
- return "com.googlesource.gerrit.plugins.myplugin.MyOptionsModule";
- }
+static class MyOptionsModulesClassNamesProvider implements DynamicOptions.ModulesClassNamesProvider {
+ @Override
+ public String getClassName() {
+ return "com.googlesource.gerrit.plugins.myplugin.CommandOptions";
}
+ @Override
+ public Iterable<String> getModulesClassNames()() {
+ return "com.googlesource.gerrit.plugins.myplugin.MyOptionsModule";
+ }
+}
----
=== Calling Command Options ===
@@ -891,7 +897,7 @@
----
[[query_attributes]]
-=== Change Attributes ===
+== Change Attributes
==== ChangePluginDefinedInfoFactory
@@ -967,13 +973,9 @@
}
----
-Example
+Example:
----
-
-ssh -p 29418 localhost gerrit query --myplugin-name--all "change:1" --format json
-
-Output:
-
+$ ssh -p 29418 localhost gerrit query --myplugin-name--all "change:1" --format json
{
"url" : "http://localhost:8080/1",
"plugins" : [
@@ -986,10 +988,7 @@
...
}
-curl http://localhost:8080/changes/1?myplugin-name--all
-
-Output:
-
+$ curl http://localhost:8080/changes/1?myplugin-name--all
{
"_number": 1,
...
@@ -1133,8 +1132,8 @@
`plugin.helloworld` subsection:
----
- [plugin "helloworld"]
- enabled = true
+[plugin "helloworld"]
+ enabled = true
----
Via the `com.google.gerrit.server.config.PluginConfigFactory` class a
@@ -1337,7 +1336,7 @@
Here and example of ref-updated JSON event payload with `instanceId`:
[source,json]
----
+----
{
"submitter": {
"name": "Administrator",
@@ -1354,7 +1353,7 @@
"eventCreatedOn": 1588849085,
"instanceId": "instance1"
}
----
+----
[[capabilities]]
== Plugin Owned Capabilities
@@ -1681,11 +1680,11 @@
can be accessed from any REST client, i. e.:
----
- curl -X POST -H "Content-Type: application/json" \
+$ curl -X POST -H "Content-Type: application/json" \
-d '{message: "François", french: true}' \
--user joe:secret \
http://host:port/a/changes/1/revisions/1/cookbook~say-hello
- "Bonjour François from change 1, patch set 1!"
+"Bonjour François from change 1, patch set 1!"
----
A special case is to bind an endpoint without a view name. This is
@@ -1782,7 +1781,6 @@
[source,java]
----
public class MyTopMenuExtension implements TopMenu {
-
@Override
public List<MenuEntry> getEntries() {
return Lists.newArrayList(
@@ -1799,7 +1797,6 @@
[source,java]
----
public class MyTopMenuExtension implements TopMenu {
-
@Override
public List<MenuEntry> getEntries() {
return Lists.newArrayList(
@@ -1817,17 +1814,17 @@
specific requests and add an menu item for this:
[source,java]
----
- new MenuItem("My Screen", "/plugins/myplugin/project/${projectName}");
----
+----
+new MenuItem("My Screen", "/plugins/myplugin/project/${projectName}");
+----
This also enables plugins to provide menu items for project aware
screens:
[source,java]
----
- new MenuItem("My Screen", "/x/my-screen/for/${projectName}");
----
+----
+new MenuItem("My Screen", "/x/my-screen/for/${projectName}");
+----
If no Guice modules are declared in the manifest, the top menu extension may use
auto-registration by providing an `@Listen` annotation:
@@ -2041,7 +2038,6 @@
bind(AccountExternalIdCreator.class)
.annotatedWith(UniqueAnnotations.create())
.to(MyExternalIdCreator.class);
-}
----
[[download-commands]]
@@ -2108,7 +2104,6 @@
@Listen
public class MyWeblinkPlugin implements PatchSetWebLink {
-
private String name = "MyLink";
private String placeHolderUrlProjectCommit = "http://my.tool.com/project=%s/commit=%s";
private String imageUrl = "http://placehold.it/16x16.gif";
@@ -2189,7 +2184,6 @@
import com.google.inject.servlet.ServletModule;
public class HttpModule extends ServletModule {
-
@Override
protected void configureServlets() {
serveRegex(URL_REGEX).with(LfsApiServlet.class);
@@ -2200,7 +2194,7 @@
import org.eclipse.jgit.lfs.server.s3.S3Repository;
public class S3LargeFileRepository extends S3Repository {
-...
+ ...
}
----
@@ -2250,8 +2244,8 @@
file. For example:
----
- [plugin "my-plugin"]
- metricsPrefix = my-metrics
+[plugin "my-plugin"]
+ metricsPrefix = my-metrics
----
will cause the metrics to be recorded under `my-metrics/${metric-name}`.
@@ -2274,6 +2268,7 @@
implementation, e.g. one that supports cluster setup with multiple
primary Gerrit nodes handling write operations.
+[source,java]
----
DynamicItem.bind(binder(), AccountPatchReviewStore.class)
.to(MultiMasterAccountPatchReviewStore.class);
@@ -2521,6 +2516,26 @@
}
----
+
+[[account-tag]]
+== Account Tag Plugins
+
+Gerrit provides an extension point that enables Plugins to supply additional
+tags on an account.
+
+[source, java]
+----
+import com.google.gerrit.entities.Account;
+import com.google.gerrit.server.account.AccountTagProvider;
+import java.util.List;
+
+public class MyPlugin implements AccountTagProvider {
+ public List<String> getTags(Account.Id id) {
+ // Implement your logic here
+ }
+}
+----
+
[[ssh-command-creation-interception]]
== SSH Command Creation Interception
@@ -2536,6 +2551,8 @@
@Override
public String intercept(String in) {
return pluginName + " mycommand";
+ }
+}
----
[[ssh-command-execution-interception]]
@@ -2569,7 +2586,8 @@
And then declare it in your SSH module:
[source, java]
----
- DynamicSet.bind(binder(), SshExecuteCommandInterceptor.class).to(SshExecuteCommandInterceptorImpl.class);
+DynamicSet.bind(binder(), SshExecuteCommandInterceptor.class)
+ .to(SshExecuteCommandInterceptorImpl.class);
----
[[pre-submit-evaluator]]
diff --git a/Documentation/metrics.txt b/Documentation/metrics.txt
index 03be71e..e62331b 100644
--- a/Documentation/metrics.txt
+++ b/Documentation/metrics.txt
@@ -27,6 +27,8 @@
* `cancellation/advisory_deadline_count`: Exceeded advisory deadlines by request
* `cancellation/cancelled_requests_count`: Number of request cancellations by
request
+* `cancellation/receive_timeout_count`: Number of requests that are cancelled
+ because link:config.html#receive.timeout[receive.timout] is exceeded
=== Pushes
diff --git a/Documentation/user-search.txt b/Documentation/user-search.txt
index 006cd71..fa77f6e 100644
--- a/Documentation/user-search.txt
+++ b/Documentation/user-search.txt
@@ -321,7 +321,7 @@
+
Matches any change touching file at 'PATH'. By default exact path
matching is used, but regular expressions can be enabled by starting
-with `^`. For example, to match all XML files use `file:^.*\.xml$`.
+with `^`. For example, to match all XML files use `file:"^.*\.xml$"`.
The link:http://www.brics.dk/automaton/[dk.brics.automaton library,role=external,window=_blank]
is used for the evaluation of such patterns.
+
@@ -331,15 +331,15 @@
files, use `file:^.*\.java`.
+
The entire regular expression pattern, including the `^` character,
-should be double quoted when using more complex construction (like
-ones using a bracket expression). For example, to match all XML
+should be double quoted. For example, to match all XML
files named like 'name1.xml', 'name2.xml', and 'name3.xml' use
`file:"^name[1-3].xml"`.
+
Slash ('/') is used path separator.
+
-More examples:
-* `-file:^path/.*` - changes that do not modify files from `path/`,
+*More examples:*
+
+* `-file:^path/.*` - changes that do not modify files from `path/`.
* `file:{^~(path/.*)}` - changes that modify files not from `path/` (but may
contain files from `path/`).
diff --git a/contrib/ui-api-proxy.go b/contrib/ui-api-proxy.go
deleted file mode 100644
index 1ae1c1a..0000000
--- a/contrib/ui-api-proxy.go
+++ /dev/null
@@ -1,65 +0,0 @@
-// ui-api-proxy is a reverse http proxy that allows the UI to be served from
-// a different host than the API. This allows testing new UI features served
-// from localhost but using live production data.
-//
-// Run the binary, download & install the Go tools available at
-// http://golang.org/doc/install . To run, execute `go run ui-api-proxy.go`.
-// For a description of the available flags, execute
-// `go run ui-api-proxy.go --help`.
-package main
-
-import (
- "flag"
- "fmt"
- "log"
- "net"
- "net/http"
- "net/http/httputil"
- "net/url"
- "strings"
- "time"
-)
-
-var (
- ui = flag.String("ui", "http://localhost:8080", "host to which ui requests will be forwarded")
- api = flag.String("api", "https://gerrit-review.googlesource.com", "host to which api requests will be forwarded")
- port = flag.Int("port", 0, "port on which to run this server")
-)
-
-func main() {
- flag.Parse()
-
- uiURL, err := url.Parse(*ui)
- if err != nil {
- log.Fatalf("proxy: parsing ui addr %q failed: %v\n", *ui, err)
- }
- apiURL, err := url.Parse(*api)
- if err != nil {
- log.Fatalf("proxy: parsing api addr %q failed: %v\n", *api, err)
- }
-
- l, err := net.Listen("tcp", fmt.Sprintf("127.0.0.1:%v", *port))
- if err != nil {
- log.Fatalln("proxy: listen failed: ", err)
- }
- defer l.Close()
- fmt.Printf("OK\nListening on http://%v/\n", l.Addr())
-
- err = http.Serve(l, &httputil.ReverseProxy{
- FlushInterval: 500 * time.Millisecond,
- Director: func(r *http.Request) {
- if strings.HasPrefix(r.URL.Path, "/changes/") || strings.HasPrefix(r.URL.Path, "/projects/") {
- r.URL.Scheme, r.URL.Host = apiURL.Scheme, apiURL.Host
- } else {
- r.URL.Scheme, r.URL.Host = uiURL.Scheme, uiURL.Host
- }
- if r.URL.Scheme == "" {
- r.URL.Scheme = "http"
- }
- r.Host, r.URL.Opaque, r.URL.RawQuery = r.URL.Host, r.RequestURI, ""
- },
- })
- if err != nil {
- log.Fatalln("proxy: serve failed: ", err)
- }
-}
diff --git a/java/com/google/gerrit/acceptance/InMemoryTestingDatabaseModule.java b/java/com/google/gerrit/acceptance/InMemoryTestingDatabaseModule.java
index e4b0eea..373246a 100644
--- a/java/com/google/gerrit/acceptance/InMemoryTestingDatabaseModule.java
+++ b/java/com/google/gerrit/acceptance/InMemoryTestingDatabaseModule.java
@@ -21,6 +21,8 @@
import com.google.gerrit.extensions.events.LifecycleListener;
import com.google.gerrit.lifecycle.LifecycleModule;
import com.google.gerrit.metrics.MetricMaker;
+import com.google.gerrit.server.config.AllProjectsConfigProvider;
+import com.google.gerrit.server.config.FileBasedAllProjectsConfigProvider;
import com.google.gerrit.server.config.FileBasedGlobalPluginConfigProvider;
import com.google.gerrit.server.config.GerritServerConfig;
import com.google.gerrit.server.config.GlobalPluginConfigProvider;
@@ -57,6 +59,7 @@
protected void configure() {
bind(Config.class).annotatedWith(GerritServerConfig.class).toInstance(cfg);
bind(GlobalPluginConfigProvider.class).to(FileBasedGlobalPluginConfigProvider.class);
+ bind(AllProjectsConfigProvider.class).to(FileBasedAllProjectsConfigProvider.class);
bind(Path.class).annotatedWith(SitePath.class).toInstance(sitePath);
if (repoManager != null) {
diff --git a/java/com/google/gerrit/entities/Patch.java b/java/com/google/gerrit/entities/Patch.java
index 856765b..2d28046 100644
--- a/java/com/google/gerrit/entities/Patch.java
+++ b/java/com/google/gerrit/entities/Patch.java
@@ -78,25 +78,27 @@
public abstract String fileName();
}
- /** Type of modification made to the file path. */
+ /**
+ * Type of modification made to the file path. Ordering of values matters (used by diff cache).
+ */
public enum ChangeType implements CodedEnum {
/** Path is being created/introduced by this patch. */
ADDED('A'),
- /** Path already exists, and has updated content. */
- MODIFIED('M'),
-
- /** Path existed, but is being removed by this patch. */
- DELETED('D'),
-
/** Path existed at the source but was moved. */
RENAMED('R'),
+ /** Path already exists, and has updated content. */
+ MODIFIED('M'),
+
/** Path was copied from the source. */
COPIED('C'),
/** Sufficient amount of content changed to claim the file was rewritten. */
- REWRITE('W');
+ REWRITE('W'),
+
+ /** Path existed, but is being removed by this patch. */
+ DELETED('D');
private final char code;
diff --git a/java/com/google/gerrit/extensions/common/AccountInfo.java b/java/com/google/gerrit/extensions/common/AccountInfo.java
index 60ba18d..4701e86 100644
--- a/java/com/google/gerrit/extensions/common/AccountInfo.java
+++ b/java/com/google/gerrit/extensions/common/AccountInfo.java
@@ -27,10 +27,13 @@
* are defined in {@link AccountDetailInfo}.
*/
public class AccountInfo {
- /** Tags are additional properties of an account. */
- public enum Tag {
+ /**
+ * Tags are additional properties of an account. These are just tags known to Gerrit core. Plugins
+ * may define their own.
+ */
+ public static final class Tags {
/** Tag indicating that this account is a service user. */
- SERVICE_USER
+ public static final String SERVICE_USER = "SERVICE_USER";
}
/** The numeric ID of the account. */
@@ -74,7 +77,7 @@
public Boolean inactive;
/** Tags, such as whether this account is a service user. */
- public List<Tag> tags;
+ public List<String> tags;
public AccountInfo(Integer id) {
this._accountId = id;
diff --git a/java/com/google/gerrit/extensions/restapi/PreconditionFailedException.java b/java/com/google/gerrit/extensions/restapi/PreconditionFailedException.java
index b8c9d38..86b821b 100644
--- a/java/com/google/gerrit/extensions/restapi/PreconditionFailedException.java
+++ b/java/com/google/gerrit/extensions/restapi/PreconditionFailedException.java
@@ -22,4 +22,12 @@
public PreconditionFailedException(String msg) {
super(msg);
}
+
+ /**
+ * @param msg message to return to the client describing the error.
+ * @param cause cause of this exception.
+ */
+ public PreconditionFailedException(String msg, Throwable cause) {
+ super(msg, cause);
+ }
}
diff --git a/java/com/google/gerrit/pgm/init/api/AllProjectsConfig.java b/java/com/google/gerrit/pgm/init/api/AllProjectsConfig.java
index 5ca239e..abd7d43 100644
--- a/java/com/google/gerrit/pgm/init/api/AllProjectsConfig.java
+++ b/java/com/google/gerrit/pgm/init/api/AllProjectsConfig.java
@@ -15,15 +15,16 @@
package com.google.gerrit.pgm.init.api;
import com.google.common.flogger.FluentLogger;
-import com.google.gerrit.common.Nullable;
import com.google.gerrit.entities.Project;
import com.google.gerrit.entities.RefNames;
+import com.google.gerrit.server.config.AllProjectsConfigProvider;
import com.google.gerrit.server.config.AllProjectsName;
import com.google.gerrit.server.config.SitePaths;
import com.google.gerrit.server.project.GroupList;
import com.google.gerrit.server.project.ProjectConfig;
import com.google.inject.Inject;
import java.io.IOException;
+import java.util.Optional;
import org.eclipse.jgit.errors.ConfigInvalidException;
import org.eclipse.jgit.lib.CommitBuilder;
import org.eclipse.jgit.lib.Config;
@@ -34,16 +35,18 @@
public class AllProjectsConfig extends VersionedMetaDataOnInit {
private static final FluentLogger logger = FluentLogger.forEnclosingClass();
- @Nullable private final StoredConfig baseConfig;
+ private final Optional<StoredConfig> baseConfig;
private Config cfg;
private GroupList groupList;
@Inject
- AllProjectsConfig(AllProjectsNameOnInitProvider allProjects, SitePaths site, InitFlags flags) {
+ AllProjectsConfig(
+ AllProjectsNameOnInitProvider allProjects,
+ AllProjectsConfigProvider allProjectsConfigProvider,
+ SitePaths site,
+ InitFlags flags) {
super(flags, site, allProjects.get(), RefNames.REFS_CONFIG);
- this.baseConfig =
- ProjectConfig.Factory.getBaseConfig(
- site, new AllProjectsName(allProjects.get()), Project.nameKey(allProjects.get()));
+ this.baseConfig = allProjectsConfigProvider.get(new AllProjectsName(allProjects.get()));
}
public Config getConfig() {
@@ -62,8 +65,8 @@
@Override
protected void onLoad() throws IOException, ConfigInvalidException {
- if (baseConfig != null) {
- baseConfig.load();
+ if (baseConfig.isPresent()) {
+ baseConfig.get().load();
}
groupList = readGroupList();
cfg = readConfig(ProjectConfig.PROJECT_CONFIG, baseConfig);
diff --git a/java/com/google/gerrit/pgm/init/api/GitRepositoryManagerOnInit.java b/java/com/google/gerrit/pgm/init/api/GitRepositoryManagerOnInit.java
index a937c4b..8e69eb9 100644
--- a/java/com/google/gerrit/pgm/init/api/GitRepositoryManagerOnInit.java
+++ b/java/com/google/gerrit/pgm/init/api/GitRepositoryManagerOnInit.java
@@ -15,6 +15,7 @@
package com.google.gerrit.pgm.init.api;
import com.google.gerrit.entities.Project;
+import com.google.gerrit.entities.Project.NameKey;
import com.google.gerrit.server.config.SitePaths;
import com.google.gerrit.server.git.GitRepositoryManager;
import com.google.inject.Inject;
@@ -41,6 +42,18 @@
}
@Override
+ public Status getRepositoryStatus(NameKey name) {
+ try {
+ openRepository(name);
+ } catch (RepositoryNotFoundException e) {
+ return Status.NON_EXISTENT;
+ } catch (IOException e) {
+ return Status.UNAVAILABLE;
+ }
+ return Status.ACTIVE;
+ }
+
+ @Override
public Repository openRepository(Project.NameKey name)
throws RepositoryNotFoundException, IOException {
return new FileRepository(getPath(name));
diff --git a/java/com/google/gerrit/server/CancellationMetrics.java b/java/com/google/gerrit/server/CancellationMetrics.java
index 9a1ac9c..19d6ee8 100644
--- a/java/com/google/gerrit/server/CancellationMetrics.java
+++ b/java/com/google/gerrit/server/CancellationMetrics.java
@@ -20,6 +20,7 @@
import com.google.common.annotations.VisibleForTesting;
import com.google.common.base.Splitter;
import com.google.gerrit.common.UsedAt;
+import com.google.gerrit.metrics.Counter1;
import com.google.gerrit.metrics.Counter3;
import com.google.gerrit.metrics.Description;
import com.google.gerrit.metrics.Field;
@@ -34,6 +35,7 @@
public class CancellationMetrics {
private final Counter3<String, String, String> advisoryDeadlineCount;
private final Counter3<String, String, RequestStateProvider.Reason> cancelledRequestsCount;
+ private final Counter1<String> receiveTimeoutCount;
@Inject
CancellationMetrics(MetricMaker metrics) {
@@ -71,6 +73,16 @@
Metadata.Builder::cancellationReason)
.description("The reason why the request was cancelled.")
.build());
+
+ this.receiveTimeoutCount =
+ metrics.newCounter(
+ "cancellation/receive_timeout_count",
+ new Description(
+ "Number of requests that are cancelled because receive.timout is exceeded")
+ .setRate(),
+ Field.ofString("cancellation_type", (metadataBuilder, resolveAllUsers) -> {})
+ .description("The cancellation type (graceful or forceful).")
+ .build());
}
public void countAdvisoryDeadline(RequestInfo requestInfo, String deadlineId) {
@@ -96,6 +108,14 @@
cancelledRequestsCount.increment(requestType, redactedRequestUri, cancellationReason);
}
+ public void countGracefulReceiveTimeout() {
+ receiveTimeoutCount.increment("graceful");
+ }
+
+ public void countForcefulReceiveTimeout() {
+ receiveTimeoutCount.increment("forceful");
+ }
+
/**
* Redacts resource IDs from the given request URI.
*
diff --git a/java/com/google/gerrit/server/account/AccountTagProvider.java b/java/com/google/gerrit/server/account/AccountTagProvider.java
new file mode 100644
index 0000000..ddb1331
--- /dev/null
+++ b/java/com/google/gerrit/server/account/AccountTagProvider.java
@@ -0,0 +1,14 @@
+package com.google.gerrit.server.account;
+
+import com.google.gerrit.entities.Account;
+import com.google.gerrit.extensions.annotations.ExtensionPoint;
+import java.util.List;
+
+/**
+ * An extension point for plugins to define their own account tags in addition to the ones defined
+ * at {@link com.google.gerrit.extensions.common.AccountInfo.Tags}.
+ */
+@ExtensionPoint
+public interface AccountTagProvider {
+ List<String> getTags(Account.Id id);
+}
diff --git a/java/com/google/gerrit/server/account/InternalAccountDirectory.java b/java/com/google/gerrit/server/account/InternalAccountDirectory.java
index 13b71cf..9d684ac4 100644
--- a/java/com/google/gerrit/server/account/InternalAccountDirectory.java
+++ b/java/com/google/gerrit/server/account/InternalAccountDirectory.java
@@ -14,17 +14,19 @@
package com.google.gerrit.server.account;
+import static com.google.common.collect.Streams.stream;
import static java.util.stream.Collectors.toList;
import static java.util.stream.Collectors.toSet;
+import static java.util.stream.Stream.concat;
import com.google.common.base.Strings;
-import com.google.common.collect.ImmutableList;
import com.google.common.collect.Sets;
-import com.google.common.collect.Streams;
import com.google.gerrit.entities.Account;
import com.google.gerrit.extensions.common.AccountInfo;
+import com.google.gerrit.extensions.common.AccountInfo.Tags;
import com.google.gerrit.extensions.common.AvatarInfo;
import com.google.gerrit.extensions.registration.DynamicItem;
+import com.google.gerrit.extensions.registration.DynamicMap;
import com.google.gerrit.extensions.restapi.AuthException;
import com.google.gerrit.server.CurrentUser;
import com.google.gerrit.server.IdentifiedUser;
@@ -45,6 +47,7 @@
import java.util.Map;
import java.util.Objects;
import java.util.Set;
+import java.util.stream.Stream;
@Singleton
public class InternalAccountDirectory extends AccountDirectory {
@@ -63,6 +66,7 @@
private final Provider<CurrentUser> self;
private final PermissionBackend permissionBackend;
private final ServiceUserClassifier serviceUserClassifier;
+ private final DynamicMap<AccountTagProvider> accountTagProviders;
@Inject
InternalAccountDirectory(
@@ -71,13 +75,15 @@
IdentifiedUser.GenericFactory userFactory,
Provider<CurrentUser> self,
PermissionBackend permissionBackend,
- ServiceUserClassifier serviceUserClassifier) {
+ ServiceUserClassifier serviceUserClassifier,
+ DynamicMap<AccountTagProvider> accountTagProviders) {
this.accountCache = accountCache;
this.avatar = avatar;
this.userFactory = userFactory;
this.self = self;
this.permissionBackend = permissionBackend;
this.serviceUserClassifier = serviceUserClassifier;
+ this.accountTagProviders = accountTagProviders;
}
@Override
@@ -102,7 +108,7 @@
Set<FillOptions> fillOptionsWithoutSecondaryEmails =
Sets.difference(options, EnumSet.of(FillOptions.SECONDARY_EMAILS));
- Set<Account.Id> ids = Streams.stream(in).map(a -> Account.id(a._accountId)).collect(toSet());
+ Set<Account.Id> ids = stream(in).map(a -> Account.id(a._accountId)).collect(toSet());
Map<Account.Id, AccountState> accountStates = accountCache.get(ids);
for (AccountInfo info : in) {
Account.Id id = Account.id(info._accountId);
@@ -160,10 +166,10 @@
}
if (options.contains(FillOptions.TAGS)) {
- info.tags =
- serviceUserClassifier.isServiceUser(account.id())
- ? ImmutableList.of(AccountInfo.Tag.SERVICE_USER)
- : null;
+ List<String> tags = getTags(account.id());
+ if (!tags.isEmpty()) {
+ info.tags = tags;
+ }
}
if (options.contains(FillOptions.AVATARS)) {
@@ -194,6 +200,15 @@
.collect(toList());
}
+ private List<String> getTags(Account.Id id) {
+ Stream<String> tagsFromProviders =
+ stream(accountTagProviders.iterator())
+ .flatMap(accountTagProvider -> accountTagProvider.get().getTags(id).stream());
+ Stream<String> tagsFromServiceUserClassifier =
+ serviceUserClassifier.isServiceUser(id) ? Stream.of(Tags.SERVICE_USER) : Stream.empty();
+ return concat(tagsFromProviders, tagsFromServiceUserClassifier).collect(toList());
+ }
+
private static void addAvatar(
AvatarProvider provider, AccountInfo account, IdentifiedUser user, int size) {
String url = provider.getUrl(user, size);
diff --git a/java/com/google/gerrit/server/change/ChangeJson.java b/java/com/google/gerrit/server/change/ChangeJson.java
index 89069e2..43f1475 100644
--- a/java/com/google/gerrit/server/change/ChangeJson.java
+++ b/java/com/google/gerrit/server/change/ChangeJson.java
@@ -98,6 +98,7 @@
import com.google.gerrit.server.StarredChangesUtil;
import com.google.gerrit.server.account.AccountInfoComparator;
import com.google.gerrit.server.account.AccountLoader;
+import com.google.gerrit.server.cancellation.RequestCancelledException;
import com.google.gerrit.server.config.GerritServerConfig;
import com.google.gerrit.server.config.TrackingFooters;
import com.google.gerrit.server.index.change.ChangeField;
@@ -509,6 +510,11 @@
cache.put(Change.id(info._number), info);
}
} catch (RuntimeException e) {
+ Optional<RequestCancelledException> requestCancelledException =
+ RequestCancelledException.getFromCausalChain(e);
+ if (requestCancelledException.isPresent()) {
+ throw e;
+ }
logger.atWarning().withCause(e).log(
"Omitting corrupt change %s from results", cd.getId());
}
diff --git a/java/com/google/gerrit/server/config/AllProjectsConfigProvider.java b/java/com/google/gerrit/server/config/AllProjectsConfigProvider.java
new file mode 100644
index 0000000..27ae41f
--- /dev/null
+++ b/java/com/google/gerrit/server/config/AllProjectsConfigProvider.java
@@ -0,0 +1,8 @@
+package com.google.gerrit.server.config;
+
+import java.util.Optional;
+import org.eclipse.jgit.lib.StoredConfig;
+
+public interface AllProjectsConfigProvider {
+ Optional<StoredConfig> get(AllProjectsName allProjectsName);
+}
diff --git a/java/com/google/gerrit/server/config/FileBasedAllProjectsConfigProvider.java b/java/com/google/gerrit/server/config/FileBasedAllProjectsConfigProvider.java
new file mode 100644
index 0000000..ebb0e50
--- /dev/null
+++ b/java/com/google/gerrit/server/config/FileBasedAllProjectsConfigProvider.java
@@ -0,0 +1,33 @@
+package com.google.gerrit.server.config;
+
+import com.google.common.annotations.VisibleForTesting;
+import com.google.gerrit.server.project.ProjectConfig;
+import com.google.inject.Inject;
+import java.util.Optional;
+import javax.inject.Singleton;
+import org.eclipse.jgit.lib.StoredConfig;
+import org.eclipse.jgit.storage.file.FileBasedConfig;
+import org.eclipse.jgit.util.FS;
+
+@Singleton
+public class FileBasedAllProjectsConfigProvider implements AllProjectsConfigProvider {
+ private final SitePaths sitePaths;
+
+ @VisibleForTesting
+ @Inject
+ public FileBasedAllProjectsConfigProvider(SitePaths sitePaths) {
+ this.sitePaths = sitePaths;
+ }
+
+ @Override
+ public Optional<StoredConfig> get(AllProjectsName allProjectsName) {
+ return Optional.of(
+ new FileBasedConfig(
+ sitePaths
+ .etc_dir
+ .resolve(allProjectsName.get())
+ .resolve(ProjectConfig.PROJECT_CONFIG)
+ .toFile(),
+ FS.DETECTED));
+ }
+}
diff --git a/java/com/google/gerrit/server/config/GerritGlobalModule.java b/java/com/google/gerrit/server/config/GerritGlobalModule.java
index ac4a8d9..06da0b9 100644
--- a/java/com/google/gerrit/server/config/GerritGlobalModule.java
+++ b/java/com/google/gerrit/server/config/GerritGlobalModule.java
@@ -92,6 +92,7 @@
import com.google.gerrit.server.account.AccountDeactivator;
import com.google.gerrit.server.account.AccountExternalIdCreator;
import com.google.gerrit.server.account.AccountManager;
+import com.google.gerrit.server.account.AccountTagProvider;
import com.google.gerrit.server.account.AccountVisibilityProvider;
import com.google.gerrit.server.account.CapabilityCollection;
import com.google.gerrit.server.account.EmailExpander;
@@ -130,6 +131,7 @@
import com.google.gerrit.server.git.GitModule;
import com.google.gerrit.server.git.MergeUtil;
import com.google.gerrit.server.git.MergedByPushOp;
+import com.google.gerrit.server.git.MultiProgressMonitor;
import com.google.gerrit.server.git.NotesBranchUtil;
import com.google.gerrit.server.git.PureRevertCache;
import com.google.gerrit.server.git.ReceivePackInitializer;
@@ -284,6 +286,7 @@
factory(ChangeIsVisibleToPredicate.Factory.class);
factory(DeadlineChecker.Factory.class);
factory(MergeUtil.Factory.class);
+ factory(MultiProgressMonitor.Factory.class);
factory(PatchScriptFactory.Factory.class);
factory(PatchScriptFactoryForAutoFix.Factory.class);
factory(ProjectState.Factory.class);
@@ -429,6 +432,7 @@
DynamicSet.bind(binder(), ExceptionHook.class).to(ExceptionHookImpl.class);
DynamicSet.setOf(binder(), MailSoyTemplateProvider.class);
DynamicSet.setOf(binder(), OnPostReview.class);
+ DynamicMap.mapOf(binder(), AccountTagProvider.class);
DynamicMap.mapOf(binder(), MailFilter.class);
bind(MailFilter.class).annotatedWith(Exports.named("ListMailFilter")).to(ListMailFilter.class);
diff --git a/java/com/google/gerrit/server/config/GerritServerConfigModule.java b/java/com/google/gerrit/server/config/GerritServerConfigModule.java
index da85834..8ddcdac 100644
--- a/java/com/google/gerrit/server/config/GerritServerConfigModule.java
+++ b/java/com/google/gerrit/server/config/GerritServerConfigModule.java
@@ -66,6 +66,7 @@
bind(Config.class)
.annotatedWith(GerritServerConfig.class)
.toProvider(GerritServerConfigProvider.class);
+ bind(AllProjectsConfigProvider.class).to(FileBasedAllProjectsConfigProvider.class);
bind(GlobalPluginConfigProvider.class).to(FileBasedGlobalPluginConfigProvider.class);
bind(SecureStore.class).toProvider(SecureStoreProvider.class).in(SINGLETON);
bind(Boolean.class)
diff --git a/java/com/google/gerrit/server/git/GitRepositoryManager.java b/java/com/google/gerrit/server/git/GitRepositoryManager.java
index e4d0696..8142089a 100644
--- a/java/com/google/gerrit/server/git/GitRepositoryManager.java
+++ b/java/com/google/gerrit/server/git/GitRepositoryManager.java
@@ -30,6 +30,23 @@
*/
@ImplementedBy(value = LocalDiskRepositoryManager.class)
public interface GitRepositoryManager {
+
+ /** Status of the repository. */
+ enum Status {
+ /** Repository exists and is available on host. */
+ ACTIVE,
+ /** Repository does not exist. */
+ NON_EXISTENT,
+ /**
+ * Repository might exist but can not be opened. This can for example be the case when the
+ * repository is pending deletion / the caller does not have permissions / repository is broken.
+ */
+ UNAVAILABLE;
+ }
+
+ /** Get {@link Status} of the repository by name. */
+ Status getRepositoryStatus(Project.NameKey name);
+
/**
* Get (or open) a repository by name.
*
@@ -47,13 +64,14 @@
* @param name the repository name, relative to the base directory.
* @return the cached Repository instance. Caller must call {@code close()} when done to decrement
* the resource handle.
+ * @throws RepositoryExistsException repository exists.
* @throws RepositoryCaseMismatchException the name collides with an existing repository name, but
* only in case of a character within the name.
* @throws RepositoryNotFoundException the name is invalid.
* @throws IOException the repository cannot be created.
*/
Repository createRepository(Project.NameKey name)
- throws RepositoryCaseMismatchException, RepositoryNotFoundException, IOException;
+ throws RepositoryNotFoundException, RepositoryExistsException, IOException;
/** @return set of all known projects, sorted by natural NameKey order. */
SortedSet<Project.NameKey> list();
diff --git a/java/com/google/gerrit/server/git/LocalDiskRepositoryManager.java b/java/com/google/gerrit/server/git/LocalDiskRepositoryManager.java
index 10220d8..1dc5c16 100644
--- a/java/com/google/gerrit/server/git/LocalDiskRepositoryManager.java
+++ b/java/com/google/gerrit/server/git/LocalDiskRepositoryManager.java
@@ -16,6 +16,7 @@
import com.google.common.flogger.FluentLogger;
import com.google.gerrit.entities.Project;
+import com.google.gerrit.entities.Project.NameKey;
import com.google.gerrit.entities.RefNames;
import com.google.gerrit.extensions.events.LifecycleListener;
import com.google.gerrit.lifecycle.LifecycleModule;
@@ -128,6 +129,29 @@
}
@Override
+ public Status getRepositoryStatus(NameKey name) {
+ if (isUnreasonableName(name)) {
+ return Status.NON_EXISTENT;
+ }
+ Path path = getBasePath(name);
+ File dir = FileKey.resolve(path.resolve(name.get()).toFile(), FS.DETECTED);
+ if (dir == null) {
+ return Status.NON_EXISTENT;
+ }
+ Repository repo;
+ try {
+ // Try to open with mustExist, so that it does not attempt to create a repository.
+ repo = RepositoryCache.open(FileKey.lenient(dir, FS.DETECTED), /*mustExist=*/ true);
+ } catch (RepositoryNotFoundException e) {
+ return Status.NON_EXISTENT;
+ } catch (IOException e) {
+ return Status.UNAVAILABLE;
+ }
+ // If object database does not exist, the repository is unusable
+ return repo.getObjectDatabase().exists() ? Status.ACTIVE : Status.UNAVAILABLE;
+ }
+
+ @Override
public Repository openRepository(Project.NameKey name) throws RepositoryNotFoundException {
return openRepository(getBasePath(name), name);
}
@@ -147,7 +171,7 @@
@Override
public Repository createRepository(Project.NameKey name)
- throws RepositoryNotFoundException, RepositoryCaseMismatchException, IOException {
+ throws RepositoryNotFoundException, RepositoryExistsException, IOException {
if (isUnreasonableName(name)) {
throw new RepositoryNotFoundException("Invalid name: " + name);
}
@@ -162,8 +186,7 @@
if (!onDiskName.equals(name)) {
throw new RepositoryCaseMismatchException(name);
}
-
- throw new IllegalStateException("Repository already exists: " + name);
+ throw new RepositoryExistsException(name);
}
// It doesn't exist under any of the standard permutations
diff --git a/java/com/google/gerrit/server/git/MultiProgressMonitor.java b/java/com/google/gerrit/server/git/MultiProgressMonitor.java
index 22385c7..b62b81b 100644
--- a/java/com/google/gerrit/server/git/MultiProgressMonitor.java
+++ b/java/com/google/gerrit/server/git/MultiProgressMonitor.java
@@ -21,9 +21,12 @@
import com.google.common.base.Strings;
import com.google.common.flogger.FluentLogger;
import com.google.common.util.concurrent.UncheckedExecutionException;
+import com.google.gerrit.server.CancellationMetrics;
import com.google.gerrit.server.cancellation.RequestStateProvider;
import com.google.gerrit.server.experiments.ExperimentFeatures;
import com.google.gerrit.server.experiments.ExperimentFeaturesConstants;
+import com.google.inject.assistedinject.Assisted;
+import com.google.inject.assistedinject.AssistedInject;
import java.io.IOException;
import java.io.OutputStream;
import java.util.List;
@@ -80,6 +83,11 @@
private static final char[] SPINNER_STATES = new char[] {'-', '\\', '|', '/'};
private static final char NO_SPINNER = ' ';
+ public enum TaskKind {
+ INDEXING,
+ RECEIVE_COMMITS;
+ }
+
/** Handle for a sub-task. */
public class Task implements ProgressMonitor {
private final String name;
@@ -149,8 +157,21 @@
}
}
+ public interface Factory {
+ MultiProgressMonitor create(OutputStream out, TaskKind taskKind, String taskName);
+
+ MultiProgressMonitor create(
+ OutputStream out,
+ TaskKind taskKind,
+ String taskName,
+ long maxIntervalTime,
+ TimeUnit maxIntervalUnit);
+ }
+
+ private final CancellationMetrics cancellationMetrics;
private final ExperimentFeatures experimentFeatures;
private final OutputStream out;
+ private final TaskKind taskKind;
private final String taskName;
private final List<Task> tasks = new CopyOnWriteArrayList<>();
private int spinnerIndex;
@@ -168,9 +189,14 @@
* @param out stream for writing progress messages.
* @param taskName name of the overall task.
*/
- public MultiProgressMonitor(
- ExperimentFeatures experimentFeatures, OutputStream out, String taskName) {
- this(experimentFeatures, out, taskName, 500, MILLISECONDS);
+ @AssistedInject
+ private MultiProgressMonitor(
+ CancellationMetrics cancellationMetrics,
+ ExperimentFeatures experimentFeatures,
+ @Assisted OutputStream out,
+ @Assisted TaskKind taskKind,
+ @Assisted String taskName) {
+ this(cancellationMetrics, experimentFeatures, out, taskKind, taskName, 500, MILLISECONDS);
}
/**
@@ -181,14 +207,19 @@
* @param maxIntervalTime maximum interval between progress messages.
* @param maxIntervalUnit time unit for progress interval.
*/
- public MultiProgressMonitor(
+ @AssistedInject
+ private MultiProgressMonitor(
+ CancellationMetrics cancellationMetrics,
ExperimentFeatures experimentFeatures,
- OutputStream out,
- String taskName,
- long maxIntervalTime,
- TimeUnit maxIntervalUnit) {
+ @Assisted OutputStream out,
+ @Assisted TaskKind taskKind,
+ @Assisted String taskName,
+ @Assisted long maxIntervalTime,
+ @Assisted TimeUnit maxIntervalUnit) {
+ this.cancellationMetrics = cancellationMetrics;
this.experimentFeatures = experimentFeatures;
this.out = out;
+ this.taskKind = taskKind;
this.taskName = taskName;
maxIntervalNanos = NANOSECONDS.convert(maxIntervalTime, maxIntervalUnit);
}
@@ -265,9 +296,11 @@
if (deadline > 0 && now > deadline) {
logger.atFine().log(
- "deadline exceeded after %sms: (timeout %sms, signaling cancellation)",
+ "deadline exceeded after %sms, signaling cancellation (timeout=%sms, task=%s(%s))",
MILLISECONDS.convert(now - overallStart, NANOSECONDS),
- MILLISECONDS.convert(now - deadline, NANOSECONDS));
+ MILLISECONDS.convert(now - deadline, NANOSECONDS),
+ taskKind,
+ taskName);
deadlineExceeded = true;
// After setting deadlineExceeded = true give the cancellationNanos to react to the
@@ -277,9 +310,14 @@
workerFuture.cancel(true);
if (workerFuture.isCancelled()) {
logger.atWarning().log(
- "MultiProgressMonitor worker killed after %sms: (timeout %sms, cancelled)",
+ "MultiProgressMonitor worker killed after %sms, cancelled (timeout=%sms, task=%s(%s))",
MILLISECONDS.convert(now - overallStart, NANOSECONDS),
- MILLISECONDS.convert(now - deadline, NANOSECONDS));
+ MILLISECONDS.convert(now - deadline, NANOSECONDS),
+ taskKind,
+ taskName);
+ if (taskKind == TaskKind.RECEIVE_COMMITS) {
+ cancellationMetrics.countForcefulReceiveTimeout();
+ }
}
break;
}
@@ -294,10 +332,15 @@
if (!done && workerFuture.isDone()) {
// The worker may not have called end() explicitly, which is likely a
// programming error.
- logger.atWarning().log("MultiProgressMonitor worker did not call end() before returning");
+ logger.atWarning().log(
+ "MultiProgressMonitor worker did not call end() before returning (task=%s(%s))",
+ taskKind, taskName);
end();
}
}
+ if (deadlineExceeded && taskKind == TaskKind.RECEIVE_COMMITS) {
+ cancellationMetrics.countGracefulReceiveTimeout();
+ }
sendDone();
}
@@ -306,7 +349,8 @@
try {
return workerFuture.get(maxIntervalNanos, NANOSECONDS);
} catch (InterruptedException | CancellationException e) {
- logger.atWarning().withCause(e).log("unable to finish processing");
+ logger.atWarning().withCause(e).log(
+ "unable to finish processing (task=%s(%s))", taskKind, taskName);
throw new UncheckedExecutionException(e);
} catch (TimeoutException e) {
workerFuture.cancel(true);
@@ -412,7 +456,8 @@
out.flush();
} catch (IOException e) {
logger.atWarning().withCause(e).log(
- "Sending progress to client failed. Stop sending updates for task %s", taskName);
+ "Sending progress to client failed. Stop sending updates for task %s(%s)",
+ taskKind, taskName);
clientDisconnected = true;
}
}
@@ -420,8 +465,9 @@
@Override
public void checkIfCancelled(OnCancelled onCancelled) {
- if (!experimentFeatures.isFeatureEnabled(
- ExperimentFeaturesConstants.GERRIT_BACKEND_REQUEST_FEATURE_ENABLE_PUSH_CANCELLATION)) {
+ if (taskKind == TaskKind.RECEIVE_COMMITS
+ && !experimentFeatures.isFeatureEnabled(
+ ExperimentFeaturesConstants.GERRIT_BACKEND_REQUEST_FEATURE_ENABLE_PUSH_CANCELLATION)) {
return;
}
diff --git a/java/com/google/gerrit/server/git/RepositoryCaseMismatchException.java b/java/com/google/gerrit/server/git/RepositoryCaseMismatchException.java
index 8535cd2..9e10c67 100644
--- a/java/com/google/gerrit/server/git/RepositoryCaseMismatchException.java
+++ b/java/com/google/gerrit/server/git/RepositoryCaseMismatchException.java
@@ -15,7 +15,6 @@
package com.google.gerrit.server.git;
import com.google.gerrit.entities.Project;
-import org.eclipse.jgit.errors.RepositoryNotFoundException;
/**
* This exception is thrown if a project cannot be created because a project with the same name in a
@@ -23,12 +22,12 @@
* (e.g. Windows), because in this case the name for the git repository in the file system is
* already occupied by the existing project.
*/
-public class RepositoryCaseMismatchException extends RepositoryNotFoundException {
+public class RepositoryCaseMismatchException extends RepositoryExistsException {
private static final long serialVersionUID = 1L;
/** @param projectName name of the project that cannot be created */
public RepositoryCaseMismatchException(Project.NameKey projectName) {
- super("Name occupied in other case. Project " + projectName.get() + " cannot be created.");
+ super(projectName, "Name occupied in other case.");
}
}
diff --git a/java/com/google/gerrit/server/git/RepositoryExistsException.java b/java/com/google/gerrit/server/git/RepositoryExistsException.java
new file mode 100644
index 0000000..563b078
--- /dev/null
+++ b/java/com/google/gerrit/server/git/RepositoryExistsException.java
@@ -0,0 +1,37 @@
+// Copyright (C) 2021 The Android Open Source Project
+//
+// 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
+//
+// http://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.
+
+package com.google.gerrit.server.git;
+
+import com.google.gerrit.entities.Project;
+import java.io.IOException;
+
+/** Thrown when trying to create a repository that exist. */
+public class RepositoryExistsException extends IOException {
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * @param projectName name of the project that cannot be created
+ * @param reason reason why the project cannot be created
+ */
+ public RepositoryExistsException(Project.NameKey projectName, String reason) {
+ super(
+ String.format("Repository %s exists and cannot be created. %s", projectName.get(), reason));
+ }
+
+ /** @param projectName name of the project that cannot be created */
+ public RepositoryExistsException(Project.NameKey projectName) {
+ super(String.format("Repository %s exists and cannot be created.", projectName.get()));
+ }
+}
diff --git a/java/com/google/gerrit/server/git/meta/VersionedMetaData.java b/java/com/google/gerrit/server/git/meta/VersionedMetaData.java
index feb038a..999ed4e 100644
--- a/java/com/google/gerrit/server/git/meta/VersionedMetaData.java
+++ b/java/com/google/gerrit/server/git/meta/VersionedMetaData.java
@@ -35,6 +35,7 @@
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
+import java.util.Optional;
import org.eclipse.jgit.dircache.DirCache;
import org.eclipse.jgit.dircache.DirCacheBuilder;
import org.eclipse.jgit.dircache.DirCacheEditor;
@@ -461,12 +462,12 @@
}
protected Config readConfig(String fileName) throws IOException, ConfigInvalidException {
- return readConfig(fileName, null);
+ return readConfig(fileName, Optional.empty());
}
- protected Config readConfig(String fileName, Config baseConfig)
+ protected Config readConfig(String fileName, Optional<? extends Config> baseConfig)
throws IOException, ConfigInvalidException {
- Config rc = new Config(baseConfig);
+ Config rc = new Config(baseConfig.isPresent() ? baseConfig.get() : null);
String text = readUTF8(fileName);
if (!text.isEmpty()) {
try {
diff --git a/java/com/google/gerrit/server/git/receive/AsyncReceiveCommits.java b/java/com/google/gerrit/server/git/receive/AsyncReceiveCommits.java
index 5b26f61..488b008 100644
--- a/java/com/google/gerrit/server/git/receive/AsyncReceiveCommits.java
+++ b/java/com/google/gerrit/server/git/receive/AsyncReceiveCommits.java
@@ -40,8 +40,8 @@
import com.google.gerrit.server.config.ConfigUtil;
import com.google.gerrit.server.config.GerritServerConfig;
import com.google.gerrit.server.config.ReceiveCommitsExecutor;
-import com.google.gerrit.server.experiments.ExperimentFeatures;
import com.google.gerrit.server.git.MultiProgressMonitor;
+import com.google.gerrit.server.git.MultiProgressMonitor.TaskKind;
import com.google.gerrit.server.git.PermissionAwareRepositoryManager;
import com.google.gerrit.server.git.ProjectRunnable;
import com.google.gerrit.server.git.TransferConfig;
@@ -141,9 +141,8 @@
}
private static MultiProgressMonitor newMultiProgressMonitor(
- ExperimentFeatures experimentFeatures, MessageSender messageSender) {
- return new MultiProgressMonitor(
- experimentFeatures,
+ MultiProgressMonitor.Factory multiProgressMonitorFactory, MessageSender messageSender) {
+ return multiProgressMonitorFactory.create(
new OutputStream() {
@Override
public void write(int b) {
@@ -165,6 +164,7 @@
messageSender.flush();
}
},
+ TaskKind.RECEIVE_COMMITS,
"Processing changes");
}
@@ -222,7 +222,7 @@
}
}
- private final ExperimentFeatures experimentFeatures;
+ private final MultiProgressMonitor.Factory multiProgressMonitorFactory;
private final Metrics metrics;
private final ReceiveCommits receiveCommits;
private final PermissionBackend.ForProject perm;
@@ -240,7 +240,7 @@
@Inject
AsyncReceiveCommits(
- ExperimentFeatures experimentFeatures,
+ MultiProgressMonitor.Factory multiProgressMonitorFactory,
ReceiveCommits.Factory factory,
PermissionBackend permissionBackend,
Provider<InternalChangeQuery> queryProvider,
@@ -261,7 +261,7 @@
@Assisted Repository repo,
@Assisted @Nullable MessageSender messageSender)
throws PermissionBackendException {
- this.experimentFeatures = experimentFeatures;
+ this.multiProgressMonitorFactory = multiProgressMonitorFactory;
this.executor = executor;
this.scopePropagator = scopePropagator;
this.receiveConfig = receiveConfig;
@@ -386,7 +386,7 @@
}
String currentThreadName = Thread.currentThread().getName();
MultiProgressMonitor monitor =
- newMultiProgressMonitor(experimentFeatures, receiveCommits.getMessageSender());
+ newMultiProgressMonitor(multiProgressMonitorFactory, receiveCommits.getMessageSender());
Callable<ReceiveCommitsResult> callable =
() -> {
String oldName = Thread.currentThread().getName();
diff --git a/java/com/google/gerrit/server/index/IndexModule.java b/java/com/google/gerrit/server/index/IndexModule.java
index 6db00f5..e580f50 100644
--- a/java/com/google/gerrit/server/index/IndexModule.java
+++ b/java/com/google/gerrit/server/index/IndexModule.java
@@ -33,6 +33,7 @@
import com.google.gerrit.index.project.ProjectSchemaDefinitions;
import com.google.gerrit.lifecycle.LifecycleModule;
import com.google.gerrit.server.config.GerritServerConfig;
+import com.google.gerrit.server.git.MultiProgressMonitor;
import com.google.gerrit.server.git.WorkQueue;
import com.google.gerrit.server.index.account.AccountIndexCollection;
import com.google.gerrit.server.index.account.AccountIndexDefinition;
@@ -110,6 +111,7 @@
@Override
protected void configure() {
+ factory(MultiProgressMonitor.Factory.class);
bind(AccountIndexRewriter.class);
bind(AccountIndexCollection.class);
diff --git a/java/com/google/gerrit/server/index/change/AllChangesIndexer.java b/java/com/google/gerrit/server/index/change/AllChangesIndexer.java
index ab90e32..1b51703 100644
--- a/java/com/google/gerrit/server/index/change/AllChangesIndexer.java
+++ b/java/com/google/gerrit/server/index/change/AllChangesIndexer.java
@@ -30,10 +30,10 @@
import com.google.gerrit.entities.Project;
import com.google.gerrit.entities.RefNames;
import com.google.gerrit.index.SiteIndexer;
-import com.google.gerrit.server.experiments.ExperimentFeatures;
import com.google.gerrit.server.git.GitRepositoryManager;
import com.google.gerrit.server.git.MultiProgressMonitor;
import com.google.gerrit.server.git.MultiProgressMonitor.Task;
+import com.google.gerrit.server.git.MultiProgressMonitor.TaskKind;
import com.google.gerrit.server.index.IndexExecutor;
import com.google.gerrit.server.index.OnlineReindexMode;
import com.google.gerrit.server.notedb.ChangeNotes;
@@ -63,7 +63,7 @@
private static final FluentLogger logger = FluentLogger.forEnclosingClass();
private static final int PROJECT_SLICE_MAX_REFS = 1000;
- private final ExperimentFeatures experimentFeatures;
+ private final MultiProgressMonitor.Factory multiProgressMonitorFactory;
private final ChangeData.Factory changeDataFactory;
private final GitRepositoryManager repoManager;
private final ListeningExecutorService executor;
@@ -73,14 +73,14 @@
@Inject
AllChangesIndexer(
- ExperimentFeatures experimentFeatures,
+ MultiProgressMonitor.Factory multiProgressMonitorFactory,
ChangeData.Factory changeDataFactory,
GitRepositoryManager repoManager,
@IndexExecutor(BATCH) ListeningExecutorService executor,
ChangeIndexer.Factory indexerFactory,
ChangeNotes.Factory notesFactory,
ProjectCache projectCache) {
- this.experimentFeatures = experimentFeatures;
+ this.multiProgressMonitorFactory = multiProgressMonitorFactory;
this.changeDataFactory = changeDataFactory;
this.repoManager = repoManager;
this.executor = executor;
@@ -185,7 +185,7 @@
private SiteIndexer.Result indexAll(ChangeIndex index, List<ProjectSlice> projectSlices) {
Stopwatch sw = Stopwatch.createStarted();
MultiProgressMonitor mpm =
- new MultiProgressMonitor(experimentFeatures, progressOut, "Reindexing changes");
+ multiProgressMonitorFactory.create(progressOut, TaskKind.INDEXING, "Reindexing changes");
Task projTask = mpm.beginSubTask("project-slices", projectSlices.size());
checkState(totalWork >= 0);
Task doneTask = mpm.beginSubTask(null, totalWork);
diff --git a/java/com/google/gerrit/server/index/change/ChangeField.java b/java/com/google/gerrit/server/index/change/ChangeField.java
index 5caceef..8b9cf38 100644
--- a/java/com/google/gerrit/server/index/change/ChangeField.java
+++ b/java/com/google/gerrit/server/index/change/ChangeField.java
@@ -598,9 +598,9 @@
/** List of labels on the current patch set including change owner votes. */
public static final FieldDef<ChangeData, Iterable<String>> LABEL =
- exact("label2").buildRepeatable(cd -> getLabels(cd, true));
+ exact("label2").buildRepeatable(cd -> getLabels(cd));
- private static Iterable<String> getLabels(ChangeData cd, boolean owners) {
+ private static Iterable<String> getLabels(ChangeData cd) {
Set<String> allApprovals = new HashSet<>();
Set<String> distinctApprovals = new HashSet<>();
for (PatchSetApproval a : cd.currentApprovals()) {
@@ -608,7 +608,7 @@
allApprovals.add(formatLabel(a.label(), a.value(), a.accountId()));
Optional<LabelType> labelType = cd.getLabelTypes().byLabel(a.labelId());
allApprovals.addAll(getMaxMinAnyLabels(a.label(), a.value(), labelType, a.accountId()));
- if (owners && cd.change().getOwner().equals(a.accountId())) {
+ if (cd.change().getOwner().equals(a.accountId())) {
allApprovals.add(formatLabel(a.label(), a.value(), ChangeQueryBuilder.OWNER_ACCOUNT_ID));
allApprovals.addAll(
getMaxMinAnyLabels(
diff --git a/java/com/google/gerrit/server/notedb/CommitRewriter.java b/java/com/google/gerrit/server/notedb/CommitRewriter.java
index 549bd0f..4170bd7 100644
--- a/java/com/google/gerrit/server/notedb/CommitRewriter.java
+++ b/java/com/google/gerrit/server/notedb/CommitRewriter.java
@@ -13,13 +13,13 @@
// limitations under the License.
package com.google.gerrit.server.notedb;
+import static com.google.common.base.MoreObjects.firstNonNull;
import static com.google.common.base.Preconditions.checkState;
import static com.google.gerrit.server.notedb.ChangeNoteUtil.FOOTER_ASSIGNEE;
import static com.google.gerrit.server.notedb.ChangeNoteUtil.FOOTER_ATTENTION;
import static com.google.gerrit.server.notedb.ChangeNoteUtil.FOOTER_LABEL;
import static com.google.gerrit.server.notedb.ChangeNoteUtil.FOOTER_REAL_USER;
import static com.google.gerrit.server.notedb.ChangeNoteUtil.FOOTER_SUBMITTED_WITH;
-import static com.google.gerrit.server.notedb.ChangeNoteUtil.FOOTER_TAG;
import static com.google.gerrit.server.util.AccountTemplateUtil.ACCOUNT_TEMPLATE_PATTERN;
import static com.google.gerrit.server.util.AccountTemplateUtil.ACCOUNT_TEMPLATE_REGEX;
@@ -38,7 +38,6 @@
import com.google.gerrit.entities.SubmitRecord;
import com.google.gerrit.git.RefUpdateUtil;
import com.google.gerrit.json.OutputFormat;
-import com.google.gerrit.server.ChangeMessagesUtil;
import com.google.gerrit.server.account.AccountCache;
import com.google.gerrit.server.account.AccountState;
import com.google.gerrit.server.account.externalids.ExternalId;
@@ -156,7 +155,7 @@
Pattern.compile("Assignee changed from: (.*) to: (.*)");
private static final Pattern REMOVED_REVIEWER_PATTERN =
- Pattern.compile("Removed (cc|reviewer) (.*) .*");
+ Pattern.compile("Removed (cc|reviewer) (.*)(\\.| with the following votes)");
private static final Pattern REMOVED_VOTE_PATTERN = Pattern.compile("Removed (.*) by (.*)");
@@ -168,10 +167,12 @@
private static final Pattern ON_CODE_OWNER_ADD_REVIEWER_PATTERN =
Pattern.compile("(.*) who was added as reviewer owns the following files");
- private static final Pattern ON_CODE_OWNER_APPROVAL_PATTERN =
- Pattern.compile("code-owner approved by (.*):");
- private static final Pattern ON_CODE_OWNER_OVERRIDE_PATTERN =
- Pattern.compile("code-owners submit requirement .* overridden by (.*):");
+ private static final String ON_CODE_OWNER_APPROVAL_REGEX = "code-owner approved by (.*):";
+ private static final String ON_CODE_OWNER_OVERRIDE_REGEX =
+ "code-owners submit requirement .* overridden by (.*)";
+
+ private static final Pattern ON_CODE_OWNER_REVIEW_PATTERN =
+ Pattern.compile(ON_CODE_OWNER_APPROVAL_REGEX + "|" + ON_CODE_OWNER_OVERRIDE_REGEX);
private static final Pattern REPLY_BY_REASON_PATTERN =
Pattern.compile("(.*) replied on the change");
@@ -179,6 +180,8 @@
Pattern.compile("Added by (.*) using the hovercard menu");
private static final Pattern REMOVED_BY_REASON_PATTERN =
Pattern.compile("Removed by (.*) using the hovercard menu");
+ private static final Pattern REMOVED_BY_ICON_CLICK_REASON_PATTERN =
+ Pattern.compile("Removed by (.*) by clicking the attention icon");
private static final FluentLogger logger = FluentLogger.forEnclosingClass();
@@ -378,8 +381,23 @@
? fixedCommitMessage.get()
: originalCommit.getFullMessage();
if (options.verifyCommits) {
- changeFixProgress.isValidAfterFix &=
- verifyCommit(commitMessage, fixedAuthorIdent, accountsInChange);
+ boolean isCommitValid = verifyCommit(commitMessage, fixedAuthorIdent, accountsInChange);
+ changeFixProgress.isValidAfterFix &= isCommitValid;
+ if (!isCommitValid) {
+ StringBuilder detailedVerificationStatus =
+ new StringBuilder(
+ String.format(
+ "Commit %s of ref %s failed verification after fix",
+ originalCommit.getId(), ref));
+ detailedVerificationStatus.append("\nCommit body:\n");
+ detailedVerificationStatus.append(commitMessage);
+ if (fixedCommitMessage.isPresent()) {
+ detailedVerificationStatus.append("\n was fixed.\n");
+ }
+ detailedVerificationStatus.append("Commit author:\n");
+ detailedVerificationStatus.append(fixedAuthorIdent.toString());
+ logger.atWarning().log(detailedVerificationStatus.toString());
+ }
}
boolean needsFix =
!fixedAuthorIdent.equals(originalCommit.getAuthorIdent())
@@ -520,7 +538,8 @@
return Optional.empty();
}
Matcher matcher = REMOVED_REVIEWER_PATTERN.matcher(originalChangeMessage);
- if (matcher.matches() && !ACCOUNT_TEMPLATE_PATTERN.matcher(matcher.group(2)).matches()) {
+
+ if (matcher.find() && !ACCOUNT_TEMPLATE_PATTERN.matcher(matcher.group(2)).matches()) {
// Since we do not use change messages for reviewer updates on UI, it does not matter what we
// rewrite it to.
return Optional.of(originalChangeMessage.substring(0, matcher.end(1)));
@@ -640,30 +659,20 @@
return Optional.empty();
}
- Matcher onCodeOwnerApprovalMatcher = ON_CODE_OWNER_APPROVAL_PATTERN.matcher(originalMessage);
- if (onCodeOwnerApprovalMatcher.find()
- && !ACCOUNT_TEMPLATE_PATTERN.matcher(onCodeOwnerApprovalMatcher.group(1)).matches()) {
- return Optional.of(
- originalMessage.replace(
- "approved by " + onCodeOwnerApprovalMatcher.group(1),
- "approved by "
- + reviewer
- .map(AccountTemplateUtil::getAccountTemplate)
- .orElse(DEFAULT_ACCOUNT_REPLACEMENT))
- + "\n");
- }
-
- Matcher onCodeOwnerOverrideMatcher = ON_CODE_OWNER_OVERRIDE_PATTERN.matcher(originalMessage);
- if (onCodeOwnerOverrideMatcher.find()
- && !ACCOUNT_TEMPLATE_PATTERN.matcher(onCodeOwnerOverrideMatcher.group(1)).matches()) {
- return Optional.of(
- originalMessage.replace(
- "overridden by " + onCodeOwnerOverrideMatcher.group(1),
- "overridden by "
- + reviewer
- .map(AccountTemplateUtil::getAccountTemplate)
- .orElse(DEFAULT_ACCOUNT_REPLACEMENT))
- + "\n");
+ Matcher onCodeOwnerReviewMatcher = ON_CODE_OWNER_REVIEW_PATTERN.matcher(originalMessage);
+ while (onCodeOwnerReviewMatcher.find()) {
+ String accountName =
+ firstNonNull(onCodeOwnerReviewMatcher.group(1), onCodeOwnerReviewMatcher.group(2));
+ if (!ACCOUNT_TEMPLATE_PATTERN.matcher(accountName).matches()) {
+ return Optional.of(
+ originalMessage.replace(
+ "by " + accountName,
+ "by "
+ + reviewer
+ .map(AccountTemplateUtil::getAccountTemplate)
+ .orElse(DEFAULT_ACCOUNT_REPLACEMENT))
+ + "\n");
+ }
}
return Optional.empty();
@@ -694,6 +703,14 @@
return Optional.of("Removed by someone using the hovercard menu");
}
+
+ Matcher removedByIconClickReasonMatcher =
+ REMOVED_BY_ICON_CLICK_REASON_PATTERN.matcher(originalReason);
+ if (removedByIconClickReasonMatcher.matches()
+ && !OK_ACCOUNT_NAME_PATTERN.matcher(removedByIconClickReasonMatcher.group(1)).matches()) {
+
+ return Optional.of("Removed by someone by clicking the attention icon");
+ }
return Optional.empty();
}
@@ -733,11 +750,7 @@
for (FooterLine fl : footerLines) {
String footerKey = fl.getKey();
String footerValue = fl.getValue();
- if (footerKey.equalsIgnoreCase(FOOTER_TAG.getName())) {
- if (footerValue.equals(ChangeMessagesUtil.TAG_MERGED) && !fixedChangeMessage.isPresent()) {
- fixedChangeMessage = fixSubmitChangeMessage(originalChangeMessage);
- }
- } else if (footerKey.equalsIgnoreCase(FOOTER_ASSIGNEE.getName())) {
+ if (footerKey.equalsIgnoreCase(FOOTER_ASSIGNEE.getName())) {
Account.Id oldAssignee = fixProgress.assigneeId;
FixIdentResult fixedAssignee = null;
if (footerValue.equals("")) {
@@ -838,6 +851,9 @@
}
if (!fixedChangeMessage.isPresent()) {
+ fixedChangeMessage = fixSubmitChangeMessage(originalChangeMessage);
+ }
+ if (!fixedChangeMessage.isPresent()) {
fixedChangeMessage = fixDeleteChangeMessageCommitMessage(originalChangeMessage);
}
if (!fixedChangeMessage.isPresent()) {
diff --git a/java/com/google/gerrit/server/patch/FilePathAdapter.java b/java/com/google/gerrit/server/patch/FilePathAdapter.java
index ccd1466..2c98f1a 100644
--- a/java/com/google/gerrit/server/patch/FilePathAdapter.java
+++ b/java/com/google/gerrit/server/patch/FilePathAdapter.java
@@ -35,11 +35,12 @@
case DELETED:
case ADDED:
case MODIFIED:
- case REWRITE:
return null;
case COPIED:
case RENAMED:
return oldName.get();
+ case REWRITE:
+ return oldName.isPresent() ? oldName.get() : null;
default:
throw new IllegalArgumentException("Unsupported type " + changeType);
}
diff --git a/java/com/google/gerrit/server/patch/IntraLineLoader.java b/java/com/google/gerrit/server/patch/IntraLineLoader.java
index 29f5c2c..d6afa88 100644
--- a/java/com/google/gerrit/server/patch/IntraLineLoader.java
+++ b/java/com/google/gerrit/server/patch/IntraLineLoader.java
@@ -15,7 +15,6 @@
package com.google.gerrit.server.patch;
-import com.google.common.base.Supplier;
import com.google.common.base.Throwables;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableSet;
@@ -28,6 +27,7 @@
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
+import java.util.Optional;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
@@ -35,6 +35,7 @@
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;
import java.util.regex.Pattern;
+import java.util.stream.Collectors;
import org.eclipse.jgit.diff.Edit;
import org.eclipse.jgit.diff.MyersDiff;
import org.eclipse.jgit.lib.Config;
@@ -273,39 +274,71 @@
* otherwise.
*/
private static boolean isValidTransformation(CharText lText, CharText rText, List<Edit> edits) {
- Supplier<String> applyDeleteAndReplaceEditsToLeft =
- () -> {
- StringBuilder reconstructed = toStringBuilder(lText);
- String right = toStringBuilder(rText).toString();
- // Process edits right to left to avoid re-computation of indices when characters are
- // removed.
- for (int i = edits.size() - 1; i >= 0; i--) {
- Edit edit = edits.get(i);
- if (edit.getType() == Edit.Type.REPLACE) {
- reconstructed.replace(
- edit.getBeginA(),
- edit.getEndA(),
- right.substring(edit.getBeginB(), edit.getEndB()));
- } else if (edit.getType() == Edit.Type.DELETE) {
- reconstructed.delete(edit.getBeginA(), edit.getEndA());
- }
- }
- return reconstructed.toString();
- };
- Supplier<StringBuilder> removeInsertEditsFromRight =
- () -> {
- StringBuilder reconstructed = toStringBuilder(rText);
- // Process edits right to left to avoid re-computation of indices when characters are
- // removed.
- for (int i = edits.size() - 1; i >= 0; i--) {
- Edit edit = edits.get(i);
- if (edit.getType() == Edit.Type.INSERT) {
- reconstructed.delete(edit.getBeginB(), edit.getEndB());
- }
- }
- return reconstructed;
- };
- return applyDeleteAndReplaceEditsToLeft.get().contentEquals(removeInsertEditsFromRight.get());
+ // Apply replace and delete edits to the left text
+ Optional<String> left =
+ applyEditsToString(
+ toStringBuilder(lText),
+ toStringBuilder(rText).toString(),
+ edits.stream()
+ .filter(e -> e.getType() == Edit.Type.REPLACE || e.getType() == Edit.Type.DELETE)
+ .collect(Collectors.toList()));
+ // Remove insert edits from the right text
+ Optional<String> right =
+ applyEditsToString(
+ toStringBuilder(rText),
+ null,
+ edits.stream()
+ .filter(e -> e.getType() == Edit.Type.INSERT)
+ .collect(Collectors.toList()));
+
+ return left.isPresent() && right.isPresent() && left.get().contentEquals(right.get());
+ }
+
+ /**
+ * Apply edits to the {@code target} string. Replace edits are applied to target and replaced with
+ * a substring from {@code from}. Delete edits are applied to target. Insert edits are removed
+ * from target.
+ *
+ * @return Optional containing the transformed string, or empty if the transformation fails (due
+ * to index out of bounds).
+ */
+ private static Optional<String> applyEditsToString(
+ StringBuilder target, String from, List<Edit> edits) {
+ // Process edits right to left to avoid re-computation of indices when characters are removed.
+ try {
+ for (int i = edits.size() - 1; i >= 0; i--) {
+ Edit edit = edits.get(i);
+ if (edit.getType() == Edit.Type.REPLACE) {
+ boundaryCheck(target, edit.getBeginA(), edit.getEndA() - 1);
+ boundaryCheck(from, edit.getBeginB(), edit.getEndB() - 1);
+ target.replace(
+ edit.getBeginA(), edit.getEndA(), from.substring(edit.getBeginB(), edit.getEndB()));
+ } else if (edit.getType() == Edit.Type.DELETE) {
+ boundaryCheck(target, edit.getBeginA(), edit.getEndA() - 1);
+ target.delete(edit.getBeginA(), edit.getEndA());
+ } else if (edit.getType() == Edit.Type.INSERT) {
+ boundaryCheck(target, edit.getBeginB(), edit.getEndB() - 1);
+ target.delete(edit.getBeginB(), edit.getEndB());
+ }
+ }
+ return Optional.of(target.toString());
+ } catch (StringIndexOutOfBoundsException unused) {
+ return Optional.empty();
+ }
+ }
+
+ private static void boundaryCheck(StringBuilder s, int i1, int i2) {
+ if (i1 >= 0 && i2 >= 0 && i1 < s.length() && i2 < s.length()) {
+ return;
+ }
+ throw new StringIndexOutOfBoundsException();
+ }
+
+ private static void boundaryCheck(String s, int i1, int i2) {
+ if (i1 >= 0 && i2 >= 0 && i1 < s.length() && i2 < s.length()) {
+ return;
+ }
+ throw new StringIndexOutOfBoundsException();
}
private static StringBuilder toStringBuilder(CharText text) {
diff --git a/java/com/google/gerrit/server/patch/PatchScriptBuilder.java b/java/com/google/gerrit/server/patch/PatchScriptBuilder.java
index 5998bba..0b08c4f 100644
--- a/java/com/google/gerrit/server/patch/PatchScriptBuilder.java
+++ b/java/com/google/gerrit/server/patch/PatchScriptBuilder.java
@@ -235,10 +235,10 @@
return null;
case DELETED:
case MODIFIED:
- case REWRITE:
return entry.getNewName();
case COPIED:
case RENAMED:
+ case REWRITE:
default:
return entry.getOldName();
}
diff --git a/java/com/google/gerrit/server/patch/SubmitWithStickyApprovalDiff.java b/java/com/google/gerrit/server/patch/SubmitWithStickyApprovalDiff.java
index 62387ee..572d73d 100644
--- a/java/com/google/gerrit/server/patch/SubmitWithStickyApprovalDiff.java
+++ b/java/com/google/gerrit/server/patch/SubmitWithStickyApprovalDiff.java
@@ -16,6 +16,7 @@
import static com.google.gerrit.server.project.ProjectCache.illegalState;
+import com.google.gerrit.common.Nullable;
import com.google.gerrit.common.data.PatchScript;
import com.google.gerrit.entities.LabelId;
import com.google.gerrit.entities.LabelType;
@@ -51,7 +52,6 @@
import org.eclipse.jgit.diff.DiffFormatter;
import org.eclipse.jgit.internal.JGitText;
import org.eclipse.jgit.lib.Config;
-import org.eclipse.jgit.lib.ObjectId;
import org.eclipse.jgit.lib.Repository;
import org.eclipse.jgit.util.RawParseUtils;
import org.eclipse.jgit.util.TemporaryBuffer;
@@ -128,11 +128,39 @@
}
diff.append("The change was submitted with unreviewed changes in the following files:\n\n");
-
- for (FileDiffOutput fileDiff : modifiedFilesList) {
- diff.append(
- getDiffForFile(
- notes, currentPatchset.id(), latestApprovedPatchsetId, fileDiff, currentUser));
+ TemporaryBuffer.Heap buffer =
+ new TemporaryBuffer.Heap(Math.min(HEAP_EST_SIZE, maxCumulativeSize), maxCumulativeSize);
+ try (Repository repository = repositoryManager.openRepository(notes.getProjectName());
+ DiffFormatter formatter = new DiffFormatter(buffer)) {
+ formatter.setRepository(repository);
+ formatter.setDetectRenames(true);
+ boolean isDiffTooLarge = false;
+ List<String> formatterResult = null;
+ try {
+ formatter.format(
+ modifiedFilesList.get(0).oldCommitId(), modifiedFilesList.get(0).newCommitId());
+ // This returns the diff for all the files.
+ formatterResult =
+ Arrays.stream(RawParseUtils.decode(buffer.toByteArray()).split("\n"))
+ .collect(Collectors.toList());
+ } catch (IOException e) {
+ if (JGitText.get().inMemoryBufferLimitExceeded.equals(e.getMessage())) {
+ isDiffTooLarge = true;
+ } else {
+ throw e;
+ }
+ }
+ for (FileDiffOutput fileDiff : modifiedFilesList) {
+ diff.append(
+ getDiffForFile(
+ notes,
+ currentPatchset.id(),
+ latestApprovedPatchsetId,
+ fileDiff,
+ currentUser,
+ formatterResult,
+ isDiffTooLarge));
+ }
}
return diff.toString();
}
@@ -142,7 +170,9 @@
PatchSet.Id currentPatchsetId,
PatchSet.Id latestApprovedPatchsetId,
FileDiffOutput fileDiffOutput,
- CurrentUser currentUser)
+ CurrentUser currentUser,
+ @Nullable List<String> formatterResult,
+ boolean isDiffTooLarge)
throws AuthException, InvalidChangeOperationException, IOException,
PermissionBackendException {
StringBuilder diff =
@@ -167,6 +197,7 @@
currentUser);
PatchScript patchScript = null;
try {
+ // TODO(paiking): we can get rid of this call to optimize by checking the diff for renames.
patchScript = patchScriptFactory.call();
} catch (LargeObjectException exception) {
diff.append("The file content is too large for showing the full diff. \n\n");
@@ -178,7 +209,15 @@
"The file %s was renamed to %s\n",
fileDiffOutput.oldPath().get(), fileDiffOutput.newPath().get()));
}
- diff.append(getUnifiedDiff(patchScript, notes));
+ if (isDiffTooLarge) {
+ diff.append("The diff is too large to show. Please review the diff.");
+ diff.append("\n```\n");
+ return diff.toString();
+ }
+ // This filters only the file we need.
+ // TODO(paiking): we can make this more efficient by mapping the files to their respective
+ // diffs prior to this method, such that we need to go over the diff only once.
+ diff.append(getDiffForFile(patchScript, formatterResult));
// This line (and the ``` above) are useful for formatting in the web UI.
diff.append("\n```\n");
return diff.toString();
@@ -188,63 +227,42 @@
* Show patch set as unified difference for a specific file. We on purpose are not using {@link
* DiffInfoCreator} since we'd like to get the original git/JGit style diff.
*/
- public String getUnifiedDiff(PatchScript patchScript, ChangeNotes changeNotes)
- throws IOException {
- TemporaryBuffer.Heap buf =
- new TemporaryBuffer.Heap(Math.min(HEAP_EST_SIZE, maxCumulativeSize), maxCumulativeSize);
- try (DiffFormatter fmt = new DiffFormatter(buf);
- // TODO(paiking): ensure we open the repository only once by opening it in the calling
- // method.
- Repository git = repositoryManager.openRepository(changeNotes.getProjectName())) {
- fmt.setRepository(git);
- fmt.setDetectRenames(true);
- fmt.format(
- ObjectId.fromString(patchScript.getFileInfoA().commitId),
- ObjectId.fromString(patchScript.getFileInfoB().commitId));
- List<String> formatterResult =
- Arrays.stream(RawParseUtils.decode(buf.toByteArray()).split("\n"))
- .collect(Collectors.toList());
- // only return information about the current file, and not about files that are not
- // relevant. DiffFormatter returns other potential files because of rebases, which we can
- // ignore.
- List<String> modifiedFormatterResult = new ArrayList<>();
- int indexOfFormatterResult = 0;
- while (formatterResult.size() > indexOfFormatterResult
- && !formatterResult
- .get(indexOfFormatterResult)
- .equals(
- String.format(
- "diff --git a/%s b/%s",
- patchScript.getOldName() != null
- ? patchScript.getOldName()
- : patchScript.getNewName(),
- patchScript.getNewName()))) {
- indexOfFormatterResult++;
- }
- // remove non user friendly information.
- while (formatterResult.size() > indexOfFormatterResult
- && !formatterResult.get(indexOfFormatterResult).startsWith("@@")) {
- indexOfFormatterResult++;
- }
- for (; indexOfFormatterResult < formatterResult.size(); indexOfFormatterResult++) {
- if (formatterResult.get(indexOfFormatterResult).startsWith("diff --git")) {
- break;
- }
- modifiedFormatterResult.add(formatterResult.get(indexOfFormatterResult));
- }
- if (modifiedFormatterResult.size() == 0) {
- // This happens for diffs that are just renames, but we already account for renames.
- return "";
- }
- return modifiedFormatterResult.stream()
- .filter(s -> !s.equals("\\ No newline at end of file"))
- .collect(Collectors.joining("\n"));
- } catch (IOException e) {
- if (JGitText.get().inMemoryBufferLimitExceeded.equals(e.getMessage())) {
- return "The diff is too large to show. Please review the diff.";
- }
- throw e;
+ public String getDiffForFile(PatchScript patchScript, List<String> formatterResult) {
+ // only return information about the current file, and not about files that are not
+ // relevant. DiffFormatter returns other potential files because of rebases, which we can
+ // ignore.
+ List<String> modifiedFormatterResult = new ArrayList<>();
+ int indexOfFormatterResult = 0;
+ while (formatterResult.size() > indexOfFormatterResult
+ && !formatterResult
+ .get(indexOfFormatterResult)
+ .equals(
+ String.format(
+ "diff --git a/%s b/%s",
+ patchScript.getOldName() != null
+ ? patchScript.getOldName()
+ : patchScript.getNewName(),
+ patchScript.getNewName()))) {
+ indexOfFormatterResult++;
}
+ // remove non user friendly information.
+ while (formatterResult.size() > indexOfFormatterResult
+ && !formatterResult.get(indexOfFormatterResult).startsWith("@@")) {
+ indexOfFormatterResult++;
+ }
+ for (; indexOfFormatterResult < formatterResult.size(); indexOfFormatterResult++) {
+ if (formatterResult.get(indexOfFormatterResult).startsWith("diff --git")) {
+ break;
+ }
+ modifiedFormatterResult.add(formatterResult.get(indexOfFormatterResult));
+ }
+ if (modifiedFormatterResult.size() == 0) {
+ // This happens for diffs that are just renames, but we already account for renames.
+ return "";
+ }
+ return modifiedFormatterResult.stream()
+ .filter(s -> !s.equals("\\ No newline at end of file"))
+ .collect(Collectors.joining("\n"));
}
private DiffPreferencesInfo createDefaultDiffPreferencesInfo() {
diff --git a/java/com/google/gerrit/server/patch/diff/ModifiedFilesCacheImpl.java b/java/com/google/gerrit/server/patch/diff/ModifiedFilesCacheImpl.java
index e4fd728..460c2e2 100644
--- a/java/com/google/gerrit/server/patch/diff/ModifiedFilesCacheImpl.java
+++ b/java/com/google/gerrit/server/patch/diff/ModifiedFilesCacheImpl.java
@@ -86,7 +86,7 @@
.valueSerializer(GitModifiedFilesCacheImpl.ValueSerializer.INSTANCE)
.maximumWeight(10 << 20)
.weigher(ModifiedFilesWeigher.class)
- .version(2)
+ .version(3)
.loader(ModifiedFilesLoader.class);
}
};
@@ -208,27 +208,22 @@
}
/**
- * Return the {@code modifiedFiles} input list while merging {@link ChangeType#ADDED} and {@link
- * ChangeType#DELETED} entries for the same file into a single {@link ChangeType#REWRITE} entry.
+ * Return the {@code modifiedFiles} input list while merging rewritten entries.
*
- * <p>Background: In some cases, JGit returns two diff entries (ADDED + DELETED) for the same
- * file path. This happens e.g. when a file's mode is changed between patchsets, for example
- * converting a symlink file to a regular file. We identify this case and return a single
- * modified file with changeType = {@link ChangeType#REWRITE}.
+ * <p>Background: In some cases, JGit returns two diff entries (ADDED/DELETED, RENAMED/DELETED,
+ * etc...) for the same file path. This happens e.g. when a file's mode is changed between
+ * patchsets, for example converting a symlink file to a regular file. We identify this case and
+ * return a single modified file with changeType = {@link ChangeType#REWRITE}.
*/
private static List<ModifiedFile> mergeRewrittenEntries(List<ModifiedFile> modifiedFiles) {
List<ModifiedFile> result = new ArrayList<>();
-
- // Handle ADDED and DELETED entries separately.
ListMultimap<String, ModifiedFile> byPath = ArrayListMultimap.create();
modifiedFiles.stream()
- .filter(ModifiedFilesLoader::isAddedOrDeleted)
.forEach(
f -> {
- if (f.oldPath().isPresent()) {
+ if (f.changeType() == ChangeType.DELETED) {
byPath.get(f.oldPath().get()).add(f);
- }
- if (f.newPath().isPresent()) {
+ } else {
byPath.get(f.newPath().get()).add(f);
}
});
@@ -236,31 +231,12 @@
List<ModifiedFile> entries = byPath.get(path);
if (entries.size() == 1) {
result.add(entries.get(0));
- } else if (entries.size() == 2) {
- result.add(getAddedEntry(entries).toBuilder().changeType(ChangeType.REWRITE).build());
} else {
- // JGit error. Not expected to happen.
- logger.atWarning().log(
- "Found %d ADDED and DELETED entries for the same file path: %s."
- + " Adding the first entry only to the result.",
- entries.size(), entries);
- result.add(entries.get(0));
+ // More than one. Return a single REWRITE entry.
+ result.add(entries.get(0).toBuilder().changeType(ChangeType.REWRITE).build());
}
}
-
- // Add the remaining non ADDED/DELETED entries to the result
- modifiedFiles.stream().filter(f -> !isAddedOrDeleted(f)).forEach(result::add);
return result;
}
-
- private static boolean isAddedOrDeleted(ModifiedFile f) {
- return f.changeType() == ChangeType.ADDED || f.changeType() == ChangeType.DELETED;
- }
-
- private static ModifiedFile getAddedEntry(List<ModifiedFile> modifiedFiles) {
- return modifiedFiles.get(0).changeType() == ChangeType.ADDED
- ? modifiedFiles.get(0)
- : modifiedFiles.get(1);
- }
}
}
diff --git a/java/com/google/gerrit/server/patch/gitfilediff/GitFileDiffCacheImpl.java b/java/com/google/gerrit/server/patch/gitfilediff/GitFileDiffCacheImpl.java
index 77b8938..be2709f 100644
--- a/java/com/google/gerrit/server/patch/gitfilediff/GitFileDiffCacheImpl.java
+++ b/java/com/google/gerrit/server/patch/gitfilediff/GitFileDiffCacheImpl.java
@@ -47,6 +47,7 @@
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collection;
+import java.util.Comparator;
import java.util.List;
import java.util.Map;
import java.util.Set;
@@ -110,9 +111,6 @@
private final LoadingCache<GitFileDiffCacheKey, GitFileDiff> cache;
- private static final ImmutableSet<Patch.ChangeType> ADDED_AND_DELETED =
- ImmutableSet.of(Patch.ChangeType.ADDED, Patch.ChangeType.DELETED);
-
@Inject
public GitFileDiffCacheImpl(
@Named(GIT_DIFF) LoadingCache<GitFileDiffCacheKey, GitFileDiff> cache) {
@@ -361,8 +359,7 @@
/**
* Create a single {@link GitFileDiff} with {@link Patch.ChangeType} equals {@link
- * Patch.ChangeType#REWRITE}, assuming the input list contains two entries with types {@link
- * Patch.ChangeType#ADDED} and {@link Patch.ChangeType#DELETED}.
+ * Patch.ChangeType#REWRITE}, assuming the input list contains two entries.
*
* @param gitDiffs input list of exactly two {@link GitFileDiff} for same file path.
* @return a single {@link GitFileDiff} with change type equals {@link Patch.ChangeType#REWRITE}.
@@ -377,19 +374,9 @@
"JGit error: found %d dff entries for same file path %s",
gitDiffs.size(), gitDiffs.get(0).getDefaultPath()));
}
- if (!ImmutableSet.of(gitDiffs.get(0).changeType(), gitDiffs.get(1).changeType())
- .equals(ADDED_AND_DELETED)) {
- // This is an illegal state. JGit is not supposed to return this, so we throw an exception.
- throw new DiffNotAvailableException(
- String.format(
- "JGit error: unexpected change types %s and %s for same file path %s",
- gitDiffs.get(0).changeType(),
- gitDiffs.get(1).changeType(),
- gitDiffs.get(0).getDefaultPath()));
- }
- GitFileDiff addedEntry =
- gitDiffs.get(0).changeType() == Patch.ChangeType.ADDED ? gitDiffs.get(0) : gitDiffs.get(1);
- return addedEntry.toBuilder().changeType(Patch.ChangeType.REWRITE).build();
+ // Convert the first entry (prioritized according to change type enum order) to REWRITE
+ gitDiffs.sort(Comparator.comparingInt(o -> o.changeType().ordinal()));
+ return gitDiffs.get(0).toBuilder().changeType(Patch.ChangeType.REWRITE).build();
}
/** An entity representing the options affecting the diff computation. */
diff --git a/java/com/google/gerrit/server/project/ProjectCacheImpl.java b/java/com/google/gerrit/server/project/ProjectCacheImpl.java
index e69967c..2874a34 100644
--- a/java/com/google/gerrit/server/project/ProjectCacheImpl.java
+++ b/java/com/google/gerrit/server/project/ProjectCacheImpl.java
@@ -51,9 +51,9 @@
import com.google.gerrit.server.cache.serialize.ObjectIdConverter;
import com.google.gerrit.server.cache.serialize.ProtobufSerializer;
import com.google.gerrit.server.cache.serialize.entities.CachedProjectConfigSerializer;
+import com.google.gerrit.server.config.AllProjectsConfigProvider;
import com.google.gerrit.server.config.AllProjectsName;
import com.google.gerrit.server.config.AllUsersName;
-import com.google.gerrit.server.config.SitePaths;
import com.google.gerrit.server.git.GitRepositoryManager;
import com.google.gerrit.server.logging.Metadata;
import com.google.gerrit.server.logging.TraceContext;
@@ -78,8 +78,7 @@
import org.eclipse.jgit.lib.ObjectId;
import org.eclipse.jgit.lib.Ref;
import org.eclipse.jgit.lib.Repository;
-import org.eclipse.jgit.storage.file.FileBasedConfig;
-import org.eclipse.jgit.util.FS;
+import org.eclipse.jgit.lib.StoredConfig;
/**
* Cache of project information, including access rights.
@@ -304,27 +303,22 @@
/**
* Returns a {@code MurMur128} hash of the contents of {@code etc/All-Projects-project.config}.
*/
- public static byte[] allProjectsFileProjectConfigHash(
- AllProjectsName allProjectsName, SitePaths sitePaths) {
+ public static byte[] allProjectsFileProjectConfigHash(Optional<StoredConfig> allProjectsConfig) {
// Hash the contents of All-Projects-project.config
// This is a way for administrators to orchestrate project.config changes across many Gerrit
// instances.
// When this file changes, we need to make sure we disregard persistently cached project
// state.
- FileBasedConfig fileBasedConfig =
- new FileBasedConfig(
- sitePaths
- .etc_dir
- .resolve(allProjectsName.get())
- .resolve(ProjectConfig.PROJECT_CONFIG)
- .toFile(),
- FS.DETECTED);
+ if (!allProjectsConfig.isPresent()) {
+ // If the project.config file is not present, this is equal to an empty config file:
+ return Hashing.murmur3_128().hashString("", UTF_8).asBytes();
+ }
try {
- fileBasedConfig.load();
+ allProjectsConfig.get().load();
} catch (IOException | ConfigInvalidException e) {
throw new IllegalStateException(e);
}
- return Hashing.murmur3_128().hashString(fileBasedConfig.toText(), UTF_8).asBytes();
+ return Hashing.murmur3_128().hashString(allProjectsConfig.get().toText(), UTF_8).asBytes();
}
@Singleton
@@ -334,7 +328,7 @@
private final ListeningExecutorService cacheRefreshExecutor;
private final Counter2<String, Boolean> refreshCounter;
private final AllProjectsName allProjectsName;
- private final SitePaths sitePaths;
+ private final AllProjectsConfigProvider allProjectsConfigProvider;
@Inject
InMemoryLoader(
@@ -344,7 +338,7 @@
@CacheRefreshExecutor ListeningExecutorService cacheRefreshExecutor,
MetricMaker metricMaker,
AllProjectsName allProjectsName,
- SitePaths sitePaths) {
+ AllProjectsConfigProvider allProjectsConfigProvider) {
this.persistedCache = persistedCache;
this.repoManager = repoManager;
this.cacheRefreshExecutor = cacheRefreshExecutor;
@@ -355,7 +349,7 @@
Field.ofString("cache", Metadata.Builder::className).build(),
Field.ofBoolean("outdated", Metadata.Builder::outdated).build());
this.allProjectsName = allProjectsName;
- this.sitePaths = sitePaths;
+ this.allProjectsConfigProvider = allProjectsConfigProvider;
}
@Override
@@ -369,7 +363,8 @@
Cache.ProjectCacheKeyProto.newBuilder().setProject(key.get());
Ref configRef = git.exactRef(RefNames.REFS_CONFIG);
if (key.get().equals(allProjectsName.get())) {
- byte[] fileHash = allProjectsFileProjectConfigHash(allProjectsName, sitePaths);
+ Optional<StoredConfig> allProjectsConfig = allProjectsConfigProvider.get(allProjectsName);
+ byte[] fileHash = allProjectsFileProjectConfigHash(allProjectsConfig);
keyProto.setGlobalConfigRevision(ByteString.copyFrom(fileHash));
}
if (configRef != null) {
diff --git a/java/com/google/gerrit/server/project/ProjectConfig.java b/java/com/google/gerrit/server/project/ProjectConfig.java
index 0d710b9..a23bb39 100644
--- a/java/com/google/gerrit/server/project/ProjectConfig.java
+++ b/java/com/google/gerrit/server/project/ProjectConfig.java
@@ -64,10 +64,10 @@
import com.google.gerrit.extensions.client.InheritableBoolean;
import com.google.gerrit.extensions.client.ProjectState;
import com.google.gerrit.server.account.GroupBackend;
+import com.google.gerrit.server.config.AllProjectsConfigProvider;
import com.google.gerrit.server.config.AllProjectsName;
import com.google.gerrit.server.config.ConfigUtil;
import com.google.gerrit.server.config.PluginConfig;
-import com.google.gerrit.server.config.SitePaths;
import com.google.gerrit.server.git.ValidationError;
import com.google.gerrit.server.git.meta.MetaDataUpdate;
import com.google.gerrit.server.git.meta.VersionedMetaData;
@@ -98,8 +98,6 @@
import org.eclipse.jgit.lib.Repository;
import org.eclipse.jgit.lib.StoredConfig;
import org.eclipse.jgit.revwalk.RevWalk;
-import org.eclipse.jgit.storage.file.FileBasedConfig;
-import org.eclipse.jgit.util.FS;
public class ProjectConfig extends VersionedMetaData implements ValidationError.Sink {
private static final FluentLogger logger = FluentLogger.forEnclosingClass();
@@ -203,28 +201,21 @@
// ProjectCache, so this would retain lots more memory.
@Singleton
public static class Factory {
- @Nullable
- public static StoredConfig getBaseConfig(
- SitePaths sitePaths, AllProjectsName allProjects, Project.NameKey projectName) {
- return projectName.equals(allProjects)
- // Delay loading till onLoad method.
- ? new FileBasedConfig(
- sitePaths.etc_dir.resolve(allProjects.get()).resolve(PROJECT_CONFIG).toFile(),
- FS.DETECTED)
- : null;
- }
-
- private final SitePaths sitePaths;
- private final AllProjectsName allProjects;
+ private final AllProjectsName allProjectsName;
+ private final AllProjectsConfigProvider allProjectsConfigProvider;
@Inject
- Factory(SitePaths sitePaths, AllProjectsName allProjects) {
- this.sitePaths = sitePaths;
- this.allProjects = allProjects;
+ Factory(AllProjectsName allProjectsName, AllProjectsConfigProvider allProjectsConfigProvider) {
+ this.allProjectsName = allProjectsName;
+ this.allProjectsConfigProvider = allProjectsConfigProvider;
}
public ProjectConfig create(Project.NameKey projectName) {
- return new ProjectConfig(projectName, getBaseConfig(sitePaths, allProjects, projectName));
+ return new ProjectConfig(
+ projectName,
+ projectName.equals(allProjectsName)
+ ? allProjectsConfigProvider.get(allProjectsName)
+ : Optional.empty());
}
public ProjectConfig read(MetaDataUpdate update) throws IOException, ConfigInvalidException {
@@ -249,7 +240,7 @@
}
}
- private final StoredConfig baseConfig;
+ private final Optional<StoredConfig> baseConfig;
private Project project;
private AccountsSection accountsSection;
@@ -355,7 +346,7 @@
requireNonNull(commentLinkSections.remove(name));
}
- private ProjectConfig(Project.NameKey projectName, @Nullable StoredConfig baseConfig) {
+ private ProjectConfig(Project.NameKey projectName, Optional<StoredConfig> baseConfig) {
this.projectName = projectName;
this.baseConfig = baseConfig;
}
@@ -636,8 +627,8 @@
@Override
protected void onLoad() throws IOException, ConfigInvalidException {
- if (baseConfig != null) {
- baseConfig.load();
+ if (baseConfig.isPresent()) {
+ baseConfig.get().load();
}
readGroupList();
diff --git a/java/com/google/gerrit/server/project/ProjectCreator.java b/java/com/google/gerrit/server/project/ProjectCreator.java
index c382f04..c38cdfa 100644
--- a/java/com/google/gerrit/server/project/ProjectCreator.java
+++ b/java/com/google/gerrit/server/project/ProjectCreator.java
@@ -30,6 +30,7 @@
import com.google.gerrit.entities.RefNames;
import com.google.gerrit.extensions.events.NewProjectCreatedListener;
import com.google.gerrit.extensions.restapi.BadRequestException;
+import com.google.gerrit.extensions.restapi.PreconditionFailedException;
import com.google.gerrit.extensions.restapi.ResourceConflictException;
import com.google.gerrit.git.LockFailureException;
import com.google.gerrit.server.GerritPersonIdent;
@@ -39,7 +40,8 @@
import com.google.gerrit.server.extensions.events.AbstractNoNotifyEvent;
import com.google.gerrit.server.extensions.events.GitReferenceUpdated;
import com.google.gerrit.server.git.GitRepositoryManager;
-import com.google.gerrit.server.git.RepositoryCaseMismatchException;
+import com.google.gerrit.server.git.GitRepositoryManager.Status;
+import com.google.gerrit.server.git.RepositoryExistsException;
import com.google.gerrit.server.git.meta.MetaDataUpdate;
import com.google.gerrit.server.plugincontext.PluginSetContext;
import com.google.inject.Inject;
@@ -103,16 +105,14 @@
}
public ProjectState createProject(CreateProjectArgs args)
- throws BadRequestException, ResourceConflictException, IOException, ConfigInvalidException {
+ throws BadRequestException, ResourceConflictException, IOException, ConfigInvalidException,
+ PreconditionFailedException {
final Project.NameKey nameKey = args.getProject();
try {
final String head = args.permissionsOnly ? RefNames.REFS_CONFIG : args.branch.get(0);
- try (Repository repo = repoManager.openRepository(nameKey)) {
- if (repo.getObjectDatabase().exists()) {
- throw new ResourceConflictException("project \"" + nameKey + "\" exists");
- }
- } catch (RepositoryNotFoundException e) {
- // It does not exist, safe to ignore.
+ Status status = repoManager.getRepositoryStatus(nameKey);
+ if (!status.equals(Status.NON_EXISTENT)) {
+ throw new RepositoryExistsException(nameKey, "Repository status: " + status);
}
try (Repository repo = repoManager.createRepository(nameKey)) {
RefUpdate u = repo.updateRef(Constants.HEAD);
@@ -129,13 +129,11 @@
return projectCache.get(nameKey).orElseThrow(illegalState(nameKey));
}
- } catch (RepositoryCaseMismatchException e) {
+ } catch (RepositoryExistsException e) {
throw new ResourceConflictException(
"Cannot create "
+ nameKey.get()
- + " because the name is already occupied by another project."
- + " The other project has the same name, only spelled in a"
- + " different case.",
+ + " because the name is already occupied by another project.",
e);
} catch (RepositoryNotFoundException badName) {
throw new BadRequestException("invalid project name: " + nameKey, badName);
diff --git a/java/com/google/gerrit/server/query/change/ChangeQueryBuilder.java b/java/com/google/gerrit/server/query/change/ChangeQueryBuilder.java
index e244d6c..94bf601 100644
--- a/java/com/google/gerrit/server/query/change/ChangeQueryBuilder.java
+++ b/java/com/google/gerrit/server/query/change/ChangeQueryBuilder.java
@@ -176,7 +176,6 @@
public static final String FIELD_OWNERIN = "ownerin";
public static final String FIELD_PARENTOF = "parentof";
public static final String FIELD_PARENTPROJECT = "parentproject";
- public static final String FIELD_PATH = "path";
public static final String FIELD_PENDING_REVIEWER = "pendingreviewer";
public static final String FIELD_PENDING_REVIEWER_BY_EMAIL = "pendingreviewerbyemail";
public static final String FIELD_PRIVATE = "private";
@@ -184,11 +183,9 @@
public static final String FIELD_PROJECTS = "projects";
public static final String FIELD_REF = "ref";
public static final String FIELD_REVIEWEDBY = "reviewedby";
- public static final String FIELD_REVIEWER = "reviewer";
public static final String FIELD_REVIEWERIN = "reviewerin";
public static final String FIELD_STAR = "star";
public static final String FIELD_STARBY = "starby";
- public static final String FIELD_STARREDBY = "starredby";
public static final String FIELD_STARTED = "started";
public static final String FIELD_STATUS = "status";
public static final String FIELD_SUBMISSIONID = "submissionid";
@@ -198,7 +195,6 @@
public static final String FIELD_WATCHEDBY = "watchedby";
public static final String FIELD_WIP = "wip";
public static final String FIELD_REVERTOF = "revertof";
- public static final String FIELD_CHERRY_PICK_OF = "cherrypickof";
public static final String FIELD_CHERRY_PICK_OF_CHANGE = "cherrypickofchange";
public static final String FIELD_CHERRY_PICK_OF_PATCHSET = "cherrypickofpatchset";
diff --git a/java/com/google/gerrit/server/restapi/project/IndexChanges.java b/java/com/google/gerrit/server/restapi/project/IndexChanges.java
index 73a064c..6ad0005 100644
--- a/java/com/google/gerrit/server/restapi/project/IndexChanges.java
+++ b/java/com/google/gerrit/server/restapi/project/IndexChanges.java
@@ -24,9 +24,9 @@
import com.google.gerrit.extensions.common.Input;
import com.google.gerrit.extensions.restapi.Response;
import com.google.gerrit.extensions.restapi.RestModifyView;
-import com.google.gerrit.server.experiments.ExperimentFeatures;
import com.google.gerrit.server.git.MultiProgressMonitor;
import com.google.gerrit.server.git.MultiProgressMonitor.Task;
+import com.google.gerrit.server.git.MultiProgressMonitor.TaskKind;
import com.google.gerrit.server.index.IndexExecutor;
import com.google.gerrit.server.index.change.AllChangesIndexer;
import com.google.gerrit.server.index.change.ChangeIndexer;
@@ -41,18 +41,18 @@
@Singleton
public class IndexChanges implements RestModifyView<ProjectResource, Input> {
- private final ExperimentFeatures experimentFeatures;
+ private final MultiProgressMonitor.Factory multiProgressMonitorFactory;
private final Provider<AllChangesIndexer> allChangesIndexerProvider;
private final ChangeIndexer indexer;
private final ListeningExecutorService executor;
@Inject
IndexChanges(
- ExperimentFeatures experimentFeatures,
+ MultiProgressMonitor.Factory multiProgressMonitorFactory,
Provider<AllChangesIndexer> allChangesIndexerProvider,
ChangeIndexer indexer,
@IndexExecutor(BATCH) ListeningExecutorService executor) {
- this.experimentFeatures = experimentFeatures;
+ this.multiProgressMonitorFactory = multiProgressMonitorFactory;
this.allChangesIndexerProvider = allChangesIndexerProvider;
this.indexer = indexer;
this.executor = executor;
@@ -62,8 +62,8 @@
public Response.Accepted apply(ProjectResource resource, Input input) {
Project.NameKey project = resource.getNameKey();
Task mpt =
- new MultiProgressMonitor(
- experimentFeatures, ByteStreams.nullOutputStream(), "Reindexing project")
+ multiProgressMonitorFactory
+ .create(ByteStreams.nullOutputStream(), TaskKind.INDEXING, "Reindexing project")
.beginSubTask("", MultiProgressMonitor.UNKNOWN);
AllChangesIndexer allChangesIndexer = allChangesIndexerProvider.get();
allChangesIndexer.setVerboseOut(NullOutputStream.INSTANCE);
diff --git a/java/com/google/gerrit/server/schema/ProjectConfigSchemaUpdate.java b/java/com/google/gerrit/server/schema/ProjectConfigSchemaUpdate.java
index 868e7ea..3bf9d02 100644
--- a/java/com/google/gerrit/server/schema/ProjectConfigSchemaUpdate.java
+++ b/java/com/google/gerrit/server/schema/ProjectConfigSchemaUpdate.java
@@ -18,12 +18,11 @@
import static java.util.stream.Collectors.toList;
import com.google.common.annotations.VisibleForTesting;
-import com.google.gerrit.common.Nullable;
import com.google.gerrit.entities.PermissionRule;
import com.google.gerrit.entities.RefNames;
import com.google.gerrit.exceptions.StorageException;
+import com.google.gerrit.server.config.AllProjectsConfigProvider;
import com.google.gerrit.server.config.AllProjectsName;
-import com.google.gerrit.server.config.SitePaths;
import com.google.gerrit.server.git.meta.MetaDataUpdate;
import com.google.gerrit.server.git.meta.VersionedMetaData;
import com.google.gerrit.server.project.ProjectConfig;
@@ -31,6 +30,7 @@
import java.io.IOException;
import java.util.Arrays;
import java.util.List;
+import java.util.Optional;
import java.util.Set;
import org.eclipse.jgit.errors.ConfigInvalidException;
import org.eclipse.jgit.lib.CommitBuilder;
@@ -40,32 +40,30 @@
public class ProjectConfigSchemaUpdate extends VersionedMetaData {
public static class Factory {
- private final SitePaths sitePaths;
private final AllProjectsName allProjectsName;
+ private final AllProjectsConfigProvider allProjectsConfigProvider;
@Inject
- Factory(SitePaths sitePaths, AllProjectsName allProjectsName) {
- this.sitePaths = sitePaths;
+ Factory(AllProjectsName allProjectsName, AllProjectsConfigProvider allProjectsConfigProvider) {
this.allProjectsName = allProjectsName;
+ this.allProjectsConfigProvider = allProjectsConfigProvider;
}
ProjectConfigSchemaUpdate read(MetaDataUpdate update)
throws IOException, ConfigInvalidException {
ProjectConfigSchemaUpdate r =
- new ProjectConfigSchemaUpdate(
- update,
- ProjectConfig.Factory.getBaseConfig(sitePaths, allProjectsName, allProjectsName));
+ new ProjectConfigSchemaUpdate(update, allProjectsConfigProvider.get(allProjectsName));
r.load(update);
return r;
}
}
private final MetaDataUpdate update;
- @Nullable private final StoredConfig baseConfig;
+ private final Optional<StoredConfig> baseConfig;
private Config config;
private boolean updated;
- private ProjectConfigSchemaUpdate(MetaDataUpdate update, @Nullable StoredConfig baseConfig) {
+ private ProjectConfigSchemaUpdate(MetaDataUpdate update, Optional<StoredConfig> baseConfig) {
this.update = update;
this.baseConfig = baseConfig;
}
@@ -77,8 +75,8 @@
@Override
protected void onLoad() throws IOException, ConfigInvalidException {
- if (baseConfig != null) {
- baseConfig.load();
+ if (baseConfig.isPresent()) {
+ baseConfig.get().load();
}
config = readConfig(ProjectConfig.PROJECT_CONFIG, baseConfig);
}
diff --git a/java/com/google/gerrit/testing/InMemoryModule.java b/java/com/google/gerrit/testing/InMemoryModule.java
index 12da2c1..3949de0 100644
--- a/java/com/google/gerrit/testing/InMemoryModule.java
+++ b/java/com/google/gerrit/testing/InMemoryModule.java
@@ -44,6 +44,7 @@
import com.google.gerrit.server.cache.h2.H2CacheModule;
import com.google.gerrit.server.cache.mem.DefaultMemoryCacheModule;
import com.google.gerrit.server.change.FileInfoJsonModule;
+import com.google.gerrit.server.config.AllProjectsConfigProvider;
import com.google.gerrit.server.config.AllProjectsName;
import com.google.gerrit.server.config.AllProjectsNameProvider;
import com.google.gerrit.server.config.AllUsersName;
@@ -54,6 +55,7 @@
import com.google.gerrit.server.config.CanonicalWebUrlModule;
import com.google.gerrit.server.config.CanonicalWebUrlProvider;
import com.google.gerrit.server.config.DefaultUrlFormatter;
+import com.google.gerrit.server.config.FileBasedAllProjectsConfigProvider;
import com.google.gerrit.server.config.FileBasedGlobalPluginConfigProvider;
import com.google.gerrit.server.config.GerritGlobalModule;
import com.google.gerrit.server.config.GerritInstanceIdModule;
@@ -196,6 +198,7 @@
bind(Path.class).annotatedWith(SitePath.class).toInstance(Paths.get("."));
bind(Config.class).annotatedWith(GerritServerConfig.class).toInstance(cfg);
bind(GerritOptions.class).toInstance(new GerritOptions(false, false));
+ bind(AllProjectsConfigProvider.class).to(FileBasedAllProjectsConfigProvider.class);
bind(GlobalPluginConfigProvider.class).to(FileBasedGlobalPluginConfigProvider.class);
bind(GitRepositoryManager.class).to(InMemoryRepositoryManager.class);
diff --git a/java/com/google/gerrit/testing/InMemoryRepositoryManager.java b/java/com/google/gerrit/testing/InMemoryRepositoryManager.java
index 09ae115..362e23c 100644
--- a/java/com/google/gerrit/testing/InMemoryRepositoryManager.java
+++ b/java/com/google/gerrit/testing/InMemoryRepositoryManager.java
@@ -17,6 +17,7 @@
import com.google.common.collect.ImmutableSortedSet;
import com.google.common.collect.Sets;
import com.google.gerrit.entities.Project;
+import com.google.gerrit.entities.Project.NameKey;
import com.google.gerrit.server.git.GitRepositoryManager;
import com.google.gerrit.server.git.RepositoryCaseMismatchException;
import com.google.inject.Inject;
@@ -79,6 +80,16 @@
}
@Override
+ public synchronized Status getRepositoryStatus(NameKey name) {
+ try {
+ get(name);
+ return Status.ACTIVE;
+ } catch (RepositoryNotFoundException e) {
+ return Status.NON_EXISTENT;
+ }
+ }
+
+ @Override
public synchronized Repo openRepository(Project.NameKey name) throws RepositoryNotFoundException {
return get(name);
}
diff --git a/javatests/com/google/gerrit/acceptance/api/change/SubmitWithStickyApprovalDiffIT.java b/javatests/com/google/gerrit/acceptance/api/change/SubmitWithStickyApprovalDiffIT.java
index 607fbc0..5124d11 100644
--- a/javatests/com/google/gerrit/acceptance/api/change/SubmitWithStickyApprovalDiffIT.java
+++ b/javatests/com/google/gerrit/acceptance/api/change/SubmitWithStickyApprovalDiffIT.java
@@ -37,6 +37,8 @@
import com.google.gerrit.extensions.api.changes.ReviewInput.CommentInput;
import com.google.gerrit.server.project.testing.TestLabels;
import com.google.inject.Inject;
+import java.util.HashSet;
+import java.util.Set;
import org.eclipse.jgit.lib.ObjectId;
import org.junit.Before;
import org.junit.Test;
@@ -602,22 +604,38 @@
int deletions2,
String expectedFileDiff2,
String oldFileName2) {
- String expectedMessage =
+ String beginningOfMessage =
"1 is the latest approved patch-set.\n"
+ "The change was submitted with unreviewed changes in the following files:\n"
+ "\n";
- expectedMessage += fileDiff(expectedFileDiff1, oldFileName1, file1, insertions1, deletions1);
- expectedMessage += fileDiff(expectedFileDiff2, oldFileName2, file2, insertions2, deletions2);
- String expectedChangeMessage = "Change has been successfully merged\n\n" + expectedMessage;
- assertThat(message.trim()).isEqualTo(expectedChangeMessage.trim());
- assertThat(Iterables.getLast(sender.getMessages()).body()).contains(expectedMessage);
+ String fileDiff1 = fileDiff(expectedFileDiff1, oldFileName1, file1, insertions1, deletions1);
+ String expectedMessage1 = beginningOfMessage + fileDiff1;
+ String expectedMessage2 = "";
+ Set<String> expectedChangeMessages = new HashSet<>();
+ if (file2 != null) {
+ String fileDiff2 = fileDiff(expectedFileDiff2, oldFileName2, file2, insertions2, deletions2);
+ expectedMessage2 = beginningOfMessage + fileDiff2 + fileDiff1;
+ String expectedChangeMessage2 = "Change has been successfully merged\n\n" + expectedMessage2;
+ expectedMessage1 += fileDiff2;
+ expectedChangeMessages.add(expectedChangeMessage2.trim());
+ }
+ String expectedChangeMessage1 = "Change has been successfully merged\n\n" + expectedMessage1;
+ expectedChangeMessage1 = expectedChangeMessage1.trim();
+ expectedChangeMessages.add(expectedChangeMessage1.trim());
+
+ // The order of appearance in the diff for multiple files is not defined, so check both
+ // possible orders.
+ assertThat(expectedChangeMessages).contains(message.trim());
+ String email = Iterables.getLast(sender.getMessages()).body();
+ if (email.contains(expectedMessage1) || expectedMessage2.isEmpty()) {
+ assertThat(email).contains(expectedMessage1.trim());
+ } else {
+ assertThat(email).contains(expectedMessage2.trim());
+ }
}
private String fileDiff(
String expectedFileDiff, String oldFileName, String file, int insertions, int deletions) {
- if (file == null) {
- return "";
- }
String expectedMessage =
"```\n"
+ String.format("The name of the file: %s\n", file)
diff --git a/javatests/com/google/gerrit/acceptance/api/revision/RevisionDiffIT.java b/javatests/com/google/gerrit/acceptance/api/revision/RevisionDiffIT.java
index bcd98d4..dfa433a 100644
--- a/javatests/com/google/gerrit/acceptance/api/revision/RevisionDiffIT.java
+++ b/javatests/com/google/gerrit/acceptance/api/revision/RevisionDiffIT.java
@@ -2837,7 +2837,7 @@
}
@Test
- public void symlinkConvertedToRegularFileIsIdentifiedAsRewritten() throws Exception {
+ public void addDeleteByJgit_IsIdentifiedAsRewritten() throws Exception {
String target = "file.txt";
String symlink = "link.lnk";
@@ -2846,58 +2846,74 @@
pushFactory
.create(admin.newIdent(), testRepo, "Commit Subject", target, "content")
.addSymlink(symlink, target);
-
PushOneCommit.Result result = push.to("refs/for/master");
String initialRev = gApi.changes().id(result.getChangeId()).get().currentRevision;
+ String cId = result.getChangeId();
- // Delete the symlink with patchset 2
- gApi.changes().id(result.getChangeId()).edit().deleteFile(symlink);
- gApi.changes().id(result.getChangeId()).edit().publish();
+ // Delete the symlink with PS2
+ gApi.changes().id(cId).edit().deleteFile(symlink);
+ gApi.changes().id(cId).edit().publish();
- // Re-add the symlink as a regular file with patchset 3
- gApi.changes()
- .id(result.getChangeId())
- .edit()
- .modifyFile(symlink, RawInputUtil.create("Content of the new file named 'symlink'"));
- gApi.changes().id(result.getChangeId()).edit().publish();
+ // Re-add the symlink as a regular file with PS3
+ gApi.changes().id(cId).edit().modifyFile(symlink, RawInputUtil.create("new content"));
+ gApi.changes().id(cId).edit().publish();
- Map<String, FileInfo> changedFiles =
- gApi.changes().id(result.getChangeId()).current().files(initialRev);
-
+ // Changed files: JGit returns two {DELETED/ADDED} entries for the file.
+ // The diff logic combines both into a single REWRITTEN entry.
+ Map<String, FileInfo> changedFiles = gApi.changes().id(cId).current().files(initialRev);
assertThat(changedFiles.keySet()).containsExactly("/COMMIT_MSG", symlink);
-
- // Both old and new diff caches agree that the state is rewritten
assertThat(changedFiles.get(symlink).status).isEqualTo('W'); // Rewritten
- DiffInfo diffInfo =
- gApi.changes().id(result.getChangeId()).current().file(symlink).diff(initialRev);
+ // Detailed diff: Old diff cache returns ADDED entry. New Diff Cache returns REWRITE.
+ DiffInfo diffInfo = gApi.changes().id(cId).current().file(symlink).diff(initialRev);
+ assertThat(diffInfo.content).hasSize(1);
+ assertThat(diffInfo).content().element(0).linesOfB().containsExactly("new content");
+ // TODO(ghareeb): remove conditional assertion when new diff cache is fully rolled out.
+ assertThat(diffInfo.changeType)
+ .isEqualTo(useNewDiffCacheGetDiff ? ChangeType.REWRITE : ChangeType.ADDED);
+ }
- // TODO(ghareeb): Remove the else branch when the new diff cache is rolled out as default.
- if (useNewDiffCacheGetDiff) {
- // File diff in New diff cache: change type is correctly identified as REWRITTEN
- assertThat(diffInfo.changeType).isEqualTo(ChangeType.REWRITE);
- assertThat(diffInfo.content).hasSize(2);
- assertThat(diffInfo)
- .content()
- .element(0)
- .linesOfB()
- .containsExactly("Content of the new file named 'symlink'");
- assertThat(diffInfo).content().element(1).linesOfA().containsExactly("file.txt");
- } else {
- // File diff in old diff cache: The diff logic identifies two entries for the file:
- // 1. One entry as 'DELETED' for the symlink.
- // 2. Another entry as 'ADDED' for the new regular file.
- // Since the diff logic returns a single entry, the implementation prioritizes the 'ADDED'
- // entry in this case so that the user is able to see the new content that was added to the
- // file.
- assertThat(diffInfo.changeType).isEqualTo(ChangeType.ADDED);
- assertThat(diffInfo.content).hasSize(1);
- assertThat(diffInfo)
- .content()
- .element(0)
- .linesOfB()
- .containsExactly("Content of the new file named 'symlink'");
- }
+ @Test
+ public void renameDeleteByJgit_IsIdentifiedAsRewritten6() throws Exception {
+ String target = "file.txt";
+ String symlink = "link.lnk";
+ PushOneCommit push =
+ pushFactory
+ .create(admin.newIdent(), testRepo, "Commit Subject", target, "content")
+ .addSymlink(symlink, target);
+ PushOneCommit.Result result = push.to("refs/for/master");
+ String cId = result.getChangeId();
+ String initialRev = gApi.changes().id(cId).get().currentRevision;
+
+ // Delete both symlink and target with PS2
+ gApi.changes().id(cId).edit().deleteFile(symlink);
+ gApi.changes().id(cId).edit().deleteFile(target);
+ gApi.changes().id(cId).edit().publish();
+
+ // Re-create the symlink as a regular file with PS3
+ gApi.changes().id(cId).edit().modifyFile(symlink, RawInputUtil.create("content"));
+ gApi.changes().id(cId).edit().publish();
+
+ // Changed files: JGit returns two {DELETED/RENAMED} entries for the file.
+ // The diff logic combines both into a single REWRITTEN entry.
+ Map<String, FileInfo> changedFiles = gApi.changes().id(cId).current().files(initialRev);
+ assertThat(changedFiles.keySet()).containsExactly("/COMMIT_MSG", symlink);
+ assertThat(changedFiles.get(symlink).status).isEqualTo('W'); // Rewritten
+
+ // Detailed diff: Old diff cache returns RENAMED entry. New Diff Cache returns REWRITE.
+ DiffInfo diffInfo = gApi.changes().id(cId).current().file(symlink).diff(initialRev);
+ assertThat(diffInfo)
+ .diffHeader()
+ .containsExactly(
+ "diff --git a/file.txt b/link.lnk",
+ "similarity index 100%",
+ "rename from file.txt",
+ "rename to link.lnk");
+ assertThat(diffInfo.content).hasSize(1);
+ assertThat(diffInfo).content().element(0).commonLines().containsExactly("content");
+ // TODO(ghareeb): remove conditional assertion when new diff cache is fully rolled out.
+ assertThat(diffInfo.changeType)
+ .isEqualTo(useNewDiffCacheGetDiff ? ChangeType.REWRITE : ChangeType.RENAMED);
}
@Test
diff --git a/javatests/com/google/gerrit/acceptance/rest/account/AccountAssert.java b/javatests/com/google/gerrit/acceptance/rest/account/AccountAssert.java
index 0b0f2ec..79e8ab0 100644
--- a/javatests/com/google/gerrit/acceptance/rest/account/AccountAssert.java
+++ b/javatests/com/google/gerrit/acceptance/rest/account/AccountAssert.java
@@ -14,7 +14,6 @@
package com.google.gerrit.acceptance.rest.account;
-import static com.google.common.collect.ImmutableList.toImmutableList;
import static com.google.common.truth.Truth.assertThat;
import com.google.common.collect.Iterables;
@@ -39,8 +38,7 @@
if (testAccount.tags().isEmpty()) {
assertThat(accountInfo.tags).isNull();
} else {
- assertThat(accountInfo.tags.stream().map(Enum::name).collect(toImmutableList()))
- .containsExactlyElementsIn(testAccount.tags());
+ assertThat(accountInfo.tags).containsExactlyElementsIn(testAccount.tags());
}
}
diff --git a/javatests/com/google/gerrit/acceptance/rest/account/GetAccountDetailIT.java b/javatests/com/google/gerrit/acceptance/rest/account/GetAccountDetailIT.java
index 84f95f7..a1e9bf1 100644
--- a/javatests/com/google/gerrit/acceptance/rest/account/GetAccountDetailIT.java
+++ b/javatests/com/google/gerrit/acceptance/rest/account/GetAccountDetailIT.java
@@ -17,22 +17,42 @@
import static com.google.common.truth.Truth.assertThat;
import static com.google.gerrit.acceptance.rest.account.AccountAssert.assertAccountInfo;
+import com.google.common.collect.ImmutableList;
import com.google.gerrit.acceptance.AbstractDaemonTest;
import com.google.gerrit.acceptance.RestResponse;
import com.google.gerrit.acceptance.testsuite.account.AccountOperations;
import com.google.gerrit.acceptance.testsuite.group.GroupOperations;
import com.google.gerrit.entities.Account;
import com.google.gerrit.entities.AccountGroup;
+import com.google.gerrit.extensions.annotations.Exports;
import com.google.gerrit.extensions.common.AccountDetailInfo;
import com.google.gerrit.extensions.common.AccountInfo;
+import com.google.gerrit.extensions.config.FactoryModule;
+import com.google.gerrit.server.account.AccountTagProvider;
import com.google.gerrit.server.account.ServiceUserClassifier;
+import com.google.gerrit.server.permissions.GlobalPermission;
+import com.google.gerrit.server.permissions.PermissionBackend;
import com.google.inject.Inject;
+import com.google.inject.Module;
+import java.util.List;
import org.junit.Test;
public class GetAccountDetailIT extends AbstractDaemonTest {
@Inject private GroupOperations groupOperations;
@Inject private AccountOperations accountOperations;
+ @Override
+ public Module createModule() {
+ return new FactoryModule() {
+ @Override
+ public void configure() {
+ bind(AccountTagProvider.class)
+ .annotatedWith(Exports.named("CustomAccountTagProvider"))
+ .to(CustomAccountTagProvider.class);
+ }
+ };
+ }
+
@Test
public void getDetail() throws Exception {
RestResponse r = adminRestSession.get("/accounts/" + admin.username() + "/detail/");
@@ -56,7 +76,14 @@
.update();
RestResponse r = adminRestSession.get("/accounts/" + serviceUser.get() + "/detail/");
AccountDetailInfo info = newGson().fromJson(r.getReader(), AccountDetailInfo.class);
- assertThat(info.tags).containsExactly(AccountInfo.Tag.SERVICE_USER);
+ assertThat(info.tags).containsExactly(AccountInfo.Tags.SERVICE_USER);
+ }
+
+ @Test
+ public void getDetailForExtensionPointAccountTag() throws Exception {
+ RestResponse r = userRestSession.get("/accounts/" + user.username() + "/detail/");
+ AccountDetailInfo info = newGson().fromJson(r.getReader(), AccountDetailInfo.class);
+ assertThat(info.tags).containsExactly("BASIC_USER");
}
@Test
@@ -75,4 +102,25 @@
AccountDetailInfo info = newGson().fromJson(r.getReader(), AccountDetailInfo.class);
assertThat(info._accountId).isEqualTo(id.get());
}
+
+ private static class CustomAccountTagProvider implements AccountTagProvider {
+ private PermissionBackend permissions;
+
+ @Inject
+ public CustomAccountTagProvider(PermissionBackend permissions) {
+ this.permissions = permissions;
+ }
+
+ @Override
+ public List<String> getTags(Account.Id id) {
+ try {
+ if (!permissions.currentUser().test(GlobalPermission.ADMINISTRATE_SERVER)) {
+ return ImmutableList.of("BASIC_USER");
+ }
+ } catch (Exception e) {
+ throw new IllegalStateException("can't check admin permissions", e);
+ }
+ return ImmutableList.of();
+ }
+ }
}
diff --git a/javatests/com/google/gerrit/acceptance/rest/change/CorsIT.java b/javatests/com/google/gerrit/acceptance/rest/change/CorsIT.java
index 61e5a2e..ae872b2b 100644
--- a/javatests/com/google/gerrit/acceptance/rest/change/CorsIT.java
+++ b/javatests/com/google/gerrit/acceptance/rest/change/CorsIT.java
@@ -27,6 +27,7 @@
import static com.google.common.net.HttpHeaders.VARY;
import static com.google.common.truth.Truth.assertThat;
import static com.google.common.truth.Truth.assertWithMessage;
+import static com.google.common.truth.TruthJUnit.assume;
import com.google.common.base.Splitter;
import com.google.common.collect.ImmutableList;
@@ -41,6 +42,7 @@
import com.google.gerrit.extensions.restapi.RestApiException;
import com.google.gerrit.server.UrlEncoded;
import com.google.gerrit.testing.ConfigSuite;
+import java.lang.reflect.Method;
import java.nio.charset.StandardCharsets;
import java.util.Locale;
import java.util.stream.Stream;
@@ -206,6 +208,10 @@
@Test
public void crossDomainPutTopic() throws Exception {
+ // Setting cookies with HttpOnly requires Servlet API 3+ which not all deployments might have
+ // available.
+ assume().that(cookieHasSetHttpOnlyMethod()).isTrue();
+
Result change = createChange();
BasicCookieStore cookies = new BasicCookieStore();
Executor http = Executor.newInstance().use(cookies);
@@ -327,4 +333,14 @@
assertWithMessage(ACCESS_CONTROL_ALLOW_HEADERS).that(allowHeaders).isNull();
}
}
+
+ private static boolean cookieHasSetHttpOnlyMethod() {
+ Method setHttpOnly = null;
+ try {
+ setHttpOnly = Cookie.class.getMethod("setHttpOnly", boolean.class);
+ } catch (NoSuchMethodException | SecurityException e) {
+ return false;
+ }
+ return setHttpOnly != null;
+ }
}
diff --git a/javatests/com/google/gerrit/pgm/init/api/AllProjectsConfigTest.java b/javatests/com/google/gerrit/pgm/init/api/AllProjectsConfigTest.java
index e34b578..fd47567 100644
--- a/javatests/com/google/gerrit/pgm/init/api/AllProjectsConfigTest.java
+++ b/javatests/com/google/gerrit/pgm/init/api/AllProjectsConfigTest.java
@@ -17,6 +17,8 @@
import static com.google.common.truth.Truth.assertThat;
import com.google.common.collect.ImmutableList;
+import com.google.gerrit.server.config.AllProjectsConfigProvider;
+import com.google.gerrit.server.config.FileBasedAllProjectsConfigProvider;
import com.google.gerrit.server.config.SitePaths;
import com.google.gerrit.server.securestore.testing.InMemorySecureStore;
import java.io.File;
@@ -76,8 +78,11 @@
InitFlags flags = new InitFlags(sitePaths, secureStore, ImmutableList.of(), false);
Section.Factory sections =
(name, subsection) -> new Section(flags, sitePaths, secureStore, ui, name, subsection);
+ AllProjectsConfigProvider configProvider = new FileBasedAllProjectsConfigProvider(sitePaths);
+
allProjectsConfig =
- new AllProjectsConfig(new AllProjectsNameOnInitProvider(sections), sitePaths, flags);
+ new AllProjectsConfig(
+ new AllProjectsNameOnInitProvider(sections), configProvider, sitePaths, flags);
}
@Test
diff --git a/javatests/com/google/gerrit/server/git/GitRepositoryManagerTest.java b/javatests/com/google/gerrit/server/git/GitRepositoryManagerTest.java
index 7832bec..6b8177e 100644
--- a/javatests/com/google/gerrit/server/git/GitRepositoryManagerTest.java
+++ b/javatests/com/google/gerrit/server/git/GitRepositoryManagerTest.java
@@ -36,6 +36,12 @@
}
private static class TestGitRepositoryManager implements GitRepositoryManager {
+
+ @Override
+ public Status getRepositoryStatus(NameKey name) {
+ throw new UnsupportedOperationException("Not implemented");
+ }
+
@Override
public Repository openRepository(NameKey name) {
throw new UnsupportedOperationException("Not implemented");
diff --git a/javatests/com/google/gerrit/server/git/LocalDiskRepositoryManagerTest.java b/javatests/com/google/gerrit/server/git/LocalDiskRepositoryManagerTest.java
index febb142..12130ea 100644
--- a/javatests/com/google/gerrit/server/git/LocalDiskRepositoryManagerTest.java
+++ b/javatests/com/google/gerrit/server/git/LocalDiskRepositoryManagerTest.java
@@ -20,6 +20,7 @@
import com.google.gerrit.entities.Project;
import com.google.gerrit.server.config.SitePaths;
+import com.google.gerrit.server.git.GitRepositoryManager.Status;
import com.google.gerrit.server.ioutil.HostPlatform;
import java.io.IOException;
import java.nio.file.Files;
@@ -67,6 +68,7 @@
try (Repository repo = repoManager.openRepository(projectA)) {
assertThat(repo).isNotNull();
}
+ assertThat(repoManager.getRepositoryStatus(projectA)).isEqualTo(Status.ACTIVE);
assertThat(repoManager.list()).containsExactly(projectA);
}
@@ -199,7 +201,7 @@
public void testProjectRecreation() throws Exception {
repoManager.createRepository(Project.nameKey("a"));
assertThrows(
- IllegalStateException.class, () -> repoManager.createRepository(Project.nameKey("a")));
+ RepositoryExistsException.class, () -> repoManager.createRepository(Project.nameKey("a")));
}
@Test
@@ -207,7 +209,8 @@
repoManager.createRepository(Project.nameKey("a"));
LocalDiskRepositoryManager newRepoManager = new LocalDiskRepositoryManager(site, cfg);
assertThrows(
- IllegalStateException.class, () -> newRepoManager.createRepository(Project.nameKey("a")));
+ RepositoryExistsException.class,
+ () -> newRepoManager.createRepository(Project.nameKey("a")));
}
@Test
@@ -221,6 +224,19 @@
}
@Test
+ public void testGetRepositoryStatusNameCaseMismatch() throws Exception {
+ assume().that(HostPlatform.isWin32() || HostPlatform.isMac()).isTrue();
+ repoManager.createRepository(Project.nameKey("a"));
+ assertThat(repoManager.getRepositoryStatus(Project.nameKey("A"))).isEqualTo(Status.ACTIVE);
+ }
+
+ @Test
+ public void testGetRepositoryStatusNonExistent() throws Exception {
+ assertThat(repoManager.getRepositoryStatus(Project.nameKey("non-existent")))
+ .isEqualTo(Status.NON_EXISTENT);
+ }
+
+ @Test
public void testNameCaseMismatch() throws Exception {
assume().that(HostPlatform.isWin32() || HostPlatform.isMac()).isTrue();
repoManager.createRepository(Project.nameKey("a"));
@@ -272,6 +288,12 @@
}
@Test
+ public void testGetRepoStatusInvalidName() throws Exception {
+ assertThat(repoManager.getRepositoryStatus(Project.nameKey("project%?|<>A")))
+ .isEqualTo(Status.NON_EXISTENT);
+ }
+
+ @Test
public void list() throws Exception {
Project.NameKey projectA = Project.nameKey("projectA");
createRepository(repoManager.getBasePath(projectA), projectA.get());
diff --git a/javatests/com/google/gerrit/server/notedb/ChangeNotesStateTest.java b/javatests/com/google/gerrit/server/notedb/ChangeNotesStateTest.java
index 209d880..66d9e4b5 100644
--- a/javatests/com/google/gerrit/server/notedb/ChangeNotesStateTest.java
+++ b/javatests/com/google/gerrit/server/notedb/ChangeNotesStateTest.java
@@ -1065,7 +1065,7 @@
.setChangeId(ID.get())
.setMergedOnMillis(234567L)
.setHasMergedOn(true)
- .setColumns(colsProto.toBuilder())
+ .setColumns(colsProto)
.build());
}
@@ -1128,7 +1128,7 @@
.setChangeId(ID.get())
.setServerId(DEFAULT_SERVER_ID)
.setHasServerId(true)
- .setColumns(colsProto.toBuilder())
+ .setColumns(colsProto)
.build());
}
diff --git a/javatests/com/google/gerrit/server/notedb/CommitRewriterTest.java b/javatests/com/google/gerrit/server/notedb/CommitRewriterTest.java
index 77db31f..029eead 100644
--- a/javatests/com/google/gerrit/server/notedb/CommitRewriterTest.java
+++ b/javatests/com/google/gerrit/server/notedb/CommitRewriterTest.java
@@ -34,7 +34,6 @@
import com.google.gerrit.entities.RefNames;
import com.google.gerrit.entities.SubmitRecord;
import com.google.gerrit.json.OutputFormat;
-import com.google.gerrit.server.ChangeMessagesUtil;
import com.google.gerrit.server.IdentifiedUser;
import com.google.gerrit.server.ReviewerStatusUpdate;
import com.google.gerrit.server.notedb.ChangeNoteUtil.AttentionStatusInNoteDb;
@@ -251,13 +250,20 @@
.add(
writeUpdate(
RefNames.changeMetaRef(c.getId()),
+ // valid change message that should not be overwritten
getChangeUpdateBody(
- c, /*changeMessage=*/ null, "Reviewer: " + reviewerIdentToFix),
+ c,
+ "Removed reviewer <GERRIT_ACCOUNT_1>.",
+ "Reviewer: " + reviewerIdentToFix),
getAuthorIdent(changeOwner.getAccount())))
.add(
writeUpdate(
RefNames.changeMetaRef(c.getId()),
- getChangeUpdateBody(c, /*changeMessage=*/ null, "CC: " + reviewerIdentToFix),
+ // valid change message that should not be overwritten
+ getChangeUpdateBody(
+ c,
+ "Removed cc <GERRIT_ACCOUNT_2> with the following votes:\n\n * Code-Review+2 by <GERRIT_ACCOUNT_2>",
+ "CC: " + reviewerIdentToFix),
getAuthorIdent(otherUser.getAccount())))
.add(
writeUpdate(
@@ -303,10 +309,12 @@
List<String> commitHistoryDiff = result.fixedRefDiff.get(RefNames.changeMetaRef(c.getId()));
assertThat(commitHistoryDiff)
.containsExactly(
- "@@ -7 +7 @@\n"
+ "@@ -9 +9 @@\n"
+ "-Reviewer: Other Account <2@gerrit>\n"
+ "+Reviewer: Gerrit User 2 <2@gerrit>\n",
- "@@ -7 +7 @@\n" + "-CC: Other Account <2@gerrit>\n" + "+CC: Gerrit User 2 <2@gerrit>\n",
+ "@@ -11 +11 @@\n"
+ + "-CC: Other Account <2@gerrit>\n"
+ + "+CC: Gerrit User 2 <2@gerrit>\n",
"@@ -9 +9 @@\n"
+ "-Removed: Other Account <2@gerrit>\n"
+ "+Removed: Gerrit User 2 <2@gerrit>\n");
@@ -325,7 +333,7 @@
RefNames.changeMetaRef(c.getId()),
getChangeUpdateBody(
c,
- "Removed reviewer " + otherUser.getAccount().fullName(),
+ String.format("Removed reviewer %s.", otherUser.getAccount().fullName()),
"Removed: " + getValidIdentAsString(otherUser.getAccount())),
getAuthorIdent(changeOwner.getAccount())));
@@ -338,7 +346,9 @@
RefNames.changeMetaRef(c.getId()),
getChangeUpdateBody(
c,
- "Removed cc " + otherUser.getAccount().fullName(),
+ String.format(
+ "Removed cc %s with the following votes:\n\n * Code-Review+2",
+ otherUser.getAccount().fullName()),
"Removed: " + getValidIdentAsString(otherUser.getAccount())),
getAuthorIdent(changeOwner.getAccount())));
@@ -378,7 +388,9 @@
assertThat(notesBeforeRewrite.getReviewerUpdates()).isEqualTo(expectedReviewerUpdates);
assertThat(changeMessages(notesBeforeRewrite))
- .containsExactly("Removed reviewer Other Account", "Removed cc Other Account");
+ .containsExactly(
+ "Removed reviewer Other Account.",
+ "Removed cc Other Account with the following votes:\n\n * Code-Review+2");
assertThat(notesAfterRewrite.getReviewerUpdates()).isEqualTo(expectedReviewerUpdates);
assertThat(changeMessages(notesAfterRewrite)).containsExactly("Removed reviewer", "Removed cc");
@@ -391,8 +403,12 @@
List<String> commitHistoryDiff = result.fixedRefDiff.get(RefNames.changeMetaRef(c.getId()));
assertThat(commitHistoryDiff)
.containsExactly(
- "@@ -6 +6 @@\n" + "-Removed reviewer Other Account\n" + "+Removed reviewer\n",
- "@@ -6 +6 @@\n" + "-Removed cc Other Account\n" + "+Removed cc\n");
+ "@@ -6 +6 @@\n" + "-Removed reviewer Other Account.\n" + "+Removed reviewer\n",
+ "@@ -6,3 +6 @@\n"
+ + "-Removed cc Other Account with the following votes:\n"
+ + "-\n"
+ + "- * Code-Review+2\n"
+ + "+Removed cc\n");
}
@Test
@@ -726,8 +742,19 @@
ChangeUpdate validAttentionSetUpdate = newUpdate(c, changeOwner);
validAttentionSetUpdate.addToPlannedAttentionSetUpdates(
AttentionSetUpdate.createForWrite(otherUserId, Operation.REMOVE, "Removed by someone"));
+ validAttentionSetUpdate.addToPlannedAttentionSetUpdates(
+ AttentionSetUpdate.createForWrite(
+ changeOwner.getAccountId(), Operation.ADD, "Added by someone"));
validAttentionSetUpdate.commit();
+ ChangeUpdate invalidRemovedByClickUpdate = newUpdate(c, changeOwner);
+ invalidRemovedByClickUpdate.addToPlannedAttentionSetUpdates(
+ AttentionSetUpdate.createForWrite(
+ changeOwner.getAccountId(),
+ Operation.REMOVE,
+ String.format("Removed by %s by clicking the attention icon", otherUser.getName())));
+ commitsToFix.add(invalidRemovedByClickUpdate.commit());
+
Ref metaRefBeforeRewrite = repo.exactRef(RefNames.changeMetaRef(c.getId()));
ImmutableList<RevCommit> commitsBeforeRewrite = logMetaRef(repo, metaRefBeforeRewrite);
@@ -747,6 +774,16 @@
ImmutableList<AttentionSetUpdate> attentionSetUpdatesBeforeRewrite =
ImmutableList.of(
AttentionSetUpdate.createFromRead(
+ invalidRemovedByClickUpdate.getWhen().toInstant(),
+ changeOwner.getAccountId(),
+ Operation.REMOVE,
+ String.format("Removed by %s by clicking the attention icon", otherUser.getName())),
+ AttentionSetUpdate.createFromRead(
+ validAttentionSetUpdate.getWhen().toInstant(),
+ changeOwner.getAccountId(),
+ Operation.ADD,
+ "Added by someone"),
+ AttentionSetUpdate.createFromRead(
validAttentionSetUpdate.getWhen().toInstant(),
otherUserId,
Operation.REMOVE,
@@ -780,6 +817,16 @@
ImmutableList<AttentionSetUpdate> attentionSetUpdatesAfterRewrite =
ImmutableList.of(
AttentionSetUpdate.createFromRead(
+ invalidRemovedByClickUpdate.getWhen().toInstant(),
+ changeOwner.getAccountId(),
+ Operation.REMOVE,
+ "Removed by someone by clicking the attention icon"),
+ AttentionSetUpdate.createFromRead(
+ validAttentionSetUpdate.getWhen().toInstant(),
+ changeOwner.getAccountId(),
+ Operation.ADD,
+ "Added by someone"),
+ AttentionSetUpdate.createFromRead(
validAttentionSetUpdate.getWhen().toInstant(),
otherUserId,
Operation.REMOVE,
@@ -824,7 +871,7 @@
assertValidCommits(commitsBeforeRewrite, commitsAfterRewrite, invalidCommits);
List<String> commitHistoryDiff = result.fixedRefDiff.get(RefNames.changeMetaRef(c.getId()));
- assertThat(commitHistoryDiff).hasSize(3);
+ assertThat(commitHistoryDiff).hasSize(4);
assertThat(commitHistoryDiff.get(0))
.isEqualTo(
"@@ -8 +8 @@\n"
@@ -844,6 +891,11 @@
"-Attention: {\"person_ident\":\"Change Owner \\u003c1@gerrit\\u003e\",\"operation\":\"REMOVE\",\"reason\":\"Other Account replied on the change\"}",
"+Attention: {\"person_ident\":\"Gerrit User 2 \\u003c2@gerrit\\u003e\",\"operation\":\"ADD\",\"reason\":\"Added by someone using the hovercard menu\"}",
"+Attention: {\"person_ident\":\"Gerrit User 1 \\u003c1@gerrit\\u003e\",\"operation\":\"REMOVE\",\"reason\":\"Someone replied on the change\"}");
+ assertThat(commitHistoryDiff.get(3))
+ .isEqualTo(
+ "@@ -7 +7 @@\n"
+ + "-Attention: {\"person_ident\":\"Gerrit User 1 \\u003c1@gerrit\\u003e\",\"operation\":\"REMOVE\",\"reason\":\"Removed by Other Account by clicking the attention icon\"}\n"
+ + "+Attention: {\"person_ident\":\"Gerrit User 1 \\u003c1@gerrit\\u003e\",\"operation\":\"REMOVE\",\"reason\":\"Removed by someone by clicking the attention icon\"}\n");
}
@Test
@@ -882,16 +934,19 @@
Operation.REMOVE,
String.format("Removed by %s using the hovercard menu", okAccountName)));
secondAttentionSetUpdate.commit();
- ChangeUpdate clearAttentionSetUpdate = newUpdate(c, changeOwner);
- clearAttentionSetUpdate.addToPlannedAttentionSetUpdates(
- AttentionSetUpdate.createForWrite(changeOwner.getAccountId(), Operation.REMOVE, "Clear"));
- clearAttentionSetUpdate.commit();
- attentionSetUpdatesBeforeRewrite.add(
- AttentionSetUpdate.createFromRead(
- clearAttentionSetUpdate.getWhen().toInstant(),
+ ChangeUpdate thirdAttentionSetUpdate = newUpdate(c, changeOwner);
+ thirdAttentionSetUpdate.addToPlannedAttentionSetUpdates(
+ AttentionSetUpdate.createForWrite(
changeOwner.getAccountId(),
Operation.REMOVE,
- "Clear"),
+ String.format("Removed by %s by clicking the attention icon", okAccountName)));
+ thirdAttentionSetUpdate.commit();
+ attentionSetUpdatesBeforeRewrite.add(
+ AttentionSetUpdate.createFromRead(
+ thirdAttentionSetUpdate.getWhen().toInstant(),
+ changeOwner.getAccountId(),
+ Operation.REMOVE,
+ String.format("Removed by %s by clicking the attention icon", okAccountName)),
AttentionSetUpdate.createFromRead(
secondAttentionSetUpdate.getWhen().toInstant(),
otherUserId,
@@ -907,7 +962,6 @@
otherUserId,
Operation.ADD,
String.format("Added by %s using the hovercard menu", okAccountName)));
- clearAttentionSetUpdate.getNotes();
}
ChangeNotes notesBeforeRewrite = newNotes(c);
@@ -934,19 +988,19 @@
invalidMergedMessageUpdate.setChangeMessage(
"Change has been successfully merged by " + changeOwner.getName());
invalidMergedMessageUpdate.setTopic("");
- invalidMergedMessageUpdate.setTag(ChangeMessagesUtil.TAG_MERGED);
+
commitsToFix.add(invalidMergedMessageUpdate.commit());
ChangeUpdate invalidCherryPickedMessageUpdate = newUpdate(c, changeOwner);
invalidCherryPickedMessageUpdate.setChangeMessage(
"Change has been successfully cherry-picked as e40dc1a50dc7f457a37579e2755374f3e1a5413b by "
+ changeOwner.getName());
- invalidCherryPickedMessageUpdate.setTag(ChangeMessagesUtil.TAG_MERGED);
+
commitsToFix.add(invalidCherryPickedMessageUpdate.commit());
ChangeUpdate invalidRebasedMessageUpdate = newUpdate(c, changeOwner);
invalidRebasedMessageUpdate.setChangeMessage(
"Change has been successfully rebased and submitted as e40dc1a50dc7f457a37579e2755374f3e1a5413b by "
+ changeOwner.getName());
- invalidRebasedMessageUpdate.setTag(ChangeMessagesUtil.TAG_MERGED);
+
commitsToFix.add(invalidRebasedMessageUpdate.commit());
ChangeUpdate validSubmitMessageUpdate = newUpdate(c, changeOwner);
validSubmitMessageUpdate.setChangeMessage(
@@ -1315,30 +1369,51 @@
Change c = newChange();
ImmutableList.Builder<ObjectId> commitsToFix = new ImmutableList.Builder<>();
- ChangeUpdate invalidOnApprovalUpdate = newUpdate(c, changeOwner);
- invalidOnApprovalUpdate.setChangeMessage(
- "Patch Set 1: Code-Review+2\n\n"
+ ChangeUpdate invalidOnReviewUpdate = newUpdate(c, changeOwner);
+ invalidOnReviewUpdate.setChangeMessage(
+ "Patch Set 1: Any-Label+2 Other-Label+2 Code-Review+2\n\n"
+ + "By voting Code-Review+2 the following files are now code-owner approved by Change Owner:\n"
+ + " * file1.java\n"
+ + " * file2.ts\n"
+ + "By voting Any-Label+2 the code-owners submit requirement is overridden by Change Owner\n"
+ + "By voting Other-Label+2 the code-owners submit requirement is still overridden by Change Owner\n");
+ commitsToFix.add(invalidOnReviewUpdate.commit());
+
+ ChangeUpdate invalidOnReviewUpdateAnyOrder = newUpdate(c, changeOwner);
+ invalidOnReviewUpdateAnyOrder.setChangeMessage(
+ "Patch Set 1: Any-Label+2 Other-Label+2 Code-Review+2\n\n"
+ + "By voting Any-Label+2 the code-owners submit requirement is overridden by Change Owner\n"
+ + "By voting Other-Label+2 the code-owners submit requirement is still overridden by Change Owner\n"
+ "By voting Code-Review+2 the following files are now code-owner approved by Change Owner:\n"
+ " * file1.java\n"
+ " * file2.ts\n");
- commitsToFix.add(invalidOnApprovalUpdate.commit());
- ChangeUpdate invalidOnApprovalMultipleByUpdate = newUpdate(c, otherUser);
- invalidOnApprovalMultipleByUpdate.setChangeMessage(
+ commitsToFix.add(invalidOnReviewUpdateAnyOrder.commit());
+ ChangeUpdate invalidOnApprovalUpdate = newUpdate(c, otherUser);
+ invalidOnApprovalUpdate.setChangeMessage(
"Patch Set 1: -Code-Review\n\n"
+ "By removing the Code-Review+2 vote the following files are no longer explicitly code-owner approved by Other Account:\n"
+ " * file1.java\n"
+ " * file2.ts\n"
+ "\nThe listed files are still implicitly approved by Other Account.\n");
- commitsToFix.add(invalidOnApprovalMultipleByUpdate.commit());
+ commitsToFix.add(invalidOnApprovalUpdate.commit());
ChangeUpdate invalidOnOverrideUpdate = newUpdate(c, changeOwner);
invalidOnOverrideUpdate.setChangeMessage(
"Patch Set 1: -Owners-Override\n\n"
+ "(1 comment)\n\n"
- + "By removing the Owners-Override+1 vote the code-owners submit requirement is no longer overridden by Change Owner:\n"
- + " * file3.java\n");
+ + "By removing the Owners-Override+1 vote the code-owners submit requirement is no longer overridden by Change Owner\n");
+
commitsToFix.add(invalidOnOverrideUpdate.commit());
+ ChangeUpdate partiallyValidOnReviewUpdate = newUpdate(c, changeOwner);
+ partiallyValidOnReviewUpdate.setChangeMessage(
+ "Patch Set 1: Any-Label+2 Code-Review+2\n\n"
+ + "By voting Code-Review+2 the following files are now code-owner approved by <GERRIT_ACCOUNT_1>:\n"
+ + " * file1.java\n"
+ + " * file2.ts\n"
+ + "By voting Any-Label+2 the code-owners submit requirement is overridden by Change Owner\n");
+ commitsToFix.add(partiallyValidOnReviewUpdate.commit());
+
ChangeUpdate validOnApprovalUpdate = newUpdate(c, changeOwner);
validOnApprovalUpdate.setChangeMessage(
"Patch Set 1: Code-Review-2\n\n"
@@ -1349,8 +1424,7 @@
ChangeUpdate validOnOverrideUpdate = newUpdate(c, changeOwner);
validOnOverrideUpdate.setChangeMessage(
"Patch Set 1: Owners-Override+1\n\n"
- + "By voting Owners-Override+1 the code-owners submit requirement is still overridden by <GERRIT_ACCOUNT_1>:\n"
- + " * file1.java\n");
+ + "By voting Owners-Override+1 the code-owners submit requirement is still overridden by <GERRIT_ACCOUNT_1>\n");
validOnOverrideUpdate.commit();
Ref metaRefBeforeRewrite = repo.exactRef(RefNames.changeMetaRef(c.getId()));
@@ -1370,11 +1444,18 @@
ChangeNotes notesAfterRewrite = newNotes(c);
- assertThat(changeMessages(notesBeforeRewrite)).hasSize(5);
+ assertThat(changeMessages(notesBeforeRewrite)).hasSize(7);
assertThat(changeMessages(notesAfterRewrite))
.containsExactly(
- "Patch Set 1: Code-Review+2\n"
- + "\n"
+ "Patch Set 1: Any-Label+2 Other-Label+2 Code-Review+2\n\n"
+ + "By voting Code-Review+2 the following files are now code-owner approved by <GERRIT_ACCOUNT_1>:\n"
+ + " * file1.java\n"
+ + " * file2.ts\n"
+ + "By voting Any-Label+2 the code-owners submit requirement is overridden by <GERRIT_ACCOUNT_1>\n"
+ + "By voting Other-Label+2 the code-owners submit requirement is still overridden by <GERRIT_ACCOUNT_1>\n",
+ "Patch Set 1: Any-Label+2 Other-Label+2 Code-Review+2\n\n"
+ + "By voting Any-Label+2 the code-owners submit requirement is overridden by <GERRIT_ACCOUNT_1>\n"
+ + "By voting Other-Label+2 the code-owners submit requirement is still overridden by <GERRIT_ACCOUNT_1>\n"
+ "By voting Code-Review+2 the following files are now code-owner approved by <GERRIT_ACCOUNT_1>:\n"
+ " * file1.java\n"
+ " * file2.ts\n",
@@ -1388,15 +1469,18 @@
+ "\n"
+ "(1 comment)\n"
+ "\n"
- + "By removing the Owners-Override+1 vote the code-owners submit requirement is no longer overridden by <GERRIT_ACCOUNT_1>:\n"
- + " * file3.java\n",
+ + "By removing the Owners-Override+1 vote the code-owners submit requirement is no longer overridden by <GERRIT_ACCOUNT_1>\n",
+ "Patch Set 1: Any-Label+2 Code-Review+2\n\n"
+ + "By voting Code-Review+2 the following files are now code-owner approved by <GERRIT_ACCOUNT_1>:\n"
+ + " * file1.java\n"
+ + " * file2.ts\n"
+ + "By voting Any-Label+2 the code-owners submit requirement is overridden by <GERRIT_ACCOUNT_1>\n",
"Patch Set 1: Code-Review-2\n\n"
+ "By voting Code-Review-2 the following files are no longer explicitly code-owner approved by <GERRIT_ACCOUNT_1>:\n"
+ " * file4.java\n",
"Patch Set 1: Owners-Override+1\n"
+ "\n"
- + "By voting Owners-Override+1 the code-owners submit requirement is still overridden by <GERRIT_ACCOUNT_1>:\n"
- + " * file1.java\n");
+ + "By voting Owners-Override+1 the code-owners submit requirement is still overridden by <GERRIT_ACCOUNT_1>\n");
Ref metaRefAfterRewrite = repo.exactRef(RefNames.changeMetaRef(c.getId()));
assertThat(metaRefAfterRewrite.getObjectId()).isNotEqualTo(metaRefBeforeRewrite.getObjectId());
@@ -1409,6 +1493,18 @@
.containsExactly(
"@@ -8 +8 @@\n"
+ "-By voting Code-Review+2 the following files are now code-owner approved by Change Owner:\n"
+ + "+By voting Code-Review+2 the following files are now code-owner approved by <GERRIT_ACCOUNT_1>:\n"
+ + "@@ -11,2 +11,2 @@\n"
+ + "-By voting Any-Label+2 the code-owners submit requirement is overridden by Change Owner\n"
+ + "-By voting Other-Label+2 the code-owners submit requirement is still overridden by Change Owner\n"
+ + "+By voting Any-Label+2 the code-owners submit requirement is overridden by <GERRIT_ACCOUNT_1>\n"
+ + "+By voting Other-Label+2 the code-owners submit requirement is still overridden by <GERRIT_ACCOUNT_1>\n",
+ "@@ -8,3 +8,3 @@\n"
+ + "-By voting Any-Label+2 the code-owners submit requirement is overridden by Change Owner\n"
+ + "-By voting Other-Label+2 the code-owners submit requirement is still overridden by Change Owner\n"
+ + "-By voting Code-Review+2 the following files are now code-owner approved by Change Owner:\n"
+ + "+By voting Any-Label+2 the code-owners submit requirement is overridden by <GERRIT_ACCOUNT_1>\n"
+ + "+By voting Other-Label+2 the code-owners submit requirement is still overridden by <GERRIT_ACCOUNT_1>\n"
+ "+By voting Code-Review+2 the following files are now code-owner approved by <GERRIT_ACCOUNT_1>:\n",
"@@ -8 +8 @@\n"
+ "-By removing the Code-Review+2 vote the following files are no longer explicitly code-owner approved by Other Account:\n"
@@ -1417,8 +1513,11 @@
+ "-The listed files are still implicitly approved by Other Account.\n"
+ "+The listed files are still implicitly approved by <GERRIT_ACCOUNT_2>.\n",
"@@ -10 +10 @@\n"
- + "-By removing the Owners-Override+1 vote the code-owners submit requirement is no longer overridden by Change Owner:\n"
- + "+By removing the Owners-Override+1 vote the code-owners submit requirement is no longer overridden by <GERRIT_ACCOUNT_1>:\n");
+ + "-By removing the Owners-Override+1 vote the code-owners submit requirement is no longer overridden by Change Owner\n"
+ + "+By removing the Owners-Override+1 vote the code-owners submit requirement is no longer overridden by <GERRIT_ACCOUNT_1>\n",
+ "@@ -11 +11 @@\n"
+ + "-By voting Any-Label+2 the code-owners submit requirement is overridden by Change Owner\n"
+ + "+By voting Any-Label+2 the code-owners submit requirement is overridden by <GERRIT_ACCOUNT_1>\n");
}
@Test
diff --git a/javatests/com/google/gerrit/server/project/ProjectConfigTest.java b/javatests/com/google/gerrit/server/project/ProjectConfigTest.java
index 9130d3e..7f0b685 100644
--- a/javatests/com/google/gerrit/server/project/ProjectConfigTest.java
+++ b/javatests/com/google/gerrit/server/project/ProjectConfigTest.java
@@ -36,6 +36,7 @@
import com.google.gerrit.entities.SubmitRequirementExpression;
import com.google.gerrit.extensions.client.InheritableBoolean;
import com.google.gerrit.server.config.AllProjectsName;
+import com.google.gerrit.server.config.FileBasedAllProjectsConfigProvider;
import com.google.gerrit.server.config.PluginConfig;
import com.google.gerrit.server.config.SitePaths;
import com.google.gerrit.server.extensions.events.GitReferenceUpdated;
@@ -68,7 +69,10 @@
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.TemporaryFolder;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
+@RunWith(JUnit4.class)
public class ProjectConfigTest {
private static final String LABEL_SCORES_CONFIG =
" copyAnyScore = "
@@ -113,7 +117,8 @@
public void setUp() throws Exception {
sitePaths = new SitePaths(temporaryFolder.newFolder().toPath());
Files.createDirectories(sitePaths.etc_dir);
- factory = new ProjectConfig.Factory(sitePaths, ALL_PROJECTS);
+ factory =
+ new ProjectConfig.Factory(ALL_PROJECTS, new FileBasedAllProjectsConfigProvider(sitePaths));
db = new InMemoryRepository(new DfsRepositoryDescription("repo"));
tr = new TestRepository<>(db);
}
@@ -327,8 +332,8 @@
assertThat(cfg.getValidationErrors()).hasSize(1);
assertThat(Iterables.getOnlyElement(cfg.getValidationErrors()).getMessage())
.isEqualTo(
- "project.config: Submit requirement \"code-review\" does not define a submittability expression."
- + " Skipping this requirement.");
+ "project.config: Submit requirement \"code-review\" does not define a submittability"
+ + " expression. Skipping this requirement.");
}
@Test
@@ -866,7 +871,9 @@
rev = commit(cfg);
assertThat(text(rev, "project.config"))
.isEqualTo(
- "[commentlink \"bugzilla\"]\n\tmatch = \"(bug\\\\s+#?)(\\\\d+)\"\n\tlink = http://bugs.example.com/show_bug.cgi?id=$2\n");
+ "[commentlink \"bugzilla\"]\n"
+ + "\tmatch = \"(bug\\\\s+#?)(\\\\d+)\"\n"
+ + "\tlink = http://bugs.example.com/show_bug.cgi?id=$2\n");
}
@Test
@@ -891,7 +898,9 @@
rev = commit(cfg);
assertThat(text(rev, "project.config"))
.isEqualTo(
- "[commentlink \"bugzilla\"]\n\tmatch = \"(bug\\\\s+#?)(\\\\d+)\"\n\tlink = http://bugs.example.com/show_bug.cgi?id=$2\n");
+ "[commentlink \"bugzilla\"]\n"
+ + "\tmatch = \"(bug\\\\s+#?)(\\\\d+)\"\n"
+ + "\tlink = http://bugs.example.com/show_bug.cgi?id=$2\n");
}
@Test
@@ -913,7 +922,9 @@
rev = commit(cfg);
assertThat(text(rev, "project.config"))
.isEqualTo(
- "[commentlink \"bugzilla\"]\n\tmatch = \"(bug\\\\s+#?)(\\\\d+)\"\n\tlink = http://bugs.example.com/show_bug.cgi?id=$2\n");
+ "[commentlink \"bugzilla\"]\n"
+ + "\tmatch = \"(bug\\\\s+#?)(\\\\d+)\"\n"
+ + "\tlink = http://bugs.example.com/show_bug.cgi?id=$2\n");
}
@Test
@@ -978,7 +989,9 @@
rev = commit(cfg);
assertThat(text(rev, "project.config"))
.isEqualTo(
- "[commentlink \"bugzilla\"]\n\tmatch = \"(bug\\\\s+#?)(\\\\d+)\"\n\tlink = http://bugs.example.com/show_bug.cgi?id=$2\n");
+ "[commentlink \"bugzilla\"]\n"
+ + "\tmatch = \"(bug\\\\s+#?)(\\\\d+)\"\n"
+ + "\tlink = http://bugs.example.com/show_bug.cgi?id=$2\n");
}
@Test
@@ -987,8 +1000,11 @@
Path tmp = Files.createTempFile("gerrit_test_", "_site");
Files.deleteIfExists(tmp);
SitePaths sitePaths = new SitePaths(tmp);
+ FileBasedAllProjectsConfigProvider allProjectsConfigProvider =
+ new FileBasedAllProjectsConfigProvider(sitePaths);
byte[] hashedContents =
- ProjectCacheImpl.allProjectsFileProjectConfigHash(ALL_PROJECTS, sitePaths);
+ ProjectCacheImpl.allProjectsFileProjectConfigHash(
+ allProjectsConfigProvider.get(ALL_PROJECTS));
assertThat(hashedContents).isEqualTo(new byte[16]); // Empty/absent config
FileBasedConfig fileBasedConfig =
new FileBasedConfig(
@@ -1000,7 +1016,9 @@
FS.DETECTED);
fileBasedConfig.setString("plugin", "my-plugin", "key", "value");
fileBasedConfig.save();
- hashedContents = ProjectCacheImpl.allProjectsFileProjectConfigHash(ALL_PROJECTS, sitePaths);
+ hashedContents =
+ ProjectCacheImpl.allProjectsFileProjectConfigHash(
+ allProjectsConfigProvider.get(ALL_PROJECTS));
assertThat(hashedContents)
.isEqualTo(
new byte[] {
diff --git a/javatests/com/google/gerrit/server/schema/ProjectConfigSchemaUpdateTest.java b/javatests/com/google/gerrit/server/schema/ProjectConfigSchemaUpdateTest.java
index da22f76..e0ba666 100644
--- a/javatests/com/google/gerrit/server/schema/ProjectConfigSchemaUpdateTest.java
+++ b/javatests/com/google/gerrit/server/schema/ProjectConfigSchemaUpdateTest.java
@@ -19,6 +19,7 @@
import com.google.common.collect.ImmutableList;
import com.google.gerrit.entities.Project;
import com.google.gerrit.server.config.AllProjectsName;
+import com.google.gerrit.server.config.FileBasedAllProjectsConfigProvider;
import com.google.gerrit.server.config.SitePaths;
import com.google.gerrit.server.extensions.events.GitReferenceUpdated;
import com.google.gerrit.server.git.meta.MetaDataUpdate;
@@ -36,7 +37,10 @@
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.TemporaryFolder;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
+@RunWith(JUnit4.class)
public class ProjectConfigSchemaUpdateTest {
private static final String ALL_PROJECTS = "All-The-Projects";
@@ -64,8 +68,11 @@
try (Repository repo = new FileRepository(allProjectsRepoFile)) {
repo.create(true);
}
+ FileBasedAllProjectsConfigProvider configProvider =
+ new FileBasedAllProjectsConfigProvider(sitePaths);
- factory = new ProjectConfigSchemaUpdate.Factory(sitePaths, new AllProjectsName(ALL_PROJECTS));
+ factory =
+ new ProjectConfigSchemaUpdate.Factory(new AllProjectsName(ALL_PROJECTS), configProvider);
}
@Test
diff --git a/package.json b/package.json
index 9df72da..7bd09b0 100644
--- a/package.json
+++ b/package.json
@@ -9,7 +9,7 @@
"twinkie": "^1.1.2"
},
"devDependencies": {
- "@typescript-eslint/eslint-plugin": "^4.25.0",
+ "@typescript-eslint/eslint-plugin": "^4.29.0",
"eslint": "^7.24.0",
"eslint-config-google": "^0.14.0",
"eslint-plugin-html": "^6.1.2",
diff --git a/plugins/tsconfig-plugins-base.json b/plugins/tsconfig-plugins-base.json
index b9d14e1..b580549 100644
--- a/plugins/tsconfig-plugins-base.json
+++ b/plugins/tsconfig-plugins-base.json
@@ -1,7 +1,7 @@
{
"compilerOptions": {
/* Basic Options */
- "target": "es2018", /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', 'ES2018', 'ES2019' or 'ESNEXT'. */
+ "target": "es2019", /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', 'ES2018', 'ES2019' or 'ESNEXT'. */
"module": "es2015", /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', or 'ESNext'. */
"inlineSourceMap": true, /* Generates corresponding '.map' file. */
"rootDir": ".", /* Specify the root directory of input files. Use to control the output directory structure with --outDir. */
diff --git a/polygerrit-ui/app/api/diff.ts b/polygerrit-ui/app/api/diff.ts
index ba7eb70..26701e8 100644
--- a/polygerrit-ui/app/api/diff.ts
+++ b/polygerrit-ui/app/api/diff.ts
@@ -374,6 +374,7 @@
* @param textElement The rendered text of one side of the diff.
* @param lineNumberElement The rendered line number of one side of the diff.
* @param line Describes the line that should be annotated.
+ * @param side Which side of the diff is being annotated.
*/
annotate(
textElement: HTMLElement,
diff --git a/polygerrit-ui/app/api/embed.ts b/polygerrit-ui/app/api/embed.ts
index b1b7f34..ba378e2 100644
--- a/polygerrit-ui/app/api/embed.ts
+++ b/polygerrit-ui/app/api/embed.ts
@@ -27,7 +27,7 @@
grdiff: {
GrAnnotation: GrAnnotation;
GrDiffCursor: {new (): GrDiffCursor};
- TokenHighlightLayer: {new (): DiffLayer};
+ TokenHighlightLayer: {new (container?: HTMLElement): DiffLayer};
};
}
}
diff --git a/polygerrit-ui/app/elements/admin/gr-repo-plugin-config/gr-repo-plugin-config.ts b/polygerrit-ui/app/elements/admin/gr-repo-plugin-config/gr-repo-plugin-config.ts
index 42060ee..9cf473b 100644
--- a/polygerrit-ui/app/elements/admin/gr-repo-plugin-config/gr-repo-plugin-config.ts
+++ b/polygerrit-ui/app/elements/admin/gr-repo-plugin-config/gr-repo-plugin-config.ts
@@ -149,7 +149,7 @@
?checked=${this._computeChecked(option.info.value)}
@change=${this._handleBooleanChange}
data-option-key=${option._key}
- ?disabled=${option.info.editable}
+ ?disabled=${!option.info.editable}
@click=${this._onTapPluginBoolean}
></paper-toggle-button>
`;
@@ -158,7 +158,7 @@
<gr-select value=${option.info.value} @change=${this._handleListChange}>
<select
data-option-key=${option._key}
- ?disabled=${option.info.editable}
+ ?disabled=${!option.info.editable}
>
${(option.info.permitted_values || []).map(
value => html`<option value="${value}">${value}</option>`
@@ -176,14 +176,14 @@
value=${option.info.value}
@input=${this._handleStringChange}
data-option-key="${option._key}"
- ?disabled=${option.info.editable}
+ ?disabled=${!option.info.editable}
>
<input
is="iron-input"
value="${option.info.value}"
@input=${this._handleStringChange}
data-option-key="${option._key}"
- ?disabled=${option.info.editable}
+ ?disabled=${!option.info.editable}
/>
</iron-input>
`;
diff --git a/polygerrit-ui/app/elements/admin/gr-repo-plugin-config/gr-repo-plugin-config_test.js b/polygerrit-ui/app/elements/admin/gr-repo-plugin-config/gr-repo-plugin-config_test.js
index 17e8256..8c2e6b3 100644
--- a/polygerrit-ui/app/elements/admin/gr-repo-plugin-config/gr-repo-plugin-config_test.js
+++ b/polygerrit-ui/app/elements/admin/gr-repo-plugin-config/gr-repo-plugin-config_test.js
@@ -67,7 +67,7 @@
test('ARRAY type option', async () => {
element.pluginData = {
name: 'testName',
- config: {plugin: {value: 'test', type: 'ARRAY'}},
+ config: {plugin: {value: 'test', type: 'ARRAY', editable: true}},
};
await flush();
@@ -82,7 +82,7 @@
test('BOOLEAN type option', async () => {
element.pluginData = {
name: 'testName',
- config: {plugin: {value: 'true', type: 'BOOLEAN'}},
+ config: {plugin: {value: 'true', type: 'BOOLEAN', editable: true}},
};
await flush();
@@ -101,7 +101,7 @@
test('INT/LONG/STRING type option', async () => {
element.pluginData = {
name: 'testName',
- config: {plugin: {value: 'test', type: 'STRING'}},
+ config: {plugin: {value: 'test', type: 'STRING', editable: true}},
};
await flush();
@@ -122,7 +122,9 @@
const permitted_values = ['test', 'newTest'];
element.pluginData = {
name: 'testName',
- config: {plugin: {value: 'test', type: 'LIST', permitted_values}},
+ config: {plugin:
+ {value: 'test', type: 'LIST', editable: true, permitted_values},
+ },
};
await flush();
diff --git a/polygerrit-ui/app/elements/change/gr-change-metadata/gr-change-metadata.ts b/polygerrit-ui/app/elements/change/gr-change-metadata/gr-change-metadata.ts
index e06f664..08ad2bd 100644
--- a/polygerrit-ui/app/elements/change/gr-change-metadata/gr-change-metadata.ts
+++ b/polygerrit-ui/app/elements/change/gr-change-metadata/gr-change-metadata.ts
@@ -17,7 +17,6 @@
import '../../../styles/shared-styles';
import '../../../styles/gr-change-metadata-shared-styles';
import '../../../styles/gr-change-view-integration-shared-styles';
-import '../../../styles/gr-voting-styles';
import '../../plugins/gr-endpoint-decorator/gr-endpoint-decorator';
import '../../plugins/gr-endpoint-param/gr-endpoint-param';
import '../../plugins/gr-external-style/gr-external-style';
diff --git a/polygerrit-ui/app/elements/change/gr-change-summary/gr-change-summary.ts b/polygerrit-ui/app/elements/change/gr-change-summary/gr-change-summary.ts
index 97d8a37..63224ba 100644
--- a/polygerrit-ui/app/elements/change/gr-change-summary/gr-change-summary.ts
+++ b/polygerrit-ui/app/elements/change/gr-change-summary/gr-change-summary.ts
@@ -24,7 +24,8 @@
aPluginHasRegistered$,
CheckResult,
CheckRun,
- errorMessageLatest$,
+ ErrorMessages,
+ errorMessagesLatest$,
loginCallbackLatest$,
someProvidersAreLoadingLatest$,
} from '../../../services/checks/checks-model';
@@ -104,6 +105,10 @@
border-radius: 12px;
border: 1px solid gray;
vertical-align: top;
+ /* centered position of 20px chips in 24px line-height inline flow */
+ vertical-align: top;
+ position: relative;
+ top: 2px;
}
iron-icon {
width: var(--line-height-small);
@@ -187,7 +192,10 @@
var(--spacing-s);
border-radius: 12px;
border: 1px solid gray;
+ /* centered position of 20px chips in 24px line-height inline flow */
vertical-align: top;
+ position: relative;
+ top: 2px;
}
.checksChip .text {
display: inline-block;
@@ -335,7 +343,7 @@
someProvidersAreLoading = false;
@property()
- errorMessage?: string;
+ errorMessages: ErrorMessages = {};
@property()
loginCallback?: () => void;
@@ -347,7 +355,7 @@
this.subscribe('runs', allRunsLatestPatchsetLatestAttempt$);
this.subscribe('showChecksSummary', aPluginHasRegistered$);
this.subscribe('someProvidersAreLoading', someProvidersAreLoadingLatest$);
- this.subscribe('errorMessage', errorMessageLatest$);
+ this.subscribe('errorMessages', errorMessagesLatest$);
this.subscribe('loginCallback', loginCallbackLatest$);
}
@@ -372,7 +380,8 @@
.login {
display: flex;
color: var(--primary-text-color);
- padding: var(--spacing-s);
+ padding: 0 var(--spacing-s);
+ margin: var(--spacing-xs) 0;
width: 490px;
}
div.error {
@@ -383,9 +392,17 @@
width: 16px;
height: 16px;
position: relative;
- top: 2px;
+ top: 4px;
margin-right: var(--spacing-s);
}
+ div.error .right {
+ overflow: hidden;
+ }
+ div.error .right .message {
+ overflow: hidden;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+ }
.login {
justify-content: space-between;
background: var(--info-background);
@@ -398,8 +415,8 @@
}
td.key {
padding-right: var(--spacing-l);
- padding-bottom: var(--spacing-m);
- vertical-align: top;
+ padding-bottom: var(--spacing-s);
+ line-height: calc(var(--line-height-normal) + var(--spacing-s));
}
td.value {
padding-right: var(--spacing-l);
@@ -432,23 +449,26 @@
];
}
- renderChecksError() {
- if (!this.errorMessage) return;
- return html`
- <div class="error zeroState">
- <div class="left">
- <iron-icon icon="gr-icons:error"></iron-icon>
- </div>
- <div class="right">
- <div>Error while fetching check results</div>
- <div>${this.errorMessage}</div>
- </div>
- </div>
- `;
+ renderErrorMessages() {
+ return Object.entries(this.errorMessages).map(
+ ([plugin, message]) =>
+ html`
+ <div class="error zeroState">
+ <div class="left">
+ <iron-icon icon="gr-icons:error"></iron-icon>
+ </div>
+ <div class="right">
+ <div class="message" title="${message}">
+ Error while fetching results for ${plugin}: ${message}
+ </div>
+ </div>
+ </div>
+ `
+ );
}
renderChecksLogin() {
- if (this.errorMessage || !this.loginCallback) return;
+ if (!this.loginCallback) return;
return html`
<div class="login">
<div class="left">
@@ -466,14 +486,14 @@
}
renderChecksZeroState() {
- if (this.errorMessage || this.loginCallback) return;
+ if (Object.keys(this.errorMessages).length > 0) return;
+ if (this.loginCallback) return;
if (this.runs.some(isRunningOrHasCompleted)) return;
const msg = this.someProvidersAreLoading ? 'Loading results' : 'No results';
return html`<span role="status" class="loading zeroState">${msg}</span>`;
}
renderChecksChipForCategory(category: Category) {
- if (this.errorMessage || this.loginCallback) return;
const runs = this.runs.filter(run => {
if (hasResultsOf(run, category)) return true;
return category === Category.SUCCESS && hasCompletedWithoutResults(run);
@@ -486,7 +506,6 @@
}
renderChecksChipRunning() {
- if (this.errorMessage || this.loginCallback) return;
const runs = this.runs.filter(isRunning);
return this.renderChecksChipsExpanded(runs, RunStatus.RUNNING, () => []);
}
@@ -616,7 +635,6 @@
<td class="key">Checks</td>
<td class="value">
<div class="checksSummary">
- ${this.renderChecksError()}${this.renderChecksLogin()}
${this.renderChecksZeroState()}${this.renderChecksChipForCategory(
Category.ERROR
)}${this.renderChecksChipForCategory(
@@ -632,6 +650,7 @@
class="loadingSpin"
?hidden="${!this.someProvidersAreLoading}"
></span>
+ ${this.renderErrorMessages()}${this.renderChecksLogin()}
</div>
</td>
</tr>
diff --git a/polygerrit-ui/app/elements/change/gr-change-view/gr-change-view.ts b/polygerrit-ui/app/elements/change/gr-change-view/gr-change-view.ts
index 5ec35c4..e8d07db 100644
--- a/polygerrit-ui/app/elements/change/gr-change-view/gr-change-view.ts
+++ b/polygerrit-ui/app/elements/change/gr-change-view/gr-change-view.ts
@@ -1811,8 +1811,9 @@
this.restApiService.getChange(changeId)
)
).then(changes => {
+ // if a change is deleted then getChanges returns null for that changeId
changes = changes.filter(
- change => change?.status !== ChangeStatus.ABANDONED
+ change => change && change.status !== ChangeStatus.ABANDONED
);
if (!changes.length) return;
const submittedRevert = changes.find(
diff --git a/polygerrit-ui/app/elements/change/gr-file-list/gr-file-list.ts b/polygerrit-ui/app/elements/change/gr-file-list/gr-file-list.ts
index 0427e9e..45cd490 100644
--- a/polygerrit-ui/app/elements/change/gr-file-list/gr-file-list.ts
+++ b/polygerrit-ui/app/elements/change/gr-file-list/gr-file-list.ts
@@ -1434,11 +1434,9 @@
);
// Find the paths introduced by the new index splices:
- const newFiles = record.indexSplices
- .map(splice =>
- splice.object.slice(splice.index, splice.index + splice.addedCount)
- )
- .reduce((acc, paths) => acc.concat(paths), []);
+ const newFiles = record.indexSplices.flatMap(splice =>
+ splice.object.slice(splice.index, splice.index + splice.addedCount)
+ );
// Required so that the newly created diff view is included in this.diffs.
flush();
diff --git a/polygerrit-ui/app/elements/change/gr-label-score-row/gr-label-score-row.ts b/polygerrit-ui/app/elements/change/gr-label-score-row/gr-label-score-row.ts
index 02416ff..9a38095 100644
--- a/polygerrit-ui/app/elements/change/gr-label-score-row/gr-label-score-row.ts
+++ b/polygerrit-ui/app/elements/change/gr-label-score-row/gr-label-score-row.ts
@@ -16,7 +16,6 @@
*/
import '@polymer/iron-selector/iron-selector';
import '../../shared/gr-button/gr-button';
-import '../../../styles/gr-voting-styles';
import '../../../styles/shared-styles';
import {PolymerElement} from '@polymer/polymer/polymer-element';
import {htmlTemplate} from './gr-label-score-row_html';
diff --git a/polygerrit-ui/app/elements/change/gr-label-score-row/gr-label-score-row_html.ts b/polygerrit-ui/app/elements/change/gr-label-score-row/gr-label-score-row_html.ts
index c53f386..f9d21d9 100644
--- a/polygerrit-ui/app/elements/change/gr-label-score-row/gr-label-score-row_html.ts
+++ b/polygerrit-ui/app/elements/change/gr-label-score-row/gr-label-score-row_html.ts
@@ -17,9 +17,6 @@
import {html} from '@polymer/polymer/lib/utils/html-tag';
export const htmlTemplate = html`
- <style include="gr-voting-styles">
- /* Workaround for empty style block - see https://github.com/Polymer/tools/issues/408 */
- </style>
<style include="shared-styles">
.labelNameCell,
.buttonsCell,
@@ -48,58 +45,35 @@
gr-button {
min-width: 42px;
box-sizing: border-box;
- --gr-button: {
- background-color: var(
- --button-background-color,
- var(--table-header-background-color)
- );
- padding: 0 var(--spacing-m);
- @apply --vote-chip-styles;
- }
+ }
+ gr-button::part(paper-button) {
+ background-color: var(
+ --button-background-color,
+ var(--table-header-background-color)
+ );
+ padding: 0 var(--spacing-m);
}
gr-button.iron-selected[vote='max'] {
--button-background-color: var(--vote-color-approved);
}
gr-button.iron-selected[vote='positive'] {
--button-background-color: var(--vote-color-recommended);
- --gr-button: {
- padding: 0 var(--spacing-m);
- border-style: solid;
- border-color: var(--vote-outline-recommended);
- border-top-left-radius: 1em;
- border-top-right-radius: 1em;
- border-bottom-right-radius: 1em;
- border-bottom-left-radius: 1em;
- border-top-width: 1px;
- border-right-width: 1px;
- border-bottom-width: 1px;
- border-left-width: 1px;
- color: var(--chip-color);
- }
}
gr-button.iron-selected[vote='min'] {
--button-background-color: var(--vote-color-rejected);
}
gr-button.iron-selected[vote='negative'] {
--button-background-color: var(--vote-color-disliked);
- --gr-button: {
- padding: 0 var(--spacing-m);
- border-style: solid;
- border-color: var(--vote-outline-disliked);
- border-top-left-radius: 1em;
- border-top-right-radius: 1em;
- border-bottom-right-radius: 1em;
- border-bottom-left-radius: 1em;
- border-top-width: 1px;
- border-right-width: 1px;
- border-bottom-width: 1px;
- border-left-width: 1px;
- color: var(--chip-color);
- }
}
gr-button.iron-selected[vote='neutral'] {
--button-background-color: var(--vote-color-neutral);
}
+ gr-button.iron-selected[vote='positive']::part(paper-button) {
+ border-color: var(--vote-outline-recommended);
+ }
+ gr-button.iron-selected[vote='negative']::part(paper-button) {
+ border-color: var(--vote-outline-disliked);
+ }
.placeholder {
display: inline-block;
width: 42px;
@@ -145,6 +119,7 @@
<gr-button
role="radio"
vote$="[[_computeVoteAttribute(value, index, _items.length)]]"
+ vote-chip
has-tooltip=""
data-name$="[[label.name]]"
data-value$="[[value]]"
diff --git a/polygerrit-ui/app/elements/change/gr-message/gr-message.ts b/polygerrit-ui/app/elements/change/gr-message/gr-message.ts
index 94295d0..b4e85a9 100644
--- a/polygerrit-ui/app/elements/change/gr-message/gr-message.ts
+++ b/polygerrit-ui/app/elements/change/gr-message/gr-message.ts
@@ -22,7 +22,6 @@
import '../../shared/gr-date-formatter/gr-date-formatter';
import '../../shared/gr-formatted-text/gr-formatted-text';
import '../../../styles/shared-styles';
-import '../../../styles/gr-voting-styles';
import {PolymerElement} from '@polymer/polymer/polymer-element';
import {htmlTemplate} from './gr-message_html';
import {MessageTag, SpecialFilePath} from '../../../constants/constants';
@@ -181,7 +180,7 @@
@property({
type: String,
computed:
- '_computeMessageContentExpanded(message.message,' +
+ '_computeMessageContentExpanded(_expanded, message.message,' +
' message.accounts_in_message,' +
' message.tag)',
})
@@ -241,10 +240,12 @@
}
_computeMessageContentExpanded(
+ expanded: boolean,
content?: string,
accountsInMessage?: AccountInfo[],
tag?: ReviewInputTag
) {
+ if (!expanded) return '';
return this._computeMessageContent(true, content, accountsInMessage, tag);
}
@@ -278,9 +279,11 @@
tag?: ReviewInputTag,
commentThreads?: CommentThread[]
) {
+ // Content is under text-overflow, so it's always shorten
+ const shortenedContent = content?.substring(0, 1000);
const summary = this._computeMessageContent(
false,
- content,
+ shortenedContent,
accountsInMessage,
tag
);
diff --git a/polygerrit-ui/app/elements/change/gr-message/gr-message_html.ts b/polygerrit-ui/app/elements/change/gr-message/gr-message_html.ts
index 9e24a09..ddbd22e 100644
--- a/polygerrit-ui/app/elements/change/gr-message/gr-message_html.ts
+++ b/polygerrit-ui/app/elements/change/gr-message/gr-message_html.ts
@@ -17,9 +17,6 @@
import {html} from '@polymer/polymer/lib/utils/html-tag';
export const htmlTemplate = html`
- <style include="gr-voting-styles">
- /* Workaround for empty style block - see https://github.com/Polymer/tools/issues/408 */
- </style>
<style>
:host {
display: block;
@@ -248,13 +245,13 @@
<template is="dom-if" if="[[message.message]]">
<div class="content messageContent">
<div class="message hideOnOpen">[[_messageContentCollapsed]]</div>
- <gr-formatted-text
- noTrailingMargin
- class="message hideOnCollapsed"
- content="[[_messageContentExpanded]]"
- config="[[_projectConfig.commentlinks]]"
- ></gr-formatted-text>
<template is="dom-if" if="[[_expanded]]">
+ <gr-formatted-text
+ noTrailingMargin
+ class="message hideOnCollapsed"
+ content="[[_messageContentExpanded]]"
+ config="[[_projectConfig.commentlinks]]"
+ ></gr-formatted-text>
<template is="dom-if" if="[[_messageContentExpanded]]">
<div
class="replyActionContainer"
@@ -284,8 +281,8 @@
</template>
<gr-thread-list
change="[[change]]"
- hidden$="[[!message.commentThreads.length]]"
- threads="[[message.commentThreads]]"
+ hidden$="[[!commentThreads.length]]"
+ threads="[[commentThreads]]"
change-num="[[changeNum]]"
logged-in="[[_loggedIn]]"
hide-dropdown
diff --git a/polygerrit-ui/app/elements/change/gr-related-changes-list/gr-related-changes-list_test.ts b/polygerrit-ui/app/elements/change/gr-related-changes-list/gr-related-changes-list_test.ts
index 15bc6bf..e38e0ae 100644
--- a/polygerrit-ui/app/elements/change/gr-related-changes-list/gr-related-changes-list_test.ts
+++ b/polygerrit-ui/app/elements/change/gr-related-changes-list/gr-related-changes-list_test.ts
@@ -74,9 +74,9 @@
v: boolean;
}>
) {
- return instructions
- .map(inst => Array.from({length: inst.len}, () => inst.v))
- .reduce((acc, val) => acc.concat(val), []);
+ return instructions.flatMap(inst =>
+ Array.from({length: inst.len}, () => inst.v)
+ );
}
function checkShowWhenCollapsed(
diff --git a/polygerrit-ui/app/elements/change/gr-submit-requirement-hovercard/gr-submit-requirement-hovercard.ts b/polygerrit-ui/app/elements/change/gr-submit-requirement-hovercard/gr-submit-requirement-hovercard.ts
new file mode 100644
index 0000000..096cb0d
--- /dev/null
+++ b/polygerrit-ui/app/elements/change/gr-submit-requirement-hovercard/gr-submit-requirement-hovercard.ts
@@ -0,0 +1,88 @@
+/**
+ * @license
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * 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
+ *
+ * http://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.
+ */
+
+import '../../shared/gr-hovercard/gr-hovercard-shared-style';
+import {PolymerElement} from '@polymer/polymer/polymer-element';
+import {customElement, property} from '@polymer/decorators';
+import {hovercardBehaviorMixin} from '../../shared/gr-hovercard/gr-hovercard-behavior';
+import {htmlTemplate} from './gr-submit-requirement-hovercard_html';
+import {
+ AccountInfo,
+ SubmitRequirementResultInfo,
+ SubmitRequirementStatus,
+} from '../../../api/rest-api';
+import {
+ extractAssociatedLabels,
+ iconForStatus,
+} from '../../../utils/label-util';
+import {ParsedChangeInfo} from '../../../types/types';
+import {Label} from '../gr-change-requirements/gr-change-requirements';
+
+@customElement('gr-submit-requirement-hovercard')
+export class GrHovercardRun extends hovercardBehaviorMixin(PolymerElement) {
+ static get template() {
+ return htmlTemplate;
+ }
+
+ @property({type: Object})
+ requirement?: SubmitRequirementResultInfo;
+
+ @property({type: Object})
+ change?: ParsedChangeInfo;
+
+ @property({type: Object})
+ account?: AccountInfo;
+
+ @property({type: Boolean})
+ mutable?: boolean;
+
+ @property({type: Array, computed: 'computeLabels(change, requirement)'})
+ _labels: Label[] = [];
+
+ computeLabels(
+ change?: ParsedChangeInfo,
+ requirement?: SubmitRequirementResultInfo
+ ) {
+ if (!requirement) return [];
+ const requirementLabels = extractAssociatedLabels(requirement);
+ const labels = change?.labels ?? {};
+
+ const allLabels: Label[] = [];
+
+ for (const label of Object.keys(labels)) {
+ if (requirementLabels.includes(label)) {
+ allLabels.push({
+ labelName: label,
+ icon: '',
+ style: '',
+ labelInfo: labels[label],
+ });
+ }
+ }
+ return allLabels;
+ }
+
+ computeIcon(status: SubmitRequirementStatus) {
+ return iconForStatus(status);
+ }
+}
+
+declare global {
+ interface HTMLElementTagNameMap {
+ 'gr-submit-requirement-hovercard': GrHovercardRun;
+ }
+}
diff --git a/polygerrit-ui/app/elements/change/gr-submit-requirement-hovercard/gr-submit-requirement-hovercard_html.ts b/polygerrit-ui/app/elements/change/gr-submit-requirement-hovercard/gr-submit-requirement-hovercard_html.ts
new file mode 100644
index 0000000..da7b780
--- /dev/null
+++ b/polygerrit-ui/app/elements/change/gr-submit-requirement-hovercard/gr-submit-requirement-hovercard_html.ts
@@ -0,0 +1,114 @@
+/**
+ * @license
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * 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
+ *
+ * http://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.
+ */
+import {html} from '@polymer/polymer/lib/utils/html-tag';
+
+export const htmlTemplate = html`
+ <style include="gr-hovercard-shared-style">
+ #container {
+ min-width: 356px;
+ max-width: 356px;
+ padding: var(--spacing-xl) 0 var(--spacing-m) 0;
+ }
+ section.label {
+ display: table-row;
+ }
+ .label-title {
+ min-width: 10em;
+ padding-top: var(--spacing-s);
+ }
+ .label-value {
+ padding-top: var(--spacing-s);
+ }
+ .label-title,
+ .label-value {
+ display: table-cell;
+ vertical-align: top;
+ }
+ .row {
+ display: flex;
+ margin-top: var(--spacing-s);
+ }
+ .title {
+ color: var(--deemphasized-text-color);
+ margin-right: var(--spacing-m);
+ }
+ div.section {
+ margin: 0 var(--spacing-xl) var(--spacing-m) var(--spacing-xl);
+ display: flex;
+ }
+ div.sectionIcon iron-icon {
+ position: relative;
+ top: 2px;
+ width: 20px;
+ height: 20px;
+ }
+ iron-icon.check {
+ color: var(--success-foreground);
+ }
+ iron-icon.close {
+ color: var(--warning-foreground);
+ }
+ </style>
+ <div id="container" role="tooltip" tabindex="-1">
+ <div class="section">
+ <div class="sectionIcon">
+ <iron-icon
+ class$="[[computeIcon(requirement.status)]]"
+ icon="gr-icons:[[computeIcon(requirement.status)]]"
+ ></iron-icon>
+ </div>
+ <div class="sectionContent">
+ <h3 class="name heading-3">
+ <span>[[requirement.name]]</span>
+ </h3>
+ </div>
+ </div>
+ <div class="section">
+ <div class="sectionIcon">
+ <iron-icon class="small" icon="gr-icons:info-outline"></iron-icon>
+ </div>
+ <div class="sectionContent">
+ <div class="row">
+ <div class="title">Status</div>
+ <div>[[requirement.status]]</div>
+ </div>
+ </div>
+ </div>
+ <div class="section">
+ <template is="dom-repeat" items="[[_labels]]">
+ <section class="label">
+ <div class="label-title">
+ <gr-limited-text
+ class="name"
+ limit="25"
+ text="[[item.labelName]]"
+ ></gr-limited-text>
+ </div>
+ <div class="label-value">
+ <gr-label-info
+ change="{{change}}"
+ account="[[account]]"
+ mutable="[[mutable]]"
+ label="[[item.labelName]]"
+ label-info="[[item.labelInfo]]"
+ ></gr-label-info>
+ </div>
+ </section>
+ </template>
+ </div>
+ </div>
+`;
diff --git a/polygerrit-ui/app/elements/change/gr-submit-requirements/gr-submit-requirements.ts b/polygerrit-ui/app/elements/change/gr-submit-requirements/gr-submit-requirements.ts
index 47f6e85..8e82cb3 100644
--- a/polygerrit-ui/app/elements/change/gr-submit-requirements/gr-submit-requirements.ts
+++ b/polygerrit-ui/app/elements/change/gr-submit-requirements/gr-submit-requirements.ts
@@ -14,17 +14,22 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
+import '../gr-submit-requirement-hovercard/gr-submit-requirement-hovercard';
import {GrLitElement} from '../../lit/gr-lit-element';
import {css, customElement, html, property} from 'lit-element';
import {ParsedChangeInfo} from '../../../types/types';
import {
AccountInfo,
+ isDetailedLabelInfo,
+ LabelNameToInfoMap,
SubmitRequirementResultInfo,
SubmitRequirementStatus,
} from '../../../api/rest-api';
-import {assertNever} from '../../../utils/common-util';
-import {extractAssociatedLabels} from '../../../utils/change-metadata-util';
-import {Label} from '../gr-change-requirements/gr-change-requirements';
+import {unique} from '../../../utils/common-util';
+import {
+ extractAssociatedLabels,
+ iconForStatus,
+} from '../../../utils/label-util';
@customElement('gr-submit-requirements')
export class GrSubmitRequirements extends GrLitElement {
@@ -61,11 +66,13 @@
padding: var(--spacing-s) 0 0 0;
}
.title,
- .value,
.status {
display: table-cell;
vertical-align: top;
}
+ .value {
+ display: inline-flex;
+ }
.status {
width: var(--line-height-small);
padding: var(--spacing-s) var(--spacing-m) 0
@@ -75,10 +82,10 @@
width: var(--line-height-small);
height: var(--line-height-small);
}
- iron-icon.satisfied {
+ iron-icon.check {
color: var(--success-foreground);
}
- iron-icon.unsatisfied {
+ iron-icon.close {
color: var(--warning-foreground);
}
.testing {
@@ -106,6 +113,12 @@
return html`<h3 class="metadata-title">Submit Requirements</h3>
${submit_requirements.map(
requirement => html`<section>
+ <gr-submit-requirement-hovercard
+ .requirement="${requirement}"
+ .change="${this.change}"
+ .account="${this.account}"
+ .mutable="${this.mutable}"
+ ></gr-submit-requirement-hovercard>
<div class="status">${this.renderStatus(requirement.status)}</div>
<div class="title">
<gr-limited-text
@@ -114,62 +127,66 @@
text="${requirement.name}"
></gr-limited-text>
</div>
- <div class="value">${this.renderLabels(requirement)}</div>
+ <div class="value">${this.renderVotes(requirement)}</div>
</section>`
+ )}
+ ${this.renderTriggerVotes(
+ submit_requirements
)}${this.renderFakeControls()}`;
}
renderStatus(status: SubmitRequirementStatus) {
- let grIcon: string;
- switch (status) {
- case SubmitRequirementStatus.SATISFIED:
- grIcon = 'gr-icons:check';
- break;
- case SubmitRequirementStatus.UNSATISFIED:
- grIcon = 'gr-icons:close';
- break;
- case SubmitRequirementStatus.OVERRIDDEN:
- grIcon = 'gr-icons:warning';
- break;
- case SubmitRequirementStatus.NOT_APPLICABLE:
- grIcon = 'gr-icons:info';
- break;
- default:
- assertNever(status, `Unsupported status: ${status}`);
- }
+ const icon = iconForStatus(status);
return html`<iron-icon
- class=${status.toLowerCase()}
- icon="${grIcon}"
+ class="${icon}"
+ icon="gr-icons:${icon}"
></iron-icon>`;
}
- renderLabels(requirement: SubmitRequirementResultInfo) {
+ renderVotes(requirement: SubmitRequirementResultInfo) {
const requirementLabels = extractAssociatedLabels(requirement);
const labels = this.change?.labels ?? {};
- const allLabels: Label[] = [];
+ return Object.keys(labels)
+ .filter(label => requirementLabels.includes(label))
+ .map(label => this.renderLabelVote(label, labels));
+ }
- for (const label of Object.keys(labels)) {
- if (requirementLabels.includes(label)) {
- allLabels.push({
- labelName: label,
- icon: '',
- style: '',
- labelInfo: labels[label],
- });
- }
- }
- return allLabels.map(
- label => html`<gr-label-info
- .change="${this.change}"
- .account="${this.account}"
- .mutable="${this.mutable}"
- label="${label.labelName}"
- .labelInfo="${label.labelInfo}"
- ></gr-label-info>`
+ renderLabelVote(label: string, labels: LabelNameToInfoMap) {
+ const labelInfo = labels[label];
+ if (!isDetailedLabelInfo(labelInfo)) return;
+ return (labelInfo.all ?? []).map(
+ approvalInfo =>
+ html`<gr-vote-chip
+ .vote="${approvalInfo}"
+ .label="${labelInfo}"
+ ></gr-vote-chip>`
);
}
+ renderTriggerVotes(submitReqs: SubmitRequirementResultInfo[]) {
+ const labels = this.change?.labels ?? {};
+ const allLabels = Object.keys(labels);
+ const labelAssociatedWithSubmitReqs = submitReqs
+ .flatMap(req => extractAssociatedLabels(req))
+ .filter(unique);
+ const triggerVotes = allLabels.filter(
+ label => !labelAssociatedWithSubmitReqs.includes(label)
+ );
+ if (!triggerVotes.length) return;
+ return html`<h3 class="metadata-title">Trigger Votes</h3>
+ ${triggerVotes.map(
+ label => html`${label}:
+ <gr-label-info
+ .change="${this.change}"
+ .account="${this.account}"
+ .mutable="${this.mutable}"
+ label="${label}"
+ .labelInfo="${labels[label]}"
+ ></gr-label-info>`
+ )}`;
+ }
+
renderFakeControls() {
return html`
<div class="testing">
diff --git a/polygerrit-ui/app/elements/checks/gr-checks-runs.ts b/polygerrit-ui/app/elements/checks/gr-checks-runs.ts
index 250b035..eb4b1e4 100644
--- a/polygerrit-ui/app/elements/checks/gr-checks-runs.ts
+++ b/polygerrit-ui/app/elements/checks/gr-checks-runs.ts
@@ -43,7 +43,8 @@
allRunsSelectedPatchset$,
CheckRun,
ChecksPatchset,
- errorMessageLatest$,
+ ErrorMessages,
+ errorMessagesLatest$,
fakeActions,
fakeLinks,
fakeRun0,
@@ -380,7 +381,7 @@
tabState?: ChecksTabState;
@property()
- errorMessage?: string;
+ errorMessages: ErrorMessages = {};
@property()
loginCallback?: () => void;
@@ -392,7 +393,7 @@
constructor() {
super();
this.subscribe('runs', allRunsSelectedPatchset$);
- this.subscribe('errorMessage', errorMessageLatest$);
+ this.subscribe('errorMessages', errorMessagesLatest$);
this.subscribe('loginCallback', loginCallbackLatest$);
}
@@ -469,6 +470,7 @@
padding: var(--spacing-m);
color: var(--primary-text-color);
margin-top: var(--spacing-m);
+ max-width: 400px;
}
.error {
display: flex;
@@ -522,7 +524,7 @@
<div class="flex-space"></div>
${this.renderTitleButtons()} ${this.renderCollapseButton()}
</h2>
- ${this.renderError()} ${this.renderSignIn()}
+ ${this.renderErrors()} ${this.renderSignIn()}
<input
id="filterInput"
type="text"
@@ -536,23 +538,26 @@
`;
}
- private renderError() {
- if (!this.errorMessage) return;
- return html`
- <div class="error">
- <div class="left">
- <iron-icon icon="gr-icons:error"></iron-icon>
- </div>
- <div class="right">
- <div>Error while fetching check results</div>
- <div>${this.errorMessage}</div>
- </div>
- </div>
- `;
+ private renderErrors() {
+ return Object.entries(this.errorMessages).map(
+ ([plugin, message]) =>
+ html`
+ <div class="error">
+ <div class="left">
+ <iron-icon icon="gr-icons:error"></iron-icon>
+ </div>
+ <div class="right">
+ <div class="message">
+ Error while fetching results for ${plugin}:<br />${message}
+ </div>
+ </div>
+ </div>
+ `
+ );
}
private renderSignIn() {
- if (this.errorMessage || !this.loginCallback) return;
+ if (!this.loginCallback) return;
return html`
<div class="login">
<div>
diff --git a/polygerrit-ui/app/elements/core/gr-account-dropdown/gr-account-dropdown.ts b/polygerrit-ui/app/elements/core/gr-account-dropdown/gr-account-dropdown.ts
index 881eb28..4d3511d 100644
--- a/polygerrit-ui/app/elements/core/gr-account-dropdown/gr-account-dropdown.ts
+++ b/polygerrit-ui/app/elements/core/gr-account-dropdown/gr-account-dropdown.ts
@@ -111,17 +111,17 @@
<gr-dropdown
link=""
.items="${this.links}"
- .top-content="${this.topContent}"
+ .topContent="${this.topContent}"
@tap-item-shortcuts=${this._handleShortcutsTap}
- .horizontal-align="right"
+ .horizontalAlign=${'right'}
>
- <span ?hidden=${this._hasAvatars}
+ <span ?hidden="${this._hasAvatars}"
>${this._accountName(this.account)}</span
>
<gr-avatar
.account="${this.account}"
?hidden=${!this._hasAvatars}
- .imageSize="56"
+ .imageSize=${56}
aria-label="Account avatar"
></gr-avatar>
</gr-dropdown>`;
diff --git a/polygerrit-ui/app/elements/core/gr-error-manager/gr-error-manager_test.ts b/polygerrit-ui/app/elements/core/gr-error-manager/gr-error-manager_test.ts
index 3ccc960..e5e8b01 100644
--- a/polygerrit-ui/app/elements/core/gr-error-manager/gr-error-manager_test.ts
+++ b/polygerrit-ui/app/elements/core/gr-error-manager/gr-error-manager_test.ts
@@ -30,6 +30,7 @@
} from '../../../test/test-data-generators';
import {tap} from '@polymer/iron-test-helpers/mock-interactions';
import {AccountId} from '../../../types/common';
+import {waitUntil} from '../../../test/test-utils';
const basicFixture = fixtureFromElement('gr-error-manager');
@@ -487,7 +488,7 @@
assert.include(toast.shadowRoot.textContent, 'second-test');
});
- test('regular toast should not dismiss auth toast', done => {
+ test('regular toast should not dismiss auth toast', async () => {
// Set status to AUTHED.
appContext.authService.authCheck();
const responseText = Promise.resolve('Authentication required\n');
@@ -509,37 +510,34 @@
})
);
assert.equal(fetchStub.callCount, 1);
- flush(() => {
- // here needs two flush as there are two chained
- // promises on server-error handler and flush only flushes one
- assert.equal(fetchStub.callCount, 2);
- flush(() => {
- let toast = toastSpy.lastCall.returnValue;
- assert.include(toast.shadowRoot.textContent, 'Credentials expired.');
- assert.include(toast.shadowRoot.textContent, 'Refresh credentials');
+ await flush();
- // fake an alert
- element.dispatchEvent(
- new CustomEvent('show-alert', {
- detail: {
- message: 'test-alert',
- action: 'reload',
- },
- composed: true,
- bubbles: true,
- })
- );
- flush(() => {
- toast = toastSpy.lastCall.returnValue;
- assert.isOk(toast);
- assert.include(
- toast.shadowRoot.textContent,
- 'Credentials expired.'
- );
- done();
- });
- });
- });
+ // here needs two flush as there are two chained
+ // promises on server-error handler and flush only flushes one
+ assert.equal(fetchStub.callCount, 2);
+ await flush();
+ await waitUntil(() => toastSpy.calledOnce);
+ let toast = toastSpy.lastCall.returnValue;
+ assert.include(toast.shadowRoot.textContent, 'Credentials expired.');
+ assert.include(toast.shadowRoot.textContent, 'Refresh credentials');
+
+ // fake an alert
+ element.dispatchEvent(
+ new CustomEvent('show-alert', {
+ detail: {
+ message: 'test-alert',
+ action: 'reload',
+ },
+ composed: true,
+ bubbles: true,
+ })
+ );
+
+ await flush();
+ assert.isTrue(toastSpy.calledOnce);
+ toast = toastSpy.lastCall.returnValue;
+ assert.isOk(toast);
+ assert.include(toast.shadowRoot.textContent, 'Credentials expired.');
});
test('show alert', () => {
@@ -609,7 +607,7 @@
// assert.isTrue(hideStub.calledOnce);
});
- test('show-error', () => {
+ test('show-error', async () => {
const openStub = sinon.stub(element.$.errorOverlay, 'open');
const closeStub = sinon.stub(element.$.errorOverlay, 'close');
const reportStub = stubReporting('reportErrorDialog');
@@ -622,7 +620,7 @@
bubbles: true,
})
);
- flush();
+ await flush();
assert.isTrue(openStub.called);
assert.isTrue(reportStub.called);
@@ -634,12 +632,12 @@
bubbles: true,
})
);
- flush();
+ await flush();
assert.isTrue(closeStub.called);
});
- test('reloads when refreshed credentials differ', done => {
+ test('reloads when refreshed credentials differ', async () => {
const accountPromise = Promise.resolve({
...createAccountDetailWithId(1234),
});
@@ -655,12 +653,11 @@
element._refreshingCredentials = true;
element._checkSignedIn();
- flush(() => {
- assert.isFalse(requestCheckStub.called);
- assert.isFalse(handleRefreshStub.called);
- assert.isTrue(reloadStub.called);
- done();
- });
+ await flush();
+
+ assert.isFalse(requestCheckStub.called);
+ assert.isFalse(handleRefreshStub.called);
+ assert.isTrue(reloadStub.called);
});
});
@@ -678,7 +675,7 @@
});
});
- test('refresh loop continues on credential fail', done => {
+ test('refresh loop continues on credential fail', async () => {
const requestCheckStub = sinon.stub(element, '_requestCheckLoggedIn');
const handleRefreshStub = sinon.stub(
element,
@@ -689,12 +686,10 @@
element._refreshingCredentials = true;
element._checkSignedIn();
- flush(() => {
- assert.isTrue(requestCheckStub.called);
- assert.isFalse(handleRefreshStub.called);
- assert.isFalse(reloadStub.called);
- done();
- });
+ await flush();
+ assert.isTrue(requestCheckStub.called);
+ assert.isFalse(handleRefreshStub.called);
+ assert.isFalse(reloadStub.called);
});
});
});
diff --git a/polygerrit-ui/app/elements/diff/gr-apply-fix-dialog/gr-apply-fix-dialog.ts b/polygerrit-ui/app/elements/diff/gr-apply-fix-dialog/gr-apply-fix-dialog.ts
index aa01c5f..6dd67e4 100644
--- a/polygerrit-ui/app/elements/diff/gr-apply-fix-dialog/gr-apply-fix-dialog.ts
+++ b/polygerrit-ui/app/elements/diff/gr-apply-fix-dialog/gr-apply-fix-dialog.ts
@@ -102,7 +102,7 @@
layers = appContext.flagsService.isEnabled(
KnownExperimentId.TOKEN_HIGHLIGHTING
)
- ? [new TokenHighlightLayer()]
+ ? [new TokenHighlightLayer(this)]
: [];
private refitOverlay?: () => void;
diff --git a/polygerrit-ui/app/elements/diff/gr-diff-builder/gr-diff-builder-side-by-side.ts b/polygerrit-ui/app/elements/diff/gr-diff-builder/gr-diff-builder-side-by-side.ts
index 057b926..bd7dc29 100644
--- a/polygerrit-ui/app/elements/diff/gr-diff-builder/gr-diff-builder-side-by-side.ts
+++ b/polygerrit-ui/app/elements/diff/gr-diff-builder/gr-diff-builder-side-by-side.ts
@@ -39,6 +39,7 @@
numberOfCells: 4,
movedOutIndex: 1,
movedInIndex: 3,
+ lineNumberCols: [0, 2],
};
}
diff --git a/polygerrit-ui/app/elements/diff/gr-diff-builder/gr-diff-builder-unified.ts b/polygerrit-ui/app/elements/diff/gr-diff-builder/gr-diff-builder-unified.ts
index b2dfa61..a7b3a42 100644
--- a/polygerrit-ui/app/elements/diff/gr-diff-builder/gr-diff-builder-unified.ts
+++ b/polygerrit-ui/app/elements/diff/gr-diff-builder/gr-diff-builder-unified.ts
@@ -38,6 +38,7 @@
numberOfCells: 3,
movedOutIndex: 2,
movedInIndex: 2,
+ lineNumberCols: [0, 1],
};
}
diff --git a/polygerrit-ui/app/elements/diff/gr-diff-builder/gr-diff-builder.ts b/polygerrit-ui/app/elements/diff/gr-diff-builder/gr-diff-builder.ts
index 869faa8..294a78e 100644
--- a/polygerrit-ui/app/elements/diff/gr-diff-builder/gr-diff-builder.ts
+++ b/polygerrit-ui/app/elements/diff/gr-diff-builder/gr-diff-builder.ts
@@ -683,6 +683,7 @@
numberOfCells: number;
movedOutIndex: number;
movedInIndex: number;
+ lineNumberCols: number[];
};
/**
@@ -776,7 +777,7 @@
_buildMoveControls(group: GrDiffGroup) {
const movedIn = group.adds.length > 0;
- const {numberOfCells, movedOutIndex, movedInIndex} =
+ const {numberOfCells, movedOutIndex, movedInIndex, lineNumberCols} =
this._getMoveControlsConfig();
let controlsClass;
@@ -794,6 +795,9 @@
const cells = [...Array(numberOfCells).keys()].map(() =>
this._createElement('td')
);
+ lineNumberCols.forEach(index => {
+ cells[index].classList.add('moveControlsLineNumCol');
+ });
const moveRangeHeader = this._createElement('gr-range-header');
moveRangeHeader.setAttribute('icon', 'gr-icons:move-item');
diff --git a/polygerrit-ui/app/elements/diff/gr-diff-builder/token-highlight-layer.ts b/polygerrit-ui/app/elements/diff/gr-diff-builder/token-highlight-layer.ts
index 647f701..8865843 100644
--- a/polygerrit-ui/app/elements/diff/gr-diff-builder/token-highlight-layer.ts
+++ b/polygerrit-ui/app/elements/diff/gr-diff-builder/token-highlight-layer.ts
@@ -31,7 +31,7 @@
/** CSS class for the currently hovered token. */
const CSS_HIGHLIGHT = 'token-highlight';
-const HOVER_DELAY_MS = 200;
+export const HOVER_DELAY_MS = 200;
const LINE_LENGTH_LIMIT = 500;
@@ -96,9 +96,9 @@
private updateTokenTask?: DelayedTask;
- constructor() {
- window.addEventListener('click', _ => {
- this.handleWindowClick();
+ constructor(container: HTMLElement = document.documentElement) {
+ container.addEventListener('click', _ => {
+ this.handleMouseClick();
});
}
@@ -165,7 +165,7 @@
private handleMouseOut(e: MouseEvent) {
// If there's no ongoing hover-task, terminate early.
if (!this.updateTokenTask?.isActive()) return;
- if (this.interferesWithSelection(e)) return;
+ if (e.buttons > 0 || this.interferesWithSelection()) return;
const {element} = this.findTokenAncestor(e?.target);
if (!element) return;
if (element === this.hoveredElement) {
@@ -177,7 +177,7 @@
}
private handleMouseOver(e: MouseEvent) {
- if (this.interferesWithSelection(e)) return;
+ if (e.buttons > 0 || this.interferesWithSelection()) return;
const {
line,
token: newHighlight,
@@ -195,18 +195,17 @@
);
}
- private interferesWithSelection(e: MouseEvent) {
- if (e.buttons > 0) return true;
- if (window.getSelection()?.type === 'Range') return true;
- return false;
- }
-
- private handleWindowClick() {
+ private handleMouseClick() {
+ if (this.interferesWithSelection()) return;
this.hoveredElement = undefined;
this.updateTokenTask?.cancel();
this.updateTokenHighlight(undefined, 0);
}
+ private interferesWithSelection() {
+ return window.getSelection()?.type === 'Range';
+ }
+
private updateTokenHighlight(
newHighlight: string | undefined,
newLineNumber: number
@@ -217,8 +216,6 @@
this.currentHighlightLineNumber = newLineNumber;
this.notifyForToken(oldHighlight, oldLineNumber);
this.notifyForToken(newHighlight, newLineNumber);
- // Reset the hovered element.
- this.hoveredElement = undefined;
}
findTokenAncestor(el?: EventTarget | Element | null): {
diff --git a/polygerrit-ui/app/elements/diff/gr-diff-builder/token-highlight-layer_test.ts b/polygerrit-ui/app/elements/diff/gr-diff-builder/token-highlight-layer_test.ts
new file mode 100644
index 0000000..8f90a42
--- /dev/null
+++ b/polygerrit-ui/app/elements/diff/gr-diff-builder/token-highlight-layer_test.ts
@@ -0,0 +1,255 @@
+/**
+ * @license
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * 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
+ *
+ * http://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.
+ */
+
+import '../../../test/common-test-setup-karma';
+import * as MockInteractions from '@polymer/iron-test-helpers/mock-interactions';
+import {Side} from '../../../api/diff';
+import {GrDiffLine, GrDiffLineType} from '../gr-diff/gr-diff-line.js';
+import {HOVER_DELAY_MS, TokenHighlightLayer} from './token-highlight-layer';
+import {GrAnnotation} from '../gr-diff-highlight/gr-annotation';
+import sinon from 'sinon/pkg/sinon-esm';
+import {html, render} from 'lit-html';
+import {_testOnly_allTasks} from '../../../utils/async-util';
+import {queryAndAssert} from '../../../test/test-utils';
+
+// MockInteractions.makeMouseEvent always sets buttons to 1.
+function dispatchMouseEvent(
+ type: string,
+ xy: {x: number; y: number},
+ node: Element
+) {
+ const props = {
+ bubbles: true,
+ cancellable: true,
+ composed: true,
+ clientX: xy.x,
+ clientY: xy.y,
+ buttons: 0,
+ };
+ node.dispatchEvent(new MouseEvent(type, props));
+}
+
+class MockListener {
+ private results: any[][] = [];
+
+ notify(...args: any[]) {
+ this.results.push(args);
+ }
+
+ shift() {
+ return this.results.shift();
+ }
+
+ flush() {
+ this.results = [];
+ }
+
+ get pending(): number {
+ return this.results.length;
+ }
+}
+
+suite('token-highlight-layer', () => {
+ let container: HTMLElement;
+ let listener: MockListener;
+ let highlighter: TokenHighlightLayer;
+
+ setup(async () => {
+ listener = new MockListener();
+ highlighter = new TokenHighlightLayer();
+ highlighter.addListener((...args) => listener.notify(...args));
+ container = document.createElement('div');
+ document.body.appendChild(container);
+ });
+
+ teardown(() => {
+ document.body.removeChild(container);
+ });
+
+ function annotate(el: HTMLElement, side: Side = Side.LEFT, line = 1) {
+ const diffLine = new GrDiffLine(GrDiffLineType.BOTH);
+ diffLine.afterNumber = line;
+ diffLine.beforeNumber = line;
+ highlighter.annotate(el, document.createElement('div'), diffLine, side);
+ return el;
+ }
+
+ let uniqueId = 0;
+ function createLineId() {
+ uniqueId++;
+ return `line-${uniqueId.toString()}`;
+ }
+
+ function createLine(text: string, line = 1): HTMLElement {
+ const lineId = createLineId();
+ const template = html`
+ <div class="line">
+ <div data-value=${line} class="lineNum"></div>
+ <div id=${lineId} class="line-content">${text}</div>
+ </div>
+ `;
+ render(template, container);
+ const el = queryAndAssert(container, `#${lineId}`);
+ return el as HTMLElement;
+ }
+
+ suite('annotate', () => {
+ function assertAnnotation(
+ args: any[],
+ el: HTMLElement,
+ start: number,
+ length: number,
+ cssClass: string
+ ) {
+ assert.equal(args[0], el);
+ assert.equal(args[1], start);
+ assert.equal(args[2], length);
+ assert.equal(args[3], cssClass);
+ }
+
+ test('annotate adds css token', () => {
+ const annotateElementStub = sinon.stub(GrAnnotation, 'annotateElement');
+ const el = createLine('these are words');
+ annotate(el);
+ assert.isTrue(annotateElementStub.calledThrice);
+ assertAnnotation(annotateElementStub.args[0], el, 0, 5, 'tk-these token');
+ assertAnnotation(annotateElementStub.args[1], el, 6, 3, 'tk-are token');
+ assertAnnotation(
+ annotateElementStub.args[2],
+ el,
+ 10,
+ 5,
+ 'tk-words token'
+ );
+ });
+
+ test('annotate adds mouse handlers', () => {
+ const el = createLine('these are words');
+ const addEventListenerStub = sinon.stub(el, 'addEventListener');
+ annotate(el);
+ assert.isTrue(addEventListenerStub.calledTwice);
+ assert.equal(addEventListenerStub.args[0][0], 'mouseover');
+ assert.equal(addEventListenerStub.args[1][0], 'mouseout');
+ });
+
+ test('annotate does not add mouse handlers without words', () => {
+ const el = createLine(' ');
+ const addEventListenerStub = sinon.stub(el, 'addEventListener');
+ annotate(el);
+ assert.isFalse(addEventListenerStub.called);
+ });
+
+ test('annotate adds mouse handlers for longest word', () => {
+ const el = createLine('w'.repeat(100));
+ const addEventListenerStub = sinon.stub(el, 'addEventListener');
+ annotate(el);
+ assert.isTrue(addEventListenerStub.called);
+ });
+
+ test('annotate does not add mouse handlers for long words', () => {
+ const el = createLine('w'.repeat(101));
+ const addEventListenerStub = sinon.stub(el, 'addEventListener');
+ annotate(el);
+ assert.isFalse(addEventListenerStub.called);
+ });
+ });
+
+ suite('highlight', () => {
+ test('highlighting hover delay', async () => {
+ const clock = sinon.useFakeTimers();
+ const line1 = createLine('two words');
+ annotate(line1);
+ const line2 = createLine('three words');
+ annotate(line2, Side.RIGHT, 2);
+ const words1 = queryAndAssert(line1, '.tk-words');
+ assert.isTrue(words1.classList.contains('token'));
+ dispatchMouseEvent(
+ 'mouseover',
+ MockInteractions.middleOfNode(words1),
+ words1
+ );
+
+ assert.equal(listener.pending, 0);
+ assert.equal(_testOnly_allTasks.size, 1);
+
+ // Too early for hover behavior to trigger.
+ clock.tick(100);
+ assert.equal(listener.pending, 0);
+ assert.equal(_testOnly_allTasks.size, 1);
+
+ // After a total of HOVER_DELAY_MS ms the hover behavior should trigger.
+ clock.tick(HOVER_DELAY_MS - 100);
+ assert.equal(listener.pending, 2);
+ assert.equal(_testOnly_allTasks.size, 0);
+ assert.deepEqual(listener.shift(), [1, 1, Side.LEFT]);
+ assert.deepEqual(listener.shift(), [2, 2, Side.RIGHT]);
+ });
+
+ test('highlighting mouse out before delay', async () => {
+ const clock = sinon.useFakeTimers();
+ const line1 = createLine('two words');
+ annotate(line1);
+ const line2 = createLine('three words', 2);
+ annotate(line2, Side.RIGHT, 2);
+ const words1 = queryAndAssert(line1, '.tk-words');
+ assert.isTrue(words1.classList.contains('token'));
+ dispatchMouseEvent(
+ 'mouseover',
+ MockInteractions.middleOfNode(words1),
+ words1
+ );
+ assert.equal(listener.pending, 0);
+ clock.tick(100);
+ // Mouse out after 100ms but before hover delay.
+ dispatchMouseEvent(
+ 'mouseout',
+ MockInteractions.middleOfNode(words1),
+ words1
+ );
+ assert.equal(listener.pending, 0);
+ clock.tick(HOVER_DELAY_MS - 100);
+ assert.equal(listener.pending, 0);
+ assert.equal(_testOnly_allTasks.size, 0);
+ });
+
+ test('clicking clears highlight', async () => {
+ const clock = sinon.useFakeTimers();
+ const line1 = createLine('two words');
+ annotate(line1);
+ const line2 = createLine('three words', 2);
+ annotate(line2, Side.RIGHT, 2);
+ const words1 = queryAndAssert(line1, '.tk-words');
+ assert.isTrue(words1.classList.contains('token'));
+ dispatchMouseEvent(
+ 'mouseover',
+ MockInteractions.middleOfNode(words1),
+ words1
+ );
+ assert.equal(listener.pending, 0);
+ clock.tick(HOVER_DELAY_MS);
+ assert.equal(listener.pending, 2);
+ listener.flush();
+ assert.equal(listener.pending, 0);
+ MockInteractions.click(container);
+ assert.equal(listener.pending, 4);
+ assert.deepEqual(listener.shift(), [1, 1, Side.LEFT]);
+ assert.deepEqual(listener.shift(), [2, 2, Side.RIGHT]);
+ assert.deepEqual(listener.shift(), [1, 1, Side.LEFT]);
+ assert.deepEqual(listener.shift(), [2, 2, Side.RIGHT]);
+ });
+ });
+});
diff --git a/polygerrit-ui/app/elements/diff/gr-diff-host/gr-diff-host.ts b/polygerrit-ui/app/elements/diff/gr-diff-host/gr-diff-host.ts
index 06d31b3..b791b55 100644
--- a/polygerrit-ui/app/elements/diff/gr-diff-host/gr-diff-host.ts
+++ b/polygerrit-ui/app/elements/diff/gr-diff-host/gr-diff-host.ts
@@ -416,7 +416,7 @@
if (
appContext.flagsService.isEnabled(KnownExperimentId.TOKEN_HIGHLIGHTING)
) {
- layers.push(new TokenHighlightLayer());
+ layers.push(new TokenHighlightLayer(this));
}
layers.push(this.syntaxLayer);
// Get layers from plugins (if any).
diff --git a/polygerrit-ui/app/elements/diff/gr-diff/gr-diff_html.ts b/polygerrit-ui/app/elements/diff/gr-diff/gr-diff_html.ts
index 79ef38a..83b0aad 100644
--- a/polygerrit-ui/app/elements/diff/gr-diff/gr-diff_html.ts
+++ b/polygerrit-ui/app/elements/diff/gr-diff/gr-diff_html.ts
@@ -69,10 +69,9 @@
/* Provides the option to add side borders (left and right) to the line number column. */
td.left,
td.right,
+ td.moveControlsLineNumCol,
td.contextLineNum {
- border-width: var(--line-number-border-width, 0);
- border-style: solid;
- border-color: var(--line-number-border-color, var(--border-color, unset));
+ box-shadow: var(--line-number-box-shadow, unset);
}
/*
@@ -112,6 +111,7 @@
width: 100%;
height: 100%;
background-color: var(--diff-blank-background-color);
+ box-shadow: var(--line-number-box-shadow, unset);
}
td.lineNum {
vertical-align: top;
diff --git a/polygerrit-ui/app/elements/shared/gr-account-label/gr-account-label.ts b/polygerrit-ui/app/elements/shared/gr-account-label/gr-account-label.ts
index dc36c78..16f5e8c 100644
--- a/polygerrit-ui/app/elements/shared/gr-account-label/gr-account-label.ts
+++ b/polygerrit-ui/app/elements/shared/gr-account-label/gr-account-label.ts
@@ -30,6 +30,7 @@
import {css, customElement, html, property, state} from 'lit-element';
import {classMap} from 'lit-html/directives/class-map';
import {modifierPressed} from '../../../utils/dom-util';
+import {getRemovedByIconClickReason} from '../../../utils/attention-set-util';
@customElement('gr-account-label')
export class GrAccountLabel extends GrLitElement {
@@ -338,8 +339,7 @@
// We are deliberately updating the UI before making the API call. It is a
// risk that we are taking to achieve a better UX for 99.9% of the cases.
- const selfName = getDisplayName(this._config, this._selfAccount);
- const reason = `Removed by ${selfName} by clicking the attention icon`;
+ const reason = getRemovedByIconClickReason(this._selfAccount, this._config);
if (this.change.attention_set)
delete this.change.attention_set[this.account._account_id];
// For re-evaluation of everything that depends on 'change'.
diff --git a/polygerrit-ui/app/elements/shared/gr-button/gr-button.ts b/polygerrit-ui/app/elements/shared/gr-button/gr-button.ts
index aef55fa..af185f2 100644
--- a/polygerrit-ui/app/elements/shared/gr-button/gr-button.ts
+++ b/polygerrit-ui/app/elements/shared/gr-button/gr-button.ts
@@ -16,6 +16,7 @@
*/
import '@polymer/paper-button/paper-button';
import '../../../styles/shared-styles';
+import '../../../styles/gr-voting-styles';
import {PolymerElement} from '@polymer/polymer/polymer-element';
import {customElement, property, computed, observe} from '@polymer/decorators';
import {htmlTemplate} from './gr-button_html';
@@ -42,6 +43,13 @@
return htmlTemplate;
}
+ /**
+ * Should this button be rendered as a vote chip? Then we are applying
+ * the .voteChip class (see gr-voting-styles) to the paper-button.
+ */
+ @property({type: Boolean, reflectToAttribute: true})
+ voteChip = false;
+
@property({type: Boolean, reflectToAttribute: true})
downArrow = false;
@@ -81,6 +89,10 @@
return this._disabled;
}
+ computePaperButtonClass(voteChip?: boolean) {
+ return voteChip ? 'voteChip' : '';
+ }
+
private readonly reporting: ReportingService = appContext.reportingService;
constructor() {
diff --git a/polygerrit-ui/app/elements/shared/gr-button/gr-button_html.ts b/polygerrit-ui/app/elements/shared/gr-button/gr-button_html.ts
index a15b560..22ec2f4 100644
--- a/polygerrit-ui/app/elements/shared/gr-button/gr-button_html.ts
+++ b/polygerrit-ui/app/elements/shared/gr-button/gr-button_html.ts
@@ -17,6 +17,9 @@
import {html} from '@polymer/polymer/lib/utils/html-tag';
export const htmlTemplate = html`
+ <style include="gr-voting-styles">
+ /* Workaround for empty style block - see https://github.com/Polymer/tools/issues/408 */
+ </style>
<style include="gr-spinner-styles">
/* general styles for all buttons */
:host {
@@ -174,6 +177,7 @@
disabled="[[_disabled]]"
tabindex="-1"
part="paper-button"
+ class$="[[computePaperButtonClass(voteChip)]]"
>
<template is="dom-if" if="[[loading]]">
<span class="loadingSpin"></span>
diff --git a/polygerrit-ui/app/elements/shared/gr-comment-thread/gr-comment-thread.ts b/polygerrit-ui/app/elements/shared/gr-comment-thread/gr-comment-thread.ts
index 6745f58..37eda73 100644
--- a/polygerrit-ui/app/elements/shared/gr-comment-thread/gr-comment-thread.ts
+++ b/polygerrit-ui/app/elements/shared/gr-comment-thread/gr-comment-thread.ts
@@ -312,7 +312,6 @@
draft.__editing = true;
draft.unresolved = unresolved === false ? unresolved : true;
this.commentsService.addDraft(draft);
- this.push('comments', draft);
}
_getDiffUrlForPath(
@@ -354,7 +353,7 @@
if (!diff) return [];
const layers = [];
if (this.flagsService.isEnabled(KnownExperimentId.TOKEN_HIGHLIGHTING)) {
- layers.push(new TokenHighlightLayer());
+ layers.push(new TokenHighlightLayer(this));
}
layers.push(this.syntaxLayer);
return layers;
@@ -548,14 +547,11 @@
}
this.commentsService.addDraft(reply);
- this.push('comments', reply);
if (!isEditing) {
- // Allow the reply to render in the dom-repeat.
- setTimeout(() => {
- const commentEl = this._commentElWithDraftID(reply.__draftID);
- if (commentEl) commentEl.save();
- }, 1);
+ assertIsDefined(this.changeNum, 'changeNum');
+ assertIsDefined(this.patchNum, 'patchNum');
+ this.restApiService.saveDiffDraft(this.changeNum, this.patchNum, reply);
}
}
diff --git a/polygerrit-ui/app/elements/shared/gr-comment-thread/gr-comment-thread_test.ts b/polygerrit-ui/app/elements/shared/gr-comment-thread/gr-comment-thread_test.ts
index 5f860f4..a4ff809 100644
--- a/polygerrit-ui/app/elements/shared/gr-comment-thread/gr-comment-thread_test.ts
+++ b/polygerrit-ui/app/elements/shared/gr-comment-thread/gr-comment-thread_test.ts
@@ -23,7 +23,6 @@
sortComments,
UIComment,
UIRobot,
- isDraft,
UIDraft,
} from '../../../utils/comment-util';
import {GrCommentThread} from './gr-comment-thread';
@@ -51,6 +50,7 @@
stubRestApi,
} from '../../../test/test-utils';
import {_testOnly_resetState} from '../../../services/comments/comments-model';
+import {SinonStub} from 'sinon';
const basicFixture = fixtureFromElement('gr-comment-thread');
@@ -314,10 +314,12 @@
suite('comment action tests with unresolved thread', () => {
let element: GrCommentThread;
-
+ let addDraftServiceStub: SinonStub;
+ let saveDiffDraftStub: SinonStub;
setup(() => {
+ addDraftServiceStub = stubComments('addDraft');
stubRestApi('getLoggedIn').returns(Promise.resolve(false));
- stubRestApi('saveDiffDraft').returns(
+ saveDiffDraftStub = stubRestApi('saveDiffDraft').returns(
Promise.resolve({
headers: {} as Headers,
redirected: false,
@@ -373,12 +375,11 @@
const replyBtn = element.$.replyBtn;
tap(replyBtn);
flush();
-
- const drafts = element._orderedComments.filter(c => isDraft(c));
- assert.equal(drafts.length, 1);
- assert.notOk(drafts[0].message, 'message should be empty');
+ const draft = addDraftServiceStub.firstCall.args[0];
+ assert.isOk(draft);
+ assert.notOk(draft.message, 'message should be empty');
assert.equal(
- drafts[0].in_reply_to,
+ draft.in_reply_to,
'baf0414d_60047215' as UrlEncodedCommentId as UrlEncodedCommentId
);
assert.isTrue(reportStub.calledOnce);
@@ -393,11 +394,10 @@
tap(quoteBtn);
flush();
- const drafts = element._orderedComments.filter(c => isDraft(c));
- assert.equal(drafts.length, 1);
- assert.equal(drafts[0].message, '> is this a crossover episode!?\n\n');
+ const draft = addDraftServiceStub.firstCall.args[0];
+ assert.equal(draft.message, '> is this a crossover episode!?\n\n');
assert.equal(
- drafts[0].in_reply_to,
+ draft.in_reply_to,
'baf0414d_60047215' as UrlEncodedCommentId as UrlEncodedCommentId
);
assert.isTrue(reportStub.calledOnce);
@@ -427,16 +427,12 @@
tap(quoteBtn);
flush();
- const drafts = element._orderedComments.filter(c => isDraft(c));
- assert.equal(drafts.length, 1);
+ const draft = addDraftServiceStub.firstCall.args[0];
assert.equal(
- drafts[0].message,
+ draft.message,
'> is this a crossover episode!?\n> It might be!\n\n'
);
- assert.equal(
- drafts[0].in_reply_to,
- 'baf0414d_60047215' as UrlEncodedCommentId
- );
+ assert.equal(draft.in_reply_to, 'baf0414d_60047215' as UrlEncodedCommentId);
assert.isTrue(reportStub.calledOnce);
});
@@ -452,14 +448,13 @@
assert.isOk(ackBtn);
tap(ackBtn!);
flush(() => {
- const drafts = element.comments.filter(c => isDraft(c));
- assert.equal(drafts.length, 1);
- assert.equal(drafts[0].message, 'Ack');
+ const draft = addDraftServiceStub.firstCall.args[0];
+ assert.equal(draft.message, 'Ack');
assert.equal(
- drafts[0].in_reply_to,
+ draft.in_reply_to,
'baf0414d_60047215' as UrlEncodedCommentId
);
- assert.equal(drafts[0].unresolved, false);
+ assert.equal(draft.unresolved, false);
assert.isTrue(reportStub.calledOnce);
done();
});
@@ -467,6 +462,7 @@
test('done', done => {
const reportStub = stubReporting('recordDraftInteraction');
+ assert.isFalse(saveDiffDraftStub.called);
element.changeNum = 42 as NumericChangeId;
element.patchNum = 1 as PatchSetNum;
const commentEl = element.shadowRoot?.querySelector('gr-comment');
@@ -476,15 +472,15 @@
assert.isOk(doneBtn);
tap(doneBtn!);
flush(() => {
- const drafts = element.comments.filter(c => isDraft(c));
- assert.equal(drafts.length, 1);
- assert.equal(drafts[0].message, 'Done');
+ const draft = addDraftServiceStub.firstCall.args[0];
+ assert.equal(draft.message, 'Done');
assert.equal(
- drafts[0].in_reply_to,
+ draft.in_reply_to,
'baf0414d_60047215' as UrlEncodedCommentId
);
- assert.isFalse(drafts[0].unresolved);
+ assert.isFalse(draft.unresolved);
assert.isTrue(reportStub.calledOnce);
+ assert.isTrue(saveDiffDraftStub.called);
done();
});
});
@@ -510,17 +506,16 @@
const commentEl = element.shadowRoot?.querySelector('gr-comment');
assert.ok(commentEl);
commentEl!.addEventListener('create-fix-comment', () => {
- const drafts = element._orderedComments.filter(c => isDraft(c));
- assert.equal(drafts.length, 1);
+ const draft = addDraftServiceStub.firstCall.args[0];
assert.equal(
- drafts[0].message,
+ draft.message,
'> is this a crossover episode!?\n\nPlease fix.'
);
assert.equal(
- drafts[0].in_reply_to,
+ draft.in_reply_to,
'baf0414d_60047215' as UrlEncodedCommentId
);
- assert.isTrue(drafts[0].unresolved);
+ assert.isTrue(draft.unresolved);
done();
});
commentEl!.dispatchEvent(
@@ -564,10 +559,12 @@
element.path = '/path/to/file.txt';
element.comments = [];
element.addOrEditDraft(1 as LineNumber);
+ const draft = addDraftServiceStub.firstCall.args[0];
+ element.comments = [draft];
flush();
const rootId = element.rootId;
assert.isOk(rootId);
-
+ flush();
const draftEl = element.root?.querySelectorAll('gr-comment')[0];
assert.ok(draftEl);
const deleteDraftStub = stubComments('deleteDraft');
@@ -644,6 +641,8 @@
test('comment in_reply_to is either null or most recent comment', () => {
element._createReplyComment('dummy', true);
+ const draft = addDraftServiceStub.firstCall.args[0];
+ element.comments = [...element.comments, draft];
flush();
assert.equal(element._orderedComments.length, 5);
assert.equal(
@@ -655,6 +654,8 @@
test('resolvable comments', () => {
assert.isFalse(element.unresolved);
element._createReplyComment('dummy', true, true);
+ const draft = addDraftServiceStub.firstCall.args[0];
+ element.comments = [...element.comments, draft];
flush();
assert.isTrue(element.unresolved);
});
@@ -703,18 +704,23 @@
test('addDraft sets unresolved state correctly', () => {
let unresolved = true;
+ let draft;
element.comments = [];
element.path = 'abcd';
element.addDraft(undefined, undefined, unresolved);
- assert.equal(element.comments[0].unresolved, true);
+ draft = addDraftServiceStub.lastCall.args[0];
+ assert.equal(draft.unresolved, true);
unresolved = false; // comment should get added as actually resolved.
element.comments = [];
element.addDraft(undefined, undefined, unresolved);
- assert.equal(element.comments[0].unresolved, false);
+ draft = addDraftServiceStub.lastCall.args[0];
+ assert.equal(draft.unresolved, false);
+
element.comments = [];
element.addDraft();
- assert.equal(element.comments[0].unresolved, true);
+ draft = addDraftServiceStub.lastCall.args[0];
+ assert.equal(draft.unresolved, true);
});
test('_newDraft with root', () => {
@@ -734,13 +740,16 @@
element.comments = [];
element.path = 'abcd';
element.addOrEditDraft(1);
+ const draft = addDraftServiceStub.firstCall.args[0];
+ element.comments = [draft];
+ flush();
assert.equal(element.comments.length, 1);
// Mock a submitted comment.
element.comments[0].id = (element.comments[0] as UIDraft)
.__draftID as UrlEncodedCommentId;
delete (element.comments[0] as UIDraft).__draft;
element.addOrEditDraft(1);
- assert.equal(element.comments.length, 2);
+ assert.equal(addDraftServiceStub.callCount, 2);
});
test('unresolved label', () => {
diff --git a/polygerrit-ui/app/elements/shared/gr-formatted-text/gr-formatted-text.ts b/polygerrit-ui/app/elements/shared/gr-formatted-text/gr-formatted-text.ts
index 487f288..a3ae754 100644
--- a/polygerrit-ui/app/elements/shared/gr-formatted-text/gr-formatted-text.ts
+++ b/polygerrit-ui/app/elements/shared/gr-formatted-text/gr-formatted-text.ts
@@ -16,17 +16,23 @@
*/
import '../gr-linked-text/gr-linked-text';
import {CommentLinks} from '../../../types/common';
-import {appContext} from '../../../services/app-context';
import {GrLitElement} from '../../lit/gr-lit-element';
-import {css, customElement, html, property} from 'lit-element';
+import {css, customElement, html, property, TemplateResult} from 'lit-element';
const CODE_MARKER_PATTERN = /^(`{1,3})([^`]+?)\1$/;
-export interface Block {
- type: string;
- text?: string;
- blocks?: Block[];
- items?: string[];
+export type Block = ListBlock | QuoteBlock | TextBlock;
+export interface ListBlock {
+ type: 'list';
+ items: string[];
+}
+export interface QuoteBlock {
+ type: 'quote';
+ blocks: Block[];
+}
+export interface TextBlock {
+ type: 'paragraph' | 'code' | 'pre';
+ text: string;
}
declare global {
@@ -45,8 +51,6 @@
@property({type: Boolean, reflect: true})
noTrailingMargin = false;
- private readonly reporting = appContext.reportingService;
-
static override get styles() {
return [
css`
@@ -99,8 +103,9 @@
}
override render() {
- const nodes = this._computeNodes(this._computeBlocks(this.content));
- return html`<div id="container">${nodes}</div>`;
+ if (!this.content) return;
+ const blocks = this._computeBlocks(this.content);
+ return html`${blocks.map(block => this.renderBlock(block))}`;
}
/**
@@ -123,9 +128,7 @@
*
* NOTE: Strings appearing in all block objects are NOT escaped.
*/
- _computeBlocks(content?: string): Block[] {
- if (!content) return [];
-
+ _computeBlocks(content: string): Block[] {
const result: Block[] = [];
const lines = content.replace(/[\s\n\r\t]+$/g, '').split('\n');
@@ -134,82 +137,87 @@
continue;
}
- if (this._isCodeMarkLine(lines[i])) {
- // handle multi-line code
- let nextI = i + 1;
- while (!this._isCodeMarkLine(lines[nextI]) && nextI < lines.length) {
- nextI++;
- }
-
- if (this._isCodeMarkLine(lines[nextI])) {
+ if (this.isCodeMarkLine(lines[i])) {
+ const startOfCode = i + 1;
+ const endOfCode = this.getEndOfSection(
+ lines,
+ startOfCode,
+ line => !this.isCodeMarkLine(line)
+ );
+ // If the code extends to the end then there is no closing``` and the
+ // opening``` should not be counted as a multiline code block.
+ const lineAfterCode = lines[endOfCode];
+ if (lineAfterCode && this.isCodeMarkLine(lineAfterCode)) {
result.push({
type: 'code',
- text: lines.slice(i + 1, nextI).join('\n'),
+ // Does not include either of the ``` lines
+ text: lines.slice(startOfCode, endOfCode).join('\n'),
});
- i = nextI;
+ i = endOfCode; // advances past the closing```
continue;
}
-
- // otherwise treat it as regular line and continue
- // check for other cases
}
-
- if (this._isSingleLineCode(lines[i])) {
+ if (this.isSingleLineCode(lines[i])) {
// no guard check as _isSingleLineCode tested on the pattern
const codeContent = lines[i].match(CODE_MARKER_PATTERN)![2];
result.push({type: 'code', text: codeContent});
- } else if (this._isList(lines[i])) {
- let nextI = i + 1;
- while (this._isList(lines[nextI])) {
- nextI++;
- }
- result.push(this._makeList(lines.slice(i, nextI)));
- i = nextI - 1;
- } else if (this._isQuote(lines[i])) {
- let nextI = i + 1;
- while (this._isQuote(lines[nextI])) {
- nextI++;
- }
+ } else if (this.isList(lines[i])) {
+ const endOfList = this.getEndOfSection(lines, i + 1, line =>
+ this.isList(line)
+ );
+ result.push(this.makeList(lines.slice(i, endOfList)));
+ i = endOfList - 1;
+ } else if (this.isQuote(lines[i])) {
+ const endOfQuote = this.getEndOfSection(lines, i + 1, line =>
+ this.isQuote(line)
+ );
const blockLines = lines
- .slice(i, nextI)
+ .slice(i, endOfQuote)
.map(l => l.replace(/^[ ]?>[ ]?/, ''));
result.push({
type: 'quote',
blocks: this._computeBlocks(blockLines.join('\n')),
});
- i = nextI - 1;
- } else if (this._isPreFormat(lines[i])) {
- let nextI = i + 1;
+ i = endOfQuote - 1;
+ } else if (this.isPreFormat(lines[i])) {
// include pre or all regular lines but stop at next new line
- while (
- this._isPreFormat(lines[nextI]) ||
- (this._isRegularLine(lines[nextI]) &&
- !this._isWhitespaceLine(lines[nextI]) &&
- lines[nextI].length)
- ) {
- nextI++;
- }
+ const predicate = (line: string) =>
+ this.isPreFormat(line) ||
+ (this.isRegularLine(line) &&
+ !this.isWhitespaceLine(line) &&
+ line.length > 0);
+ const endOfPre = this.getEndOfSection(lines, i + 1, predicate);
result.push({
type: 'pre',
- text: lines.slice(i, nextI).join('\n'),
+ text: lines.slice(i, endOfPre).join('\n'),
});
- i = nextI - 1;
+ i = endOfPre - 1;
} else {
- let nextI = i + 1;
- while (this._isRegularLine(lines[nextI])) {
- nextI++;
- }
+ const endOfRegularLines = this.getEndOfSection(lines, i + 1, line =>
+ this.isRegularLine(line)
+ );
result.push({
type: 'paragraph',
- text: lines.slice(i, nextI).join('\n'),
+ text: lines.slice(i, endOfRegularLines).join('\n'),
});
- i = nextI - 1;
+ i = endOfRegularLines - 1;
}
}
return result;
}
+ private getEndOfSection(
+ lines: string[],
+ startIndex: number,
+ sectionPredicate: (line: string) => boolean
+ ) {
+ const index = lines
+ .slice(startIndex)
+ .findIndex(line => !sectionPredicate(line));
+ return index === -1 ? lines.length : index + startIndex;
+ }
+
/**
* Take a block of comment text that contains a list, generate appropriate
* block objects and append them to the output list.
@@ -222,105 +230,78 @@
*
* @param lines The block containing the list.
*/
- _makeList(lines: string[]) {
- const items = [];
- for (let i = 0; i < lines.length; i++) {
- let line = lines[i];
- line = line.substring(1).trim();
- items.push(line);
- }
+ private makeList(lines: string[]): Block {
+ const items = lines.map(line => line.substring(1).trim());
return {type: 'list', items};
}
- _isRegularLine(line: string) {
- // line can not be recognized by existing patterns
- if (line === undefined) return false;
+ private isRegularLine(line: string): boolean {
return (
- !this._isQuote(line) &&
- !this._isCodeMarkLine(line) &&
- !this._isSingleLineCode(line) &&
- !this._isList(line) &&
- !this._isPreFormat(line)
+ !this.isQuote(line) &&
+ !this.isCodeMarkLine(line) &&
+ !this.isSingleLineCode(line) &&
+ !this.isList(line) &&
+ !this.isPreFormat(line)
);
}
- _isQuote(line: string) {
- return line && (line.startsWith('> ') || line.startsWith(' > '));
+ private isQuote(line: string): boolean {
+ return line.startsWith('> ') || line.startsWith(' > ');
}
- _isCodeMarkLine(line: string) {
- return line && line.trim() === '```';
+ private isCodeMarkLine(line: string): boolean {
+ return line.trim() === '```';
}
- _isSingleLineCode(line: string) {
- return line && CODE_MARKER_PATTERN.test(line);
+ private isSingleLineCode(line: string): boolean {
+ return CODE_MARKER_PATTERN.test(line);
}
- _isPreFormat(line: string) {
- return line && /^[ \t]/.test(line) && !this._isWhitespaceLine(line);
+ private isPreFormat(line: string): boolean {
+ return /^[ \t]/.test(line) && !this.isWhitespaceLine(line);
}
- _isList(line: string) {
- return line && /^[-*] /.test(line);
+ private isList(line: string): boolean {
+ return /^[-*] /.test(line);
}
- _isWhitespaceLine(line: string) {
- return line && /^\s+$/.test(line);
+ private isWhitespaceLine(line: string): boolean {
+ return /^\s+$/.test(line);
}
- _makeLinkedText(content = '', isPre?: boolean) {
- const text = document.createElement('gr-linked-text');
- text.config = this.config;
- text.content = content;
- text.pre = true;
- if (isPre) {
- text.classList.add('pre');
+ private renderLinkedText(content: string, isPre?: boolean): TemplateResult {
+ return html`
+ <gr-linked-text
+ class="${isPre ? 'pre' : ''}"
+ .config=${this.config}
+ content=${content}
+ pre
+ ></gr-linked-text>
+ `;
+ }
+
+ private renderBlock(block: Block): TemplateResult {
+ switch (block.type) {
+ case 'paragraph':
+ return html`<p>${this.renderLinkedText(block.text)}</p>`;
+ case 'quote':
+ return html`
+ <blockquote>
+ ${block.blocks.map(subBlock => this.renderBlock(subBlock))}
+ </blockquote>
+ `;
+ case 'code':
+ return html`<code>${block.text}</code>`;
+ case 'pre':
+ return this.renderLinkedText(block.text, true);
+ case 'list':
+ return html`
+ <ul>
+ ${block.items.map(
+ item => html`<li>${this.renderLinkedText(item)}</li>`
+ )}
+ </ul>
+ `;
}
- return text;
- }
-
- /**
- * Map an array of block objects to an array of DOM nodes.
- */
- _computeNodes(blocks: Block[]): HTMLElement[] {
- return blocks.map(block => {
- if (block.type === 'paragraph') {
- const p = document.createElement('p');
- p.appendChild(this._makeLinkedText(block.text));
- return p;
- }
-
- if (block.type === 'quote') {
- const bq = document.createElement('blockquote');
- for (const node of this._computeNodes(block.blocks || [])) {
- if (node) bq.appendChild(node);
- }
- return bq;
- }
-
- if (block.type === 'code') {
- const code = document.createElement('code');
- code.textContent = block.text || '';
- return code;
- }
-
- if (block.type === 'pre') {
- return this._makeLinkedText(block.text, true);
- }
-
- if (block.type === 'list') {
- const ul = document.createElement('ul');
- const items = block.items || [];
- for (const item of items) {
- const li = document.createElement('li');
- li.appendChild(this._makeLinkedText(item));
- ul.appendChild(li);
- }
- return ul;
- }
-
- this.reporting.error(new Error(`Unrecognized block type: ${block.type}`));
- return document.createElement('span');
- });
}
}
diff --git a/polygerrit-ui/app/elements/shared/gr-formatted-text/gr-formatted-text_test.ts b/polygerrit-ui/app/elements/shared/gr-formatted-text/gr-formatted-text_test.ts
index cf12032..8cecf71 100644
--- a/polygerrit-ui/app/elements/shared/gr-formatted-text/gr-formatted-text_test.ts
+++ b/polygerrit-ui/app/elements/shared/gr-formatted-text/gr-formatted-text_test.ts
@@ -17,40 +17,41 @@
import '../../../test/common-test-setup-karma';
import './gr-formatted-text';
-import {GrFormattedText, Block} from './gr-formatted-text';
+import {
+ GrFormattedText,
+ Block,
+ ListBlock,
+ TextBlock,
+ QuoteBlock,
+} from './gr-formatted-text';
const basicFixture = fixtureFromElement('gr-formatted-text');
suite('gr-formatted-text tests', () => {
let element: GrFormattedText;
- function assertBlock(
- result: Block[],
- index: number,
- type: string,
- text?: string
- ) {
- assert.equal(result[index].type, type);
- assert.equal(result[index].text, text);
+ function assertTextBlock(block: Block, type: string, text: string) {
+ assert.equal(block.type, type);
+ const textBlock = block as TextBlock;
+ assert.equal(textBlock.text, text);
}
- function assertListBlock(
- result: Block[],
- resultIndex: number,
- itemIndex: number,
- text: string
- ) {
- assert.equal(result[resultIndex].type, 'list');
- const item = result[resultIndex].items?.[itemIndex];
- assert.equal(item, text);
+ function assertListBlock(block: Block, items: string[]) {
+ assert.equal(block.type, 'list');
+ const listBlock = block as ListBlock;
+ assert.deepEqual(listBlock.items, items);
+ }
+
+ function assertQuoteBlock(block: Block): QuoteBlock {
+ assert.equal(block.type, 'quote');
+ return block as QuoteBlock;
}
setup(() => {
element = basicFixture.instantiate();
});
- test('parse null undefined and empty', () => {
- assert.lengthOf(element._computeBlocks(undefined), 0);
+ test('parse empty', () => {
assert.lengthOf(element._computeBlocks(''), 0);
});
@@ -58,53 +59,49 @@
const comment = 'Para1';
const result = element._computeBlocks(comment);
assert.lengthOf(result, 1);
- assertBlock(result, 0, 'paragraph', comment);
+ assertTextBlock(result[0], 'paragraph', comment);
});
test('parse multiline para', () => {
const comment = 'Para 1\nStill para 1';
const result = element._computeBlocks(comment);
assert.lengthOf(result, 1);
- assertBlock(result, 0, 'paragraph', comment);
+ assertTextBlock(result[0], 'paragraph', comment);
});
test('parse para break without special blocks', () => {
const comment = 'Para 1\n\nPara 2\n\nPara 3';
const result = element._computeBlocks(comment);
assert.lengthOf(result, 1);
- assertBlock(result, 0, 'paragraph', comment);
+ assertTextBlock(result[0], 'paragraph', comment);
});
test('parse quote', () => {
const comment = '> Quote text';
const result = element._computeBlocks(comment);
assert.lengthOf(result, 1);
- assert.equal(result[0].type, 'quote');
- const blocks = result[0].blocks!;
- assert.lengthOf(blocks, 1);
- assertBlock(blocks, 0, 'paragraph', 'Quote text');
+ const quoteBlock = assertQuoteBlock(result[0]);
+ assert.lengthOf(quoteBlock.blocks, 1);
+ assertTextBlock(quoteBlock.blocks[0], 'paragraph', 'Quote text');
});
test('parse quote lead space', () => {
const comment = ' > Quote text';
const result = element._computeBlocks(comment);
assert.lengthOf(result, 1);
- assert.equal(result[0].type, 'quote');
- const blocks = result[0].blocks!;
- assert.lengthOf(blocks, 1);
- assertBlock(blocks, 0, 'paragraph', 'Quote text');
+ const quoteBlock = assertQuoteBlock(result[0]);
+ assert.lengthOf(quoteBlock.blocks, 1);
+ assertTextBlock(quoteBlock.blocks[0], 'paragraph', 'Quote text');
});
test('parse multiline quote', () => {
const comment = '> Quote line 1\n> Quote line 2\n > Quote line 3\n';
const result = element._computeBlocks(comment);
assert.lengthOf(result, 1);
- assert.equal(result[0].type, 'quote');
- const blocks = result[0].blocks!;
- assert.lengthOf(blocks, 1);
- assertBlock(
- blocks,
- 0,
+ const quoteBlock = assertQuoteBlock(result[0]);
+ assert.lengthOf(quoteBlock.blocks, 1);
+ assertTextBlock(
+ quoteBlock.blocks[0],
'paragraph',
'Quote line 1\nQuote line 2\nQuote line 3'
);
@@ -114,49 +111,42 @@
const comment = ' Four space indent.';
const result = element._computeBlocks(comment);
assert.lengthOf(result, 1);
- assertBlock(result, 0, 'pre', comment);
+ assertTextBlock(result[0], 'pre', comment);
});
test('parse one space pre', () => {
const comment = ' One space indent.\n Another line.';
const result = element._computeBlocks(comment);
assert.lengthOf(result, 1);
- assertBlock(result, 0, 'pre', comment);
+ assertTextBlock(result[0], 'pre', comment);
});
test('parse tab pre', () => {
const comment = '\tOne tab indent.\n\tAnother line.\n Yet another!';
const result = element._computeBlocks(comment);
assert.lengthOf(result, 1);
- assertBlock(result, 0, 'pre', comment);
+ assertTextBlock(result[0], 'pre', comment);
});
test('parse star list', () => {
const comment = '* Item 1\n* Item 2\n* Item 3';
const result = element._computeBlocks(comment);
assert.lengthOf(result, 1);
- assertListBlock(result, 0, 0, 'Item 1');
- assertListBlock(result, 0, 1, 'Item 2');
- assertListBlock(result, 0, 2, 'Item 3');
+ assertListBlock(result[0], ['Item 1', 'Item 2', 'Item 3']);
});
test('parse dash list', () => {
const comment = '- Item 1\n- Item 2\n- Item 3';
const result = element._computeBlocks(comment);
assert.lengthOf(result, 1);
- assertListBlock(result, 0, 0, 'Item 1');
- assertListBlock(result, 0, 1, 'Item 2');
- assertListBlock(result, 0, 2, 'Item 3');
+ assertListBlock(result[0], ['Item 1', 'Item 2', 'Item 3']);
});
test('parse mixed list', () => {
const comment = '- Item 1\n* Item 2\n- Item 3\n* Item 4';
const result = element._computeBlocks(comment);
assert.lengthOf(result, 1);
- assertListBlock(result, 0, 0, 'Item 1');
- assertListBlock(result, 0, 1, 'Item 2');
- assertListBlock(result, 0, 2, 'Item 3');
- assertListBlock(result, 0, 3, 'Item 4');
+ assertListBlock(result[0], ['Item 1', 'Item 2', 'Item 3', 'Item 4']);
});
test('parse mixed block types', () => {
@@ -176,64 +166,75 @@
'Parting words.';
const result = element._computeBlocks(comment);
assert.lengthOf(result, 7);
- assertBlock(result, 0, 'paragraph', 'Paragraph\nacross\na\nfew\nlines.\n');
+ assertTextBlock(
+ result[0],
+ 'paragraph',
+ 'Paragraph\nacross\na\nfew\nlines.\n'
+ );
- assert.equal(result[1].type, 'quote');
- const secondBlocks = result[1].blocks!;
- assert.lengthOf(secondBlocks, 1);
- assertBlock(secondBlocks, 0, 'paragraph', 'Quote\nacross\nnot many lines.');
+ const quoteBlock = assertQuoteBlock(result[1]);
+ assert.lengthOf(quoteBlock.blocks, 1);
+ assertTextBlock(
+ quoteBlock.blocks[0],
+ 'paragraph',
+ 'Quote\nacross\nnot many lines.'
+ );
- assertBlock(result, 2, 'paragraph', 'Another paragraph\n');
- assertListBlock(result, 3, 0, 'Series');
- assertListBlock(result, 3, 1, 'of');
- assertListBlock(result, 3, 2, 'list');
- assertListBlock(result, 3, 3, 'items');
- assertBlock(result, 4, 'paragraph', 'Yet another paragraph\n');
- assertBlock(result, 5, 'pre', '\tPreformatted text.');
- assertBlock(result, 6, 'paragraph', 'Parting words.');
+ assertTextBlock(result[2], 'paragraph', 'Another paragraph\n');
+ assertListBlock(result[3], ['Series', 'of', 'list', 'items']);
+ assertTextBlock(result[4], 'paragraph', 'Yet another paragraph\n');
+ assertTextBlock(result[5], 'pre', '\tPreformatted text.');
+ assertTextBlock(result[6], 'paragraph', 'Parting words.');
});
test('bullet list 1', () => {
- const comment = 'A\n\n* line 1\n* 2nd line';
+ const comment = 'A\n\n* line 1';
const result = element._computeBlocks(comment);
assert.lengthOf(result, 2);
- assertBlock(result, 0, 'paragraph', 'A\n');
- assertListBlock(result, 1, 0, 'line 1');
- assertListBlock(result, 1, 1, '2nd line');
+ assertTextBlock(result[0], 'paragraph', 'A\n');
+ assertListBlock(result[1], ['line 1']);
});
test('bullet list 2', () => {
- const comment = 'A\n* line 1\n* 2nd line\n\nB';
+ const comment = 'A\n\n* line 1\n* 2nd line';
const result = element._computeBlocks(comment);
- assert.lengthOf(result, 3);
- assertBlock(result, 0, 'paragraph', 'A');
- assertListBlock(result, 1, 0, 'line 1');
- assertListBlock(result, 1, 1, '2nd line');
- assertBlock(result, 2, 'paragraph', 'B');
+ assert.lengthOf(result, 2);
+ assertTextBlock(result[0], 'paragraph', 'A\n');
+ assertListBlock(result[1], ['line 1', '2nd line']);
});
test('bullet list 3', () => {
- const comment = '* line 1\n* 2nd line\n\nB';
+ const comment = 'A\n* line 1\n* 2nd line\n\nB';
const result = element._computeBlocks(comment);
- assert.lengthOf(result, 2);
- assertListBlock(result, 0, 0, 'line 1');
- assertListBlock(result, 0, 1, '2nd line');
- assertBlock(result, 1, 'paragraph', 'B');
+ assert.lengthOf(result, 3);
+ assertTextBlock(result[0], 'paragraph', 'A');
+ assertListBlock(result[1], ['line 1', '2nd line']);
+ assertTextBlock(result[2], 'paragraph', 'B');
});
test('bullet list 4', () => {
+ const comment = '* line 1\n* 2nd line\n\nB';
+ const result = element._computeBlocks(comment);
+ assert.lengthOf(result, 2);
+ assertListBlock(result[0], ['line 1', '2nd line']);
+ assertTextBlock(result[1], 'paragraph', 'B');
+ });
+
+ test('bullet list 5', () => {
const comment =
'To see this bug, you have to:\n' +
'* Be on IMAP or EAS (not on POP)\n' +
'* Be very unlucky\n';
const result = element._computeBlocks(comment);
assert.lengthOf(result, 2);
- assertBlock(result, 0, 'paragraph', 'To see this bug, you have to:');
- assertListBlock(result, 1, 0, 'Be on IMAP or EAS (not on POP)');
- assertListBlock(result, 1, 1, 'Be very unlucky');
+ assertTextBlock(result[0], 'paragraph', 'To see this bug, you have to:');
+ assertListBlock(result[1], [
+ 'Be on IMAP or EAS (not on POP)',
+ 'Be very unlucky',
+ ]);
});
- test('bullet list 5', () => {
+ test('bullet list 6', () => {
const comment =
'To see this bug,\n' +
'you have to:\n' +
@@ -241,37 +242,36 @@
'* Be very unlucky\n';
const result = element._computeBlocks(comment);
assert.lengthOf(result, 2);
- assertBlock(result, 0, 'paragraph', 'To see this bug,\nyou have to:');
- assertListBlock(result, 1, 0, 'Be on IMAP or EAS (not on POP)');
- assertListBlock(result, 1, 1, 'Be very unlucky');
+ assertTextBlock(result[0], 'paragraph', 'To see this bug,\nyou have to:');
+ assertListBlock(result[1], [
+ 'Be on IMAP or EAS (not on POP)',
+ 'Be very unlucky',
+ ]);
});
test('dash list 1', () => {
const comment = 'A\n- line 1\n- 2nd line';
const result = element._computeBlocks(comment);
assert.lengthOf(result, 2);
- assertBlock(result, 0, 'paragraph', 'A');
- assertListBlock(result, 1, 0, 'line 1');
- assertListBlock(result, 1, 1, '2nd line');
+ assertTextBlock(result[0], 'paragraph', 'A');
+ assertListBlock(result[1], ['line 1', '2nd line']);
});
test('dash list 2', () => {
const comment = 'A\n- line 1\n- 2nd line\n\nB';
const result = element._computeBlocks(comment);
assert.lengthOf(result, 3);
- assertBlock(result, 0, 'paragraph', 'A');
- assertListBlock(result, 1, 0, 'line 1');
- assertListBlock(result, 1, 1, '2nd line');
- assertBlock(result, 2, 'paragraph', 'B');
+ assertTextBlock(result[0], 'paragraph', 'A');
+ assertListBlock(result[1], ['line 1', '2nd line']);
+ assertTextBlock(result[2], 'paragraph', 'B');
});
test('dash list 3', () => {
const comment = '- line 1\n- 2nd line\n\nB';
const result = element._computeBlocks(comment);
assert.lengthOf(result, 2);
- assertListBlock(result, 0, 0, 'line 1');
- assertListBlock(result, 0, 1, '2nd line');
- assertBlock(result, 1, 'paragraph', 'B');
+ assertListBlock(result[0], ['line 1', '2nd line']);
+ assertTextBlock(result[1], 'paragraph', 'B');
});
test('nested list will NOT be recognized', () => {
@@ -279,134 +279,143 @@
const comment = '- line 1\n - line with indentation\n- line 2';
const result = element._computeBlocks(comment);
assert.lengthOf(result, 3);
- assertListBlock(result, 0, 0, 'line 1');
- assert.equal(result[1].type, 'pre');
- assertListBlock(result, 2, 0, 'line 2');
+ assertListBlock(result[0], ['line 1']);
+ assertTextBlock(result[1], 'pre', ' - line with indentation');
+ assertListBlock(result[2], ['line 2']);
});
test('pre format 1', () => {
const comment = 'A\n This is pre\n formatted';
const result = element._computeBlocks(comment);
assert.lengthOf(result, 2);
- assertBlock(result, 0, 'paragraph', 'A');
- assertBlock(result, 1, 'pre', ' This is pre\n formatted');
+ assertTextBlock(result[0], 'paragraph', 'A');
+ assertTextBlock(result[1], 'pre', ' This is pre\n formatted');
});
test('pre format 2', () => {
const comment = 'A\n This is pre\n formatted\n\nbut this is not';
const result = element._computeBlocks(comment);
assert.lengthOf(result, 3);
- assertBlock(result, 0, 'paragraph', 'A');
- assertBlock(result, 1, 'pre', ' This is pre\n formatted');
- assertBlock(result, 2, 'paragraph', 'but this is not');
+ assertTextBlock(result[0], 'paragraph', 'A');
+ assertTextBlock(result[1], 'pre', ' This is pre\n formatted');
+ assertTextBlock(result[2], 'paragraph', 'but this is not');
});
test('pre format 3', () => {
const comment = 'A\n Q\n <R>\n S\n\nB';
const result = element._computeBlocks(comment);
assert.lengthOf(result, 3);
- assertBlock(result, 0, 'paragraph', 'A');
- assertBlock(result, 1, 'pre', ' Q\n <R>\n S');
- assertBlock(result, 2, 'paragraph', 'B');
+ assertTextBlock(result[0], 'paragraph', 'A');
+ assertTextBlock(result[1], 'pre', ' Q\n <R>\n S');
+ assertTextBlock(result[2], 'paragraph', 'B');
});
test('pre format 4', () => {
const comment = ' Q\n <R>\n S\n\nB';
const result = element._computeBlocks(comment);
assert.lengthOf(result, 2);
- assertBlock(result, 0, 'pre', ' Q\n <R>\n S');
- assertBlock(result, 1, 'paragraph', 'B');
+ assertTextBlock(result[0], 'pre', ' Q\n <R>\n S');
+ assertTextBlock(result[1], 'paragraph', 'B');
});
test('pre format 5', () => {
const comment = ' Q\n <R>\n S\n \nB';
const result = element._computeBlocks(comment);
assert.lengthOf(result, 2);
- assertBlock(result, 0, 'pre', ' Q\n <R>\n S');
- assertBlock(result, 1, 'paragraph', ' \nB');
+ assertTextBlock(result[0], 'pre', ' Q\n <R>\n S');
+ assertTextBlock(result[1], 'paragraph', ' \nB');
});
test('quote 1', () => {
- const comment = "> I'm happy\n > with quotes!\n\nSee above.";
+ const comment = "> I'm happy with quotes!!";
const result = element._computeBlocks(comment);
- assert.lengthOf(result, 2);
- assert.equal(result[0].type, 'quote');
- const blocks = result[0].blocks!;
- assert.lengthOf(blocks, 1);
- assertBlock(blocks, 0, 'paragraph', "I'm happy\nwith quotes!");
- assertBlock(result, 1, 'paragraph', 'See above.');
+ assert.lengthOf(result, 1);
+ const quoteBlock = assertQuoteBlock(result[0]);
+ assert.lengthOf(quoteBlock.blocks, 1);
+ assertTextBlock(
+ quoteBlock.blocks[0],
+ 'paragraph',
+ "I'm happy with quotes!!"
+ );
});
test('quote 2', () => {
+ const comment = "> I'm happy\n > with quotes!\n\nSee above.";
+ const result = element._computeBlocks(comment);
+ assert.lengthOf(result, 2);
+ const quoteBlock = assertQuoteBlock(result[0]);
+ assert.lengthOf(quoteBlock.blocks, 1);
+ assertTextBlock(
+ quoteBlock.blocks[0],
+ 'paragraph',
+ "I'm happy\nwith quotes!"
+ );
+ assertTextBlock(result[1], 'paragraph', 'See above.');
+ });
+
+ test('quote 3', () => {
const comment = 'See this said:\n > a quoted\n > string block\n\nOK?';
const result = element._computeBlocks(comment);
assert.lengthOf(result, 3);
- assertBlock(result, 0, 'paragraph', 'See this said:');
- assert.equal(result[1].type, 'quote');
- const secondBlocks = result[1].blocks!;
- assert.lengthOf(secondBlocks, 1);
- assertBlock(secondBlocks, 0, 'paragraph', 'a quoted\nstring block');
- assertBlock(result, 2, 'paragraph', 'OK?');
+ assertTextBlock(result[0], 'paragraph', 'See this said:');
+ const quoteBlock = assertQuoteBlock(result[1]);
+ assert.lengthOf(quoteBlock.blocks, 1);
+ assertTextBlock(
+ quoteBlock.blocks[0],
+ 'paragraph',
+ 'a quoted\nstring block'
+ );
+ assertTextBlock(result[2], 'paragraph', 'OK?');
});
test('nested quotes', () => {
const comment = ' > > prior\n > \n > next\n';
const result = element._computeBlocks(comment);
assert.lengthOf(result, 1);
- assert.equal(result[0].type, 'quote');
- const blocks = result[0].blocks!;
- assert.lengthOf(blocks, 2);
- assert.equal(blocks[0].type, 'quote');
- const blocksBlocks = blocks[0].blocks!;
- assert.lengthOf(blocksBlocks, 1);
- assertBlock(blocksBlocks, 0, 'paragraph', 'prior');
- assertBlock(blocks, 1, 'paragraph', 'next');
+ const outerQuoteBlock = assertQuoteBlock(result[0]);
+ assert.lengthOf(outerQuoteBlock.blocks, 2);
+ const nestedQuoteBlock = assertQuoteBlock(outerQuoteBlock.blocks[0]);
+ assert.lengthOf(nestedQuoteBlock.blocks, 1);
+ assertTextBlock(nestedQuoteBlock.blocks[0], 'paragraph', 'prior');
+ assertTextBlock(outerQuoteBlock.blocks[1], 'paragraph', 'next');
});
test('code 1', () => {
const comment = '```\n// test code\n```';
const result = element._computeBlocks(comment);
assert.lengthOf(result, 1);
- assert.equal(result[0].type, 'code');
- assert.equal(result[0].text, '// test code');
+ assertTextBlock(result[0], 'code', '// test code');
});
test('code 2', () => {
const comment = 'test code\n```// test code```';
const result = element._computeBlocks(comment);
assert.lengthOf(result, 2);
- assert.equal(result[0].type, 'paragraph');
- assert.equal(result[0].text, 'test code');
- assert.equal(result[1].type, 'code');
- assert.equal(result[1].text, '// test code');
+ assertTextBlock(result[0], 'paragraph', 'test code');
+ assertTextBlock(result[1], 'code', '// test code');
});
- test('code 3', () => {
- const comment = 'test code\n```// test code```';
- const result = element._computeBlocks(comment);
- assert.lengthOf(result, 2);
- assert.equal(result[0].type, 'paragraph');
- assert.equal(result[0].text, 'test code');
- assert.equal(result[1].type, 'code');
- assert.equal(result[1].text, '// test code');
- });
-
- test('not a code', () => {
+ test('not a code block', () => {
const comment = 'test code\n```// test code';
const result = element._computeBlocks(comment);
assert.lengthOf(result, 1);
- assert.equal(result[0].type, 'paragraph');
- assert.equal(result[0].text, 'test code\n```// test code');
+ assertTextBlock(result[0], 'paragraph', 'test code\n```// test code');
});
- test('not a code 2', () => {
+ test('not a code block 2', () => {
const comment = 'test code\n```\n// test code';
const result = element._computeBlocks(comment);
assert.lengthOf(result, 2);
- assert.equal(result[0].type, 'paragraph');
- assert.equal(result[0].text, 'test code');
- assert.equal(result[1].type, 'paragraph');
- assert.equal(result[1].text, '```\n// test code');
+ assertTextBlock(result[0], 'paragraph', 'test code');
+ assertTextBlock(result[1], 'paragraph', '```\n// test code');
+ });
+
+ test('not a code block 3', () => {
+ const comment = 'test code\n```';
+ const result = element._computeBlocks(comment);
+ assert.lengthOf(result, 2);
+ assertTextBlock(result[0], 'paragraph', 'test code');
+ assertTextBlock(result[1], 'paragraph', '```');
});
test('mix all 1', () => {
diff --git a/polygerrit-ui/app/elements/shared/gr-hovercard/gr-hovercard-behavior.ts b/polygerrit-ui/app/elements/shared/gr-hovercard/gr-hovercard-behavior.ts
index 76c13e3..d5e9152 100644
--- a/polygerrit-ui/app/elements/shared/gr-hovercard/gr-hovercard-behavior.ts
+++ b/polygerrit-ui/app/elements/shared/gr-hovercard/gr-hovercard-behavior.ts
@@ -19,7 +19,6 @@
import {getRootElement} from '../../../scripts/rootElement';
import {Constructor} from '../../../utils/common-util';
import {PolymerElement} from '@polymer/polymer/polymer-element';
-import {dedupingMixin} from '@polymer/polymer/lib/utils/mixin';
import {property, observe} from '@polymer/decorators';
import {
pushScrollLock,
@@ -82,399 +81,393 @@
* @polymer
* @mixinFunction
*/
-export const hovercardBehaviorMixin = dedupingMixin(
- <T extends Constructor<PolymerElement>>(
- superClass: T
- ): T & Constructor<GrHovercardBehaviorInterface> => {
+export const hovercardBehaviorMixin = <T extends Constructor<PolymerElement>>(
+ superClass: T
+) => {
+ /**
+ * @polymer
+ * @mixinClass
+ */
+ class Mixin extends superClass {
+ @property({type: Object})
+ _target: HTMLElement | null = null;
+
+ // Determines whether or not the hovercard is visible.
+ @property({type: Boolean})
+ _isShowing = false;
+
+ // The `id` of the element that the hovercard is anchored to.
+ @property({type: String})
+ for?: string;
+
/**
- * @polymer
- * @mixinClass
+ * The spacing between the top of the hovercard and the element it is
+ * anchored to.
*/
- class Mixin extends superClass {
- @property({type: Object})
- _target: HTMLElement | null = null;
+ @property({type: Number})
+ offset = 14;
- // Determines whether or not the hovercard is visible.
- @property({type: Boolean})
- _isShowing = false;
+ /**
+ * Positions the hovercard to the top, right, bottom, left, bottom-left,
+ * bottom-right, top-left, or top-right of its content.
+ */
+ @property({type: String})
+ position = 'right';
- // The `id` of the element that the hovercard is anchored to.
- @property({type: String})
- for?: string;
+ @property({type: Object})
+ container: HTMLElement | null = null;
- /**
- * The spacing between the top of the hovercard and the element it is
- * anchored to.
- */
- @property({type: Number})
- offset = 14;
+ private hideTask?: DelayedTask;
- /**
- * Positions the hovercard to the top, right, bottom, left, bottom-left,
- * bottom-right, top-left, or top-right of its content.
- */
- @property({type: String})
- position = 'right';
+ private showTask?: DelayedTask;
- @property({type: Object})
- container: HTMLElement | null = null;
+ private isScheduledToShow?: boolean;
- private hideTask?: DelayedTask;
+ private isScheduledToHide?: boolean;
- private showTask?: DelayedTask;
-
- private isScheduledToShow?: boolean;
-
- private isScheduledToHide?: boolean;
-
- override connectedCallback() {
- super.connectedCallback();
- if (!this._target) {
- this._target = this.target;
- }
- this._target.addEventListener('mouseenter', this.debounceShow);
- this._target.addEventListener('focus', this.debounceShow);
- this._target.addEventListener('mouseleave', this.debounceHide);
- this._target.addEventListener('blur', this.debounceHide);
-
- // when click, dismiss immediately
- this._target.addEventListener('click', this.hide);
-
- // show the hovercard if mouse moves to hovercard
- // this will cancel pending hide as well
- this.addEventListener('mouseenter', this.show);
- this.addEventListener('mouseenter', this.lock);
- // when leave hovercard, hide it immediately
- this.addEventListener('mouseleave', this.hide);
- this.addEventListener('mouseleave', this.unlock);
- }
-
- override disconnectedCallback() {
- this.cancelShowTask();
- this.cancelHideTask();
- this.unlock();
- super.disconnectedCallback();
- }
-
- override ready() {
- super.ready();
- // First, check to see if the container has already been created.
- this.container = getHovercardContainer({createIfNotExists: true});
- }
-
- removeListeners() {
- this._target?.removeEventListener('mouseenter', this.debounceShow);
- this._target?.removeEventListener('focus', this.debounceShow);
- this._target?.removeEventListener('mouseleave', this.debounceHide);
- this._target?.removeEventListener('blur', this.debounceHide);
- this._target?.removeEventListener('click', this.hide);
- }
-
- readonly debounceHide = () => {
- this.cancelShowTask();
- if (!this._isShowing || this.isScheduledToHide) return;
- this.isScheduledToHide = true;
- this.hideTask = debounce(
- this.hideTask,
- () => {
- // This happens when hide immediately through click or mouse leave
- // on the hovercard
- if (!this.isScheduledToHide) return;
- this.hide();
- },
- HIDE_DELAY_MS
- );
- };
-
- cancelHideTask() {
- if (this.hideTask) {
- this.hideTask.cancel();
- this.isScheduledToHide = false;
- }
- }
-
- /**
- * Hovercard elements are created outside of <gr-app>, so if you want to fire
- * events, then you probably want to do that through the target element.
- */
-
- dispatchEventThroughTarget(eventName: string): void;
-
- dispatchEventThroughTarget(
- eventName: 'show-alert',
- detail: ShowAlertEventDetail
- ): void;
-
- dispatchEventThroughTarget(
- eventName: 'reload',
- detail: ReloadEventDetail
- ): void;
-
- dispatchEventThroughTarget(eventName: string, detail?: unknown) {
- if (!detail) detail = {};
- if (this._target)
- this._target.dispatchEvent(
- new CustomEvent(eventName, {
- detail,
- bubbles: true,
- composed: true,
- })
- );
- }
-
- /**
- * Returns the target element that the hovercard is anchored to (the `id` of
- * the `for` property).
- */
- get target(): HTMLElement {
- const parentNode = this.parentNode;
- // If the parentNode is a document fragment, then we need to use the host.
- const ownerRoot = this.getRootNode() as ShadowRoot;
- let target;
- if (this.for) {
- target = ownerRoot.querySelector('#' + this.for);
- } else {
- target =
- !parentNode || parentNode.nodeType === Node.DOCUMENT_FRAGMENT_NODE
- ? ownerRoot.host
- : parentNode;
- }
- return target as HTMLElement;
- }
-
- /**
- * unlock scroll, this will resume the scroll outside of the hovercard.
- */
- readonly unlock = () => {
- removeScrollLock(this);
- };
-
- /**
- * Hides/closes the hovercard. This occurs when the user triggers the
- * `mouseleave` event on the hovercard's `target` element (as long as the
- * user is not hovering over the hovercard).
- *
- */
- readonly hide = (e?: MouseEvent) => {
- this.cancelHideTask();
- this.cancelShowTask();
- if (!this._isShowing) {
- return;
- }
-
- // If the user is now hovering over the hovercard or the user is returning
- // from the hovercard but now hovering over the target (to stop an annoying
- // flicker effect), just return.
- if (e) {
- if (
- e.relatedTarget === this ||
- (e.target === this && e.relatedTarget === this._target)
- ) {
- return;
- }
- }
-
- // Mark that the hovercard is not visible and do not allow focusing
- this._isShowing = false;
-
- // Clear styles in preparation for the next time we need to show the card
- this.classList.remove(HOVER_CLASS);
-
- // Reset and remove the hovercard from the DOM
- this.style.cssText = '';
- this.$['container'].setAttribute('tabindex', '-1');
-
- // Remove the hovercard from the container, given that it is still a child
- // of the container.
- if (this.container?.contains(this)) {
- this.container.removeChild(this);
- }
- };
-
- /**
- * Shows/opens the hovercard with a fixed delay.
- */
- readonly debounceShow = () => {
- this.debounceShowBy(SHOW_DELAY_MS);
- };
-
- /**
- * Shows/opens the hovercard with the given delay.
- */
- debounceShowBy(delayMs: number) {
- this.cancelHideTask();
- if (this._isShowing || this.isScheduledToShow) return;
- this.isScheduledToShow = true;
- this.showTask = debounce(
- this.showTask,
- () => {
- // This happens when the mouse leaves the target before the delay is over.
- if (!this.isScheduledToShow) return;
- this.show();
- },
- delayMs
- );
- }
-
- cancelShowTask() {
- if (this.showTask) {
- this.showTask.cancel();
- this.isScheduledToShow = false;
- }
- }
-
- /**
- * Lock background scroll but enable scroll inside of current hovercard.
- */
- readonly lock = () => {
- pushScrollLock(this);
- };
-
- /**
- * Shows/opens the hovercard. This occurs when the user triggers the
- * `mousenter` event on the hovercard's `target` element.
- */
- readonly show = () => {
- this.cancelHideTask();
- this.cancelShowTask();
- if (this._isShowing || !this.container) {
- return;
- }
-
- // Mark that the hovercard is now visible
- this._isShowing = true;
- this.setAttribute('tabindex', '0');
-
- // Add it to the DOM and calculate its position
- this.container.appendChild(this);
- // We temporarily hide the hovercard until we have found the correct
- // position for it.
- this.classList.add(HIDE_CLASS);
- this.classList.add(HOVER_CLASS);
- // Make sure that the hovercard actually rendered and all dom-if
- // statements processed, so that we can measure the (invisible)
- // hovercard properly in updatePosition().
- flush();
- this.updatePosition();
- this.classList.remove(HIDE_CLASS);
- };
-
- updatePosition() {
- const positionsToTry = new Set([
- this.position,
- 'right',
- 'bottom-right',
- 'top-right',
- 'bottom',
- 'top',
- 'bottom-left',
- 'top-left',
- 'left',
- ]);
- for (const position of positionsToTry) {
- this.updatePositionTo(position);
- if (this._isInsideViewport()) return;
- }
- console.warn('Could not find a visible position for the hovercard.');
- }
-
- _isInsideViewport() {
- const thisRect = this.getBoundingClientRect();
- if (thisRect.top < 0) return false;
- if (thisRect.left < 0) return false;
- const docuRect = document.documentElement.getBoundingClientRect();
- if (thisRect.bottom > docuRect.height) return false;
- if (thisRect.right > docuRect.width) return false;
- return true;
- }
-
- /**
- * Updates the hovercard's position based the current position of the `target`
- * element.
- *
- * The hovercard is supposed to stay open if the user hovers over it.
- * To keep it open when the user moves away from the target, the bounding
- * rects of the target and hovercard must touch or overlap.
- *
- * NOTE: You do not need to directly call this method unless you need to
- * update the position of the tooltip while it is already visible (the
- * target element has moved and the tooltip is still open).
- */
- updatePositionTo(position: string) {
- if (!this._target) {
- return;
- }
-
- // Make sure that thisRect will not get any paddings and such included
- // in the width and height of the bounding client rect.
- this.style.cssText = '';
-
- const docuRect = document.documentElement.getBoundingClientRect();
- const targetRect = this._target.getBoundingClientRect();
- const thisRect = this.getBoundingClientRect();
-
- const targetLeft = targetRect.left - docuRect.left;
- const targetTop = targetRect.top - docuRect.top;
-
- let hovercardLeft;
- let hovercardTop;
-
- switch (position) {
- case 'top':
- hovercardLeft =
- targetLeft + (targetRect.width - thisRect.width) / 2;
- hovercardTop = targetTop - thisRect.height - this.offset;
- break;
- case 'bottom':
- hovercardLeft =
- targetLeft + (targetRect.width - thisRect.width) / 2;
- hovercardTop = targetTop + targetRect.height + this.offset;
- break;
- case 'left':
- hovercardLeft = targetLeft - thisRect.width - this.offset;
- hovercardTop =
- targetTop + (targetRect.height - thisRect.height) / 2;
- break;
- case 'right':
- hovercardLeft = targetLeft + targetRect.width + this.offset;
- hovercardTop =
- targetTop + (targetRect.height - thisRect.height) / 2;
- break;
- case 'bottom-right':
- hovercardLeft = targetLeft + targetRect.width + this.offset;
- hovercardTop = targetTop;
- break;
- case 'bottom-left':
- hovercardLeft = targetLeft - thisRect.width - this.offset;
- hovercardTop = targetTop;
- break;
- case 'top-left':
- hovercardLeft = targetLeft - thisRect.width - this.offset;
- hovercardTop = targetTop + targetRect.height - thisRect.height;
- break;
- case 'top-right':
- hovercardLeft = targetLeft + targetRect.width + this.offset;
- hovercardTop = targetTop + targetRect.height - thisRect.height;
- break;
- }
-
- this.style.left = `${hovercardLeft}px`;
- this.style.top = `${hovercardTop}px`;
- }
-
- /**
- * Responds to a change in the `for` value and gets the updated `target`
- * element for the hovercard.
- */
- @observe('for')
- _forChanged() {
+ override connectedCallback() {
+ super.connectedCallback();
+ if (!this._target) {
this._target = this.target;
}
+ this._target.addEventListener('mouseenter', this.debounceShow);
+ this._target.addEventListener('focus', this.debounceShow);
+ this._target.addEventListener('mouseleave', this.debounceHide);
+ this._target.addEventListener('blur', this.debounceHide);
+
+ // when click, dismiss immediately
+ this._target.addEventListener('click', this.hide);
+
+ // show the hovercard if mouse moves to hovercard
+ // this will cancel pending hide as well
+ this.addEventListener('mouseenter', this.show);
+ this.addEventListener('mouseenter', this.lock);
+ // when leave hovercard, hide it immediately
+ this.addEventListener('mouseleave', this.hide);
+ this.addEventListener('mouseleave', this.unlock);
+ }
+
+ override disconnectedCallback() {
+ this.cancelShowTask();
+ this.cancelHideTask();
+ this.unlock();
+ super.disconnectedCallback();
+ }
+
+ override ready() {
+ super.ready();
+ // First, check to see if the container has already been created.
+ this.container = getHovercardContainer({createIfNotExists: true});
+ }
+
+ removeListeners() {
+ this._target?.removeEventListener('mouseenter', this.debounceShow);
+ this._target?.removeEventListener('focus', this.debounceShow);
+ this._target?.removeEventListener('mouseleave', this.debounceHide);
+ this._target?.removeEventListener('blur', this.debounceHide);
+ this._target?.removeEventListener('click', this.hide);
+ }
+
+ readonly debounceHide = () => {
+ this.cancelShowTask();
+ if (!this._isShowing || this.isScheduledToHide) return;
+ this.isScheduledToHide = true;
+ this.hideTask = debounce(
+ this.hideTask,
+ () => {
+ // This happens when hide immediately through click or mouse leave
+ // on the hovercard
+ if (!this.isScheduledToHide) return;
+ this.hide();
+ },
+ HIDE_DELAY_MS
+ );
+ };
+
+ cancelHideTask() {
+ if (this.hideTask) {
+ this.hideTask.cancel();
+ this.isScheduledToHide = false;
+ }
}
- return Mixin;
+ /**
+ * Hovercard elements are created outside of <gr-app>, so if you want to fire
+ * events, then you probably want to do that through the target element.
+ */
+
+ dispatchEventThroughTarget(eventName: string): void;
+
+ dispatchEventThroughTarget(
+ eventName: 'show-alert',
+ detail: ShowAlertEventDetail
+ ): void;
+
+ dispatchEventThroughTarget(
+ eventName: 'reload',
+ detail: ReloadEventDetail
+ ): void;
+
+ dispatchEventThroughTarget(eventName: string, detail?: unknown) {
+ if (!detail) detail = {};
+ if (this._target)
+ this._target.dispatchEvent(
+ new CustomEvent(eventName, {
+ detail,
+ bubbles: true,
+ composed: true,
+ })
+ );
+ }
+
+ /**
+ * Returns the target element that the hovercard is anchored to (the `id` of
+ * the `for` property).
+ */
+ get target(): HTMLElement {
+ const parentNode = this.parentNode;
+ // If the parentNode is a document fragment, then we need to use the host.
+ const ownerRoot = this.getRootNode() as ShadowRoot;
+ let target;
+ if (this.for) {
+ target = ownerRoot.querySelector('#' + this.for);
+ } else {
+ target =
+ !parentNode || parentNode.nodeType === Node.DOCUMENT_FRAGMENT_NODE
+ ? ownerRoot.host
+ : parentNode;
+ }
+ return target as HTMLElement;
+ }
+
+ /**
+ * unlock scroll, this will resume the scroll outside of the hovercard.
+ */
+ readonly unlock = () => {
+ removeScrollLock(this);
+ };
+
+ /**
+ * Hides/closes the hovercard. This occurs when the user triggers the
+ * `mouseleave` event on the hovercard's `target` element (as long as the
+ * user is not hovering over the hovercard).
+ *
+ */
+ readonly hide = (e?: MouseEvent) => {
+ this.cancelHideTask();
+ this.cancelShowTask();
+ if (!this._isShowing) {
+ return;
+ }
+
+ // If the user is now hovering over the hovercard or the user is returning
+ // from the hovercard but now hovering over the target (to stop an annoying
+ // flicker effect), just return.
+ if (e) {
+ if (
+ e.relatedTarget === this ||
+ (e.target === this && e.relatedTarget === this._target)
+ ) {
+ return;
+ }
+ }
+
+ // Mark that the hovercard is not visible and do not allow focusing
+ this._isShowing = false;
+
+ // Clear styles in preparation for the next time we need to show the card
+ this.classList.remove(HOVER_CLASS);
+
+ // Reset and remove the hovercard from the DOM
+ this.style.cssText = '';
+ this.$['container'].setAttribute('tabindex', '-1');
+
+ // Remove the hovercard from the container, given that it is still a child
+ // of the container.
+ if (this.container?.contains(this)) {
+ this.container.removeChild(this);
+ }
+ };
+
+ /**
+ * Shows/opens the hovercard with a fixed delay.
+ */
+ readonly debounceShow = () => {
+ this.debounceShowBy(SHOW_DELAY_MS);
+ };
+
+ /**
+ * Shows/opens the hovercard with the given delay.
+ */
+ debounceShowBy(delayMs: number) {
+ this.cancelHideTask();
+ if (this._isShowing || this.isScheduledToShow) return;
+ this.isScheduledToShow = true;
+ this.showTask = debounce(
+ this.showTask,
+ () => {
+ // This happens when the mouse leaves the target before the delay is over.
+ if (!this.isScheduledToShow) return;
+ this.show();
+ },
+ delayMs
+ );
+ }
+
+ cancelShowTask() {
+ if (this.showTask) {
+ this.showTask.cancel();
+ this.isScheduledToShow = false;
+ }
+ }
+
+ /**
+ * Lock background scroll but enable scroll inside of current hovercard.
+ */
+ readonly lock = () => {
+ pushScrollLock(this);
+ };
+
+ /**
+ * Shows/opens the hovercard. This occurs when the user triggers the
+ * `mousenter` event on the hovercard's `target` element.
+ */
+ readonly show = () => {
+ this.cancelHideTask();
+ this.cancelShowTask();
+ if (this._isShowing || !this.container) {
+ return;
+ }
+
+ // Mark that the hovercard is now visible
+ this._isShowing = true;
+ this.setAttribute('tabindex', '0');
+
+ // Add it to the DOM and calculate its position
+ this.container.appendChild(this);
+ // We temporarily hide the hovercard until we have found the correct
+ // position for it.
+ this.classList.add(HIDE_CLASS);
+ this.classList.add(HOVER_CLASS);
+ // Make sure that the hovercard actually rendered and all dom-if
+ // statements processed, so that we can measure the (invisible)
+ // hovercard properly in updatePosition().
+ flush();
+ this.updatePosition();
+ this.classList.remove(HIDE_CLASS);
+ };
+
+ updatePosition() {
+ const positionsToTry = new Set([
+ this.position,
+ 'right',
+ 'bottom-right',
+ 'top-right',
+ 'bottom',
+ 'top',
+ 'bottom-left',
+ 'top-left',
+ 'left',
+ ]);
+ for (const position of positionsToTry) {
+ this.updatePositionTo(position);
+ if (this._isInsideViewport()) return;
+ }
+ console.warn('Could not find a visible position for the hovercard.');
+ }
+
+ _isInsideViewport() {
+ const thisRect = this.getBoundingClientRect();
+ if (thisRect.top < 0) return false;
+ if (thisRect.left < 0) return false;
+ const docuRect = document.documentElement.getBoundingClientRect();
+ if (thisRect.bottom > docuRect.height) return false;
+ if (thisRect.right > docuRect.width) return false;
+ return true;
+ }
+
+ /**
+ * Updates the hovercard's position based the current position of the `target`
+ * element.
+ *
+ * The hovercard is supposed to stay open if the user hovers over it.
+ * To keep it open when the user moves away from the target, the bounding
+ * rects of the target and hovercard must touch or overlap.
+ *
+ * NOTE: You do not need to directly call this method unless you need to
+ * update the position of the tooltip while it is already visible (the
+ * target element has moved and the tooltip is still open).
+ */
+ updatePositionTo(position: string) {
+ if (!this._target) {
+ return;
+ }
+
+ // Make sure that thisRect will not get any paddings and such included
+ // in the width and height of the bounding client rect.
+ this.style.cssText = '';
+
+ const docuRect = document.documentElement.getBoundingClientRect();
+ const targetRect = this._target.getBoundingClientRect();
+ const thisRect = this.getBoundingClientRect();
+
+ const targetLeft = targetRect.left - docuRect.left;
+ const targetTop = targetRect.top - docuRect.top;
+
+ let hovercardLeft;
+ let hovercardTop;
+
+ switch (position) {
+ case 'top':
+ hovercardLeft = targetLeft + (targetRect.width - thisRect.width) / 2;
+ hovercardTop = targetTop - thisRect.height - this.offset;
+ break;
+ case 'bottom':
+ hovercardLeft = targetLeft + (targetRect.width - thisRect.width) / 2;
+ hovercardTop = targetTop + targetRect.height + this.offset;
+ break;
+ case 'left':
+ hovercardLeft = targetLeft - thisRect.width - this.offset;
+ hovercardTop = targetTop + (targetRect.height - thisRect.height) / 2;
+ break;
+ case 'right':
+ hovercardLeft = targetLeft + targetRect.width + this.offset;
+ hovercardTop = targetTop + (targetRect.height - thisRect.height) / 2;
+ break;
+ case 'bottom-right':
+ hovercardLeft = targetLeft + targetRect.width + this.offset;
+ hovercardTop = targetTop;
+ break;
+ case 'bottom-left':
+ hovercardLeft = targetLeft - thisRect.width - this.offset;
+ hovercardTop = targetTop;
+ break;
+ case 'top-left':
+ hovercardLeft = targetLeft - thisRect.width - this.offset;
+ hovercardTop = targetTop + targetRect.height - thisRect.height;
+ break;
+ case 'top-right':
+ hovercardLeft = targetLeft + targetRect.width + this.offset;
+ hovercardTop = targetTop + targetRect.height - thisRect.height;
+ break;
+ }
+
+ this.style.left = `${hovercardLeft}px`;
+ this.style.top = `${hovercardTop}px`;
+ }
+
+ /**
+ * Responds to a change in the `for` value and gets the updated `target`
+ * element for the hovercard.
+ */
+ @observe('for')
+ _forChanged() {
+ this._target = this.target;
+ }
}
-);
+
+ return Mixin as T & Constructor<GrHovercardBehaviorInterface>;
+};
export interface GrHovercardBehaviorInterface {
ready(): void;
diff --git a/polygerrit-ui/app/elements/shared/gr-label-info/gr-label-info_html.ts b/polygerrit-ui/app/elements/shared/gr-label-info/gr-label-info_html.ts
index b6583d9..1588020 100644
--- a/polygerrit-ui/app/elements/shared/gr-label-info/gr-label-info_html.ts
+++ b/polygerrit-ui/app/elements/shared/gr-label-info/gr-label-info_html.ts
@@ -27,13 +27,13 @@
.hidden {
display: none;
}
+ /* Note that most of the .voteChip styles are coming from the
+ gr-voting-styles include. */
.voteChip {
display: flex;
justify-content: center;
margin-right: var(--spacing-s);
padding: 1px;
- @apply --vote-chip-styles;
- border: 1px solid var(--border-color);
}
.max {
background-color: var(--vote-color-approved);
diff --git a/polygerrit-ui/app/mixins/gr-change-table-mixin/gr-change-table-mixin.ts b/polygerrit-ui/app/mixins/gr-change-table-mixin/gr-change-table-mixin.ts
index e3b75de..9e4608f 100644
--- a/polygerrit-ui/app/mixins/gr-change-table-mixin/gr-change-table-mixin.ts
+++ b/polygerrit-ui/app/mixins/gr-change-table-mixin/gr-change-table-mixin.ts
@@ -15,7 +15,6 @@
* limitations under the License.
*/
-import {dedupingMixin} from '@polymer/polymer/lib/utils/mixin';
import {PolymerElement} from '@polymer/polymer';
import {Constructor} from '../../utils/common-util';
import {property} from '@polymer/decorators';
@@ -25,89 +24,82 @@
* @polymer
* @mixinFunction
*/
-export const ChangeTableMixin = dedupingMixin(
- <T extends Constructor<PolymerElement>>(
- superClass: T
- ): T & Constructor<ChangeTableMixinInterface> => {
- /**
- * @polymer
- * @mixinClass
- */
- class Mixin extends superClass {
- @property({type: Array})
- readonly columnNames: string[] = [
- 'Subject',
- 'Status',
- 'Owner',
- 'Assignee',
- 'Reviewers',
- 'Comments',
- 'Repo',
- 'Branch',
- 'Updated',
- 'Size',
- ];
+export const ChangeTableMixin = <T extends Constructor<PolymerElement>>(
+ superClass: T
+) => {
+ /**
+ * @polymer
+ * @mixinClass
+ */
+ class Mixin extends superClass {
+ @property({type: Array})
+ readonly columnNames: string[] = [
+ 'Subject',
+ 'Status',
+ 'Owner',
+ 'Assignee',
+ 'Reviewers',
+ 'Comments',
+ 'Repo',
+ 'Branch',
+ 'Updated',
+ 'Size',
+ ];
- isColumnHidden(columnToCheck?: string, columnsToDisplay?: string[]) {
- if (!columnsToDisplay || !columnToCheck) {
- return false;
- }
- return !columnsToDisplay.includes(columnToCheck);
+ isColumnHidden(columnToCheck?: string, columnsToDisplay?: string[]) {
+ if (!columnsToDisplay || !columnToCheck) {
+ return false;
}
-
- /**
- * Is the column disabled by a server config or experiment? For example the
- * assignee feature might be disabled and thus the corresponding column is
- * also disabled.
- *
- */
- isColumnEnabled(
- column: string,
- config: ServerInfo,
- experiments: string[]
- ) {
- if (!config || !config.change) return true;
- if (column === 'Assignee') return !!config.change.enable_assignee;
- if (column === 'Comments')
- return experiments.includes('comments-column');
- return true;
- }
-
- /**
- * @return enabled columns, see isColumnEnabled().
- */
- getEnabledColumns(
- columns: string[],
- config: ServerInfo,
- experiments: string[]
- ) {
- return columns.filter(col =>
- this.isColumnEnabled(col, config, experiments)
- );
- }
-
- /**
- * The Project column was renamed to Repo, but some users may have
- * preferences that use its old name. If that column is found, rename it
- * before use.
- *
- * @return If the column was renamed, returns a new array
- * with the corrected name. Otherwise, it returns the original param.
- */
- renameProjectToRepoColumn(columns: string[]) {
- const projectIndex = columns.indexOf('Project');
- if (projectIndex === -1) {
- return columns;
- }
- const newColumns = [...columns];
- newColumns[projectIndex] = 'Repo';
- return newColumns;
- }
+ return !columnsToDisplay.includes(columnToCheck);
}
- return Mixin;
+ /**
+ * Is the column disabled by a server config or experiment? For example the
+ * assignee feature might be disabled and thus the corresponding column is
+ * also disabled.
+ *
+ */
+ isColumnEnabled(column: string, config: ServerInfo, experiments: string[]) {
+ if (!config || !config.change) return true;
+ if (column === 'Assignee') return !!config.change.enable_assignee;
+ if (column === 'Comments') return experiments.includes('comments-column');
+ return true;
+ }
+
+ /**
+ * @return enabled columns, see isColumnEnabled().
+ */
+ getEnabledColumns(
+ columns: string[],
+ config: ServerInfo,
+ experiments: string[]
+ ) {
+ return columns.filter(col =>
+ this.isColumnEnabled(col, config, experiments)
+ );
+ }
+
+ /**
+ * The Project column was renamed to Repo, but some users may have
+ * preferences that use its old name. If that column is found, rename it
+ * before use.
+ *
+ * @return If the column was renamed, returns a new array
+ * with the corrected name. Otherwise, it returns the original param.
+ */
+ renameProjectToRepoColumn(columns: string[]) {
+ const projectIndex = columns.indexOf('Project');
+ if (projectIndex === -1) {
+ return columns;
+ }
+ const newColumns = [...columns];
+ newColumns[projectIndex] = 'Repo';
+ return newColumns;
+ }
}
-);
+
+ return Mixin as T & Constructor<ChangeTableMixinInterface>;
+};
export interface ChangeTableMixinInterface {
readonly columnNames: string[];
diff --git a/polygerrit-ui/app/mixins/gr-list-view-mixin/gr-list-view-mixin.ts b/polygerrit-ui/app/mixins/gr-list-view-mixin/gr-list-view-mixin.ts
index af89194..70d212c 100644
--- a/polygerrit-ui/app/mixins/gr-list-view-mixin/gr-list-view-mixin.ts
+++ b/polygerrit-ui/app/mixins/gr-list-view-mixin/gr-list-view-mixin.ts
@@ -16,7 +16,6 @@
*/
import {encodeURL, getBaseUrl} from '../../utils/url-util';
-import {dedupingMixin} from '@polymer/polymer/lib/utils/mixin';
import {PolymerElement} from '@polymer/polymer';
import {Constructor} from '../../utils/common-util';
@@ -24,45 +23,43 @@
* @polymer
* @mixinFunction
*/
-export const ListViewMixin = dedupingMixin(
- <T extends Constructor<PolymerElement>>(
- superClass: T
- ): T & Constructor<ListViewMixinInterface> => {
- /**
- * @polymer
- * @mixinClass
- */
- class Mixin extends superClass {
- computeLoadingClass(loading: boolean): string {
- return loading ? 'loading' : '';
- }
-
- computeShownItems<T>(items: T[]): T[] {
- return items.slice(0, 25);
- }
-
- getUrl(path: string, item: string) {
- return getBaseUrl() + path + encodeURL(item, true);
- }
-
- getFilterValue<T extends ListViewParams>(params: T): string {
- if (!params) {
- return '';
- }
- return params.filter || '';
- }
-
- getOffsetValue<T extends ListViewParams>(params: T): number {
- if (params?.offset) {
- return Number(params.offset);
- }
- return 0;
- }
+export const ListViewMixin = <T extends Constructor<PolymerElement>>(
+ superClass: T
+) => {
+ /**
+ * @polymer
+ * @mixinClass
+ */
+ class Mixin extends superClass {
+ computeLoadingClass(loading: boolean): string {
+ return loading ? 'loading' : '';
}
- return Mixin;
+ computeShownItems<T>(items: T[]): T[] {
+ return items.slice(0, 25);
+ }
+
+ getUrl(path: string, item: string) {
+ return getBaseUrl() + path + encodeURL(item, true);
+ }
+
+ getFilterValue<T extends ListViewParams>(params: T): string {
+ if (!params) {
+ return '';
+ }
+ return params.filter || '';
+ }
+
+ getOffsetValue<T extends ListViewParams>(params: T): number {
+ if (params?.offset) {
+ return Number(params.offset);
+ }
+ return 0;
+ }
}
-);
+
+ return Mixin as T & Constructor<ListViewMixinInterface>;
+};
export interface ListViewMixinInterface {
computeLoadingClass(loading: boolean): string;
diff --git a/polygerrit-ui/app/mixins/gr-tooltip-mixin/gr-tooltip-mixin.ts b/polygerrit-ui/app/mixins/gr-tooltip-mixin/gr-tooltip-mixin.ts
index 4d119eb..3e20d1d 100644
--- a/polygerrit-ui/app/mixins/gr-tooltip-mixin/gr-tooltip-mixin.ts
+++ b/polygerrit-ui/app/mixins/gr-tooltip-mixin/gr-tooltip-mixin.ts
@@ -18,7 +18,6 @@
import {flush} from '@polymer/polymer/lib/legacy/polymer.dom';
import {getRootElement} from '../../scripts/rootElement';
import {property, observe} from '@polymer/decorators';
-import {dedupingMixin} from '@polymer/polymer/lib/utils/mixin';
import {GrTooltip} from '../../elements/shared/gr-tooltip/gr-tooltip';
import {PolymerElement} from '@polymer/polymer';
import {Constructor} from '../../utils/common-util';
@@ -39,192 +38,190 @@
* @polymer
* @mixinFunction
*/
-export const TooltipMixin = dedupingMixin(
- <T extends Constructor<PolymerElement>>(
- superClass: T
- ): T & Constructor<TooltipMixinInterface> => {
- /**
- * @polymer
- * @mixinClass
- */
- class Mixin extends superClass {
- @property({type: Boolean})
- hasTooltip = false;
+export const TooltipMixin = <T extends Constructor<PolymerElement>>(
+ superClass: T
+) => {
+ /**
+ * @polymer
+ * @mixinClass
+ */
+ class Mixin extends superClass {
+ @property({type: Boolean})
+ hasTooltip = false;
- @property({type: Boolean, reflectToAttribute: true})
- positionBelow = false;
+ @property({type: Boolean, reflectToAttribute: true})
+ positionBelow = false;
- @property({type: Boolean})
- _isTouchDevice = 'ontouchstart' in document.documentElement;
+ @property({type: Boolean})
+ _isTouchDevice = 'ontouchstart' in document.documentElement;
- @property({type: Object})
- _tooltip: GrTooltip | null = null;
+ @property({type: Object})
+ _tooltip: GrTooltip | null = null;
- @property({type: String})
- _titleText = '';
+ @property({type: String})
+ _titleText = '';
- @property({type: Boolean})
- _hasSetupTooltipListeners = false;
+ @property({type: Boolean})
+ _hasSetupTooltipListeners = false;
- // Handler for mouseenter event
- private mouseenterHandler?: (e: MouseEvent) => void;
+ // Handler for mouseenter event
+ private mouseenterHandler?: (e: MouseEvent) => void;
- // Handler for scrolling on window
- private readonly windowScrollHandler: () => void;
+ // Handler for scrolling on window
+ private readonly windowScrollHandler: () => void;
- // Handler for showing the tooltip, will be attached to certain events
- private readonly showHandler: () => void;
+ // Handler for showing the tooltip, will be attached to certain events
+ private readonly showHandler: () => void;
- // Handler for hiding the tooltip, will be attached to certain events
- private readonly hideHandler: (e: Event) => void;
+ // Handler for hiding the tooltip, will be attached to certain events
+ private readonly hideHandler: (e: Event) => void;
- // eslint-disable-next-line @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any
- constructor(..._: any[]) {
- super();
- this.windowScrollHandler = () => this._handleWindowScroll();
- this.showHandler = () => this._handleShowTooltip();
- this.hideHandler = (e: Event | undefined) => this._handleHideTooltip(e);
- }
-
- override disconnectedCallback() {
- // NOTE: if you define your own `detached` in your component
- // then this won't take affect (as its not a class yet)
- this._handleHideTooltip(undefined);
- if (this.mouseenterHandler) {
- this.removeEventListener('mouseenter', this.mouseenterHandler);
- }
- window.removeEventListener('scroll', this.windowScrollHandler);
- super.disconnectedCallback();
- }
-
- @observe('hasTooltip')
- _setupTooltipListeners() {
- if (!this.mouseenterHandler) {
- this.mouseenterHandler = this.showHandler;
- }
-
- if (!this.hasTooltip) {
- // if attribute set to false, remove the listener
- this.removeEventListener('mouseenter', this.mouseenterHandler);
- this._hasSetupTooltipListeners = false;
- return;
- }
-
- if (this._hasSetupTooltipListeners) {
- return;
- }
- this._hasSetupTooltipListeners = true;
-
- this.addEventListener('mouseenter', this.mouseenterHandler);
- }
-
- _handleShowTooltip() {
- if (this._isTouchDevice) {
- return;
- }
-
- if (
- !this.hasAttribute('title') ||
- this.getAttribute('title') === '' ||
- this._tooltip
- ) {
- return;
- }
-
- // Store the title attribute text then set it to an empty string to
- // prevent it from showing natively.
- this._titleText = this.getAttribute('title') || '';
- this.setAttribute('title', '');
-
- const tooltip = document.createElement('gr-tooltip');
- tooltip.text = this._titleText;
- tooltip.maxWidth = this.getAttribute('max-width') || '';
- tooltip.positionBelow = this.hasAttribute('position-below');
-
- // Set visibility to hidden before appending to the DOM so that
- // calculations can be made based on the element’s size.
- tooltip.style.visibility = 'hidden';
- getRootElement().appendChild(tooltip);
- this._positionTooltip(tooltip);
- tooltip.style.visibility = 'initial';
-
- this._tooltip = tooltip;
- window.addEventListener('scroll', this.windowScrollHandler);
- this.addEventListener('mouseleave', this.hideHandler);
- this.addEventListener('click', this.hideHandler);
- tooltip.addEventListener('mouseleave', this.hideHandler);
- }
-
- _handleHideTooltip(e: Event | undefined) {
- if (this._isTouchDevice) {
- return;
- }
- if (!this.hasAttribute('title') || !this._titleText) {
- return;
- }
- // Do not hide if mouse left this or this._tooltip and came to this or
- // this._tooltip
- if (
- (e as MouseEvent)?.relatedTarget === this._tooltip ||
- (e as MouseEvent)?.relatedTarget === this
- ) {
- return;
- }
-
- window.removeEventListener('scroll', this.windowScrollHandler);
- this.removeEventListener('mouseleave', this.hideHandler);
- this.removeEventListener('click', this.hideHandler);
- this.setAttribute('title', this._titleText);
- this._tooltip?.removeEventListener('mouseleave', this.hideHandler);
-
- if (this._tooltip?.parentNode) {
- this._tooltip.parentNode.removeChild(this._tooltip);
- }
- this._tooltip = null;
- }
-
- _handleWindowScroll() {
- if (!this._tooltip) {
- return;
- }
-
- this._positionTooltip(this._tooltip);
- }
-
- _positionTooltip(tooltip: GrTooltip) {
- // This flush is needed for tooltips to be positioned correctly in Firefox
- // and Safari.
- flush();
- const rect = this.getBoundingClientRect();
- const boxRect = tooltip.getBoundingClientRect();
- if (!tooltip.parentElement) {
- return;
- }
- const parentRect = tooltip.parentElement.getBoundingClientRect();
- const top = rect.top - parentRect.top;
- const left =
- rect.left - parentRect.left + (rect.width - boxRect.width) / 2;
- const right = parentRect.width - left - boxRect.width;
- if (left < 0) {
- tooltip.updateStyles({
- '--gr-tooltip-arrow-center-offset': `${left}px`,
- });
- } else if (right < 0) {
- tooltip.updateStyles({
- '--gr-tooltip-arrow-center-offset': `${-0.5 * right}px`,
- });
- }
- tooltip.style.left = `${Math.max(0, left)}px`;
-
- if (!this.positionBelow) {
- tooltip.style.top = `${Math.max(0, top)}px`;
- tooltip.style.transform = `translateY(calc(-100% - ${BOTTOM_OFFSET}px))`;
- } else {
- tooltip.style.top = `${top + rect.height + BOTTOM_OFFSET}px`;
- }
- }
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any
+ constructor(..._: any[]) {
+ super();
+ this.windowScrollHandler = () => this._handleWindowScroll();
+ this.showHandler = () => this._handleShowTooltip();
+ this.hideHandler = (e: Event | undefined) => this._handleHideTooltip(e);
}
- return Mixin;
+ override disconnectedCallback() {
+ // NOTE: if you define your own `detached` in your component
+ // then this won't take affect (as its not a class yet)
+ this._handleHideTooltip(undefined);
+ if (this.mouseenterHandler) {
+ this.removeEventListener('mouseenter', this.mouseenterHandler);
+ }
+ window.removeEventListener('scroll', this.windowScrollHandler);
+ super.disconnectedCallback();
+ }
+
+ @observe('hasTooltip')
+ _setupTooltipListeners() {
+ if (!this.mouseenterHandler) {
+ this.mouseenterHandler = this.showHandler;
+ }
+
+ if (!this.hasTooltip) {
+ // if attribute set to false, remove the listener
+ this.removeEventListener('mouseenter', this.mouseenterHandler);
+ this._hasSetupTooltipListeners = false;
+ return;
+ }
+
+ if (this._hasSetupTooltipListeners) {
+ return;
+ }
+ this._hasSetupTooltipListeners = true;
+
+ this.addEventListener('mouseenter', this.mouseenterHandler);
+ }
+
+ _handleShowTooltip() {
+ if (this._isTouchDevice) {
+ return;
+ }
+
+ if (
+ !this.hasAttribute('title') ||
+ this.getAttribute('title') === '' ||
+ this._tooltip
+ ) {
+ return;
+ }
+
+ // Store the title attribute text then set it to an empty string to
+ // prevent it from showing natively.
+ this._titleText = this.getAttribute('title') || '';
+ this.setAttribute('title', '');
+
+ const tooltip = document.createElement('gr-tooltip');
+ tooltip.text = this._titleText;
+ tooltip.maxWidth = this.getAttribute('max-width') || '';
+ tooltip.positionBelow = this.hasAttribute('position-below');
+
+ // Set visibility to hidden before appending to the DOM so that
+ // calculations can be made based on the element’s size.
+ tooltip.style.visibility = 'hidden';
+ getRootElement().appendChild(tooltip);
+ this._positionTooltip(tooltip);
+ tooltip.style.visibility = 'initial';
+
+ this._tooltip = tooltip;
+ window.addEventListener('scroll', this.windowScrollHandler);
+ this.addEventListener('mouseleave', this.hideHandler);
+ this.addEventListener('click', this.hideHandler);
+ tooltip.addEventListener('mouseleave', this.hideHandler);
+ }
+
+ _handleHideTooltip(e: Event | undefined) {
+ if (this._isTouchDevice) {
+ return;
+ }
+ if (!this.hasAttribute('title') || !this._titleText) {
+ return;
+ }
+ // Do not hide if mouse left this or this._tooltip and came to this or
+ // this._tooltip
+ if (
+ (e as MouseEvent)?.relatedTarget === this._tooltip ||
+ (e as MouseEvent)?.relatedTarget === this
+ ) {
+ return;
+ }
+
+ window.removeEventListener('scroll', this.windowScrollHandler);
+ this.removeEventListener('mouseleave', this.hideHandler);
+ this.removeEventListener('click', this.hideHandler);
+ this.setAttribute('title', this._titleText);
+ this._tooltip?.removeEventListener('mouseleave', this.hideHandler);
+
+ if (this._tooltip?.parentNode) {
+ this._tooltip.parentNode.removeChild(this._tooltip);
+ }
+ this._tooltip = null;
+ }
+
+ _handleWindowScroll() {
+ if (!this._tooltip) {
+ return;
+ }
+
+ this._positionTooltip(this._tooltip);
+ }
+
+ _positionTooltip(tooltip: GrTooltip) {
+ // This flush is needed for tooltips to be positioned correctly in Firefox
+ // and Safari.
+ flush();
+ const rect = this.getBoundingClientRect();
+ const boxRect = tooltip.getBoundingClientRect();
+ if (!tooltip.parentElement) {
+ return;
+ }
+ const parentRect = tooltip.parentElement.getBoundingClientRect();
+ const top = rect.top - parentRect.top;
+ const left =
+ rect.left - parentRect.left + (rect.width - boxRect.width) / 2;
+ const right = parentRect.width - left - boxRect.width;
+ if (left < 0) {
+ tooltip.updateStyles({
+ '--gr-tooltip-arrow-center-offset': `${left}px`,
+ });
+ } else if (right < 0) {
+ tooltip.updateStyles({
+ '--gr-tooltip-arrow-center-offset': `${-0.5 * right}px`,
+ });
+ }
+ tooltip.style.left = `${Math.max(0, left)}px`;
+
+ if (!this.positionBelow) {
+ tooltip.style.top = `${Math.max(0, top)}px`;
+ tooltip.style.transform = `translateY(calc(-100% - ${BOTTOM_OFFSET}px))`;
+ } else {
+ tooltip.style.top = `${top + rect.height + BOTTOM_OFFSET}px`;
+ }
+ }
}
-);
+
+ return Mixin as T & Constructor<TooltipMixinInterface>;
+};
diff --git a/polygerrit-ui/app/mixins/keyboard-shortcut-mixin/keyboard-shortcut-mixin.ts b/polygerrit-ui/app/mixins/keyboard-shortcut-mixin/keyboard-shortcut-mixin.ts
index c48b179..3efa9d6 100644
--- a/polygerrit-ui/app/mixins/keyboard-shortcut-mixin/keyboard-shortcut-mixin.ts
+++ b/polygerrit-ui/app/mixins/keyboard-shortcut-mixin/keyboard-shortcut-mixin.ts
@@ -99,7 +99,6 @@
import {IronA11yKeysBehavior} from '@polymer/iron-a11y-keys-behavior/iron-a11y-keys-behavior';
import {dom, EventApi} from '@polymer/polymer/lib/legacy/polymer.dom';
import {mixinBehaviors} from '@polymer/polymer/lib/legacy/class';
-import {dedupingMixin} from '@polymer/polymer/lib/utils/mixin';
import {property} from '@polymer/decorators';
import {PolymerElement} from '@polymer/polymer';
import {check, Constructor} from '../../utils/common-util';
@@ -742,337 +741,335 @@
* @polymer
* @mixinFunction
*/
-const InternalKeyboardShortcutMixin = dedupingMixin(
- <T extends Constructor<PolymerElement> & IronA11yKeysMixinConstructor>(
- superClass: T
- ): T & Constructor<KeyboardShortcutMixinInterface> => {
+const InternalKeyboardShortcutMixin = <
+ T extends Constructor<PolymerElement> & IronA11yKeysMixinConstructor
+>(
+ superClass: T
+) => {
+ /**
+ * @polymer
+ * @mixinClass
+ */
+ class Mixin extends superClass {
+ @property({type: Number})
+ _shortcut_go_key_last_pressed: number | null = null;
+
+ @property({type: Number})
+ _shortcut_v_key_last_pressed: number | null = null;
+
+ @property({type: Object})
+ _shortcut_go_table: Map<string, string> = new Map<string, string>();
+
+ @property({type: Object})
+ _shortcut_v_table: Map<string, string> = new Map<string, string>();
+
+ Shortcut = Shortcut;
+
+ ShortcutSection = ShortcutSection;
+
+ private _disableKeyboardShortcuts = false;
+
+ private readonly restApiService = appContext.restApiService;
+
+ private reporting = appContext.reportingService;
+
+ /** Used to disable shortcuts when the element is not visible. */
+ private observer?: IntersectionObserver;
+
/**
- * @polymer
- * @mixinClass
+ * Enabling shortcuts only when the element is visible (see `observer`
+ * above) is a great feature, but often what you want is for the *page* to
+ * be visible, not the specific child element that registers keyboard
+ * shortcuts. An example is the FileList in the ChangeView. So we allow
+ * a broader observer target to be specified here, and fall back to
+ * `this` as the default.
*/
- class Mixin extends superClass {
- @property({type: Number})
- _shortcut_go_key_last_pressed: number | null = null;
+ @property({type: Object})
+ observerTarget: Element = this;
- @property({type: Number})
- _shortcut_v_key_last_pressed: number | null = null;
+ /** Are shortcuts currently enabled? True only when element is visible. */
+ private bindingsEnabled = false;
- @property({type: Object})
- _shortcut_go_table: Map<string, string> = new Map<string, string>();
-
- @property({type: Object})
- _shortcut_v_table: Map<string, string> = new Map<string, string>();
-
- Shortcut = Shortcut;
-
- ShortcutSection = ShortcutSection;
-
- private _disableKeyboardShortcuts = false;
-
- private readonly restApiService = appContext.restApiService;
-
- private reporting = appContext.reportingService;
-
- /** Used to disable shortcuts when the element is not visible. */
- private observer?: IntersectionObserver;
-
- /**
- * Enabling shortcuts only when the element is visible (see `observer`
- * above) is a great feature, but often what you want is for the *page* to
- * be visible, not the specific child element that registers keyboard
- * shortcuts. An example is the FileList in the ChangeView. So we allow
- * a broader observer target to be specified here, and fall back to
- * `this` as the default.
+ modifierPressed(event: CustomKeyboardEvent) {
+ /* We are checking for g/v as modifiers pressed. There are cases such as
+ * pressing v and then /, where we want the handler for / to be triggered.
+ * TODO(dhruvsri): find a way to support that keyboard combination
*/
- @property({type: Object})
- observerTarget: Element = this;
+ const e = getKeyboardEvent(event);
+ return (
+ isModifierPressed(e) || !!this._inGoKeyMode() || !!this.inVKeyMode()
+ );
+ }
- /** Are shortcuts currently enabled? True only when element is visible. */
- private bindingsEnabled = false;
-
- modifierPressed(event: CustomKeyboardEvent) {
- /* We are checking for g/v as modifiers pressed. There are cases such as
- * pressing v and then /, where we want the handler for / to be triggered.
- * TODO(dhruvsri): find a way to support that keyboard combination
- */
- const e = getKeyboardEvent(event);
- return (
- isModifierPressed(e) || !!this._inGoKeyMode() || !!this.inVKeyMode()
- );
+ shouldSuppressKeyboardShortcut(event: CustomKeyboardEvent) {
+ if (this._disableKeyboardShortcuts) return true;
+ const e = getKeyboardEvent(event);
+ // TODO(TS): maybe override the EventApi, narrow it down to Element always
+ const target = (dom(e) as EventApi).rootTarget as Element;
+ const tagName = target.tagName;
+ const type = target.getAttribute('type');
+ if (
+ // Suppress shortcuts on <input> and <textarea>, but not on
+ // checkboxes, because we want to enable workflows like 'click
+ // mark-reviewed and then press ] to go to the next file'.
+ (tagName === 'INPUT' && type !== 'checkbox') ||
+ tagName === 'TEXTAREA' ||
+ // Suppress shortcuts if the key is 'enter'
+ // and target is an anchor or button or paper-tab.
+ (e.keyCode === 13 &&
+ (tagName === 'A' || tagName === 'BUTTON' || tagName === 'PAPER-TAB'))
+ ) {
+ return true;
}
-
- shouldSuppressKeyboardShortcut(event: CustomKeyboardEvent) {
- if (this._disableKeyboardShortcuts) return true;
- const e = getKeyboardEvent(event);
- // TODO(TS): maybe override the EventApi, narrow it down to Element always
- const target = (dom(e) as EventApi).rootTarget as Element;
- const tagName = target.tagName;
- const type = target.getAttribute('type');
- if (
- // Suppress shortcuts on <input> and <textarea>, but not on
- // checkboxes, because we want to enable workflows like 'click
- // mark-reviewed and then press ] to go to the next file'.
- (tagName === 'INPUT' && type !== 'checkbox') ||
- tagName === 'TEXTAREA' ||
- // Suppress shortcuts if the key is 'enter'
- // and target is an anchor or button or paper-tab.
- (e.keyCode === 13 &&
- (tagName === 'A' ||
- tagName === 'BUTTON' ||
- tagName === 'PAPER-TAB'))
- ) {
+ for (let i = 0; e.path && i < e.path.length; i++) {
+ // TODO(TS): narrow this down to Element from EventTarget first
+ if ((e.path[i] as Element).tagName === 'GR-OVERLAY') {
return true;
}
- for (let i = 0; e.path && i < e.path.length; i++) {
- // TODO(TS): narrow this down to Element from EventTarget first
- if ((e.path[i] as Element).tagName === 'GR-OVERLAY') {
- return true;
- }
- }
-
- // eg: {key: "k:keydown", ..., from: "gr-diff-view"}
- let key = `${(e as unknown as KeyboardEvent).key}:${e.type}`;
- if (this._inGoKeyMode()) key = 'g+' + key;
- if (this.inVKeyMode()) key = 'v+' + key;
- if (e.shiftKey) key = 'shift+' + key;
- if (e.ctrlKey) key = 'ctrl+' + key;
- if (e.metaKey) key = 'meta+' + key;
- if (e.altKey) key = 'alt+' + key;
- this.reporting.reportInteraction('shortcut-triggered', {
- key,
- from: this.nodeName ?? 'unknown',
- });
- return false;
}
- // Alias for getKeyboardEvent.
- getKeyboardEvent(e: CustomKeyboardEvent) {
- return getKeyboardEvent(e);
+ // eg: {key: "k:keydown", ..., from: "gr-diff-view"}
+ let key = `${(e as unknown as KeyboardEvent).key}:${e.type}`;
+ if (this._inGoKeyMode()) key = 'g+' + key;
+ if (this.inVKeyMode()) key = 'v+' + key;
+ if (e.shiftKey) key = 'shift+' + key;
+ if (e.ctrlKey) key = 'ctrl+' + key;
+ if (e.metaKey) key = 'meta+' + key;
+ if (e.altKey) key = 'alt+' + key;
+ this.reporting.reportInteraction('shortcut-triggered', {
+ key,
+ from: this.nodeName ?? 'unknown',
+ });
+ return false;
+ }
+
+ // Alias for getKeyboardEvent.
+ getKeyboardEvent(e: CustomKeyboardEvent) {
+ return getKeyboardEvent(e);
+ }
+
+ bindShortcut(shortcut: Shortcut, ...bindings: string[]) {
+ shortcutManager.bindShortcut(shortcut, ...bindings);
+ }
+
+ createTitle(shortcutName: Shortcut, section: ShortcutSection) {
+ const desc = shortcutManager.getDescription(section, shortcutName);
+ const shortcut = shortcutManager.getShortcut(shortcutName);
+ return desc && shortcut ? `${desc} (shortcut: ${shortcut})` : '';
+ }
+
+ _addOwnKeyBindings(shortcut: Shortcut, handler: string) {
+ const bindings = shortcutManager.getBindingsForShortcut(shortcut);
+ if (!bindings) {
+ return;
}
-
- bindShortcut(shortcut: Shortcut, ...bindings: string[]) {
- shortcutManager.bindShortcut(shortcut, ...bindings);
+ if (bindings[0] === SPECIAL_SHORTCUT.DOC_ONLY) {
+ return;
}
-
- createTitle(shortcutName: Shortcut, section: ShortcutSection) {
- const desc = shortcutManager.getDescription(section, shortcutName);
- const shortcut = shortcutManager.getShortcut(shortcutName);
- return desc && shortcut ? `${desc} (shortcut: ${shortcut})` : '';
- }
-
- _addOwnKeyBindings(shortcut: Shortcut, handler: string) {
- const bindings = shortcutManager.getBindingsForShortcut(shortcut);
- if (!bindings) {
- return;
- }
- if (bindings[0] === SPECIAL_SHORTCUT.DOC_ONLY) {
- return;
- }
- if (bindings[0] === SPECIAL_SHORTCUT.GO_KEY) {
- bindings
- .slice(1)
- .forEach(binding => this._shortcut_go_table.set(binding, handler));
- } else if (bindings[0] === SPECIAL_SHORTCUT.V_KEY) {
- // for each binding added with the go/v key, we set the handler to be
- // handleVKeyAction. handleVKeyAction then looks up in th
- // shortcut_table to see what the relevant handler should be
- bindings
- .slice(1)
- .forEach(binding => this._shortcut_v_table.set(binding, handler));
- } else {
- this.addOwnKeyBinding(bindings.join(' '), handler);
- }
- }
-
- override connectedCallback() {
- super.connectedCallback();
- this.restApiService.getPreferences().then(prefs => {
- if (prefs?.disable_keyboard_shortcuts) {
- this._disableKeyboardShortcuts = true;
- }
- });
- this.createVisibilityObserver();
- this.enableBindings();
- }
-
- override disconnectedCallback() {
- this.destroyVisibilityObserver();
- this.disableBindings();
- super.disconnectedCallback();
- }
-
- /**
- * Creates an intersection observer that enables bindings when the
- * element is visible and disables them when the element is hidden.
- */
- private createVisibilityObserver() {
- if (!this.hasKeyboardShortcuts()) return;
- if (this.observer) return;
- this.observer = new IntersectionObserver(entries => {
- check(entries.length === 1, 'Expected one observer entry.');
- const isVisible = entries[0].isIntersecting;
- if (isVisible) {
- this.enableBindings();
- } else {
- this.disableBindings();
- }
- });
- this.observer.observe(this.observerTarget);
- }
-
- private destroyVisibilityObserver() {
- if (this.observer) this.observer.unobserve(this.observerTarget);
- }
-
- /**
- * Enables all the shortcuts returned by keyboardShortcuts().
- * This is a private method being called when the element becomes
- * connected or visible.
- */
- private enableBindings() {
- if (!this.hasKeyboardShortcuts()) return;
- if (this.bindingsEnabled) return;
- this.bindingsEnabled = true;
-
- const shortcuts = new Map<string, string>(
- Object.entries(this.keyboardShortcuts())
- );
- shortcutManager.attachHost(this, shortcuts);
-
- for (const [key, value] of shortcuts.entries()) {
- this._addOwnKeyBindings(key as Shortcut, value);
- }
-
- // each component that uses this behaviour must be aware if go key is
- // pressed or not, since it needs to check it as a modifier
- this.addOwnKeyBinding('g:keydown', '_handleGoKeyDown');
- this.addOwnKeyBinding('g:keyup', '_handleGoKeyUp');
-
- // If any of the shortcuts utilized GO_KEY, then they are handled
- // directly by this behavior.
- if (this._shortcut_go_table.size > 0) {
- this._shortcut_go_table.forEach((_, key) => {
- this.addOwnKeyBinding(key, '_handleGoAction');
- });
- }
-
- this.addOwnKeyBinding('v:keydown', '_handleVKeyDown');
- this.addOwnKeyBinding('v:keyup', '_handleVKeyUp');
- if (this._shortcut_v_table.size > 0) {
- this._shortcut_v_table.forEach((_, key) => {
- this.addOwnKeyBinding(key, '_handleVAction');
- });
- }
- }
-
- /**
- * Disables all the shortcuts returned by keyboardShortcuts().
- * This is a private method being called when the element becomes
- * disconnected or invisible.
- */
- private disableBindings() {
- if (!this.bindingsEnabled) return;
- this.bindingsEnabled = false;
- if (shortcutManager.detachHost(this)) {
- this.removeOwnKeyBindings();
- }
- }
-
- private hasKeyboardShortcuts() {
- return Object.entries(this.keyboardShortcuts()).length > 0;
- }
-
- keyboardShortcuts() {
- return {};
- }
-
- addKeyboardShortcutDirectoryListener(listener: ShortcutListener) {
- shortcutManager.addListener(listener);
- }
-
- removeKeyboardShortcutDirectoryListener(listener: ShortcutListener) {
- shortcutManager.removeListener(listener);
- }
-
- _handleVKeyDown(e: CustomKeyboardEvent) {
- if (this.shouldSuppressKeyboardShortcut(e)) return;
- this._shortcut_v_key_last_pressed = Date.now();
- }
-
- _handleVKeyUp() {
- setTimeout(() => {
- this._shortcut_v_key_last_pressed = null;
- }, V_KEY_TIMEOUT_MS);
- }
-
- private inVKeyMode() {
- return !!(
- this._shortcut_v_key_last_pressed &&
- Date.now() - this._shortcut_v_key_last_pressed <= V_KEY_TIMEOUT_MS
- );
- }
-
- _handleVAction(e: CustomKeyboardEvent) {
- if (
- !this.inVKeyMode() ||
- !this._shortcut_v_table.has(e.detail.key) ||
- this.shouldSuppressKeyboardShortcut(e)
- ) {
- return;
- }
- e.preventDefault();
- const handler = this._shortcut_v_table.get(e.detail.key);
- if (handler) {
- // TODO(TS): should fix this
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
- (this as any)[handler](e);
- }
- }
-
- _handleGoKeyDown(e: CustomKeyboardEvent) {
- if (this.shouldSuppressKeyboardShortcut(e)) return;
- this._shortcut_go_key_last_pressed = Date.now();
- }
-
- _handleGoKeyUp() {
- // Set go_key_last_pressed to null `GO_KEY_TIMEOUT_MS` after keyup event
- // so that users can trigger `g + i` by pressing g and i quickly.
- setTimeout(() => {
- this._shortcut_go_key_last_pressed = null;
- }, GO_KEY_TIMEOUT_MS);
- }
-
- _inGoKeyMode() {
- return !!(
- this._shortcut_go_key_last_pressed &&
- Date.now() - this._shortcut_go_key_last_pressed <= GO_KEY_TIMEOUT_MS
- );
- }
-
- _handleGoAction(e: CustomKeyboardEvent) {
- if (
- !this._inGoKeyMode() ||
- !this._shortcut_go_table.has(e.detail.key) ||
- this.shouldSuppressKeyboardShortcut(e)
- ) {
- return;
- }
- e.preventDefault();
- const handler = this._shortcut_go_table.get(e.detail.key);
- if (handler) {
- // TODO(TS): should fix this
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
- (this as any)[handler](e);
- }
+ if (bindings[0] === SPECIAL_SHORTCUT.GO_KEY) {
+ bindings
+ .slice(1)
+ .forEach(binding => this._shortcut_go_table.set(binding, handler));
+ } else if (bindings[0] === SPECIAL_SHORTCUT.V_KEY) {
+ // for each binding added with the go/v key, we set the handler to be
+ // handleVKeyAction. handleVKeyAction then looks up in th
+ // shortcut_table to see what the relevant handler should be
+ bindings
+ .slice(1)
+ .forEach(binding => this._shortcut_v_table.set(binding, handler));
+ } else {
+ this.addOwnKeyBinding(bindings.join(' '), handler);
}
}
- return Mixin;
+ override connectedCallback() {
+ super.connectedCallback();
+ this.restApiService.getPreferences().then(prefs => {
+ if (prefs?.disable_keyboard_shortcuts) {
+ this._disableKeyboardShortcuts = true;
+ }
+ });
+ this.createVisibilityObserver();
+ this.enableBindings();
+ }
+
+ override disconnectedCallback() {
+ this.destroyVisibilityObserver();
+ this.disableBindings();
+ super.disconnectedCallback();
+ }
+
+ /**
+ * Creates an intersection observer that enables bindings when the
+ * element is visible and disables them when the element is hidden.
+ */
+ private createVisibilityObserver() {
+ if (!this.hasKeyboardShortcuts()) return;
+ if (this.observer) return;
+ this.observer = new IntersectionObserver(entries => {
+ check(entries.length === 1, 'Expected one observer entry.');
+ const isVisible = entries[0].isIntersecting;
+ if (isVisible) {
+ this.enableBindings();
+ } else {
+ this.disableBindings();
+ }
+ });
+ this.observer.observe(this.observerTarget);
+ }
+
+ private destroyVisibilityObserver() {
+ if (this.observer) this.observer.unobserve(this.observerTarget);
+ }
+
+ /**
+ * Enables all the shortcuts returned by keyboardShortcuts().
+ * This is a private method being called when the element becomes
+ * connected or visible.
+ */
+ private enableBindings() {
+ if (!this.hasKeyboardShortcuts()) return;
+ if (this.bindingsEnabled) return;
+ this.bindingsEnabled = true;
+
+ const shortcuts = new Map<string, string>(
+ Object.entries(this.keyboardShortcuts())
+ );
+ shortcutManager.attachHost(this, shortcuts);
+
+ for (const [key, value] of shortcuts.entries()) {
+ this._addOwnKeyBindings(key as Shortcut, value);
+ }
+
+ // each component that uses this behaviour must be aware if go key is
+ // pressed or not, since it needs to check it as a modifier
+ this.addOwnKeyBinding('g:keydown', '_handleGoKeyDown');
+ this.addOwnKeyBinding('g:keyup', '_handleGoKeyUp');
+
+ // If any of the shortcuts utilized GO_KEY, then they are handled
+ // directly by this behavior.
+ if (this._shortcut_go_table.size > 0) {
+ this._shortcut_go_table.forEach((_, key) => {
+ this.addOwnKeyBinding(key, '_handleGoAction');
+ });
+ }
+
+ this.addOwnKeyBinding('v:keydown', '_handleVKeyDown');
+ this.addOwnKeyBinding('v:keyup', '_handleVKeyUp');
+ if (this._shortcut_v_table.size > 0) {
+ this._shortcut_v_table.forEach((_, key) => {
+ this.addOwnKeyBinding(key, '_handleVAction');
+ });
+ }
+ }
+
+ /**
+ * Disables all the shortcuts returned by keyboardShortcuts().
+ * This is a private method being called when the element becomes
+ * disconnected or invisible.
+ */
+ private disableBindings() {
+ if (!this.bindingsEnabled) return;
+ this.bindingsEnabled = false;
+ if (shortcutManager.detachHost(this)) {
+ this.removeOwnKeyBindings();
+ }
+ }
+
+ private hasKeyboardShortcuts() {
+ return Object.entries(this.keyboardShortcuts()).length > 0;
+ }
+
+ keyboardShortcuts() {
+ return {};
+ }
+
+ addKeyboardShortcutDirectoryListener(listener: ShortcutListener) {
+ shortcutManager.addListener(listener);
+ }
+
+ removeKeyboardShortcutDirectoryListener(listener: ShortcutListener) {
+ shortcutManager.removeListener(listener);
+ }
+
+ _handleVKeyDown(e: CustomKeyboardEvent) {
+ if (this.shouldSuppressKeyboardShortcut(e)) return;
+ this._shortcut_v_key_last_pressed = Date.now();
+ }
+
+ _handleVKeyUp() {
+ setTimeout(() => {
+ this._shortcut_v_key_last_pressed = null;
+ }, V_KEY_TIMEOUT_MS);
+ }
+
+ private inVKeyMode() {
+ return !!(
+ this._shortcut_v_key_last_pressed &&
+ Date.now() - this._shortcut_v_key_last_pressed <= V_KEY_TIMEOUT_MS
+ );
+ }
+
+ _handleVAction(e: CustomKeyboardEvent) {
+ if (
+ !this.inVKeyMode() ||
+ !this._shortcut_v_table.has(e.detail.key) ||
+ this.shouldSuppressKeyboardShortcut(e)
+ ) {
+ return;
+ }
+ e.preventDefault();
+ const handler = this._shortcut_v_table.get(e.detail.key);
+ if (handler) {
+ // TODO(TS): should fix this
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
+ (this as any)[handler](e);
+ }
+ }
+
+ _handleGoKeyDown(e: CustomKeyboardEvent) {
+ if (this.shouldSuppressKeyboardShortcut(e)) return;
+ this._shortcut_go_key_last_pressed = Date.now();
+ }
+
+ _handleGoKeyUp() {
+ // Set go_key_last_pressed to null `GO_KEY_TIMEOUT_MS` after keyup event
+ // so that users can trigger `g + i` by pressing g and i quickly.
+ setTimeout(() => {
+ this._shortcut_go_key_last_pressed = null;
+ }, GO_KEY_TIMEOUT_MS);
+ }
+
+ _inGoKeyMode() {
+ return !!(
+ this._shortcut_go_key_last_pressed &&
+ Date.now() - this._shortcut_go_key_last_pressed <= GO_KEY_TIMEOUT_MS
+ );
+ }
+
+ _handleGoAction(e: CustomKeyboardEvent) {
+ if (
+ !this._inGoKeyMode() ||
+ !this._shortcut_go_table.has(e.detail.key) ||
+ this.shouldSuppressKeyboardShortcut(e)
+ ) {
+ return;
+ }
+ e.preventDefault();
+ const handler = this._shortcut_go_table.get(e.detail.key);
+ if (handler) {
+ // TODO(TS): should fix this
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
+ (this as any)[handler](e);
+ }
+ }
}
-);
+
+ return Mixin as T & Constructor<KeyboardShortcutMixinInterface>;
+};
// The following doesn't work (IronA11yKeysBehavior crashes):
-// const KeyboardShortcutMixin = dedupingMixin(superClass => {
+// const KeyboardShortcutMixin = superClass => {
// class Mixin extends mixinBehaviors([IronA11yKeysBehavior], superClass) {
// ...
// }
diff --git a/polygerrit-ui/app/node_modules_licenses/tsconfig.json b/polygerrit-ui/app/node_modules_licenses/tsconfig.json
index c562a0c..f0a540b 100644
--- a/polygerrit-ui/app/node_modules_licenses/tsconfig.json
+++ b/polygerrit-ui/app/node_modules_licenses/tsconfig.json
@@ -1,7 +1,7 @@
{
"compilerOptions": {
- "target": "es6",
- "module": "commonjs",
+ "target": "es2019", /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', 'ES2018', 'ES2019' or 'ESNEXT'. */
+ "module": "es2015", /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', or 'ESNext'. */
"allowSyntheticDefaultImports": true,
"esModuleInterop": true,
"strict": true,
diff --git a/polygerrit-ui/app/services/checks/checks-model.ts b/polygerrit-ui/app/services/checks/checks-model.ts
index f55631b..17cad53 100644
--- a/polygerrit-ui/app/services/checks/checks-model.ts
+++ b/polygerrit-ui/app/services/checks/checks-model.ts
@@ -30,6 +30,7 @@
import {PatchSetNumber} from '../../types/common';
import {AttemptDetail, createAttemptMap} from './checks-util';
import {assertIsDefined} from '../../utils/common-util';
+import {deepEqualStringDict} from '../../utils/compare-util';
/**
* The checks model maintains the state of checks for two patchsets: the latest
@@ -184,6 +185,23 @@
distinctUntilChanged()
);
+export interface ErrorMessages {
+ /* Maps plugin name to error message. */
+ [name: string]: string;
+}
+
+export const errorMessagesLatest$ = checksLatest$.pipe(
+ map(state => {
+ const errorMessages: ErrorMessages = {};
+ for (const providerState of Object.values(state)) {
+ if (providerState.errorMessage === undefined) continue;
+ errorMessages[providerState.pluginName] = providerState.errorMessage;
+ }
+ return errorMessages;
+ }),
+ distinctUntilChanged(deepEqualStringDict)
+);
+
export const loginCallbackLatest$ = checksLatest$.pipe(
map(
state =>
diff --git a/polygerrit-ui/app/services/gr-auth/gr-auth_impl.ts b/polygerrit-ui/app/services/gr-auth/gr-auth_impl.ts
index 024fa2a..c254284 100644
--- a/polygerrit-ui/app/services/gr-auth/gr-auth_impl.ts
+++ b/polygerrit-ui/app/services/gr-auth/gr-auth_impl.ts
@@ -108,7 +108,7 @@
// See https://stackoverflow.com/questions/45816743/how-to-solve-this-caution-request-is-not-finished-yet-in-chrome
try {
res.clone().text();
- } catch (error) {
+ } catch {
// Ignore error
}
@@ -306,7 +306,7 @@
// See https://stackoverflow.com/questions/45816743/how-to-solve-this-caution-request-is-not-finished-yet-in-chrome
try {
response.clone().text();
- } catch (error) {
+ } catch {
// Ignore error
}
}
diff --git a/polygerrit-ui/app/styles/gr-voting-styles.ts b/polygerrit-ui/app/styles/gr-voting-styles.ts
index cb8b0be8..12d0784 100644
--- a/polygerrit-ui/app/styles/gr-voting-styles.ts
+++ b/polygerrit-ui/app/styles/gr-voting-styles.ts
@@ -25,23 +25,14 @@
$_documentContainer.innerHTML = `<dom-module id="gr-voting-styles">
<template>
<style>
- :host {
- --vote-chip-styles: {
- border-style: solid;
- border-color: var(--border-color);
- border-top-left-radius: 1em;
- border-top-right-radius: 1em;
- border-bottom-right-radius: 1em;
- border-bottom-left-radius: 1em;
- border-top-width: 1px;
- border-right-width: 1px;
- border-bottom-width: 1px;
- border-left-width: 1px;
- box-shadow: none;
- box-sizing: border-box;
- min-width: 3em;
- color: var(--vote-text-color);
- }
+ .voteChip {
+ border: 1px solid var(--border-color);
+ /* max rounded */
+ border-radius: 1em;
+ box-shadow: none;
+ box-sizing: border-box;
+ min-width: 3em;
+ color: var(--vote-text-color);
}
</style>
</template>
diff --git a/polygerrit-ui/app/test/test-utils.ts b/polygerrit-ui/app/test/test-utils.ts
index 03a9525..156217c 100644
--- a/polygerrit-ui/app/test/test-utils.ts
+++ b/polygerrit-ui/app/test/test-utils.ts
@@ -28,6 +28,7 @@
import {AuthService} from '../services/gr-auth/gr-auth';
import {ReportingService} from '../services/gr-reporting/gr-reporting';
import {CommentsService} from '../services/comments/comments-service';
+export {query, queryAll, queryAndAssert} from '../utils/common-util';
export interface MockPromise extends Promise<unknown> {
resolve: (value?: unknown) => void;
@@ -47,33 +48,6 @@
return getComputedStyle(el).display === 'none';
}
-export function queryAll<E extends Element = Element>(
- el: Element | undefined,
- selector: string
-): NodeListOf<E> {
- if (!el) assert.fail('element not defined');
- const root = el.shadowRoot ?? el;
- return root.querySelectorAll<E>(selector);
-}
-
-export function query<E extends Element = Element>(
- el: Element | undefined,
- selector: string
-): E | undefined {
- if (!el) return undefined;
- const root = el.shadowRoot ?? el;
- return root.querySelector<E>(selector) ?? undefined;
-}
-
-export function queryAndAssert<E extends Element = Element>(
- el: Element | undefined,
- selector: string
-): E {
- const found = query<E>(el, selector);
- if (!found) assert.fail(`selector '${selector}' did not match anything'`);
- return found;
-}
-
export function isVisible(el: Element) {
assert.ok(el);
return getComputedStyle(el).getPropertyValue('display') !== 'none';
@@ -218,6 +192,27 @@
el.parentNode?.removeChild(el);
}
+export function waitUntil(
+ predicate: () => boolean,
+ maxMillis = 100
+): Promise<void> {
+ const start = Date.now();
+ let sleep = 1;
+ return new Promise((resolve, reject) => {
+ const waiter = () => {
+ if (predicate()) {
+ return resolve();
+ }
+ if (Date.now() - start >= maxMillis) {
+ return reject(new Error('Took to long to waitUntil'));
+ }
+ setTimeout(waiter, sleep);
+ sleep *= 2;
+ };
+ waiter();
+ });
+}
+
/**
* Promisify an event callback to simplify async...await tests.
*
diff --git a/polygerrit-ui/app/tsconfig.json b/polygerrit-ui/app/tsconfig.json
index a533a0f..79dae41 100644
--- a/polygerrit-ui/app/tsconfig.json
+++ b/polygerrit-ui/app/tsconfig.json
@@ -1,7 +1,7 @@
{
"compilerOptions": {
/* Basic Options */
- "target": "es2018", /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', 'ES2018', 'ES2019' or 'ESNEXT'. */
+ "target": "es2019", /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', 'ES2018', 'ES2019' or 'ESNEXT'. */
"module": "es2015", /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', or 'ESNext'. */
"allowJs": true, /* Allow javascript files to be compiled. */
"checkJs": false, /* Report errors in .js files. */
diff --git a/polygerrit-ui/app/utils/attention-set-util.ts b/polygerrit-ui/app/utils/attention-set-util.ts
index bcb2d66..631b633 100644
--- a/polygerrit-ui/app/utils/attention-set-util.ts
+++ b/polygerrit-ui/app/utils/attention-set-util.ts
@@ -76,6 +76,16 @@
return `${getAccountTemplate(account, config)} replied on the change`;
}
+export function getRemovedByIconClickReason(
+ account?: AccountInfo,
+ config?: ServerInfo
+) {
+ return `Removed by ${getAccountTemplate(
+ account,
+ config
+ )} by clicking the attention icon`;
+}
+
export function getLastUpdate(account?: AccountInfo, change?: ChangeInfo) {
if (!hasAttention(account, change)) return '';
const entry = change!.attention_set![account!._account_id!];
diff --git a/polygerrit-ui/app/utils/change-metadata-util.ts b/polygerrit-ui/app/utils/change-metadata-util.ts
index a4865dc..9692ab31 100644
--- a/polygerrit-ui/app/utils/change-metadata-util.ts
+++ b/polygerrit-ui/app/utils/change-metadata-util.ts
@@ -15,9 +15,7 @@
* limitations under the License.
*/
-import {SubmitRequirementResultInfo} from '../api/rest-api';
import {ParsedChangeInfo} from '../types/types';
-import {unique} from './common-util';
export enum Metadata {
OWNER = 'Owner',
@@ -83,19 +81,3 @@
}
return true;
}
-
-export function extractAssociatedLabels(
- requirement: SubmitRequirementResultInfo
-): string[] {
- const pattern = new RegExp('label[0-9]*:([\\w-]+)', 'g');
- const labels = [];
- let match;
- while (
- (match = pattern.exec(
- requirement.submittability_expression_result.expression
- )) !== null
- ) {
- labels.push(match[1]);
- }
- return labels.filter(unique);
-}
diff --git a/polygerrit-ui/app/utils/change-metadata-util_test.ts b/polygerrit-ui/app/utils/change-metadata-util_test.ts
deleted file mode 100644
index 888114d..0000000
--- a/polygerrit-ui/app/utils/change-metadata-util_test.ts
+++ /dev/null
@@ -1,59 +0,0 @@
-/**
- * @license
- * Copyright (C) 2020 The Android Open Source Project
- *
- * 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
- *
- * http://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.
- */
-
-import '../test/common-test-setup-karma';
-import {
- createSubmitRequirementExpressionInfo,
- createSubmitRequirementResultInfo,
-} from '../test/test-data-generators';
-import {extractAssociatedLabels} from './change-metadata-util';
-
-suite('change-metadata-util', () => {
- suite('extractAssociatedLabels()', () => {
- function createSubmitRequirementExpressionInfoWith(expression: string) {
- return {
- ...createSubmitRequirementResultInfo(),
- submittability_expression_result: {
- ...createSubmitRequirementExpressionInfo(),
- expression,
- },
- };
- }
-
- test('1 label', () => {
- const submitRequirement = createSubmitRequirementExpressionInfoWith(
- 'label:Verified=MAX -label:Verified=MIN'
- );
- const labels = extractAssociatedLabels(submitRequirement);
- assert.deepEqual(labels, ['Verified']);
- });
- test('label with number', () => {
- const submitRequirement = createSubmitRequirementExpressionInfoWith(
- 'label2:verified=MAX'
- );
- const labels = extractAssociatedLabels(submitRequirement);
- assert.deepEqual(labels, ['verified']);
- });
- test('2 labels', () => {
- const submitRequirement = createSubmitRequirementExpressionInfoWith(
- 'label:Verified=MAX -label:Code-Review=MIN'
- );
- const labels = extractAssociatedLabels(submitRequirement);
- assert.deepEqual(labels, ['Verified', 'Code-Review']);
- });
- });
-});
diff --git a/polygerrit-ui/app/utils/common-util.ts b/polygerrit-ui/app/utils/common-util.ts
index 36c3657..5370cf9 100644
--- a/polygerrit-ui/app/utils/common-util.ts
+++ b/polygerrit-ui/app/utils/common-util.ts
@@ -90,7 +90,16 @@
}
}
-function query<E extends Element = Element>(
+export function queryAll<E extends Element = Element>(
+ el: Element,
+ selector: string
+): NodeListOf<E> {
+ if (!el) throw new Error('element not defined');
+ const root = el.shadowRoot ?? el;
+ return root.querySelectorAll<E>(selector);
+}
+
+export function query<E extends Element = Element>(
el: Element | undefined,
selector: string
): E | undefined {
diff --git a/polygerrit-ui/app/utils/compare-util.ts b/polygerrit-ui/app/utils/compare-util.ts
new file mode 100644
index 0000000..a9b5906
--- /dev/null
+++ b/polygerrit-ui/app/utils/compare-util.ts
@@ -0,0 +1,28 @@
+/**
+ * @license
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * 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
+ *
+ * http://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.
+ */
+export function deepEqualStringDict(
+ a: {[name: string]: string},
+ b: {[name: string]: string}
+): boolean {
+ const aKeys = Object.keys(a);
+ const bKeys = Object.keys(b);
+ if (aKeys.length !== bKeys.length) return false;
+ for (const key of aKeys) {
+ if (a[key] !== b[key]) return false;
+ }
+ return true;
+}
diff --git a/polygerrit-ui/app/utils/compare-util_test.ts b/polygerrit-ui/app/utils/compare-util_test.ts
new file mode 100644
index 0000000..12cdfe2
--- /dev/null
+++ b/polygerrit-ui/app/utils/compare-util_test.ts
@@ -0,0 +1,30 @@
+/**
+ * @license
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * 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
+ *
+ * http://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.
+ */
+import '../test/common-test-setup-karma';
+import {deepEqualStringDict} from './compare-util';
+
+suite('compare-utils tests', () => {
+ test('deepEqual', () => {
+ assert.isTrue(deepEqualStringDict({}, {}));
+ assert.isTrue(deepEqualStringDict({x: 'y'}, {x: 'y'}));
+ assert.isTrue(deepEqualStringDict({x: 'y', p: 'q'}, {p: 'q', x: 'y'}));
+
+ assert.isFalse(deepEqualStringDict({}, {x: 'y'}));
+ assert.isFalse(deepEqualStringDict({x: 'y'}, {x: 'z'}));
+ assert.isFalse(deepEqualStringDict({x: 'y'}, {z: 'y'}));
+ });
+});
diff --git a/polygerrit-ui/app/utils/label-util.ts b/polygerrit-ui/app/utils/label-util.ts
index 92bbdac..e46e4fc 100644
--- a/polygerrit-ui/app/utils/label-util.ts
+++ b/polygerrit-ui/app/utils/label-util.ts
@@ -15,6 +15,10 @@
* limitations under the License.
*/
import {
+ SubmitRequirementResultInfo,
+ SubmitRequirementStatus,
+} from '../api/rest-api';
+import {
AccountInfo,
ApprovalInfo,
DetailedLabelInfo,
@@ -23,6 +27,7 @@
LabelNameToInfoMap,
VotingRangeInfo,
} from '../types/common';
+import {assertNever, unique} from './common-util';
// Name of the standard Code-Review label.
export const CODE_REVIEW = 'Code-Review';
@@ -114,3 +119,34 @@
}
return;
}
+
+export function extractAssociatedLabels(
+ requirement: SubmitRequirementResultInfo
+): string[] {
+ const pattern = new RegExp('label[0-9]*:([\\w-]+)', 'g');
+ const labels = [];
+ let match;
+ while (
+ (match = pattern.exec(
+ requirement.submittability_expression_result.expression
+ )) !== null
+ ) {
+ labels.push(match[1]);
+ }
+ return labels.filter(unique);
+}
+
+export function iconForStatus(status: SubmitRequirementStatus) {
+ switch (status) {
+ case SubmitRequirementStatus.SATISFIED:
+ return 'check';
+ case SubmitRequirementStatus.UNSATISFIED:
+ return 'close';
+ case SubmitRequirementStatus.OVERRIDDEN:
+ return 'warning';
+ case SubmitRequirementStatus.NOT_APPLICABLE:
+ return 'info';
+ default:
+ assertNever(status, `Unsupported status: ${status}`);
+ }
+}
diff --git a/polygerrit-ui/app/utils/label-util_test.ts b/polygerrit-ui/app/utils/label-util_test.ts
index 56941ba..196c5e9 100644
--- a/polygerrit-ui/app/utils/label-util_test.ts
+++ b/polygerrit-ui/app/utils/label-util_test.ts
@@ -17,6 +17,7 @@
import '../test/common-test-setup-karma';
import {
+ extractAssociatedLabels,
getApprovalInfo,
getLabelStatus,
getMaxAccounts,
@@ -32,6 +33,10 @@
ApprovalInfo,
DetailedLabelInfo,
} from '../types/common';
+import {
+ createSubmitRequirementExpressionInfo,
+ createSubmitRequirementResultInfo,
+} from '../test/test-data-generators';
const VALUES_0 = {
'0': 'neutral',
@@ -186,4 +191,38 @@
labelInfo = {all: [{value: 0}, {value: -2}]};
assert.equal(getRepresentativeValue(labelInfo), -2);
});
+
+ suite('extractAssociatedLabels()', () => {
+ function createSubmitRequirementExpressionInfoWith(expression: string) {
+ return {
+ ...createSubmitRequirementResultInfo(),
+ submittability_expression_result: {
+ ...createSubmitRequirementExpressionInfo(),
+ expression,
+ },
+ };
+ }
+
+ test('1 label', () => {
+ const submitRequirement = createSubmitRequirementExpressionInfoWith(
+ 'label:Verified=MAX -label:Verified=MIN'
+ );
+ const labels = extractAssociatedLabels(submitRequirement);
+ assert.deepEqual(labels, ['Verified']);
+ });
+ test('label with number', () => {
+ const submitRequirement = createSubmitRequirementExpressionInfoWith(
+ 'label2:verified=MAX'
+ );
+ const labels = extractAssociatedLabels(submitRequirement);
+ assert.deepEqual(labels, ['verified']);
+ });
+ test('2 labels', () => {
+ const submitRequirement = createSubmitRequirementExpressionInfoWith(
+ 'label:Verified=MAX -label:Code-Review=MIN'
+ );
+ const labels = extractAssociatedLabels(submitRequirement);
+ assert.deepEqual(labels, ['Verified', 'Code-Review']);
+ });
+ });
});
diff --git a/tools/node_tools/node_modules_licenses/tsconfig.json b/tools/node_tools/node_modules_licenses/tsconfig.json
index cb7bb60..4a57571 100644
--- a/tools/node_tools/node_modules_licenses/tsconfig.json
+++ b/tools/node_tools/node_modules_licenses/tsconfig.json
@@ -8,8 +8,8 @@
]
}
],
- "target": "es6",
- "module": "commonjs",
+ "target": "es2019", /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', 'ES2018', 'ES2019' or 'ESNEXT'. */
+ "module": "es2015", /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', or 'ESNext'. */
"allowSyntheticDefaultImports": true,
"esModuleInterop": true,
"strict": true,
diff --git a/tools/node_tools/polygerrit_app_preprocessor/tsconfig.json b/tools/node_tools/polygerrit_app_preprocessor/tsconfig.json
index 34ffb2f..d3c7d1d 100644
--- a/tools/node_tools/polygerrit_app_preprocessor/tsconfig.json
+++ b/tools/node_tools/polygerrit_app_preprocessor/tsconfig.json
@@ -1,7 +1,7 @@
{
"compilerOptions": {
- "target": "es6",
- "module": "commonjs",
+ "target": "es2019", /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', 'ES2018', 'ES2019' or 'ESNEXT'. */
+ "module": "es2015", /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', or 'ESNext'. */
"allowSyntheticDefaultImports": true,
"esModuleInterop": true,
"strict": true,
diff --git a/tools/node_tools/utils/tsconfig.json b/tools/node_tools/utils/tsconfig.json
index 56ab91b..d6bffa0 100644
--- a/tools/node_tools/utils/tsconfig.json
+++ b/tools/node_tools/utils/tsconfig.json
@@ -1,7 +1,7 @@
{
"compilerOptions": {
- "target": "es6",
- "module": "commonjs",
+ "target": "es2019", /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', 'ES2018', 'ES2019' or 'ESNEXT'. */
+ "module": "es2015", /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', or 'ESNext'. */
"allowSyntheticDefaultImports": true,
"esModuleInterop": true,
"strict": true,
diff --git a/tools/polygerrit-updater/tsconfig.json b/tools/polygerrit-updater/tsconfig.json
index 37ff1b2..80f60c1 100644
--- a/tools/polygerrit-updater/tsconfig.json
+++ b/tools/polygerrit-updater/tsconfig.json
@@ -2,8 +2,8 @@
"compilerOptions": {
/* Basic Options */
// "incremental": true, /* Enable incremental compilation */
- "target": "es2015", /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', 'ES2018', 'ES2019' or 'ESNEXT'. */
- "module": "commonjs", /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', or 'ESNext'. */
+ "target": "es2019", /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', 'ES2018', 'ES2019' or 'ESNEXT'. */
+ "module": "es2015", /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', or 'ESNext'. */
// "lib": [], /* Specify library files to be included in the compilation. */
// "allowJs": true, /* Allow javascript files to be compiled. */
// "checkJs": true, /* Report errors in .js files. */
diff --git a/yarn.lock b/yarn.lock
index 32d86fc..353270d 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -2,39 +2,39 @@
# yarn lockfile v1
-"@babel/code-frame@7.12.11", "@babel/code-frame@^7.0.0":
+"@babel/code-frame@7.12.11":
version "7.12.11"
- resolved "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz"
+ resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.12.11.tgz#f4ad435aa263db935b8f10f2c552d23fb716a63f"
integrity sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==
dependencies:
"@babel/highlight" "^7.10.4"
-"@babel/code-frame@^7.12.13":
- version "7.12.13"
- resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.12.13.tgz#dcfc826beef65e75c50e21d3837d7d95798dd658"
- integrity sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g==
+"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.14.5":
+ version "7.14.5"
+ resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.14.5.tgz#23b08d740e83f49c5e59945fbf1b43e80bbf4edb"
+ integrity sha512-9pzDqyc6OLDaqe+zbACgFkb6fKMNG6CObKpnYXChRsvYGyEdc7CA2BaqeOM+vOtCS5ndmJicPJhKAwYRI6UfFw==
dependencies:
- "@babel/highlight" "^7.12.13"
+ "@babel/highlight" "^7.14.5"
-"@babel/compat-data@^7.13.12", "@babel/compat-data@^7.13.8":
- version "7.13.15"
- resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.13.15.tgz#7e8eea42d0b64fda2b375b22d06c605222e848f4"
- integrity sha512-ltnibHKR1VnrU4ymHyQ/CXtNXI6yZC0oJThyW78Hft8XndANwi+9H+UIklBDraIjFEJzw8wmcM427oDd9KS5wA==
+"@babel/compat-data@^7.14.7", "@babel/compat-data@^7.15.0":
+ version "7.15.0"
+ resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.15.0.tgz#2dbaf8b85334796cafbb0f5793a90a2fc010b176"
+ integrity sha512-0NqAC1IJE0S0+lL1SWFMxMkz1pKCNCjI4tr2Zx4LJSXxCLAdr6KyArnY+sno5m3yH9g737ygOyPABDsnXkpxiA==
"@babel/core@^7.0.0":
- version "7.13.15"
- resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.13.15.tgz#a6d40917df027487b54312202a06812c4f7792d0"
- integrity sha512-6GXmNYeNjS2Uz+uls5jalOemgIhnTMeaXo+yBUA72kC2uX/8VW6XyhVIo2L8/q0goKQA3EVKx0KOQpVKSeWadQ==
+ version "7.15.0"
+ resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.15.0.tgz#749e57c68778b73ad8082775561f67f5196aafa8"
+ integrity sha512-tXtmTminrze5HEUPn/a0JtOzzfp0nk+UEXQ/tqIJo3WDGypl/2OFQEMll/zSFU8f/lfmfLXvTaORHF3cfXIQMw==
dependencies:
- "@babel/code-frame" "^7.12.13"
- "@babel/generator" "^7.13.9"
- "@babel/helper-compilation-targets" "^7.13.13"
- "@babel/helper-module-transforms" "^7.13.14"
- "@babel/helpers" "^7.13.10"
- "@babel/parser" "^7.13.15"
- "@babel/template" "^7.12.13"
- "@babel/traverse" "^7.13.15"
- "@babel/types" "^7.13.14"
+ "@babel/code-frame" "^7.14.5"
+ "@babel/generator" "^7.15.0"
+ "@babel/helper-compilation-targets" "^7.15.0"
+ "@babel/helper-module-transforms" "^7.15.0"
+ "@babel/helpers" "^7.14.8"
+ "@babel/parser" "^7.15.0"
+ "@babel/template" "^7.14.5"
+ "@babel/traverse" "^7.15.0"
+ "@babel/types" "^7.15.0"
convert-source-map "^1.7.0"
debug "^4.1.0"
gensync "^1.0.0-beta.2"
@@ -42,220 +42,227 @@
semver "^6.3.0"
source-map "^0.5.0"
-"@babel/generator@^7.0.0-beta.42", "@babel/generator@^7.13.9":
- version "7.13.9"
- resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.13.9.tgz#3a7aa96f9efb8e2be42d38d80e2ceb4c64d8de39"
- integrity sha512-mHOOmY0Axl/JCTkxTU6Lf5sWOg/v8nUa+Xkt4zMTftX0wqmb6Sh7J8gvcehBw7q0AhrhAR+FDacKjCZ2X8K+Sw==
+"@babel/generator@^7.0.0-beta.42", "@babel/generator@^7.15.0":
+ version "7.15.0"
+ resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.15.0.tgz#a7d0c172e0d814974bad5aa77ace543b97917f15"
+ integrity sha512-eKl4XdMrbpYvuB505KTta4AV9g+wWzmVBW69tX0H2NwKVKd2YJbKgyK6M8j/rgLbmHOYJn6rUklV677nOyJrEQ==
dependencies:
- "@babel/types" "^7.13.0"
+ "@babel/types" "^7.15.0"
jsesc "^2.5.1"
source-map "^0.5.0"
-"@babel/helper-annotate-as-pure@^7.12.13":
- version "7.12.13"
- resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.12.13.tgz#0f58e86dfc4bb3b1fcd7db806570e177d439b6ab"
- integrity sha512-7YXfX5wQ5aYM/BOlbSccHDbuXXFPxeoUmfWtz8le2yTkTZc+BxsiEnENFoi2SlmA8ewDkG2LgIMIVzzn2h8kfw==
+"@babel/helper-annotate-as-pure@^7.14.5":
+ version "7.14.5"
+ resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.14.5.tgz#7bf478ec3b71726d56a8ca5775b046fc29879e61"
+ integrity sha512-EivH9EgBIb+G8ij1B2jAwSH36WnGvkQSEC6CkX/6v6ZFlw5fVOHvsgGF4uiEHO2GzMvunZb6tDLQEQSdrdocrA==
dependencies:
- "@babel/types" "^7.12.13"
+ "@babel/types" "^7.14.5"
-"@babel/helper-builder-binary-assignment-operator-visitor@^7.12.13":
- version "7.12.13"
- resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.12.13.tgz#6bc20361c88b0a74d05137a65cac8d3cbf6f61fc"
- integrity sha512-CZOv9tGphhDRlVjVkAgm8Nhklm9RzSmWpX2my+t7Ua/KT616pEzXsQCjinzvkRvHWJ9itO4f296efroX23XCMA==
+"@babel/helper-builder-binary-assignment-operator-visitor@^7.14.5":
+ version "7.14.5"
+ resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.14.5.tgz#b939b43f8c37765443a19ae74ad8b15978e0a191"
+ integrity sha512-YTA/Twn0vBXDVGJuAX6PwW7x5zQei1luDDo2Pl6q1qZ7hVNl0RZrhHCQG/ArGpR29Vl7ETiB8eJyrvpuRp300w==
dependencies:
- "@babel/helper-explode-assignable-expression" "^7.12.13"
- "@babel/types" "^7.12.13"
+ "@babel/helper-explode-assignable-expression" "^7.14.5"
+ "@babel/types" "^7.14.5"
-"@babel/helper-compilation-targets@^7.13.13", "@babel/helper-compilation-targets@^7.13.8":
- version "7.13.13"
- resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.13.13.tgz#2b2972a0926474853f41e4adbc69338f520600e5"
- integrity sha512-q1kcdHNZehBwD9jYPh3WyXcsFERi39X4I59I3NadciWtNDyZ6x+GboOxncFK0kXlKIv6BJm5acncehXWUjWQMQ==
+"@babel/helper-compilation-targets@^7.14.5", "@babel/helper-compilation-targets@^7.15.0":
+ version "7.15.0"
+ resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.15.0.tgz#973df8cbd025515f3ff25db0c05efc704fa79818"
+ integrity sha512-h+/9t0ncd4jfZ8wsdAsoIxSa61qhBYlycXiHWqJaQBCXAhDCMbPRSMTGnZIkkmt1u4ag+UQmuqcILwqKzZ4N2A==
dependencies:
- "@babel/compat-data" "^7.13.12"
- "@babel/helper-validator-option" "^7.12.17"
- browserslist "^4.14.5"
+ "@babel/compat-data" "^7.15.0"
+ "@babel/helper-validator-option" "^7.14.5"
+ browserslist "^4.16.6"
semver "^6.3.0"
-"@babel/helper-create-regexp-features-plugin@^7.12.13":
- version "7.12.17"
- resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.12.17.tgz#a2ac87e9e319269ac655b8d4415e94d38d663cb7"
- integrity sha512-p2VGmBu9oefLZ2nQpgnEnG0ZlRPvL8gAGvPUMQwUdaE8k49rOMuZpOwdQoy5qJf6K8jL3bcAMhVUlHAjIgJHUg==
+"@babel/helper-create-regexp-features-plugin@^7.14.5":
+ version "7.14.5"
+ resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.14.5.tgz#c7d5ac5e9cf621c26057722fb7a8a4c5889358c4"
+ integrity sha512-TLawwqpOErY2HhWbGJ2nZT5wSkR192QpN+nBg1THfBfftrlvOh+WbhrxXCH4q4xJ9Gl16BGPR/48JA+Ryiho/A==
dependencies:
- "@babel/helper-annotate-as-pure" "^7.12.13"
+ "@babel/helper-annotate-as-pure" "^7.14.5"
regexpu-core "^4.7.1"
-"@babel/helper-explode-assignable-expression@^7.12.13":
- version "7.13.0"
- resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.13.0.tgz#17b5c59ff473d9f956f40ef570cf3a76ca12657f"
- integrity sha512-qS0peLTDP8kOisG1blKbaoBg/o9OSa1qoumMjTK5pM+KDTtpxpsiubnCGP34vK8BXGcb2M9eigwgvoJryrzwWA==
+"@babel/helper-explode-assignable-expression@^7.14.5":
+ version "7.14.5"
+ resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.14.5.tgz#8aa72e708205c7bb643e45c73b4386cdf2a1f645"
+ integrity sha512-Htb24gnGJdIGT4vnRKMdoXiOIlqOLmdiUYpAQ0mYfgVT/GDm8GOYhgi4GL+hMKrkiPRohO4ts34ELFsGAPQLDQ==
dependencies:
- "@babel/types" "^7.13.0"
+ "@babel/types" "^7.14.5"
-"@babel/helper-function-name@^7.12.13":
- version "7.12.13"
- resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.12.13.tgz#93ad656db3c3c2232559fd7b2c3dbdcbe0eb377a"
- integrity sha512-TZvmPn0UOqmvi5G4vvw0qZTpVptGkB1GL61R6lKvrSdIxGm5Pky7Q3fpKiIkQCAtRCBUwB0PaThlx9vebCDSwA==
+"@babel/helper-function-name@^7.14.5":
+ version "7.14.5"
+ resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.14.5.tgz#89e2c474972f15d8e233b52ee8c480e2cfcd50c4"
+ integrity sha512-Gjna0AsXWfFvrAuX+VKcN/aNNWonizBj39yGwUzVDVTlMYJMK2Wp6xdpy72mfArFq5uK+NOuexfzZlzI1z9+AQ==
dependencies:
- "@babel/helper-get-function-arity" "^7.12.13"
- "@babel/template" "^7.12.13"
- "@babel/types" "^7.12.13"
+ "@babel/helper-get-function-arity" "^7.14.5"
+ "@babel/template" "^7.14.5"
+ "@babel/types" "^7.14.5"
-"@babel/helper-get-function-arity@^7.12.13":
- version "7.12.13"
- resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.13.tgz#bc63451d403a3b3082b97e1d8b3fe5bd4091e583"
- integrity sha512-DjEVzQNz5LICkzN0REdpD5prGoidvbdYk1BVgRUOINaWJP2t6avB27X1guXK1kXNrX0WMfsrm1A/ZBthYuIMQg==
+"@babel/helper-get-function-arity@^7.14.5":
+ version "7.14.5"
+ resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.14.5.tgz#25fbfa579b0937eee1f3b805ece4ce398c431815"
+ integrity sha512-I1Db4Shst5lewOM4V+ZKJzQ0JGGaZ6VY1jYvMghRjqs6DWgxLCIyFt30GlnKkfUeFLpJt2vzbMVEXVSXlIFYUg==
dependencies:
- "@babel/types" "^7.12.13"
+ "@babel/types" "^7.14.5"
-"@babel/helper-member-expression-to-functions@^7.13.12":
- version "7.13.12"
- resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.13.12.tgz#dfe368f26d426a07299d8d6513821768216e6d72"
- integrity sha512-48ql1CLL59aKbU94Y88Xgb2VFy7a95ykGRbJJaaVv+LX5U8wFpLfiGXJJGUozsmA1oEh/o5Bp60Voq7ACyA/Sw==
+"@babel/helper-hoist-variables@^7.14.5":
+ version "7.14.5"
+ resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.14.5.tgz#e0dd27c33a78e577d7c8884916a3e7ef1f7c7f8d"
+ integrity sha512-R1PXiz31Uc0Vxy4OEOm07x0oSjKAdPPCh3tPivn/Eo8cvz6gveAeuyUUPB21Hoiif0uoPQSSdhIPS3352nvdyQ==
dependencies:
- "@babel/types" "^7.13.12"
+ "@babel/types" "^7.14.5"
-"@babel/helper-module-imports@^7.12.13", "@babel/helper-module-imports@^7.13.12":
- version "7.13.12"
- resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.13.12.tgz#c6a369a6f3621cb25da014078684da9196b61977"
- integrity sha512-4cVvR2/1B693IuOvSI20xqqa/+bl7lqAMR59R4iu39R9aOX8/JoYY1sFaNvUMyMBGnHdwvJgUrzNLoUZxXypxA==
+"@babel/helper-member-expression-to-functions@^7.15.0":
+ version "7.15.0"
+ resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.15.0.tgz#0ddaf5299c8179f27f37327936553e9bba60990b"
+ integrity sha512-Jq8H8U2kYiafuj2xMTPQwkTBnEEdGKpT35lJEQsRRjnG0LW3neucsaMWLgKcwu3OHKNeYugfw+Z20BXBSEs2Lg==
dependencies:
- "@babel/types" "^7.13.12"
+ "@babel/types" "^7.15.0"
-"@babel/helper-module-transforms@^7.13.0", "@babel/helper-module-transforms@^7.13.14":
- version "7.13.14"
- resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.13.14.tgz#e600652ba48ccb1641775413cb32cfa4e8b495ef"
- integrity sha512-QuU/OJ0iAOSIatyVZmfqB0lbkVP0kDRiKj34xy+QNsnVZi/PA6BoSoreeqnxxa9EHFAIL0R9XOaAR/G9WlIy5g==
+"@babel/helper-module-imports@^7.14.5":
+ version "7.14.5"
+ resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.14.5.tgz#6d1a44df6a38c957aa7c312da076429f11b422f3"
+ integrity sha512-SwrNHu5QWS84XlHwGYPDtCxcA0hrSlL2yhWYLgeOc0w7ccOl2qv4s/nARI0aYZW+bSwAL5CukeXA47B/1NKcnQ==
dependencies:
- "@babel/helper-module-imports" "^7.13.12"
- "@babel/helper-replace-supers" "^7.13.12"
- "@babel/helper-simple-access" "^7.13.12"
- "@babel/helper-split-export-declaration" "^7.12.13"
- "@babel/helper-validator-identifier" "^7.12.11"
- "@babel/template" "^7.12.13"
- "@babel/traverse" "^7.13.13"
- "@babel/types" "^7.13.14"
+ "@babel/types" "^7.14.5"
-"@babel/helper-optimise-call-expression@^7.12.13":
- version "7.12.13"
- resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.12.13.tgz#5c02d171b4c8615b1e7163f888c1c81c30a2aaea"
- integrity sha512-BdWQhoVJkp6nVjB7nkFWcn43dkprYauqtk++Py2eaf/GRDFm5BxRqEIZCiHlZUGAVmtwKcsVL1dC68WmzeFmiA==
+"@babel/helper-module-transforms@^7.14.5", "@babel/helper-module-transforms@^7.15.0":
+ version "7.15.0"
+ resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.15.0.tgz#679275581ea056373eddbe360e1419ef23783b08"
+ integrity sha512-RkGiW5Rer7fpXv9m1B3iHIFDZdItnO2/BLfWVW/9q7+KqQSDY5kUfQEbzdXM1MVhJGcugKV7kRrNVzNxmk7NBg==
dependencies:
- "@babel/types" "^7.12.13"
+ "@babel/helper-module-imports" "^7.14.5"
+ "@babel/helper-replace-supers" "^7.15.0"
+ "@babel/helper-simple-access" "^7.14.8"
+ "@babel/helper-split-export-declaration" "^7.14.5"
+ "@babel/helper-validator-identifier" "^7.14.9"
+ "@babel/template" "^7.14.5"
+ "@babel/traverse" "^7.15.0"
+ "@babel/types" "^7.15.0"
-"@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.13.0", "@babel/helper-plugin-utils@^7.8.0":
- version "7.13.0"
- resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz#806526ce125aed03373bc416a828321e3a6a33af"
- integrity sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==
-
-"@babel/helper-remap-async-to-generator@^7.13.0":
- version "7.13.0"
- resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.13.0.tgz#376a760d9f7b4b2077a9dd05aa9c3927cadb2209"
- integrity sha512-pUQpFBE9JvC9lrQbpX0TmeNIy5s7GnZjna2lhhcHC7DzgBs6fWn722Y5cfwgrtrqc7NAJwMvOa0mKhq6XaE4jg==
+"@babel/helper-optimise-call-expression@^7.14.5":
+ version "7.14.5"
+ resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.14.5.tgz#f27395a8619e0665b3f0364cddb41c25d71b499c"
+ integrity sha512-IqiLIrODUOdnPU9/F8ib1Fx2ohlgDhxnIDU7OEVi+kAbEZcyiF7BLU8W6PfvPi9LzztjS7kcbzbmL7oG8kD6VA==
dependencies:
- "@babel/helper-annotate-as-pure" "^7.12.13"
- "@babel/helper-wrap-function" "^7.13.0"
- "@babel/types" "^7.13.0"
+ "@babel/types" "^7.14.5"
-"@babel/helper-replace-supers@^7.12.13", "@babel/helper-replace-supers@^7.13.0", "@babel/helper-replace-supers@^7.13.12":
- version "7.13.12"
- resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.13.12.tgz#6442f4c1ad912502481a564a7386de0c77ff3804"
- integrity sha512-Gz1eiX+4yDO8mT+heB94aLVNCL+rbuT2xy4YfyNqu8F+OI6vMvJK891qGBTqL9Uc8wxEvRW92Id6G7sDen3fFw==
+"@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.8.0":
+ version "7.14.5"
+ resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.14.5.tgz#5ac822ce97eec46741ab70a517971e443a70c5a9"
+ integrity sha512-/37qQCE3K0vvZKwoK4XU/irIJQdIfCJuhU5eKnNxpFDsOkgFaUAwbv+RYw6eYgsC0E4hS7r5KqGULUogqui0fQ==
+
+"@babel/helper-remap-async-to-generator@^7.14.5":
+ version "7.14.5"
+ resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.14.5.tgz#51439c913612958f54a987a4ffc9ee587a2045d6"
+ integrity sha512-rLQKdQU+HYlxBwQIj8dk4/0ENOUEhA/Z0l4hN8BexpvmSMN9oA9EagjnhnDpNsRdWCfjwa4mn/HyBXO9yhQP6A==
dependencies:
- "@babel/helper-member-expression-to-functions" "^7.13.12"
- "@babel/helper-optimise-call-expression" "^7.12.13"
- "@babel/traverse" "^7.13.0"
- "@babel/types" "^7.13.12"
+ "@babel/helper-annotate-as-pure" "^7.14.5"
+ "@babel/helper-wrap-function" "^7.14.5"
+ "@babel/types" "^7.14.5"
-"@babel/helper-simple-access@^7.13.12":
- version "7.13.12"
- resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.13.12.tgz#dd6c538afb61819d205a012c31792a39c7a5eaf6"
- integrity sha512-7FEjbrx5SL9cWvXioDbnlYTppcZGuCY6ow3/D5vMggb2Ywgu4dMrpTJX0JdQAIcRRUElOIxF3yEooa9gUb9ZbA==
+"@babel/helper-replace-supers@^7.14.5", "@babel/helper-replace-supers@^7.15.0":
+ version "7.15.0"
+ resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.15.0.tgz#ace07708f5bf746bf2e6ba99572cce79b5d4e7f4"
+ integrity sha512-6O+eWrhx+HEra/uJnifCwhwMd6Bp5+ZfZeJwbqUTuqkhIT6YcRhiZCOOFChRypOIe0cV46kFrRBlm+t5vHCEaA==
dependencies:
- "@babel/types" "^7.13.12"
+ "@babel/helper-member-expression-to-functions" "^7.15.0"
+ "@babel/helper-optimise-call-expression" "^7.14.5"
+ "@babel/traverse" "^7.15.0"
+ "@babel/types" "^7.15.0"
-"@babel/helper-skip-transparent-expression-wrappers@^7.12.1":
- version "7.12.1"
- resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.12.1.tgz#462dc63a7e435ade8468385c63d2b84cce4b3cbf"
- integrity sha512-Mf5AUuhG1/OCChOJ/HcADmvcHM42WJockombn8ATJG3OnyiSxBK/Mm5x78BQWvmtXZKHgbjdGL2kin/HOLlZGA==
+"@babel/helper-simple-access@^7.14.8":
+ version "7.14.8"
+ resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.14.8.tgz#82e1fec0644a7e775c74d305f212c39f8fe73924"
+ integrity sha512-TrFN4RHh9gnWEU+s7JloIho2T76GPwRHhdzOWLqTrMnlas8T9O7ec+oEDNsRXndOmru9ymH9DFrEOxpzPoSbdg==
dependencies:
- "@babel/types" "^7.12.1"
+ "@babel/types" "^7.14.8"
-"@babel/helper-split-export-declaration@^7.12.13":
- version "7.12.13"
- resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.12.13.tgz#e9430be00baf3e88b0e13e6f9d4eaf2136372b05"
- integrity sha512-tCJDltF83htUtXx5NLcaDqRmknv652ZWCHyoTETf1CXYJdPC7nohZohjUgieXhv0hTJdRf2FjDueFehdNucpzg==
+"@babel/helper-skip-transparent-expression-wrappers@^7.14.5":
+ version "7.14.5"
+ resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.14.5.tgz#96f486ac050ca9f44b009fbe5b7d394cab3a0ee4"
+ integrity sha512-dmqZB7mrb94PZSAOYtr+ZN5qt5owZIAgqtoTuqiFbHFtxgEcmQlRJVI+bO++fciBunXtB6MK7HrzrfcAzIz2NQ==
dependencies:
- "@babel/types" "^7.12.13"
+ "@babel/types" "^7.14.5"
-"@babel/helper-validator-identifier@^7.12.11":
- version "7.12.11"
- resolved "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz"
- integrity sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==
-
-"@babel/helper-validator-option@^7.12.17":
- version "7.12.17"
- resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.12.17.tgz#d1fbf012e1a79b7eebbfdc6d270baaf8d9eb9831"
- integrity sha512-TopkMDmLzq8ngChwRlyjR6raKD6gMSae4JdYDB8bByKreQgG0RBTuKe9LRxW3wFtUnjxOPRKBDwEH6Mg5KeDfw==
-
-"@babel/helper-wrap-function@^7.13.0":
- version "7.13.0"
- resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.13.0.tgz#bdb5c66fda8526ec235ab894ad53a1235c79fcc4"
- integrity sha512-1UX9F7K3BS42fI6qd2A4BjKzgGjToscyZTdp1DjknHLCIvpgne6918io+aL5LXFcER/8QWiwpoY902pVEqgTXA==
+"@babel/helper-split-export-declaration@^7.14.5":
+ version "7.14.5"
+ resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.14.5.tgz#22b23a54ef51c2b7605d851930c1976dd0bc693a"
+ integrity sha512-hprxVPu6e5Kdp2puZUmvOGjaLv9TCe58E/Fl6hRq4YiVQxIcNvuq6uTM2r1mT/oPskuS9CgR+I94sqAYv0NGKA==
dependencies:
- "@babel/helper-function-name" "^7.12.13"
- "@babel/template" "^7.12.13"
- "@babel/traverse" "^7.13.0"
- "@babel/types" "^7.13.0"
+ "@babel/types" "^7.14.5"
-"@babel/helpers@^7.13.10":
- version "7.13.10"
- resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.13.10.tgz#fd8e2ba7488533cdeac45cc158e9ebca5e3c7df8"
- integrity sha512-4VO883+MWPDUVRF3PhiLBUFHoX/bsLTGFpFK/HqvvfBZz2D57u9XzPVNFVBTc0PW/CWR9BXTOKt8NF4DInUHcQ==
- dependencies:
- "@babel/template" "^7.12.13"
- "@babel/traverse" "^7.13.0"
- "@babel/types" "^7.13.0"
+"@babel/helper-validator-identifier@^7.14.5", "@babel/helper-validator-identifier@^7.14.9":
+ version "7.14.9"
+ resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.9.tgz#6654d171b2024f6d8ee151bf2509699919131d48"
+ integrity sha512-pQYxPY0UP6IHISRitNe8bsijHex4TWZXi2HwKVsjPiltzlhse2znVcm9Ace510VT1kxIHjGJCZZQBX2gJDbo0g==
-"@babel/highlight@^7.10.4", "@babel/highlight@^7.12.13":
- version "7.13.10"
- resolved "https://registry.npmjs.org/@babel/highlight/-/highlight-7.13.10.tgz"
- integrity sha512-5aPpe5XQPzflQrFwL1/QoeHkP2MsA4JCntcXHRhEsdsfPVkvPi2w7Qix4iV7t5S/oC9OodGrggd8aco1g3SZFg==
+"@babel/helper-validator-option@^7.14.5":
+ version "7.14.5"
+ resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.14.5.tgz#6e72a1fff18d5dfcb878e1e62f1a021c4b72d5a3"
+ integrity sha512-OX8D5eeX4XwcroVW45NMvoYaIuFI+GQpA2a8Gi+X/U/cDUIRsV37qQfF905F0htTRCREQIB4KqPeaveRJUl3Ow==
+
+"@babel/helper-wrap-function@^7.14.5":
+ version "7.14.5"
+ resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.14.5.tgz#5919d115bf0fe328b8a5d63bcb610f51601f2bff"
+ integrity sha512-YEdjTCq+LNuNS1WfxsDCNpgXkJaIyqco6DAelTUjT4f2KIWC1nBcaCaSdHTBqQVLnTBexBcVcFhLSU1KnYuePQ==
dependencies:
- "@babel/helper-validator-identifier" "^7.12.11"
+ "@babel/helper-function-name" "^7.14.5"
+ "@babel/template" "^7.14.5"
+ "@babel/traverse" "^7.14.5"
+ "@babel/types" "^7.14.5"
+
+"@babel/helpers@^7.14.8":
+ version "7.15.3"
+ resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.15.3.tgz#c96838b752b95dcd525b4e741ed40bb1dc2a1357"
+ integrity sha512-HwJiz52XaS96lX+28Tnbu31VeFSQJGOeKHJeaEPQlTl7PnlhFElWPj8tUXtqFIzeN86XxXoBr+WFAyK2PPVz6g==
+ dependencies:
+ "@babel/template" "^7.14.5"
+ "@babel/traverse" "^7.15.0"
+ "@babel/types" "^7.15.0"
+
+"@babel/highlight@^7.10.4", "@babel/highlight@^7.14.5":
+ version "7.14.5"
+ resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.14.5.tgz#6861a52f03966405001f6aa534a01a24d99e8cd9"
+ integrity sha512-qf9u2WFWVV0MppaL877j2dBtQIDgmidgjGk5VIMw3OadXvYaXn66U1BFlH2t4+t3i+8PhedppRv+i40ABzd+gg==
+ dependencies:
+ "@babel/helper-validator-identifier" "^7.14.5"
chalk "^2.0.0"
js-tokens "^4.0.0"
-"@babel/parser@^7.12.13", "@babel/parser@^7.13.15":
- version "7.13.15"
- resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.13.15.tgz#8e66775fb523599acb6a289e12929fa5ab0954d8"
- integrity sha512-b9COtcAlVEQljy/9fbcMHpG+UIW9ReF+gpaxDHTlZd0c6/UU9ng8zdySAW9sRTzpvcdCHn6bUcbuYUgGzLAWVQ==
+"@babel/parser@^7.14.5", "@babel/parser@^7.15.0":
+ version "7.15.3"
+ resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.15.3.tgz#3416d9bea748052cfcb63dbcc27368105b1ed862"
+ integrity sha512-O0L6v/HvqbdJawj0iBEfVQMc3/6WP+AeOsovsIgBFyJaG+W2w7eqvZB7puddATmWuARlm1SX7DwxJ/JJUnDpEA==
"@babel/plugin-external-helpers@^7.0.0":
- version "7.12.13"
- resolved "https://registry.yarnpkg.com/@babel/plugin-external-helpers/-/plugin-external-helpers-7.12.13.tgz#65ef9f4576297250dc601d2aa334769790d9966d"
- integrity sha512-ClvAsk4RqpE6iacYUjdU9PtvIwC9yAefZENsPfGeG5FckX3jFZLDlWPuyv5gi9/9C2VgwX6H8q1ukBifC0ha+Q==
+ version "7.14.5"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-external-helpers/-/plugin-external-helpers-7.14.5.tgz#920baa1569a8df5d5710abc342c7b1ac8968ed76"
+ integrity sha512-q/B/hLX+nDGk73Xn529d7Ar4ih17J8pNBbsXafq8oXij0XfFEA/bks+u+6q5q04zO5o/qivjzui6BqzPfYShEg==
dependencies:
- "@babel/helper-plugin-utils" "^7.12.13"
+ "@babel/helper-plugin-utils" "^7.14.5"
"@babel/plugin-proposal-async-generator-functions@^7.0.0":
- version "7.13.15"
- resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.13.15.tgz#80e549df273a3b3050431b148c892491df1bcc5b"
- integrity sha512-VapibkWzFeoa6ubXy/NgV5U2U4MVnUlvnx6wo1XhlsaTrLYWE0UFpDQsVrmn22q5CzeloqJ8gEMHSKxuee6ZdA==
+ version "7.14.9"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.14.9.tgz#7028dc4fa21dc199bbacf98b39bab1267d0eaf9a"
+ integrity sha512-d1lnh+ZnKrFKwtTYdw320+sQWCTwgkB9fmUhNXRADA4akR6wLjaruSGnIEUjpt9HCOwTr4ynFTKu19b7rFRpmw==
dependencies:
- "@babel/helper-plugin-utils" "^7.13.0"
- "@babel/helper-remap-async-to-generator" "^7.13.0"
+ "@babel/helper-plugin-utils" "^7.14.5"
+ "@babel/helper-remap-async-to-generator" "^7.14.5"
"@babel/plugin-syntax-async-generators" "^7.8.4"
"@babel/plugin-proposal-object-rest-spread@^7.0.0":
- version "7.13.8"
- resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.13.8.tgz#5d210a4d727d6ce3b18f9de82cc99a3964eed60a"
- integrity sha512-DhB2EuB1Ih7S3/IRX5AFVgZ16k3EzfRbq97CxAVI1KSYcW+lexV8VZb7G7L8zuPVSdQMRn0kiBpf/Yzu9ZKH0g==
+ version "7.14.7"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.14.7.tgz#5920a2b3df7f7901df0205974c0641b13fd9d363"
+ integrity sha512-082hsZz+sVabfmDWo1Oct1u1AgbKbUAyVgmX4otIc7bdsRgHBXwTwb3DpDmD4Eyyx6DNiuz5UAATT655k+kL5g==
dependencies:
- "@babel/compat-data" "^7.13.8"
- "@babel/helper-compilation-targets" "^7.13.8"
- "@babel/helper-plugin-utils" "^7.13.0"
+ "@babel/compat-data" "^7.14.7"
+ "@babel/helper-compilation-targets" "^7.14.5"
+ "@babel/helper-plugin-utils" "^7.14.5"
"@babel/plugin-syntax-object-rest-spread" "^7.8.3"
- "@babel/plugin-transform-parameters" "^7.13.0"
+ "@babel/plugin-transform-parameters" "^7.14.5"
"@babel/plugin-syntax-async-generators@^7.0.0", "@babel/plugin-syntax-async-generators@^7.8.4":
version "7.8.4"
@@ -286,234 +293,234 @@
"@babel/helper-plugin-utils" "^7.8.0"
"@babel/plugin-transform-arrow-functions@^7.0.0":
- version "7.13.0"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.13.0.tgz#10a59bebad52d637a027afa692e8d5ceff5e3dae"
- integrity sha512-96lgJagobeVmazXFaDrbmCLQxBysKu7U6Do3mLsx27gf5Dk85ezysrs2BZUpXD703U/Su1xTBDxxar2oa4jAGg==
+ version "7.14.5"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.14.5.tgz#f7187d9588a768dd080bf4c9ffe117ea62f7862a"
+ integrity sha512-KOnO0l4+tD5IfOdi4x8C1XmEIRWUjNRV8wc6K2vz/3e8yAOoZZvsRXRRIF/yo/MAOFb4QjtAw9xSxMXbSMRy8A==
dependencies:
- "@babel/helper-plugin-utils" "^7.13.0"
+ "@babel/helper-plugin-utils" "^7.14.5"
"@babel/plugin-transform-async-to-generator@^7.0.0":
- version "7.13.0"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.13.0.tgz#8e112bf6771b82bf1e974e5e26806c5c99aa516f"
- integrity sha512-3j6E004Dx0K3eGmhxVJxwwI89CTJrce7lg3UrtFuDAVQ/2+SJ/h/aSFOeE6/n0WB1GsOffsJp6MnPQNQ8nmwhg==
+ version "7.14.5"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.14.5.tgz#72c789084d8f2094acb945633943ef8443d39e67"
+ integrity sha512-szkbzQ0mNk0rpu76fzDdqSyPu0MuvpXgC+6rz5rpMb5OIRxdmHfQxrktL8CYolL2d8luMCZTR0DpIMIdL27IjA==
dependencies:
- "@babel/helper-module-imports" "^7.12.13"
- "@babel/helper-plugin-utils" "^7.13.0"
- "@babel/helper-remap-async-to-generator" "^7.13.0"
+ "@babel/helper-module-imports" "^7.14.5"
+ "@babel/helper-plugin-utils" "^7.14.5"
+ "@babel/helper-remap-async-to-generator" "^7.14.5"
"@babel/plugin-transform-block-scoped-functions@^7.0.0":
- version "7.12.13"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.12.13.tgz#a9bf1836f2a39b4eb6cf09967739de29ea4bf4c4"
- integrity sha512-zNyFqbc3kI/fVpqwfqkg6RvBgFpC4J18aKKMmv7KdQ/1GgREapSJAykLMVNwfRGO3BtHj3YQZl8kxCXPcVMVeg==
+ version "7.14.5"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.14.5.tgz#e48641d999d4bc157a67ef336aeb54bc44fd3ad4"
+ integrity sha512-dtqWqdWZ5NqBX3KzsVCWfQI3A53Ft5pWFCT2eCVUftWZgjc5DpDponbIF1+c+7cSGk2wN0YK7HGL/ezfRbpKBQ==
dependencies:
- "@babel/helper-plugin-utils" "^7.12.13"
+ "@babel/helper-plugin-utils" "^7.14.5"
"@babel/plugin-transform-block-scoping@^7.0.0":
- version "7.12.13"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.12.13.tgz#f36e55076d06f41dfd78557ea039c1b581642e61"
- integrity sha512-Pxwe0iqWJX4fOOM2kEZeUuAxHMWb9nK+9oh5d11bsLoB0xMg+mkDpt0eYuDZB7ETrY9bbcVlKUGTOGWy7BHsMQ==
+ version "7.15.3"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.15.3.tgz#94c81a6e2fc230bcce6ef537ac96a1e4d2b3afaf"
+ integrity sha512-nBAzfZwZb4DkaGtOes1Up1nOAp9TDRRFw4XBzBBSG9QK7KVFmYzgj9o9sbPv7TX5ofL4Auq4wZnxCoPnI/lz2Q==
dependencies:
- "@babel/helper-plugin-utils" "^7.12.13"
+ "@babel/helper-plugin-utils" "^7.14.5"
"@babel/plugin-transform-classes@^7.0.0":
- version "7.13.0"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.13.0.tgz#0265155075c42918bf4d3a4053134176ad9b533b"
- integrity sha512-9BtHCPUARyVH1oXGcSJD3YpsqRLROJx5ZNP6tN5vnk17N0SVf9WCtf8Nuh1CFmgByKKAIMstitKduoCmsaDK5g==
+ version "7.14.9"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.14.9.tgz#2a391ffb1e5292710b00f2e2c210e1435e7d449f"
+ integrity sha512-NfZpTcxU3foGWbl4wxmZ35mTsYJy8oQocbeIMoDAGGFarAmSQlL+LWMkDx/tj6pNotpbX3rltIA4dprgAPOq5A==
dependencies:
- "@babel/helper-annotate-as-pure" "^7.12.13"
- "@babel/helper-function-name" "^7.12.13"
- "@babel/helper-optimise-call-expression" "^7.12.13"
- "@babel/helper-plugin-utils" "^7.13.0"
- "@babel/helper-replace-supers" "^7.13.0"
- "@babel/helper-split-export-declaration" "^7.12.13"
+ "@babel/helper-annotate-as-pure" "^7.14.5"
+ "@babel/helper-function-name" "^7.14.5"
+ "@babel/helper-optimise-call-expression" "^7.14.5"
+ "@babel/helper-plugin-utils" "^7.14.5"
+ "@babel/helper-replace-supers" "^7.14.5"
+ "@babel/helper-split-export-declaration" "^7.14.5"
globals "^11.1.0"
"@babel/plugin-transform-computed-properties@^7.0.0":
- version "7.13.0"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.13.0.tgz#845c6e8b9bb55376b1fa0b92ef0bdc8ea06644ed"
- integrity sha512-RRqTYTeZkZAz8WbieLTvKUEUxZlUTdmL5KGMyZj7FnMfLNKV4+r5549aORG/mgojRmFlQMJDUupwAMiF2Q7OUg==
+ version "7.14.5"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.14.5.tgz#1b9d78987420d11223d41195461cc43b974b204f"
+ integrity sha512-pWM+E4283UxaVzLb8UBXv4EIxMovU4zxT1OPnpHJcmnvyY9QbPPTKZfEj31EUvG3/EQRbYAGaYEUZ4yWOBC2xg==
dependencies:
- "@babel/helper-plugin-utils" "^7.13.0"
+ "@babel/helper-plugin-utils" "^7.14.5"
"@babel/plugin-transform-destructuring@^7.0.0":
- version "7.13.0"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.13.0.tgz#c5dce270014d4e1ebb1d806116694c12b7028963"
- integrity sha512-zym5em7tePoNT9s964c0/KU3JPPnuq7VhIxPRefJ4/s82cD+q1mgKfuGRDMCPL0HTyKz4dISuQlCusfgCJ86HA==
+ version "7.14.7"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.14.7.tgz#0ad58ed37e23e22084d109f185260835e5557576"
+ integrity sha512-0mDE99nK+kVh3xlc5vKwB6wnP9ecuSj+zQCa/n0voENtP/zymdT4HH6QEb65wjjcbqr1Jb/7z9Qp7TF5FtwYGw==
dependencies:
- "@babel/helper-plugin-utils" "^7.13.0"
+ "@babel/helper-plugin-utils" "^7.14.5"
"@babel/plugin-transform-duplicate-keys@^7.0.0":
- version "7.12.13"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.12.13.tgz#6f06b87a8b803fd928e54b81c258f0a0033904de"
- integrity sha512-NfADJiiHdhLBW3pulJlJI2NB0t4cci4WTZ8FtdIuNc2+8pslXdPtRRAEWqUY+m9kNOk2eRYbTAOipAxlrOcwwQ==
+ version "7.14.5"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.14.5.tgz#365a4844881bdf1501e3a9f0270e7f0f91177954"
+ integrity sha512-iJjbI53huKbPDAsJ8EmVmvCKeeq21bAze4fu9GBQtSLqfvzj2oRuHVx4ZkDwEhg1htQ+5OBZh/Ab0XDf5iBZ7A==
dependencies:
- "@babel/helper-plugin-utils" "^7.12.13"
+ "@babel/helper-plugin-utils" "^7.14.5"
"@babel/plugin-transform-exponentiation-operator@^7.0.0":
- version "7.12.13"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.12.13.tgz#4d52390b9a273e651e4aba6aee49ef40e80cd0a1"
- integrity sha512-fbUelkM1apvqez/yYx1/oICVnGo2KM5s63mhGylrmXUxK/IAXSIf87QIxVfZldWf4QsOafY6vV3bX8aMHSvNrA==
+ version "7.14.5"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.14.5.tgz#5154b8dd6a3dfe6d90923d61724bd3deeb90b493"
+ integrity sha512-jFazJhMBc9D27o9jDnIE5ZErI0R0m7PbKXVq77FFvqFbzvTMuv8jaAwLZ5PviOLSFttqKIW0/wxNSDbjLk0tYA==
dependencies:
- "@babel/helper-builder-binary-assignment-operator-visitor" "^7.12.13"
- "@babel/helper-plugin-utils" "^7.12.13"
+ "@babel/helper-builder-binary-assignment-operator-visitor" "^7.14.5"
+ "@babel/helper-plugin-utils" "^7.14.5"
"@babel/plugin-transform-for-of@^7.0.0":
- version "7.13.0"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.13.0.tgz#c799f881a8091ac26b54867a845c3e97d2696062"
- integrity sha512-IHKT00mwUVYE0zzbkDgNRP6SRzvfGCYsOxIRz8KsiaaHCcT9BWIkO+H9QRJseHBLOGBZkHUdHiqj6r0POsdytg==
+ version "7.14.5"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.14.5.tgz#dae384613de8f77c196a8869cbf602a44f7fc0eb"
+ integrity sha512-CfmqxSUZzBl0rSjpoQSFoR9UEj3HzbGuGNL21/iFTmjb5gFggJp3ph0xR1YBhexmLoKRHzgxuFvty2xdSt6gTA==
dependencies:
- "@babel/helper-plugin-utils" "^7.13.0"
+ "@babel/helper-plugin-utils" "^7.14.5"
"@babel/plugin-transform-function-name@^7.0.0":
- version "7.12.13"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.12.13.tgz#bb024452f9aaed861d374c8e7a24252ce3a50051"
- integrity sha512-6K7gZycG0cmIwwF7uMK/ZqeCikCGVBdyP2J5SKNCXO5EOHcqi+z7Jwf8AmyDNcBgxET8DrEtCt/mPKPyAzXyqQ==
+ version "7.14.5"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.14.5.tgz#e81c65ecb900746d7f31802f6bed1f52d915d6f2"
+ integrity sha512-vbO6kv0fIzZ1GpmGQuvbwwm+O4Cbm2NrPzwlup9+/3fdkuzo1YqOZcXw26+YUJB84Ja7j9yURWposEHLYwxUfQ==
dependencies:
- "@babel/helper-function-name" "^7.12.13"
- "@babel/helper-plugin-utils" "^7.12.13"
+ "@babel/helper-function-name" "^7.14.5"
+ "@babel/helper-plugin-utils" "^7.14.5"
"@babel/plugin-transform-instanceof@^7.0.0":
- version "7.12.13"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-instanceof/-/plugin-transform-instanceof-7.12.13.tgz#5df8ead82ed421b728662c9e0ed943536c872ced"
- integrity sha512-lYZ6F2xmM797Nk8PzDn2AreAEjKb96S3JkZkaMUlRTIThaYjvo1+aLa7oegnVc42lJY7Hr4yT1M/i6kwRcPlsQ==
+ version "7.14.5"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-instanceof/-/plugin-transform-instanceof-7.14.5.tgz#8568277fbcfd7a3e4f3e6c8b7aa8ce4f60cba6e7"
+ integrity sha512-3CIpRzBLk5tEwIzjjD86KR8oMYrp1fl9q7kbdJa6O6Lcmkcee9DXfeO6zRXis//5gWRf63o5oDlNBh0VAlmtgw==
dependencies:
- "@babel/helper-plugin-utils" "^7.12.13"
+ "@babel/helper-plugin-utils" "^7.14.5"
"@babel/plugin-transform-literals@^7.0.0":
- version "7.12.13"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.12.13.tgz#2ca45bafe4a820197cf315794a4d26560fe4bdb9"
- integrity sha512-FW+WPjSR7hiUxMcKqyNjP05tQ2kmBCdpEpZHY1ARm96tGQCCBvXKnpjILtDplUnJ/eHZ0lALLM+d2lMFSpYJrQ==
+ version "7.14.5"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.14.5.tgz#41d06c7ff5d4d09e3cf4587bd3ecf3930c730f78"
+ integrity sha512-ql33+epql2F49bi8aHXxvLURHkxJbSmMKl9J5yHqg4PLtdE6Uc48CH1GS6TQvZ86eoB/ApZXwm7jlA+B3kra7A==
dependencies:
- "@babel/helper-plugin-utils" "^7.12.13"
+ "@babel/helper-plugin-utils" "^7.14.5"
"@babel/plugin-transform-modules-amd@^7.0.0":
- version "7.13.0"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.13.0.tgz#19f511d60e3d8753cc5a6d4e775d3a5184866cc3"
- integrity sha512-EKy/E2NHhY/6Vw5d1k3rgoobftcNUmp9fGjb9XZwQLtTctsRBOTRO7RHHxfIky1ogMN5BxN7p9uMA3SzPfotMQ==
+ version "7.14.5"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.14.5.tgz#4fd9ce7e3411cb8b83848480b7041d83004858f7"
+ integrity sha512-3lpOU8Vxmp3roC4vzFpSdEpGUWSMsHFreTWOMMLzel2gNGfHE5UWIh/LN6ghHs2xurUp4jRFYMUIZhuFbody1g==
dependencies:
- "@babel/helper-module-transforms" "^7.13.0"
- "@babel/helper-plugin-utils" "^7.13.0"
+ "@babel/helper-module-transforms" "^7.14.5"
+ "@babel/helper-plugin-utils" "^7.14.5"
babel-plugin-dynamic-import-node "^2.3.3"
"@babel/plugin-transform-object-super@^7.0.0":
- version "7.12.13"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.12.13.tgz#b4416a2d63b8f7be314f3d349bd55a9c1b5171f7"
- integrity sha512-JzYIcj3XtYspZDV8j9ulnoMPZZnF/Cj0LUxPOjR89BdBVx+zYJI9MdMIlUZjbXDX+6YVeS6I3e8op+qQ3BYBoQ==
+ version "7.14.5"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.14.5.tgz#d0b5faeac9e98597a161a9cf78c527ed934cdc45"
+ integrity sha512-MKfOBWzK0pZIrav9z/hkRqIk/2bTv9qvxHzPQc12RcVkMOzpIKnFCNYJip00ssKWYkd8Sf5g0Wr7pqJ+cmtuFg==
dependencies:
- "@babel/helper-plugin-utils" "^7.12.13"
- "@babel/helper-replace-supers" "^7.12.13"
+ "@babel/helper-plugin-utils" "^7.14.5"
+ "@babel/helper-replace-supers" "^7.14.5"
-"@babel/plugin-transform-parameters@^7.0.0", "@babel/plugin-transform-parameters@^7.13.0":
- version "7.13.0"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.13.0.tgz#8fa7603e3097f9c0b7ca1a4821bc2fb52e9e5007"
- integrity sha512-Jt8k/h/mIwE2JFEOb3lURoY5C85ETcYPnbuAJ96zRBzh1XHtQZfs62ChZ6EP22QlC8c7Xqr9q+e1SU5qttwwjw==
+"@babel/plugin-transform-parameters@^7.0.0", "@babel/plugin-transform-parameters@^7.14.5":
+ version "7.14.5"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.14.5.tgz#49662e86a1f3ddccac6363a7dfb1ff0a158afeb3"
+ integrity sha512-Tl7LWdr6HUxTmzQtzuU14SqbgrSKmaR77M0OKyq4njZLQTPfOvzblNKyNkGwOfEFCEx7KeYHQHDI0P3F02IVkA==
dependencies:
- "@babel/helper-plugin-utils" "^7.13.0"
+ "@babel/helper-plugin-utils" "^7.14.5"
"@babel/plugin-transform-regenerator@^7.0.0":
- version "7.13.15"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.13.15.tgz#e5eb28945bf8b6563e7f818945f966a8d2997f39"
- integrity sha512-Bk9cOLSz8DiurcMETZ8E2YtIVJbFCPGW28DJWUakmyVWtQSm6Wsf0p4B4BfEr/eL2Nkhe/CICiUiMOCi1TPhuQ==
+ version "7.14.5"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.14.5.tgz#9676fd5707ed28f522727c5b3c0aa8544440b04f"
+ integrity sha512-NVIY1W3ITDP5xQl50NgTKlZ0GrotKtLna08/uGY6ErQt6VEQZXla86x/CTddm5gZdcr+5GSsvMeTmWA5Ii6pkg==
dependencies:
regenerator-transform "^0.14.2"
"@babel/plugin-transform-shorthand-properties@^7.0.0":
- version "7.12.13"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.12.13.tgz#db755732b70c539d504c6390d9ce90fe64aff7ad"
- integrity sha512-xpL49pqPnLtf0tVluuqvzWIgLEhuPpZzvs2yabUHSKRNlN7ScYU7aMlmavOeyXJZKgZKQRBlh8rHbKiJDraTSw==
+ version "7.14.5"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.14.5.tgz#97f13855f1409338d8cadcbaca670ad79e091a58"
+ integrity sha512-xLucks6T1VmGsTB+GWK5Pl9Jl5+nRXD1uoFdA5TSO6xtiNjtXTjKkmPdFXVLGlK5A2/or/wQMKfmQ2Y0XJfn5g==
dependencies:
- "@babel/helper-plugin-utils" "^7.12.13"
+ "@babel/helper-plugin-utils" "^7.14.5"
"@babel/plugin-transform-spread@^7.0.0":
- version "7.13.0"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.13.0.tgz#84887710e273c1815ace7ae459f6f42a5d31d5fd"
- integrity sha512-V6vkiXijjzYeFmQTr3dBxPtZYLPcUfY34DebOU27jIl2M/Y8Egm52Hw82CSjjPqd54GTlJs5x+CR7HeNr24ckg==
+ version "7.14.6"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.14.6.tgz#6bd40e57fe7de94aa904851963b5616652f73144"
+ integrity sha512-Zr0x0YroFJku7n7+/HH3A2eIrGMjbmAIbJSVv0IZ+t3U2WUQUA64S/oeied2e+MaGSjmt4alzBCsK9E8gh+fag==
dependencies:
- "@babel/helper-plugin-utils" "^7.13.0"
- "@babel/helper-skip-transparent-expression-wrappers" "^7.12.1"
+ "@babel/helper-plugin-utils" "^7.14.5"
+ "@babel/helper-skip-transparent-expression-wrappers" "^7.14.5"
"@babel/plugin-transform-sticky-regex@^7.0.0":
- version "7.12.13"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.12.13.tgz#760ffd936face73f860ae646fb86ee82f3d06d1f"
- integrity sha512-Jc3JSaaWT8+fr7GRvQP02fKDsYk4K/lYwWq38r/UGfaxo89ajud321NH28KRQ7xy1Ybc0VUE5Pz8psjNNDUglg==
+ version "7.14.5"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.14.5.tgz#5b617542675e8b7761294381f3c28c633f40aeb9"
+ integrity sha512-Z7F7GyvEMzIIbwnziAZmnSNpdijdr4dWt+FJNBnBLz5mwDFkqIXU9wmBcWWad3QeJF5hMTkRe4dAq2sUZiG+8A==
dependencies:
- "@babel/helper-plugin-utils" "^7.12.13"
+ "@babel/helper-plugin-utils" "^7.14.5"
"@babel/plugin-transform-template-literals@^7.0.0":
- version "7.13.0"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.13.0.tgz#a36049127977ad94438dee7443598d1cefdf409d"
- integrity sha512-d67umW6nlfmr1iehCcBv69eSUSySk1EsIS8aTDX4Xo9qajAh6mYtcl4kJrBkGXuxZPEgVr7RVfAvNW6YQkd4Mw==
+ version "7.14.5"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.14.5.tgz#a5f2bc233937d8453885dc736bdd8d9ffabf3d93"
+ integrity sha512-22btZeURqiepOfuy/VkFr+zStqlujWaarpMErvay7goJS6BWwdd6BY9zQyDLDa4x2S3VugxFb162IZ4m/S/+Gg==
dependencies:
- "@babel/helper-plugin-utils" "^7.13.0"
+ "@babel/helper-plugin-utils" "^7.14.5"
"@babel/plugin-transform-typeof-symbol@^7.0.0":
- version "7.12.13"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.12.13.tgz#785dd67a1f2ea579d9c2be722de8c84cb85f5a7f"
- integrity sha512-eKv/LmUJpMnu4npgfvs3LiHhJua5fo/CysENxa45YCQXZwKnGCQKAg87bvoqSW1fFT+HA32l03Qxsm8ouTY3ZQ==
+ version "7.14.5"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.14.5.tgz#39af2739e989a2bd291bf6b53f16981423d457d4"
+ integrity sha512-lXzLD30ffCWseTbMQzrvDWqljvZlHkXU+CnseMhkMNqU1sASnCsz3tSzAaH3vCUXb9PHeUb90ZT1BdFTm1xxJw==
dependencies:
- "@babel/helper-plugin-utils" "^7.12.13"
+ "@babel/helper-plugin-utils" "^7.14.5"
"@babel/plugin-transform-unicode-regex@^7.0.0":
- version "7.12.13"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.12.13.tgz#b52521685804e155b1202e83fc188d34bb70f5ac"
- integrity sha512-mDRzSNY7/zopwisPZ5kM9XKCfhchqIYwAKRERtEnhYscZB79VRekuRSoYbN0+KVe3y8+q1h6A4svXtP7N+UoCA==
+ version "7.14.5"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.14.5.tgz#4cd09b6c8425dd81255c7ceb3fb1836e7414382e"
+ integrity sha512-UygduJpC5kHeCiRw/xDVzC+wj8VaYSoKl5JNVmbP7MadpNinAm3SvZCxZ42H37KZBKztz46YC73i9yV34d0Tzw==
dependencies:
- "@babel/helper-create-regexp-features-plugin" "^7.12.13"
- "@babel/helper-plugin-utils" "^7.12.13"
+ "@babel/helper-create-regexp-features-plugin" "^7.14.5"
+ "@babel/helper-plugin-utils" "^7.14.5"
"@babel/runtime@^7.8.4":
- version "7.13.10"
- resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.13.10.tgz#47d42a57b6095f4468da440388fdbad8bebf0d7d"
- integrity sha512-4QPkjJq6Ns3V/RgpEahRk+AGfL0eO6RHHtTWoNNr5mO49G6B5+X6d6THgWEAvTrznU5xYpbAlVKRYcsCgh/Akw==
+ version "7.15.3"
+ resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.15.3.tgz#2e1c2880ca118e5b2f9988322bd8a7656a32502b"
+ integrity sha512-OvwMLqNXkCXSz1kSm58sEsNuhqOx/fKpnUnKnFB5v8uDda5bLNEHNgKPvhDN6IU0LDcnHQ90LlJ0Q6jnyBSIBA==
dependencies:
regenerator-runtime "^0.13.4"
-"@babel/template@^7.12.13":
- version "7.12.13"
- resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.12.13.tgz#530265be8a2589dbb37523844c5bcb55947fb327"
- integrity sha512-/7xxiGA57xMo/P2GVvdEumr8ONhFOhfgq2ihK3h1e6THqzTAkHbkXgB0xI9yeTfIUoH3+oAeHhqm/I43OTbbjA==
+"@babel/template@^7.14.5":
+ version "7.14.5"
+ resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.14.5.tgz#a9bc9d8b33354ff6e55a9c60d1109200a68974f4"
+ integrity sha512-6Z3Po85sfxRGachLULUhOmvAaOo7xCvqGQtxINai2mEGPFm6pQ4z5QInFnUrRpfoSV60BnjyF5F3c+15fxFV1g==
dependencies:
- "@babel/code-frame" "^7.12.13"
- "@babel/parser" "^7.12.13"
- "@babel/types" "^7.12.13"
+ "@babel/code-frame" "^7.14.5"
+ "@babel/parser" "^7.14.5"
+ "@babel/types" "^7.14.5"
-"@babel/traverse@^7.0.0", "@babel/traverse@^7.0.0-beta.42", "@babel/traverse@^7.13.0", "@babel/traverse@^7.13.13", "@babel/traverse@^7.13.15":
- version "7.13.15"
- resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.13.15.tgz#c38bf7679334ddd4028e8e1f7b3aa5019f0dada7"
- integrity sha512-/mpZMNvj6bce59Qzl09fHEs8Bt8NnpEDQYleHUPZQ3wXUMvXi+HJPLars68oAbmp839fGoOkv2pSL2z9ajCIaQ==
+"@babel/traverse@^7.0.0", "@babel/traverse@^7.0.0-beta.42", "@babel/traverse@^7.14.5", "@babel/traverse@^7.15.0":
+ version "7.15.0"
+ resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.15.0.tgz#4cca838fd1b2a03283c1f38e141f639d60b3fc98"
+ integrity sha512-392d8BN0C9eVxVWd8H6x9WfipgVH5IaIoLp23334Sc1vbKKWINnvwRpb4us0xtPaCumlwbTtIYNA0Dv/32sVFw==
dependencies:
- "@babel/code-frame" "^7.12.13"
- "@babel/generator" "^7.13.9"
- "@babel/helper-function-name" "^7.12.13"
- "@babel/helper-split-export-declaration" "^7.12.13"
- "@babel/parser" "^7.13.15"
- "@babel/types" "^7.13.14"
+ "@babel/code-frame" "^7.14.5"
+ "@babel/generator" "^7.15.0"
+ "@babel/helper-function-name" "^7.14.5"
+ "@babel/helper-hoist-variables" "^7.14.5"
+ "@babel/helper-split-export-declaration" "^7.14.5"
+ "@babel/parser" "^7.15.0"
+ "@babel/types" "^7.15.0"
debug "^4.1.0"
globals "^11.1.0"
-"@babel/types@^7.0.0-beta.42", "@babel/types@^7.12.1", "@babel/types@^7.12.13", "@babel/types@^7.13.0", "@babel/types@^7.13.12", "@babel/types@^7.13.14":
- version "7.13.14"
- resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.13.14.tgz#c35a4abb15c7cd45a2746d78ab328e362cbace0d"
- integrity sha512-A2aa3QTkWoyqsZZFl56MLUsfmh7O0gN41IPvXAE/++8ojpbz12SszD7JEGYVdn4f9Kt4amIei07swF1h4AqmmQ==
+"@babel/types@^7.0.0-beta.42", "@babel/types@^7.14.5", "@babel/types@^7.14.8", "@babel/types@^7.15.0":
+ version "7.15.0"
+ resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.15.0.tgz#61af11f2286c4e9c69ca8deb5f4375a73c72dcbd"
+ integrity sha512-OBvfqnllOIdX4ojTHpwZbpvz4j3EWyjkZEdmjH0/cgsd6QOdSgU8rLSk6ard/pcW7rlmjdVSX/AWOaORR1uNOQ==
dependencies:
- "@babel/helper-validator-identifier" "^7.12.11"
- lodash "^4.17.19"
+ "@babel/helper-validator-identifier" "^7.14.9"
to-fast-properties "^2.0.0"
"@bazel/rollup@^3.5.0":
- version "3.5.0"
- resolved "https://registry.yarnpkg.com/@bazel/rollup/-/rollup-3.5.0.tgz#3de2db08cbc62c3cffbbabaa4517ec250cf6419a"
- integrity sha512-sFPqbzSbIn6h66uuZdXgK5oitSmEGtnDPfL3TwTS4ZWy75SpYvk9X1TFGlvkralEkVnFfdH15sq80/1t+YgQow==
+ version "3.8.0"
+ resolved "https://registry.yarnpkg.com/@bazel/rollup/-/rollup-3.8.0.tgz#850f56176d73e3b7d99a43c7e33df21ecc6ac161"
+ integrity sha512-u63ubqYtfQhOu8Km3uYdhKa6qiLSlOKYsWwMP1xGkkXzu1hOiUznN1N7q8gCF1BV2DMy1D5IYkv+Xg4a+LEiBA==
"@bazel/terser@^3.5.0":
- version "3.5.0"
- resolved "https://registry.yarnpkg.com/@bazel/terser/-/terser-3.5.0.tgz#4b1c3a3b781e65547694aa05bc600c251e4d8c0b"
- integrity sha512-dpWHn1Iu+w0uA/kvPb0pP+4Io0PrVuzCCbVg2Ow4uRt/gTFKQJJWp4EiTitEZlPA2dHlW7PHThAb93lGo2c8qA==
+ version "3.8.0"
+ resolved "https://registry.yarnpkg.com/@bazel/terser/-/terser-3.8.0.tgz#96d337b62b2ba18e2fe00984cca950cda899d165"
+ integrity sha512-c7cGIltFUI7prRocMDZ3qZVERnew81SFheuI5B9RQ3qeqTlJmlV8B8GI9FPG+7Ut69bmwn8es6UyPaH0iBnsQw==
"@bazel/typescript@^3.5.0":
- version "3.5.0"
- resolved "https://registry.yarnpkg.com/@bazel/typescript/-/typescript-3.5.0.tgz#605493f4f0a5297df8a7fcccb86a1a80ea2090bb"
- integrity sha512-BtGFp4nYFkQTmnONCzomk7dkmOwaINBL3piq+lykBlcc6UxLe9iCAnZpOyPypB1ReN3k3SRNAa53x6oGScQxMg==
+ version "3.8.0"
+ resolved "https://registry.yarnpkg.com/@bazel/typescript/-/typescript-3.8.0.tgz#725d51a1c25e314a1d8cddb8b880ac05ba97acd4"
+ integrity sha512-4C1pLe4V7aidWqcPsWNqXFS7uHAB1nH5SUKG5uWoVv4JT9XhkNSvzzQIycMwXs2tZeCylX4KYNeNvfKrmkyFlw==
dependencies:
protobufjs "6.8.8"
semver "5.6.0"
@@ -529,21 +536,35 @@
enabled "2.0.x"
kuler "^2.0.0"
-"@eslint/eslintrc@^0.4.0":
- version "0.4.0"
- resolved "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.0.tgz"
- integrity sha512-2ZPCc+uNbjV5ERJr+aKSPRwZgKd2z11x0EgLvb1PURmUrn9QNRXFqje0Ldq454PfAVyaJYyrDvvIKSFP4NnBog==
+"@eslint/eslintrc@^0.4.3":
+ version "0.4.3"
+ resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-0.4.3.tgz#9e42981ef035beb3dd49add17acb96e8ff6f394c"
+ integrity sha512-J6KFFz5QCYUJq3pf0mjEcCJVERbzv71PUIDczuh9JkwGEzced6CO5ADLHB1rbf/+oPBtoPfMYNOpGDzCANlbXw==
dependencies:
ajv "^6.12.4"
debug "^4.1.1"
espree "^7.3.0"
- globals "^12.1.0"
+ globals "^13.9.0"
ignore "^4.0.6"
import-fresh "^3.2.1"
js-yaml "^3.13.1"
minimatch "^3.0.4"
strip-json-comments "^3.1.1"
+"@humanwhocodes/config-array@^0.5.0":
+ version "0.5.0"
+ resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.5.0.tgz#1407967d4c6eecd7388f83acf1eaf4d0c6e58ef9"
+ integrity sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg==
+ dependencies:
+ "@humanwhocodes/object-schema" "^1.2.0"
+ debug "^4.1.1"
+ minimatch "^3.0.4"
+
+"@humanwhocodes/object-schema@^1.2.0":
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-1.2.0.tgz#87de7af9c231826fdd68ac7258f77c429e0e5fcf"
+ integrity sha512-wdppn25U8z/2yiaT6YGquE6X8sSv7hNMWSXYSSU1jGv/yd6XqjXgTDJ8KP4NgjTXfJ3GbRjeeb8RTV7a/VpM+w==
+
"@mrmlnc/readdir-enhanced@^2.2.1":
version "2.2.1"
resolved "https://registry.yarnpkg.com/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz#524af240d1a360527b730475ecfa1344aa540dde"
@@ -552,18 +573,18 @@
call-me-maybe "^1.0.1"
glob-to-regexp "^0.3.0"
-"@nodelib/fs.scandir@2.1.4":
- version "2.1.4"
- resolved "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.4.tgz"
- integrity sha512-33g3pMJk3bg5nXbL/+CY6I2eJDzZAni49PfJnL5fghPTggPvBd/pFNSgJsdAgWptuFu7qq/ERvOYFlhvsLTCKA==
+"@nodelib/fs.scandir@2.1.5":
+ version "2.1.5"
+ resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5"
+ integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==
dependencies:
- "@nodelib/fs.stat" "2.0.4"
+ "@nodelib/fs.stat" "2.0.5"
run-parallel "^1.1.9"
-"@nodelib/fs.stat@2.0.4", "@nodelib/fs.stat@^2.0.2":
- version "2.0.4"
- resolved "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.4.tgz"
- integrity sha512-IYlHJA0clt2+Vg7bccq+TzRdJvv19c2INqBSsoOLp1je7xjtr7J26+WXR72MCdvU9q1qTzIWDfhMf+DRvQJK4Q==
+"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2":
+ version "2.0.5"
+ resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b"
+ integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==
"@nodelib/fs.stat@^1.1.2":
version "1.1.3"
@@ -571,11 +592,11 @@
integrity sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw==
"@nodelib/fs.walk@^1.2.3":
- version "1.2.6"
- resolved "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.6.tgz"
- integrity sha512-8Broas6vTtW4GIXTAHDoE32hnN2M5ykgCpWGbuXHQ15vEMqr23pB76e/GZcYsZCHALv50ktd24qhEyKr6wBtow==
+ version "1.2.8"
+ resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a"
+ integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==
dependencies:
- "@nodelib/fs.scandir" "2.1.4"
+ "@nodelib/fs.scandir" "2.1.5"
fastq "^1.6.0"
"@octokit/auth-token@^2.4.0":
@@ -586,18 +607,18 @@
"@octokit/types" "^6.0.3"
"@octokit/endpoint@^6.0.1":
- version "6.0.11"
- resolved "https://registry.yarnpkg.com/@octokit/endpoint/-/endpoint-6.0.11.tgz#082adc2aebca6dcefa1fb383f5efb3ed081949d1"
- integrity sha512-fUIPpx+pZyoLW4GCs3yMnlj2LfoXTWDUVPTC4V3MUEKZm48W+XYpeWSZCv+vYF1ZABUm2CqnDVf1sFtIYrj7KQ==
+ version "6.0.12"
+ resolved "https://registry.yarnpkg.com/@octokit/endpoint/-/endpoint-6.0.12.tgz#3b4d47a4b0e79b1027fb8d75d4221928b2d05658"
+ integrity sha512-lF3puPwkQWGfkMClXb4k/eUT/nZKQfxinRWJrdZaJO85Dqwo/G0yOC434Jr2ojwafWJMYqFGFa5ms4jJUgujdA==
dependencies:
"@octokit/types" "^6.0.3"
is-plain-object "^5.0.0"
universal-user-agent "^6.0.0"
-"@octokit/openapi-types@^6.0.0":
- version "6.0.0"
- resolved "https://registry.yarnpkg.com/@octokit/openapi-types/-/openapi-types-6.0.0.tgz#7da8d7d5a72d3282c1a3ff9f951c8133a707480d"
- integrity sha512-CnDdK7ivHkBtJYzWzZm7gEkanA7gKH6a09Eguz7flHw//GacPJLmkHA3f3N++MJmlxD1Fl+mB7B32EEpSCwztQ==
+"@octokit/openapi-types@^9.5.0":
+ version "9.7.0"
+ resolved "https://registry.yarnpkg.com/@octokit/openapi-types/-/openapi-types-9.7.0.tgz#9897cdefd629cd88af67b8dbe2e5fb19c63426b2"
+ integrity sha512-TUJ16DJU8mekne6+KVcMV5g6g/rJlrnIKn7aALG9QrNpnEipFc1xjoarh0PKaAWf2Hf+HwthRKYt+9mCm5RsRg==
"@octokit/plugin-paginate-rest@^1.1.1":
version "1.1.2"
@@ -607,9 +628,9 @@
"@octokit/types" "^2.0.1"
"@octokit/plugin-request-log@^1.0.0":
- version "1.0.3"
- resolved "https://registry.yarnpkg.com/@octokit/plugin-request-log/-/plugin-request-log-1.0.3.tgz#70a62be213e1edc04bb8897ee48c311482f9700d"
- integrity sha512-4RFU4li238jMJAzLgAwkBAw+4Loile5haQMQr+uhFq27BmyJXcXSKvoQKqh0agsZEiUlW6iSv3FAgvmGkur7OQ==
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/@octokit/plugin-request-log/-/plugin-request-log-1.0.4.tgz#5e50ed7083a613816b1e4a28aeec5fb7f1462e85"
+ integrity sha512-mLUsMkgP7K/cnFEw07kWqXGF5LKrOkD+lhCrKvPHXWDywAwuDUeDwWBpc69XK3pNX0uKiVt8g5z96PJ6z9xCFA==
"@octokit/plugin-rest-endpoint-methods@2.4.0":
version "2.4.0"
@@ -628,23 +649,23 @@
deprecation "^2.0.0"
once "^1.4.0"
-"@octokit/request-error@^2.0.0":
- version "2.0.5"
- resolved "https://registry.yarnpkg.com/@octokit/request-error/-/request-error-2.0.5.tgz#72cc91edc870281ad583a42619256b380c600143"
- integrity sha512-T/2wcCFyM7SkXzNoyVNWjyVlUwBvW3igM3Btr/eKYiPmucXTtkxt2RBsf6gn3LTzaLSLTQtNmvg+dGsOxQrjZg==
+"@octokit/request-error@^2.1.0":
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/@octokit/request-error/-/request-error-2.1.0.tgz#9e150357831bfc788d13a4fd4b1913d60c74d677"
+ integrity sha512-1VIvgXxs9WHSjicsRwq8PlR2LR2x6DwsJAaFgzdi0JfJoGSO8mYI/cHJQ+9FbN21aa+DrgNLnwObmyeSC8Rmpg==
dependencies:
"@octokit/types" "^6.0.3"
deprecation "^2.0.0"
once "^1.4.0"
"@octokit/request@^5.2.0":
- version "5.4.15"
- resolved "https://registry.yarnpkg.com/@octokit/request/-/request-5.4.15.tgz#829da413dc7dd3aa5e2cdbb1c7d0ebe1f146a128"
- integrity sha512-6UnZfZzLwNhdLRreOtTkT9n57ZwulCve8q3IT/Z477vThu6snfdkBuhxnChpOKNGxcQ71ow561Qoa6uqLdPtag==
+ version "5.6.1"
+ resolved "https://registry.yarnpkg.com/@octokit/request/-/request-5.6.1.tgz#f97aff075c37ab1d427c49082fefeef0dba2d8ce"
+ integrity sha512-Ls2cfs1OfXaOKzkcxnqw5MR6drMA/zWX/LIS/p8Yjdz7QKTPQLMsB3R+OvoxE6XnXeXEE2X7xe4G4l4X0gRiKQ==
dependencies:
"@octokit/endpoint" "^6.0.1"
- "@octokit/request-error" "^2.0.0"
- "@octokit/types" "^6.7.1"
+ "@octokit/request-error" "^2.1.0"
+ "@octokit/types" "^6.16.1"
is-plain-object "^5.0.0"
node-fetch "^2.6.1"
universal-user-agent "^6.0.0"
@@ -678,12 +699,12 @@
dependencies:
"@types/node" ">= 8"
-"@octokit/types@^6.0.3", "@octokit/types@^6.7.1":
- version "6.13.0"
- resolved "https://registry.yarnpkg.com/@octokit/types/-/types-6.13.0.tgz#779e5b7566c8dde68f2f6273861dd2f0409480d0"
- integrity sha512-W2J9qlVIU11jMwKHUp5/rbVUeErqelCsO5vW5PKNb7wAXQVUz87Rc+imjlEvpvbH8yUb+KHmv8NEjVZdsdpyxA==
+"@octokit/types@^6.0.3", "@octokit/types@^6.16.1":
+ version "6.25.0"
+ resolved "https://registry.yarnpkg.com/@octokit/types/-/types-6.25.0.tgz#c8e37e69dbe7ce55ed98ee63f75054e7e808bf1a"
+ integrity sha512-bNvyQKfngvAd/08COlYIN54nRgxskmejgywodizQNyiKoXmWRAjKup2/LYwm+T9V0gsKH6tuld1gM0PzmOiB4Q==
dependencies:
- "@octokit/openapi-types" "^6.0.0"
+ "@octokit/openapi-types" "^9.5.0"
"@polymer/esm-amd-loader@^1.0.0":
version "1.0.4"
@@ -702,27 +723,27 @@
"@protobufjs/aspromise@^1.1.1", "@protobufjs/aspromise@^1.1.2":
version "1.1.2"
- resolved "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz"
+ resolved "https://registry.yarnpkg.com/@protobufjs/aspromise/-/aspromise-1.1.2.tgz#9b8b0cc663d669a7d8f6f5d0893a14d348f30fbf"
integrity sha1-m4sMxmPWaafY9vXQiToU00jzD78=
"@protobufjs/base64@^1.1.2":
version "1.1.2"
- resolved "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz"
+ resolved "https://registry.yarnpkg.com/@protobufjs/base64/-/base64-1.1.2.tgz#4c85730e59b9a1f1f349047dbf24296034bb2735"
integrity sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==
"@protobufjs/codegen@^2.0.4":
version "2.0.4"
- resolved "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz"
+ resolved "https://registry.yarnpkg.com/@protobufjs/codegen/-/codegen-2.0.4.tgz#7ef37f0d010fb028ad1ad59722e506d9262815cb"
integrity sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==
"@protobufjs/eventemitter@^1.1.0":
version "1.1.0"
- resolved "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz"
+ resolved "https://registry.yarnpkg.com/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz#355cbc98bafad5978f9ed095f397621f1d066b70"
integrity sha1-NVy8mLr61ZePntCV85diHx0Ga3A=
"@protobufjs/fetch@^1.1.0":
version "1.1.0"
- resolved "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz"
+ resolved "https://registry.yarnpkg.com/@protobufjs/fetch/-/fetch-1.1.0.tgz#ba99fb598614af65700c1619ff06d454b0d84c45"
integrity sha1-upn7WYYUr2VwDBYZ/wbUVLDYTEU=
dependencies:
"@protobufjs/aspromise" "^1.1.1"
@@ -730,71 +751,71 @@
"@protobufjs/float@^1.0.2":
version "1.0.2"
- resolved "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz"
+ resolved "https://registry.yarnpkg.com/@protobufjs/float/-/float-1.0.2.tgz#5e9e1abdcb73fc0a7cb8b291df78c8cbd97b87d1"
integrity sha1-Xp4avctz/Ap8uLKR33jIy9l7h9E=
"@protobufjs/inquire@^1.1.0":
version "1.1.0"
- resolved "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz"
+ resolved "https://registry.yarnpkg.com/@protobufjs/inquire/-/inquire-1.1.0.tgz#ff200e3e7cf2429e2dcafc1140828e8cc638f089"
integrity sha1-/yAOPnzyQp4tyvwRQIKOjMY48Ik=
"@protobufjs/path@^1.1.2":
version "1.1.2"
- resolved "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz"
+ resolved "https://registry.yarnpkg.com/@protobufjs/path/-/path-1.1.2.tgz#6cc2b20c5c9ad6ad0dccfd21ca7673d8d7fbf68d"
integrity sha1-bMKyDFya1q0NzP0hynZz2Nf79o0=
"@protobufjs/pool@^1.1.0":
version "1.1.0"
- resolved "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz"
+ resolved "https://registry.yarnpkg.com/@protobufjs/pool/-/pool-1.1.0.tgz#09fd15f2d6d3abfa9b65bc366506d6ad7846ff54"
integrity sha1-Cf0V8tbTq/qbZbw2ZQbWrXhG/1Q=
"@protobufjs/utf8@^1.1.0":
version "1.1.0"
- resolved "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz"
+ resolved "https://registry.yarnpkg.com/@protobufjs/utf8/-/utf8-1.1.0.tgz#a777360b5b39a1a2e5106f8e858f2fd2d060c570"
integrity sha1-p3c2C1s5oaLlEG+OhY8v0tBgxXA=
"@sindresorhus/is@^0.14.0":
version "0.14.0"
- resolved "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz"
+ resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-0.14.0.tgz#9fb3a3cf3132328151f353de4632e01e52102bea"
integrity sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==
"@sindresorhus/is@^4.0.0":
- version "4.0.0"
- resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-4.0.0.tgz#2ff674e9611b45b528896d820d3d7a812de2f0e4"
- integrity sha512-FyD2meJpDPjyNQejSjvnhpgI/azsQkA4lGbuu5BQZfjvJ9cbRZXzeWL2HceCekW4lixO9JPesIIQkSoLjeJHNQ==
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-4.0.1.tgz#d26729db850fa327b7cacc5522252194404226f5"
+ integrity sha512-Qm9hBEBu18wt1PO2flE7LPb30BHMQt1eQgbV76YntdNk73XZGpn3izvGTYxbGgzXKgbCjiia0uxTd3aTNQrY/g==
"@szmarczak/http-timer@^1.1.2":
version "1.1.2"
- resolved "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-1.1.2.tgz"
+ resolved "https://registry.yarnpkg.com/@szmarczak/http-timer/-/http-timer-1.1.2.tgz#b1665e2c461a2cd92f4c1bbf50d5454de0d4b421"
integrity sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==
dependencies:
defer-to-connect "^1.0.1"
"@szmarczak/http-timer@^4.0.5":
- version "4.0.5"
- resolved "https://registry.yarnpkg.com/@szmarczak/http-timer/-/http-timer-4.0.5.tgz#bfbd50211e9dfa51ba07da58a14cdfd333205152"
- integrity sha512-PyRA9sm1Yayuj5OIoJ1hGt2YISX45w9WcFbh6ddT0Z/0yaFxOtGLInr4jUfU1EAFVs0Yfyfev4RNwBlUaHdlDQ==
+ version "4.0.6"
+ resolved "https://registry.yarnpkg.com/@szmarczak/http-timer/-/http-timer-4.0.6.tgz#b4a914bb62e7c272d4e5989fe4440f812ab1d807"
+ integrity sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==
dependencies:
defer-to-connect "^2.0.0"
"@types/babel-generator@^6.25.1":
- version "6.25.3"
- resolved "https://registry.yarnpkg.com/@types/babel-generator/-/babel-generator-6.25.3.tgz#8f06caa12d0595a0538560abe771966d77d29286"
- integrity sha512-pGgnuxVddKcYIc+VJkRDop7gxLhqclNKBdlsm/5Vp8d+37pQkkDK7fef8d9YYImRzw9xcojEPc18pUYnbxmjqA==
+ version "6.25.4"
+ resolved "https://registry.yarnpkg.com/@types/babel-generator/-/babel-generator-6.25.4.tgz#74eacdaa4822c4c6923e68c541144a04415ad8a1"
+ integrity sha512-Rnsen+ckop5mbl9d43bempS7i9wdTN1vytiTlmQla/YiNm6kH8kEVABVSXmp1UbnpkUV44nUCPeDQoa+Mu7ALA==
dependencies:
"@types/babel-types" "*"
"@types/babel-traverse@^6.25.2", "@types/babel-traverse@^6.25.3":
- version "6.25.5"
- resolved "https://registry.yarnpkg.com/@types/babel-traverse/-/babel-traverse-6.25.5.tgz#6d293cf7523e48b524faa7b86dc3c488191484e5"
- integrity sha512-WrMbwmu+MWf8FiUMbmVOGkc7bHPzndUafn1CivMaBHthBBoo0VNIcYk1KV71UovYguhsNOwf3UF5oRmkkGOU3w==
+ version "6.25.7"
+ resolved "https://registry.yarnpkg.com/@types/babel-traverse/-/babel-traverse-6.25.7.tgz#bc75fce23d8394534562a36a32dec94a54d11835"
+ integrity sha512-BeQiEGLnVzypzBdsexEpZAHUx+WucOMXW6srEWDkl4SegBlaCy+iBvRO+4vz6EZ+BNQg22G4MCdDdvZxf+jW5A==
dependencies:
"@types/babel-types" "*"
"@types/babel-types@*":
- version "7.0.9"
- resolved "https://registry.yarnpkg.com/@types/babel-types/-/babel-types-7.0.9.tgz#01d7b86949f455402a94c788883fe4ba574cad41"
- integrity sha512-qZLoYeXSTgQuK1h7QQS16hqLGdmqtRmN8w/rl3Au/l5x/zkHx+a4VHrHyBsi1I1vtK2oBHxSzKIu0R5p6spdOA==
+ version "7.0.11"
+ resolved "https://registry.yarnpkg.com/@types/babel-types/-/babel-types-7.0.11.tgz#263b113fa396fac4373188d73225297fb86f19a9"
+ integrity sha512-pkPtJUUY+Vwv6B1inAz55rQvivClHJxc9aVEPPmaq2cbyeMLCiDpbKpcKyX4LAwpNGi+SHBv0tHv6+0gXv0P2A==
"@types/babel-types@^6.25.1":
version "6.25.2"
@@ -802,29 +823,29 @@
integrity sha512-+3bMuktcY4a70a0KZc8aPJlEOArPuAKQYHU5ErjkOqGJdx8xuEEVK6nWogqigBOJ8nKPxRpyCUDTCPmZ3bUxGA==
"@types/babylon@^6.16.2":
- version "6.16.5"
- resolved "https://registry.yarnpkg.com/@types/babylon/-/babylon-6.16.5.tgz#1c5641db69eb8cdf378edd25b4be7754beeb48b4"
- integrity sha512-xH2e58elpj1X4ynnKp9qSnWlsRTIs6n3tgLGNfwAGHwePw0mulHQllV34n0T25uYSu1k0hRKkWXF890B1yS47w==
+ version "6.16.6"
+ resolved "https://registry.yarnpkg.com/@types/babylon/-/babylon-6.16.6.tgz#a1e7e01567b26a5ebad321a74d10299189d8d932"
+ integrity sha512-G4yqdVlhr6YhzLXFKy5F7HtRBU8Y23+iWy7UKthMq/OSQnL1hbsoeXESQ2LY8zEDlknipDG3nRGhUC9tkwvy/w==
dependencies:
"@types/babel-types" "*"
"@types/bluebird@*":
- version "3.5.33"
- resolved "https://registry.yarnpkg.com/@types/bluebird/-/bluebird-3.5.33.tgz#d79c020f283bd50bd76101d7d300313c107325fc"
- integrity sha512-ndEo1xvnYeHxm7I/5sF6tBvnsA4Tdi3zj1keRKRs12SP+2ye2A27NDJ1B6PqkfMbGAcT+mqQVqbZRIrhfOp5PQ==
+ version "3.5.36"
+ resolved "https://registry.yarnpkg.com/@types/bluebird/-/bluebird-3.5.36.tgz#00d9301d4dc35c2f6465a8aec634bb533674c652"
+ integrity sha512-HBNx4lhkxN7bx6P0++W8E289foSu8kO8GCk2unhuVggO+cE7rh9DhZUyPhUxNRG9m+5B5BTKxZQ5ZP92x/mx9Q==
"@types/body-parser@*":
- version "1.19.0"
- resolved "https://registry.yarnpkg.com/@types/body-parser/-/body-parser-1.19.0.tgz#0685b3c47eb3006ffed117cdd55164b61f80538f"
- integrity sha512-W98JrE0j2K78swW4ukqMleo8R7h/pFETjM2DQ90MF6XK2i4LO4W3gQ71Lt4w3bfm2EvVSyWHplECvB5sK22yFQ==
+ version "1.19.1"
+ resolved "https://registry.yarnpkg.com/@types/body-parser/-/body-parser-1.19.1.tgz#0c0174c42a7d017b818303d4b5d969cb0b75929c"
+ integrity sha512-a6bTJ21vFOGIkwM0kzh9Yr89ziVxq4vYH2fQ6N8AeipEzai/cFK6aGMArIkUeIdRIgpwQa+2bXiLuUJCpSf2Cg==
dependencies:
"@types/connect" "*"
"@types/node" "*"
"@types/cacheable-request@^6.0.1":
- version "6.0.1"
- resolved "https://registry.yarnpkg.com/@types/cacheable-request/-/cacheable-request-6.0.1.tgz#5d22f3dded1fd3a84c0bbeb5039a7419c2c91976"
- integrity sha512-ykFq2zmBGOCbpIXtoVbz4SKY5QriWPh3AjyU4G74RYbtt5yOc5OfaY75ftjg7mikMOla1CTGpX3lLbuJh8DTrQ==
+ version "6.0.2"
+ resolved "https://registry.yarnpkg.com/@types/cacheable-request/-/cacheable-request-6.0.2.tgz#c324da0197de0a98a2312156536ae262429ff6b9"
+ integrity sha512-B3xVo+dlKM6nnKTcmm5ZtY/OL8bOAOd2Olee9M1zft65ox50OzjEHW91sDiU9j6cvW8Ejg1/Qkf4xd2kugApUA==
dependencies:
"@types/http-cache-semantics" "*"
"@types/keyv" "*"
@@ -839,9 +860,9 @@
"@types/chai" "*"
"@types/chai@*":
- version "4.2.16"
- resolved "https://registry.yarnpkg.com/@types/chai/-/chai-4.2.16.tgz#f09cc36e18d28274f942e7201147cce34d97e8c8"
- integrity sha512-vI5iOAsez9+roLS3M3+Xx7w+WRuDtSmF8bQkrbcIJ2sC1PcDgVoA0WGpa+bIrJ+y8zqY2oi//fUctkxtIcXJCw==
+ version "4.2.21"
+ resolved "https://registry.yarnpkg.com/@types/chai/-/chai-4.2.21.tgz#9f35a5643129df132cf3b5c1ec64046ea1af0650"
+ integrity sha512-yd+9qKmJxm496BOV9CMNaey8TWsikaZOwMRwPHQIjcOJM9oV+fi9ZMNw3JsVnbEEbo2gRTDnGEBv8pjyn67hNg==
"@types/chalk@^0.4.30":
version "0.4.31"
@@ -856,9 +877,9 @@
chalk "*"
"@types/clean-css@*":
- version "4.2.4"
- resolved "https://registry.yarnpkg.com/@types/clean-css/-/clean-css-4.2.4.tgz#4fe4705c384e6ec9ee8454bc3d49089f38dc038a"
- integrity sha512-x8xEbfTtcv5uyQDrBXKg9Beo5QhTPqO4vM0uq4iU27/nhyRRWNEMKHjxvAb0WDvp2Mnt4Sw0jKmIi5yQF/k2Ag==
+ version "4.2.5"
+ resolved "https://registry.yarnpkg.com/@types/clean-css/-/clean-css-4.2.5.tgz#69ce62cc13557c90ca40460133f672dc52ceaf89"
+ integrity sha512-NEzjkGGpbs9S9fgC4abuBvTpVwE3i+Acu9BBod3PUyjDVZcNsGx61b8r2PphR61QGPnn0JHVs5ey6/I4eTrkxw==
dependencies:
"@types/node" "*"
source-map "^0.6.0"
@@ -876,21 +897,21 @@
"@types/express" "*"
"@types/connect@*":
- version "3.4.34"
- resolved "https://registry.yarnpkg.com/@types/connect/-/connect-3.4.34.tgz#170a40223a6d666006d93ca128af2beb1d9b1901"
- integrity sha512-ePPA/JuI+X0vb+gSWlPKOY0NdNAie/rPUqX2GUPpbZwiKTkSPhjXWuee47E4MtE54QVzGCQMQkAL6JhV2E1+cQ==
+ version "3.4.35"
+ resolved "https://registry.yarnpkg.com/@types/connect/-/connect-3.4.35.tgz#5fcf6ae445e4021d1fc2219a4873cc73a3bb2ad1"
+ integrity sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==
dependencies:
"@types/node" "*"
"@types/content-type@^1.1.0":
- version "1.1.3"
- resolved "https://registry.yarnpkg.com/@types/content-type/-/content-type-1.1.3.tgz#3688bd77fc12f935548eef102a4e34c512b03a07"
- integrity sha512-pv8VcFrZ3fN93L4rTNIbbUzdkzjEyVMp5mPVjsFfOYTDOZMZiZ8P1dhu+kEv3faYyKzZgLlSvnyQNFg+p/v5ug==
+ version "1.1.5"
+ resolved "https://registry.yarnpkg.com/@types/content-type/-/content-type-1.1.5.tgz#aa02dca40864749a9e2bf0161a6216da57e3ede5"
+ integrity sha512-dgMN+syt1xb7Hk8LU6AODOfPlvz5z1CbXpPuJE5ZrX9STfBOIXF09pEB8N7a97WT9dbngt3ksDCm6GW6yMrxfQ==
"@types/cssbeautify@^0.3.1":
- version "0.3.1"
- resolved "https://registry.yarnpkg.com/@types/cssbeautify/-/cssbeautify-0.3.1.tgz#8e0bee8f7decb952250da0caebe05e30591c17ef"
- integrity sha1-jgvuj33suVIlDaDK6+BeMFkcF+8=
+ version "0.3.2"
+ resolved "https://registry.yarnpkg.com/@types/cssbeautify/-/cssbeautify-0.3.2.tgz#8a76207cd980d3e7b29b4b6dea1f4ed861285615"
+ integrity sha512-b3PXlFAcS4gvGr2pDz0NoZEBo3MMQe8Ozy6+Mvm3XIEcHS4oQstvCnnCofBZD/0tQgxSzkYbW+cD3yD4yaKTxQ==
"@types/del@^3.0.0":
version "3.0.1"
@@ -910,9 +931,9 @@
integrity sha512-6dhZJLbA7aOwkYB2GDGdIqJ20wmHnkDzaxV9PJXe7O02I2dSFTERzRB6JrX6cWKaS+VqhhY7cQUMCbO5kloFUw==
"@types/estree@*":
- version "0.0.47"
- resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.47.tgz#d7a51db20f0650efec24cd04994f523d93172ed4"
- integrity sha512-c5ciR06jK8u9BstrmJyO97m+klJrrhCf9u3rLu3DEAJBirxRqSCvDQoYKmxuYwQI5SZChAWu+tq9oVlGRuzPAg==
+ version "0.0.50"
+ resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.50.tgz#1e0caa9364d3fccd2931c3ed96fdbeaa5d4cca83"
+ integrity sha512-C6N5s2ZFtuZRj54k2/zyRhNDjJwwcViAM3Nbm8zjBpbqAdZ00mr0CFxvSKeO8Y/e03WVFLpQMdHYVfUd6SB+Hw==
"@types/events@*":
version "3.0.0"
@@ -925,18 +946,18 @@
integrity sha512-Q5Vn3yjTDyCMV50TB6VRIbQNxSE4OmZR86VSbGaNpfUolm0iePBB4KdEEHmxoY5sT2+2DIvXW0rvMDP2nHZ4Mg==
"@types/express-serve-static-core@^4.17.18":
- version "4.17.19"
- resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.17.19.tgz#00acfc1632e729acac4f1530e9e16f6dd1508a1d"
- integrity sha512-DJOSHzX7pCiSElWaGR8kCprwibCB/3yW6vcT8VG3P0SJjnv19gnWG/AZMfM60Xj/YJIp/YCaDHyvzsFVeniARA==
+ version "4.17.24"
+ resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.17.24.tgz#ea41f93bf7e0d59cd5a76665068ed6aab6815c07"
+ integrity sha512-3UJuW+Qxhzwjq3xhwXm2onQcFHn76frIYVbTu+kn24LFxI+dEhdfISDFovPB8VpEgW8oQCTpRuCe+0zJxB7NEA==
dependencies:
"@types/node" "*"
"@types/qs" "*"
"@types/range-parser" "*"
"@types/express@*", "@types/express@^4.0.30", "@types/express@^4.0.36":
- version "4.17.11"
- resolved "https://registry.yarnpkg.com/@types/express/-/express-4.17.11.tgz#debe3caa6f8e5fcda96b47bd54e2f40c4ee59545"
- integrity sha512-no+R6rW60JEc59977wIxreQVsIEOAYwgCqldrA/vkpCnbD7MqTefO97lmoBe4WE0F156bC4uLSP1XHDOySnChg==
+ 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"
@@ -963,22 +984,22 @@
form-data "*"
"@types/freeport@^1.0.19":
- version "1.0.21"
- resolved "https://registry.yarnpkg.com/@types/freeport/-/freeport-1.0.21.tgz#73f6543ed67d3ca3fff97b985591598b7092066f"
- integrity sha1-c/ZUPtZ9PKP/+XuYVZFZi3CSBm8=
+ version "1.0.22"
+ resolved "https://registry.yarnpkg.com/@types/freeport/-/freeport-1.0.22.tgz#dbe627a20cb30c17c8aaaba09332e1d14cc2281f"
+ integrity sha512-UGg4s5PDPXZXkkrHarU1l6WDbULxN3g7xUEtdbNf9HQhU/JnCj1G1/xZHZmQjC0uWqN1LlB0R0xOlk3k5svgTQ==
"@types/glob-stream@*":
- version "6.1.0"
- resolved "https://registry.yarnpkg.com/@types/glob-stream/-/glob-stream-6.1.0.tgz#7ede8a33e59140534f8d8adfb8ac9edfb31897bc"
- integrity sha512-RHv6ZQjcTncXo3thYZrsbAVwoy4vSKosSWhuhuQxLOTv74OJuFQxXkmUuZCr3q9uNBEVCvIzmZL/FeRNbHZGUg==
+ version "6.1.1"
+ resolved "https://registry.yarnpkg.com/@types/glob-stream/-/glob-stream-6.1.1.tgz#c792d8d1514278ff03cad5689aba4c4ab4fbc805"
+ integrity sha512-AGOUTsTdbPkRS0qDeyeS+6KypmfVpbT5j23SN8UPG63qjKXNKjXn6V9wZUr8Fin0m9l8oGYaPK8b2WUMF8xI1A==
dependencies:
"@types/glob" "*"
"@types/node" "*"
"@types/glob@*", "@types/glob@^7.1.1":
- version "7.1.3"
- resolved "https://registry.yarnpkg.com/@types/glob/-/glob-7.1.3.tgz#e6ba80f36b7daad2c685acd9266382e68985c183"
- integrity sha512-SEYeGAIQIQX8NN6LDKprLjbrd5dARM5EXsd8GI/A5l0apYI1fGMWgPHSe4ZKL4eozlAyI+doUE9XbYS4xCkQ1w==
+ version "7.1.4"
+ resolved "https://registry.yarnpkg.com/@types/glob/-/glob-7.1.4.tgz#ea59e21d2ee5c517914cb4bc8e4153b99e566672"
+ integrity sha512-w+LsMxKyYQm347Otw+IfBXOv9UWVjpHpCDdbBMt8Kz/xbvCYNjP+0qPh91Km3iKfSRLBB0P7fAMf0KHrPu+MyA==
dependencies:
"@types/minimatch" "*"
"@types/node" "*"
@@ -1008,14 +1029,14 @@
"@types/uglify-js" "*"
"@types/http-cache-semantics@*":
- version "4.0.0"
- resolved "https://registry.yarnpkg.com/@types/http-cache-semantics/-/http-cache-semantics-4.0.0.tgz#9140779736aa2655635ee756e2467d787cfe8a2a"
- integrity sha512-c3Xy026kOF7QOTn00hbIllV1dLR9hG9NkSrLQgCVs8NF6sBU+VGWjD3wLPhmh1TYAc7ugCFsvHYMN4VcBN1U1A==
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/@types/http-cache-semantics/-/http-cache-semantics-4.0.1.tgz#0ea7b61496902b95890dc4c3a116b60cb8dae812"
+ integrity sha512-SZs7ekbP8CN0txVG2xVRH6EgKmEm31BOxA07vkFaETzZz1xh+cbt8BcI0slpymvwhx5dlFnQG2rTlPVQn+iRPQ==
"@types/inquirer@*":
- version "7.3.1"
- resolved "https://registry.yarnpkg.com/@types/inquirer/-/inquirer-7.3.1.tgz#1f231224e7df11ccfaf4cf9acbcc3b935fea292d"
- integrity sha512-osD38QVIfcdgsPCT0V3lD7eH0OFurX71Jft18bZrsVQWVRt6TuxRzlr0GJLrxoHZR2V5ph7/qP8se/dcnI7o0g==
+ version "7.3.3"
+ resolved "https://registry.yarnpkg.com/@types/inquirer/-/inquirer-7.3.3.tgz#92e6676efb67fa6925c69a2ee638f67a822952ac"
+ integrity sha512-HhxyLejTHMfohAuhRun4csWigAMjXTmRyiJTU1Y/I1xmggikFMkOUoMQRlFm+zQcPEGHSs3io/0FAmNZf8EymQ==
dependencies:
"@types/through" "*"
rxjs "^6.4.0"
@@ -1033,11 +1054,6 @@
resolved "https://registry.yarnpkg.com/@types/is-windows/-/is-windows-0.2.0.tgz#6f24ee48731d31168ea510610d6dd15e5fc9c6ff"
integrity sha1-byTuSHMdMRaOpRBhDW3RXl/Jxv8=
-"@types/json-schema@^7.0.3":
- version "7.0.7"
- resolved "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.7.tgz"
- integrity sha512-cxWFQVseBm6O9Gbw1IWb8r6OS4OhSt3hPZLkFApLjM8TEXROBuQGLAH2i2gZpcXdLBIrpXuTDhH7Vbm1iXmNGA==
-
"@types/json-schema@^7.0.7":
version "7.0.9"
resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.9.tgz#97edc9037ea0c38585320b28964dde3b39e4660d"
@@ -1045,24 +1061,24 @@
"@types/json5@^0.0.29":
version "0.0.29"
- resolved "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz"
+ resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee"
integrity sha1-7ihweulOEdK4J7y+UnC86n8+ce4=
"@types/keyv@*":
- version "3.1.1"
- resolved "https://registry.yarnpkg.com/@types/keyv/-/keyv-3.1.1.tgz#e45a45324fca9dab716ab1230ee249c9fb52cfa7"
- integrity sha512-MPtoySlAZQ37VoLaPcTHCu1RWJ4llDkULYZIzOYxlhxBqYPB0RsRlmMU0R6tahtFe27mIdkHV+551ZWV4PLmVw==
+ version "3.1.2"
+ resolved "https://registry.yarnpkg.com/@types/keyv/-/keyv-3.1.2.tgz#5d97bb65526c20b6e0845f6b0d2ade4f28604ee5"
+ integrity sha512-/FvAK2p4jQOaJ6CGDHJTqZcUtbZe820qIeTg7o0Shg7drB4JHeL+V/dhSaly7NXx6u8eSee+r7coT+yuJEvDLg==
dependencies:
"@types/node" "*"
"@types/launchpad@^0.6.0":
- version "0.6.0"
- resolved "https://registry.yarnpkg.com/@types/launchpad/-/launchpad-0.6.0.tgz#37296109b7f277f6e6c5fd7e0c0706bc918fbb51"
- integrity sha1-NylhCbfyd/bmxf1+DAcGvJGPu1E=
+ version "0.6.1"
+ resolved "https://registry.yarnpkg.com/@types/launchpad/-/launchpad-0.6.1.tgz#9a5f285128598f5e0cb4a5db3e458e1b7cf07f35"
+ integrity sha512-kQ1a7PwzJelwwOIw1SABmW5OsbCRPvdjps0J84MahGsEKzN89StrPyrWCMWfwpONR3ZqSxDeblxS+8WznIBEGw==
"@types/long@^4.0.0":
version "4.0.1"
- resolved "https://registry.npmjs.org/@types/long/-/long-4.0.1.tgz"
+ resolved "https://registry.yarnpkg.com/@types/long/-/long-4.0.1.tgz#459c65fa1867dafe6a8f322c4c51695663cc55e9"
integrity sha512-5tXH6Bx/kNGd3MgffdmP4dy2Z+G4eaXw0SE81Tq3BNadtnMR5/ySMzX4SLEzHJzSmPNn4HIdpQsBvXMUykr58w==
"@types/merge-stream@^1.0.28":
@@ -1083,9 +1099,9 @@
integrity sha512-Jus9s4CDbqwocc5pOAnh8ShfrnMcPHuJYzVcSUU7lrh8Ni5HuIqX3oilL86p3dlTrk0LzHRCgA/GQ7uNCw6l2Q==
"@types/minimatch@*", "@types/minimatch@^3.0.1", "@types/minimatch@^3.0.3":
- version "3.0.4"
- resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.4.tgz#f0ec25dbf2f0e4b18647313ac031134ca5b24b21"
- integrity sha512-1z8k4wzFnNjVK/tlxvrWuK5WMt6mydWWP7+zvH5eFep4oj+UkrfiJTRtjCeBXNpwaA/FYqqtb4/QS4ianFpIRA==
+ version "3.0.5"
+ resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.5.tgz#1001cc5e6a3704b83c236027e77f2f58ea010f40"
+ integrity sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==
"@types/minimatch@3.0.3":
version "3.0.3"
@@ -1093,9 +1109,9 @@
integrity sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==
"@types/minimist@^1.2.0":
- version "1.2.1"
- resolved "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.1.tgz"
- integrity sha512-fZQQafSREFyuZcdWFAExYjBiCL7AUCdgsk80iO0q4yihYYdcIiH28CcuPTGFgLOCC8RlW49GSQxdHwZP+I7CNg==
+ version "1.2.2"
+ resolved "https://registry.yarnpkg.com/@types/minimist/-/minimist-1.2.2.tgz#ee771e2ba4b3dc5b372935d549fd9617bf345b8c"
+ integrity sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ==
"@types/mz@0.0.29":
version "0.0.29"
@@ -1113,14 +1129,14 @@
"@types/node" "*"
"@types/node@*", "@types/node@>= 8":
- version "14.14.37"
- resolved "https://registry.yarnpkg.com/@types/node/-/node-14.14.37.tgz#a3dd8da4eb84a996c36e331df98d82abd76b516e"
- integrity sha512-XYmBiy+ohOR4Lh5jE379fV2IU+6Jn4g5qASinhitfyO71b/sCo6MKsMLF5tc7Zf2CE8hViVQyYSobJNke8OvUw==
+ version "16.7.2"
+ resolved "https://registry.yarnpkg.com/@types/node/-/node-16.7.2.tgz#0465a39b5456b61a04d98bd5545f8b34be340cb7"
+ integrity sha512-TbG4TOx9hng8FKxaVrCisdaxKxqEwJ3zwHoCWXZ0Jw6mnvTInpaB99/2Cy4+XxpXtjNv9/TgfGSvZFyfV/t8Fw==
"@types/node@^10.1.0":
- version "10.17.56"
- resolved "https://registry.npmjs.org/@types/node/-/node-10.17.56.tgz"
- integrity sha512-LuAa6t1t0Bfw4CuSR0UITsm1hP17YL+u82kfHGrHUWdhlBtH7sa7jGY5z7glGaIj/WDYDkRtgGd+KCjCzxBW1w==
+ version "10.17.60"
+ resolved "https://registry.yarnpkg.com/@types/node/-/node-10.17.60.tgz#35f3d6213daed95da7f0f73e75bcc6980e90597b"
+ integrity sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw==
"@types/node@^4.0.30":
version "4.9.5"
@@ -1128,9 +1144,9 @@
integrity sha512-+8fpgbXsbATKRF2ayAlYhPl2E9MPdLjrnK/79ZEpyPJ+k7dZwJm9YM8FK+l4rqL//xHk7PgQhGwz6aA2ckxbCQ==
"@types/normalize-package-data@^2.4.0":
- version "2.4.0"
- resolved "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.0.tgz"
- integrity sha512-f5j5b/Gf71L+dbqxIpQ4Z2WlmI/mPJ0fOkGGmFgtb6sAu97EPczzbS3/tJKxmcYDj55OX6ssqwDAWOHIYDRDGA==
+ version "2.4.1"
+ resolved "https://registry.yarnpkg.com/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz#d3357479a0fdfdd5907fe67e17e0a85c906e1301"
+ integrity sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==
"@types/opn@^3.0.28":
version "3.0.28"
@@ -1152,26 +1168,26 @@
integrity sha512-hfnXRGugz+McgX2jxyy5qz9sB21LRzlGn24zlwN2KEgoPtEvjzNRrLtUkOOebPDPZl3Rq7ywKxYvylVcEZDnEw==
"@types/pem@^1.8.1":
- version "1.9.5"
- resolved "https://registry.yarnpkg.com/@types/pem/-/pem-1.9.5.tgz#cd5548b5e0acb4b41a9e21067e9fcd8c57089c99"
- integrity sha512-C0txxEw8B7DCoD85Ko7SEvzUogNd5VDJ5/YBG8XUcacsOGqxr5Oo4g3OUAfdEDUbhXanwUoVh/ZkMFw77FGPQQ==
+ version "1.9.6"
+ resolved "https://registry.yarnpkg.com/@types/pem/-/pem-1.9.6.tgz#c3686832e935947fdd9d848dec3b8fe830068de7"
+ integrity sha512-IC67SxacM9fxEi/w7hf98dTun83OwUMeLMo1NS2gE0wdM9MHeg73iH/Pp9nB02OUCQ7Zb2UuKE/IpFCmQw9jxw==
dependencies:
"@types/node" "*"
"@types/qs@*":
- version "6.9.6"
- resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.6.tgz#df9c3c8b31a247ec315e6996566be3171df4b3b1"
- integrity sha512-0/HnwIfW4ki2D8L8c9GVcG5I72s9jP5GSLVF0VIXDW00kmIpA6O33G7a8n59Tmh7Nz0WUC3rSb7PTY/sdW2JzA==
+ 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.3"
- resolved "https://registry.yarnpkg.com/@types/range-parser/-/range-parser-1.2.3.tgz#7ee330ba7caafb98090bece86a5ee44115904c2c"
- integrity sha512-ewFXqrQHlFsgc09MK5jP5iR7vumV/BYayNC6PgJO2LPe8vrnNFyjQjSppfEngITi0qvfKtzFvgKymGheFM9UOA==
+ version "1.2.4"
+ resolved "https://registry.yarnpkg.com/@types/range-parser/-/range-parser-1.2.4.tgz#cd667bcfdd025213aafb7ca5915a932590acdcdc"
+ integrity sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==
"@types/relateurl@*":
- version "0.2.28"
- resolved "https://registry.yarnpkg.com/@types/relateurl/-/relateurl-0.2.28.tgz#6bda7db8653fa62643f5ee69e9f69c11a392e3a6"
- integrity sha1-a9p9uGU/piZD9e5p6facEaOS46Y=
+ version "0.2.29"
+ resolved "https://registry.yarnpkg.com/@types/relateurl/-/relateurl-0.2.29.tgz#68ccecec3d4ffdafb9c577fe764f912afc050fe6"
+ integrity sha512-QSvevZ+IRww2ldtfv1QskYsqVVVwCKQf1XbwtcyyoRvLIQzfyPhj/C+3+PKzSDRdiyejaiLgnq//XTkleorpLg==
"@types/request@2.0.3":
version "2.0.3"
@@ -1321,17 +1337,17 @@
integrity sha512-41qEJgBH/TWgo5NFSvBCJ1qkoi3Q6ONSF2avrHq1LVEZfYpdHmj0y9SuTK+u9ZhG1sYQKBL1AWXKyLWP4RaUoQ==
"@types/serve-static@*", "@types/serve-static@^1.7.31":
- version "1.13.9"
- resolved "https://registry.yarnpkg.com/@types/serve-static/-/serve-static-1.13.9.tgz#aacf28a85a05ee29a11fb7c3ead935ac56f33e4e"
- integrity sha512-ZFqF6qa48XsPdjXV5Gsz0Zqmux2PerNd3a/ktL45mHpa19cuMi/cL8tcxdAx497yRh+QtYPuofjT9oWw9P7nkA==
+ 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/spdy@^3.4.1":
- version "3.4.4"
- resolved "https://registry.yarnpkg.com/@types/spdy/-/spdy-3.4.4.tgz#3282fd4ad8c4603aa49f7017dd520a08a345b2bc"
- integrity sha512-N9LBlbVRRYq6HgYpPkqQc3a9HJ/iEtVZToW6xlTtJiMhmRJ7jJdV7TaZQJw/Ve/1ePUsQiCTDc4JMuzzag94GA==
+ version "3.4.5"
+ resolved "https://registry.yarnpkg.com/@types/spdy/-/spdy-3.4.5.tgz#194dc132312ddcd31e8053789ae83a7bb32a8aaf"
+ integrity sha512-/33fIRK/aqkKNxg9BSjpzt1ucmvPremgeDywm9z2C2mOlIh5Ljjvgc3UhQHqwXsSLDLHPT9jlsnrjKQ1XiVJzA==
dependencies:
"@types/node" "*"
@@ -1350,26 +1366,26 @@
"@types/node" "*"
"@types/ua-parser-js@^0.7.31":
- version "0.7.35"
- resolved "https://registry.yarnpkg.com/@types/ua-parser-js/-/ua-parser-js-0.7.35.tgz#cca67a95deb9165e4b1f449471801e6489d3fe93"
- integrity sha512-PsPx0RLbo2Un8+ff2buzYJnZjzwhD3jQHPOG2PtVIeOhkRDddMcKU8vJtHpzzfLB95dkUi0qAkfLg2l2Fd0yrQ==
+ version "0.7.36"
+ resolved "https://registry.yarnpkg.com/@types/ua-parser-js/-/ua-parser-js-0.7.36.tgz#9bd0b47f26b5a3151be21ba4ce9f5fa457c5f190"
+ integrity sha512-N1rW+njavs70y2cApeIw1vLMYXRwfBy+7trgavGuuTfOd7j1Yh7QTRc/yqsPl6ncokt72ZXuxEU0PiCp9bSwNQ==
"@types/uglify-js@*":
- version "3.13.0"
- resolved "https://registry.yarnpkg.com/@types/uglify-js/-/uglify-js-3.13.0.tgz#1cad8df1fb0b143c5aba08de5712ea9d1ff71124"
- integrity sha512-EGkrJD5Uy+Pg0NUR8uA4bJ5WMfljyad0G+784vLCNUkD+QwOJXUbBYExXfVGf7YtyzdQp3L/XMYcliB987kL5Q==
+ version "3.13.1"
+ resolved "https://registry.yarnpkg.com/@types/uglify-js/-/uglify-js-3.13.1.tgz#5e889e9e81e94245c75b6450600e1c5ea2878aea"
+ integrity sha512-O3MmRAk6ZuAKa9CHgg0Pr0+lUOqoMLpc9AS4R8ano2auvsg7IE8syF3Xh/NPr26TWklxYcqoEEFdzLLs1fV9PQ==
dependencies:
source-map "^0.6.1"
"@types/update-notifier@^1.0.0":
- version "1.0.3"
- resolved "https://registry.yarnpkg.com/@types/update-notifier/-/update-notifier-1.0.3.tgz#3c7ee1921af6f16149cdcaef356baf57d7a0b806"
- integrity sha512-BLStNhP2DFF7funARwTcoD6tetRte8NK3Sc59mn7GNALCN975jOlKX3dGvsFxXr/HwQMxxCuRn9IWB3WQ7odHQ==
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/@types/update-notifier/-/update-notifier-1.0.4.tgz#ce73d597bd399d5df4544fe136a79c2b9fe41958"
+ integrity sha512-smyU9GTDitojg87woCcLNCdPnUfNx4LHRBWf+aWmHsAgE1kaCDhhcu84W+dFymAKL1yKDsq2JFWKkR2K6WjJfw==
"@types/uuid@^3.4.3":
- version "3.4.9"
- resolved "https://registry.yarnpkg.com/@types/uuid/-/uuid-3.4.9.tgz#fcf01997bbc9f7c09ae5f91383af076d466594e1"
- integrity sha512-XDwyIlt/47l2kWLTzw/mtrpLdB+GPSskR2n/PIcPn+VYhVO77rGhRncIR5GPU0KRzXuqkDO+J5qqrG0Y8P6jzQ==
+ version "3.4.10"
+ resolved "https://registry.yarnpkg.com/@types/uuid/-/uuid-3.4.10.tgz#637d3c8431f112edf6728ac9bdfadfe029540f48"
+ integrity sha512-BgeaZuElf7DEYZhWYDTc/XcLZXdVgFkVSTa13BqKvbnmUrxr3TJFKofUxCtDO9UQOdhnV+HPOESdHiHKZOJV1A==
"@types/vinyl-fs@0.0.28":
version "0.0.28"
@@ -1381,18 +1397,18 @@
"@types/vinyl" "*"
"@types/vinyl-fs@^2.4.8":
- version "2.4.11"
- resolved "https://registry.yarnpkg.com/@types/vinyl-fs/-/vinyl-fs-2.4.11.tgz#b98119b8bb2494141eaf649b09fbfeb311161206"
- integrity sha512-2OzQSfIr9CqqWMGqmcERE6Hnd2KY3eBVtFaulVo3sJghplUcaeMdL9ZjEiljcQQeHjheWY9RlNmumjIAvsBNaA==
+ version "2.4.12"
+ resolved "https://registry.yarnpkg.com/@types/vinyl-fs/-/vinyl-fs-2.4.12.tgz#7b4673d9b4d5a874c8652d10f0f0265479014c8e"
+ integrity sha512-LgBpYIWuuGsihnlF+OOWWz4ovwCYlT03gd3DuLwex50cYZLmX3yrW+sFF9ndtmh7zcZpS6Ri47PrIu+fV+sbXw==
dependencies:
"@types/glob-stream" "*"
"@types/node" "*"
"@types/vinyl" "*"
"@types/vinyl@*", "@types/vinyl@^2.0.0":
- version "2.0.4"
- resolved "https://registry.yarnpkg.com/@types/vinyl/-/vinyl-2.0.4.tgz#9a7a8071c8d14d3a95d41ebe7135babe4ad5995a"
- integrity sha512-2o6a2ixaVI2EbwBPg1QYLGQoHK56p/8X/sGfKbFC8N6sY9lfjsMf/GprtkQkSya0D4uRiutRZ2BWj7k3JvLsAQ==
+ version "2.0.5"
+ resolved "https://registry.yarnpkg.com/@types/vinyl/-/vinyl-2.0.5.tgz#52d3b850a4ed494aaad51e96708834c500c8d5cd"
+ integrity sha512-1m6uReH8R/RuLVQGvTT/4LlWq67jZEUxp+FBHt0hYv2BT7TUwFbKI0wa7JZVEU/XtlcnX1QcTuZ36es4rGj7jg==
dependencies:
"@types/expect" "^1.20.4"
"@types/node" "*"
@@ -1417,133 +1433,73 @@
"@types/events" "*"
"@types/inquirer" "*"
-"@typescript-eslint/eslint-plugin@^4.2.0":
- version "4.21.0"
- resolved "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.21.0.tgz"
- integrity sha512-FPUyCPKZbVGexmbCFI3EQHzCZdy2/5f+jv6k2EDljGdXSRc0cKvbndd2nHZkSLqCNOPk0jB6lGzwIkglXcYVsQ==
+"@typescript-eslint/eslint-plugin@^4.2.0", "@typescript-eslint/eslint-plugin@^4.29.0":
+ version "4.29.3"
+ resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.29.3.tgz#95cb8029a8bd8bd9c7f4ab95074a7cb2115adefa"
+ integrity sha512-tBgfA3K/3TsZY46ROGvoRxQr1wBkclbVqRQep97MjVHJzcRBURRY3sNFqLk0/Xr//BY5hM9H2p/kp+6qim85SA==
dependencies:
- "@typescript-eslint/experimental-utils" "4.21.0"
- "@typescript-eslint/scope-manager" "4.21.0"
- debug "^4.1.1"
- functional-red-black-tree "^1.0.1"
- lodash "^4.17.15"
- regexpp "^3.0.0"
- semver "^7.3.2"
- tsutils "^3.17.1"
-
-"@typescript-eslint/eslint-plugin@^4.25.0":
- version "4.29.2"
- resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.29.2.tgz#f54dc0a32b8f61c6024ab8755da05363b733838d"
- integrity sha512-x4EMgn4BTfVd9+Z+r+6rmWxoAzBaapt4QFqE+d8L8sUtYZYLDTK6VG/y/SMMWA5t1/BVU5Kf+20rX4PtWzUYZg==
- dependencies:
- "@typescript-eslint/experimental-utils" "4.29.2"
- "@typescript-eslint/scope-manager" "4.29.2"
+ "@typescript-eslint/experimental-utils" "4.29.3"
+ "@typescript-eslint/scope-manager" "4.29.3"
debug "^4.3.1"
functional-red-black-tree "^1.0.1"
regexpp "^3.1.0"
semver "^7.3.5"
tsutils "^3.21.0"
-"@typescript-eslint/experimental-utils@4.21.0":
- version "4.21.0"
- resolved "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-4.21.0.tgz"
- integrity sha512-cEbgosW/tUFvKmkg3cU7LBoZhvUs+ZPVM9alb25XvR0dal4qHL3SiUqHNrzoWSxaXA9gsifrYrS1xdDV6w/gIA==
- dependencies:
- "@types/json-schema" "^7.0.3"
- "@typescript-eslint/scope-manager" "4.21.0"
- "@typescript-eslint/types" "4.21.0"
- "@typescript-eslint/typescript-estree" "4.21.0"
- eslint-scope "^5.0.0"
- eslint-utils "^2.0.0"
-
-"@typescript-eslint/experimental-utils@4.29.2":
- version "4.29.2"
- resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-4.29.2.tgz#5f67fb5c5757ef2cb3be64817468ba35c9d4e3b7"
- integrity sha512-P6mn4pqObhftBBPAv4GQtEK7Yos1fz/MlpT7+YjH9fTxZcALbiiPKuSIfYP/j13CeOjfq8/fr9Thr2glM9ub7A==
+"@typescript-eslint/experimental-utils@4.29.3":
+ version "4.29.3"
+ resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-4.29.3.tgz#52e437a689ccdef73e83c5106b34240a706f15e1"
+ integrity sha512-ffIvbytTVWz+3keg+Sy94FG1QeOvmV9dP2YSdLFHw/ieLXWCa3U1TYu8IRCOpMv2/SPS8XqhM1+ou1YHsdzKrg==
dependencies:
"@types/json-schema" "^7.0.7"
- "@typescript-eslint/scope-manager" "4.29.2"
- "@typescript-eslint/types" "4.29.2"
- "@typescript-eslint/typescript-estree" "4.29.2"
+ "@typescript-eslint/scope-manager" "4.29.3"
+ "@typescript-eslint/types" "4.29.3"
+ "@typescript-eslint/typescript-estree" "4.29.3"
eslint-scope "^5.1.1"
eslint-utils "^3.0.0"
"@typescript-eslint/parser@^4.2.0":
- version "4.21.0"
- resolved "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-4.21.0.tgz"
- integrity sha512-eyNf7QmE5O/l1smaQgN0Lj2M/1jOuNg2NrBm1dqqQN0sVngTLyw8tdCbih96ixlhbF1oINoN8fDCyEH9SjLeIA==
+ version "4.29.3"
+ resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-4.29.3.tgz#2ac25535f34c0e98f50c0e6b28c679c2357d45f2"
+ integrity sha512-jrHOV5g2u8ROghmspKoW7pN8T/qUzk0+DITun0MELptvngtMrwUJ1tv5zMI04CYVEUsSrN4jV7AKSv+I0y0EfQ==
dependencies:
- "@typescript-eslint/scope-manager" "4.21.0"
- "@typescript-eslint/types" "4.21.0"
- "@typescript-eslint/typescript-estree" "4.21.0"
- debug "^4.1.1"
+ "@typescript-eslint/scope-manager" "4.29.3"
+ "@typescript-eslint/types" "4.29.3"
+ "@typescript-eslint/typescript-estree" "4.29.3"
+ debug "^4.3.1"
-"@typescript-eslint/scope-manager@4.21.0":
- version "4.21.0"
- resolved "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.21.0.tgz"
- integrity sha512-kfOjF0w1Ix7+a5T1knOw00f7uAP9Gx44+OEsNQi0PvvTPLYeXJlsCJ4tYnDj5PQEYfpcgOH5yBlw7K+UEI9Agw==
+"@typescript-eslint/scope-manager@4.29.3":
+ version "4.29.3"
+ resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-4.29.3.tgz#497dec66f3a22e459f6e306cf14021e40ec86e19"
+ integrity sha512-x+w8BLXO7iWPkG5mEy9bA1iFRnk36p/goVlYobVWHyDw69YmaH9q6eA+Fgl7kYHmFvWlebUTUfhtIg4zbbl8PA==
dependencies:
- "@typescript-eslint/types" "4.21.0"
- "@typescript-eslint/visitor-keys" "4.21.0"
+ "@typescript-eslint/types" "4.29.3"
+ "@typescript-eslint/visitor-keys" "4.29.3"
-"@typescript-eslint/scope-manager@4.29.2":
- version "4.29.2"
- resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-4.29.2.tgz#442b0f029d981fa402942715b1718ac7fcd5aa1b"
- integrity sha512-mfHmvlQxmfkU8D55CkZO2sQOueTxLqGvzV+mG6S/6fIunDiD2ouwsAoiYCZYDDK73QCibYjIZmGhpvKwAB5BOA==
+"@typescript-eslint/types@4.29.3":
+ version "4.29.3"
+ resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-4.29.3.tgz#d7980c49aef643d0af8954c9f14f656b7fd16017"
+ integrity sha512-s1eV1lKNgoIYLAl1JUba8NhULmf+jOmmeFO1G5MN/RBCyyzg4TIOfIOICVNC06lor+Xmy4FypIIhFiJXOknhIg==
+
+"@typescript-eslint/typescript-estree@4.29.3":
+ version "4.29.3"
+ resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-4.29.3.tgz#1bafad610015c4ded35c85a70b6222faad598b40"
+ integrity sha512-45oQJA0bxna4O5TMwz55/TpgjX1YrAPOI/rb6kPgmdnemRZx/dB0rsx+Ku8jpDvqTxcE1C/qEbVHbS3h0hflag==
dependencies:
- "@typescript-eslint/types" "4.29.2"
- "@typescript-eslint/visitor-keys" "4.29.2"
-
-"@typescript-eslint/types@4.21.0":
- version "4.21.0"
- resolved "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.21.0.tgz"
- integrity sha512-+OQaupjGVVc8iXbt6M1oZMwyKQNehAfLYJJ3SdvnofK2qcjfor9pEM62rVjBknhowTkh+2HF+/KdRAc/wGBN2w==
-
-"@typescript-eslint/types@4.29.2":
- version "4.29.2"
- resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-4.29.2.tgz#fc0489c6b89773f99109fb0aa0aaddff21f52fcd"
- integrity sha512-K6ApnEXId+WTGxqnda8z4LhNMa/pZmbTFkDxEBLQAbhLZL50DjeY0VIDCml/0Y3FlcbqXZrABqrcKxq+n0LwzQ==
-
-"@typescript-eslint/typescript-estree@4.21.0":
- version "4.21.0"
- resolved "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.21.0.tgz"
- integrity sha512-ZD3M7yLaVGVYLw4nkkoGKumb7Rog7QID9YOWobFDMQKNl+vPxqVIW/uDk+MDeGc+OHcoG2nJ2HphwiPNajKw3w==
- dependencies:
- "@typescript-eslint/types" "4.21.0"
- "@typescript-eslint/visitor-keys" "4.21.0"
- debug "^4.1.1"
- globby "^11.0.1"
- is-glob "^4.0.1"
- semver "^7.3.2"
- tsutils "^3.17.1"
-
-"@typescript-eslint/typescript-estree@4.29.2":
- version "4.29.2"
- resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-4.29.2.tgz#a0ea8b98b274adbb2577100ba545ddf8bf7dc219"
- integrity sha512-TJ0/hEnYxapYn9SGn3dCnETO0r+MjaxtlWZ2xU+EvytF0g4CqTpZL48SqSNn2hXsPolnewF30pdzR9a5Lj3DNg==
- dependencies:
- "@typescript-eslint/types" "4.29.2"
- "@typescript-eslint/visitor-keys" "4.29.2"
+ "@typescript-eslint/types" "4.29.3"
+ "@typescript-eslint/visitor-keys" "4.29.3"
debug "^4.3.1"
globby "^11.0.3"
is-glob "^4.0.1"
semver "^7.3.5"
tsutils "^3.21.0"
-"@typescript-eslint/visitor-keys@4.21.0":
- version "4.21.0"
- resolved "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.21.0.tgz"
- integrity sha512-dH22dROWGi5Z6p+Igc8bLVLmwy7vEe8r+8c+raPQU0LxgogPUrRAtRGtvBWmlr9waTu3n+QLt/qrS/hWzk1x5w==
+"@typescript-eslint/visitor-keys@4.29.3":
+ version "4.29.3"
+ resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-4.29.3.tgz#c691760a00bd86bf8320d2a90a93d86d322f1abf"
+ integrity sha512-MGGfJvXT4asUTeVs0Q2m+sY63UsfnA+C/FDgBKV3itLBmM9H0u+URcneePtkd0at1YELmZK6HSolCqM4Fzs6yA==
dependencies:
- "@typescript-eslint/types" "4.21.0"
- eslint-visitor-keys "^2.0.0"
-
-"@typescript-eslint/visitor-keys@4.29.2":
- version "4.29.2"
- resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-4.29.2.tgz#d2da7341f3519486f50655159f4e5ecdcb2cd1df"
- integrity sha512-bDgJLQ86oWHJoZ1ai4TZdgXzJxsea3Ee9u9wsTAvjChdj2WLcVsgWYAPeY7RQMn16tKrlQaBnpKv7KBfs4EQag==
- dependencies:
- "@typescript-eslint/types" "4.29.2"
+ "@typescript-eslint/types" "4.29.3"
eslint-visitor-keys "^2.0.0"
"@webcomponents/webcomponentsjs@^1.0.7":
@@ -1580,9 +1536,9 @@
acorn "^3.0.4"
acorn-jsx@^5.3.1:
- version "5.3.1"
- resolved "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.1.tgz"
- integrity sha512-K0Ptm/47OKfQRpNQ2J/oIN/3QYiK6FwW+eJbILhsdxh2WTLdl+30o8aGdTbm5JbffpFFAg/g+zi1E+jvJha5ng==
+ version "5.3.2"
+ resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937"
+ integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==
acorn@^3.0.4:
version "3.3.0"
@@ -1596,7 +1552,7 @@
acorn@^7.1.0, acorn@^7.4.0:
version "7.4.1"
- resolved "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz"
+ resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa"
integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==
adm-zip@~0.4.3:
@@ -1625,7 +1581,7 @@
ajv@^6.10.0, ajv@^6.12.3, ajv@^6.12.4:
version "6.12.6"
- resolved "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz"
+ 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"
@@ -1634,9 +1590,9 @@
uri-js "^4.2.2"
ajv@^8.0.1:
- version "8.0.5"
- resolved "https://registry.npmjs.org/ajv/-/ajv-8.0.5.tgz"
- integrity sha512-RkiLa/AeJx7+9OvniQ/qeWu0w74A8DiPPBclQ6ji3ZQkv5KamO+QGpqmi7O4JIw3rHGUXZ6CoP9tsAkn3gyazg==
+ version "8.6.2"
+ resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.6.2.tgz#2fb45e0e5fcbc0813326c1c3da535d1881bb0571"
+ integrity sha512-9807RlWAgT564wT+DjeyU5OFMPjmzxVobvDFmNAhY+5zD6A2ly3jDp6sgnfyDtlIQ+7H97oc/DGCzzfu9rjw9w==
dependencies:
fast-deep-equal "^3.1.1"
json-schema-traverse "^1.0.0"
@@ -1659,14 +1615,14 @@
ansi-align@^3.0.0:
version "3.0.0"
- resolved "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.0.tgz"
+ resolved "https://registry.yarnpkg.com/ansi-align/-/ansi-align-3.0.0.tgz#b536b371cf687caaef236c18d3e21fe3797467cb"
integrity sha512-ZpClVKqXN3RGBmKibdfWzqCY4lnjEuoNzU5T0oEFpfd/z5qJHVarukridD4juLO2FXMiwUQxr9WqQtaYa8XRYw==
dependencies:
string-width "^3.0.0"
ansi-colors@^4.1.1:
version "4.1.1"
- resolved "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz"
+ resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.1.tgz#cbb9ae256bf750af1eab344f229aa27fe94ba348"
integrity sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==
ansi-escapes@^1.1.0:
@@ -1676,7 +1632,7 @@
ansi-escapes@^4.2.1:
version "4.3.2"
- resolved "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz"
+ resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz#6b2291d1db7d98b6521d5f1efa42d0f3a9feb65e"
integrity sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==
dependencies:
type-fest "^0.21.3"
@@ -1693,12 +1649,12 @@
ansi-regex@^4.1.0:
version "4.1.0"
- resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz"
+ resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.0.tgz#8b9f8f08cf1acb843756a839ca8c7e3168c51997"
integrity sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==
ansi-regex@^5.0.0:
version "5.0.0"
- resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz"
+ resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.0.tgz#388539f55179bf39339c81af30a654d69f87cb75"
integrity sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==
ansi-styles@^2.2.1:
@@ -1708,14 +1664,14 @@
ansi-styles@^3.2.1:
version "3.2.1"
- resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz"
+ resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d"
integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==
dependencies:
color-convert "^1.9.0"
ansi-styles@^4.0.0, ansi-styles@^4.1.0:
version "4.3.0"
- resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz"
+ resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937"
integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==
dependencies:
color-convert "^2.0.1"
@@ -1774,7 +1730,7 @@
argparse@^1.0.7:
version "1.0.10"
- resolved "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz"
+ resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911"
integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==
dependencies:
sprintf-js "~1.0.2"
@@ -1808,7 +1764,7 @@
dependencies:
typical "^2.6.1"
-array-back@^3.0.1:
+array-back@^3.0.1, array-back@^3.1.0:
version "3.1.0"
resolved "https://registry.yarnpkg.com/array-back/-/array-back-3.1.0.tgz#b8859d7a508871c9a7b2cf42f99428f65e96bfb0"
integrity sha512-TkuxA4UCOvxuDK6NZYXCalszEzj+TLszyASooky+i742l9TqsOdYCMJJupxRic61hwquNtppB3hgcuq9SVSH1Q==
@@ -1833,9 +1789,9 @@
resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2"
integrity sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=
-array-includes@^3.1.1:
+array-includes@^3.1.3:
version "3.1.3"
- resolved "https://registry.npmjs.org/array-includes/-/array-includes-3.1.3.tgz"
+ resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.3.tgz#c7f619b382ad2afaf5326cddfdc0afc61af7690a"
integrity sha512-gcem1KlBU7c9rB+Rq8/3PPKsK2kjqeEBa3bD5kkQo4nYlOHQCJqIJFqBXDEfwaRuYTT4E+FxA9xez7Gf/e3Q7A==
dependencies:
call-bind "^1.0.2"
@@ -1853,7 +1809,7 @@
array-union@^2.1.0:
version "2.1.0"
- resolved "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz"
+ resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d"
integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==
array-uniq@^1.0.1:
@@ -1871,9 +1827,9 @@
resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428"
integrity sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=
-array.prototype.flat@^1.2.3:
+array.prototype.flat@^1.2.4:
version "1.2.4"
- resolved "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.2.4.tgz"
+ resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.2.4.tgz#6ef638b43312bd401b4c6199fdec7e2dc9e9a123"
integrity sha512-4470Xi3GAPAjZqFcljX2xzckv1qeKPizoNkiS0+O4IoPR2ZNpcjE0pkhdihlDouK+x6QOast26B4Q/O9DJnwSg==
dependencies:
call-bind "^1.0.0"
@@ -1887,7 +1843,7 @@
arrify@^1.0.0, arrify@^1.0.1:
version "1.0.1"
- resolved "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz"
+ resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d"
integrity sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=
arrify@^2.0.1:
@@ -1914,7 +1870,7 @@
astral-regex@^2.0.0:
version "2.0.0"
- resolved "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz"
+ resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-2.0.0.tgz#483143c567aeed4785759c0865786dc77d7d2e31"
integrity sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==
async-each@^1.0.0:
@@ -1935,9 +1891,9 @@
lodash "^4.17.14"
async@^3.1.0:
- version "3.2.0"
- resolved "https://registry.yarnpkg.com/async/-/async-3.2.0.tgz#b3a2685c5ebb641d3de02d161002c60fc9f85720"
- integrity sha512-TR2mEZFVOj2pLStYxLht7TyfuRzaydfpxr3k9RpHIzMgw7A64dzsdqCxH1WJyQdoe8T10nDXd9wnEigmiuHIZw==
+ version "3.2.1"
+ resolved "https://registry.yarnpkg.com/async/-/async-3.2.1.tgz#d3274ec66d107a47476a4c49136aacdb00665fc8"
+ integrity sha512-XdD5lRO/87udXCMC9meWdYiR+Nq6ZjUfXidViUZGu2F1MO4T3XwZ1et0hb2++BgLfhyJwy44BGB/yx80ABx8hg==
async@~0.2.9:
version "0.2.10"
@@ -2262,7 +2218,7 @@
balanced-match@^1.0.0:
version "1.0.2"
- resolved "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz"
+ resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee"
integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==
base64-arraybuffer@0.1.4:
@@ -2306,9 +2262,9 @@
tweetnacl "^0.14.3"
before-after-hook@^2.0.0:
- version "2.2.1"
- resolved "https://registry.yarnpkg.com/before-after-hook/-/before-after-hook-2.2.1.tgz#73540563558687586b52ed217dad6a802ab1549c"
- integrity sha512-/6FKxSTWoJdbsLDF8tdIjaRiFXiE6UHsEHE3OPI/cwPURCVi1ukP0gmLn7XWEiFk5TcwQjjY5PWsU+j+tgXgmw==
+ version "2.2.2"
+ resolved "https://registry.yarnpkg.com/before-after-hook/-/before-after-hook-2.2.2.tgz#a6e8ca41028d90ee2c24222f201c90956091613e"
+ integrity sha512-3pZEU3NT5BFUo/AD5ERPWOgQOCZITni6iavr5AUw5AUwQjMlI0kzu5btnyD39AF0gUEsDPwJT+oY1ORBJijPjQ==
binary-extensions@^1.0.0:
version "1.13.1"
@@ -2434,7 +2390,7 @@
boxen@^5.0.0:
version "5.0.1"
- resolved "https://registry.npmjs.org/boxen/-/boxen-5.0.1.tgz"
+ resolved "https://registry.yarnpkg.com/boxen/-/boxen-5.0.1.tgz#657528bdd3f59a772b8279b831f27ec2c744664b"
integrity sha512-49VBlw+PrWEF51aCmy7QIteYPIFZxSpvqBdP/2itCPPlJ49kj9zg/XPRFrdkne2W+CfwXUls8exMvu1RysZpKA==
dependencies:
ansi-align "^3.0.0"
@@ -2448,7 +2404,7 @@
brace-expansion@^1.0.0, brace-expansion@^1.1.7:
version "1.1.11"
- resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz"
+ resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd"
integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==
dependencies:
balanced-match "^1.0.0"
@@ -2481,7 +2437,7 @@
braces@^3.0.1:
version "3.0.2"
- resolved "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz"
+ resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107"
integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==
dependencies:
fill-range "^7.0.1"
@@ -2501,16 +2457,16 @@
dependencies:
pako "~0.2.0"
-browserslist@^4.14.5:
- version "4.16.3"
- resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.16.3.tgz#340aa46940d7db878748567c5dea24a48ddf3717"
- integrity sha512-vIyhWmIkULaq04Gt93txdh+j02yX/JzlyhLYbV3YQCn/zvES3JnY7TifHHvvr1w5hTDluNKMkV05cs4vy8Q7sw==
+browserslist@^4.16.6:
+ version "4.16.8"
+ resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.16.8.tgz#cb868b0b554f137ba6e33de0ecff2eda403c4fb0"
+ integrity sha512-sc2m9ohR/49sWEbPj14ZSSZqp+kbi16aLao42Hmn3Z8FpjuMaq2xCA2l4zl9ITfyzvnvyE0hcg62YkIGKxgaNQ==
dependencies:
- caniuse-lite "^1.0.30001181"
- colorette "^1.2.1"
- electron-to-chromium "^1.3.649"
+ caniuse-lite "^1.0.30001251"
+ colorette "^1.3.0"
+ electron-to-chromium "^1.3.811"
escalade "^3.1.1"
- node-releases "^1.1.70"
+ node-releases "^1.1.75"
browserstack@^1.2.0:
version "1.6.1"
@@ -2548,9 +2504,9 @@
integrity sha1-+PeLdniYiO858gXNY39o5wISKyw=
buffer-from@^1.0.0:
- version "1.1.1"
- resolved "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz"
- integrity sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==
+ 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==
buffer@^5.1.0, buffer@^5.5.0:
version "5.7.1"
@@ -2600,7 +2556,7 @@
cacheable-request@^6.0.0:
version "6.1.0"
- resolved "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.1.0.tgz"
+ resolved "https://registry.yarnpkg.com/cacheable-request/-/cacheable-request-6.1.0.tgz#20ffb8bd162ba4be11e9567d823db651052ca912"
integrity sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==
dependencies:
clone-response "^1.0.2"
@@ -2612,21 +2568,21 @@
responselike "^1.0.2"
cacheable-request@^7.0.1:
- version "7.0.1"
- resolved "https://registry.yarnpkg.com/cacheable-request/-/cacheable-request-7.0.1.tgz#062031c2856232782ed694a257fa35da93942a58"
- integrity sha512-lt0mJ6YAnsrBErpTMWeu5kl/tg9xMAWjavYTN6VQXM1A/teBITuNcccXsCxF0tDQQJf9DfAaX5O4e0zp0KlfZw==
+ version "7.0.2"
+ resolved "https://registry.yarnpkg.com/cacheable-request/-/cacheable-request-7.0.2.tgz#ea0d0b889364a25854757301ca12b2da77f91d27"
+ integrity sha512-pouW8/FmiPQbuGpkXQ9BAPv/Mo5xDGANgSNXzTzJ8DrKGuXOssM4wIQRjfanNRh3Yu5cfYPvcorqbhg2KIJtew==
dependencies:
clone-response "^1.0.2"
get-stream "^5.1.0"
http-cache-semantics "^4.0.0"
keyv "^4.0.0"
lowercase-keys "^2.0.0"
- normalize-url "^4.1.0"
+ normalize-url "^6.0.1"
responselike "^2.0.0"
call-bind@^1.0.0, call-bind@^1.0.2:
version "1.0.2"
- resolved "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz"
+ 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"
@@ -2639,7 +2595,7 @@
callsites@^3.0.0:
version "3.1.0"
- resolved "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz"
+ resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73"
integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==
camel-case@3.0.x:
@@ -2660,7 +2616,7 @@
camelcase-keys@^6.2.2:
version "6.2.2"
- resolved "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-6.2.2.tgz"
+ resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-6.2.2.tgz#5e755d6ba51aa223ec7d3d52f25778210f9dc3c0"
integrity sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==
dependencies:
camelcase "^5.3.1"
@@ -2679,12 +2635,12 @@
camelcase@^5.3.1:
version "5.3.1"
- resolved "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz"
+ resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320"
integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==
camelcase@^6.2.0:
version "6.2.0"
- resolved "https://registry.npmjs.org/camelcase/-/camelcase-6.2.0.tgz"
+ resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.2.0.tgz#924af881c9d525ac9d87f40d964e5cea982a1809"
integrity sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg==
cancel-token@^0.1.1:
@@ -2694,10 +2650,10 @@
dependencies:
"@types/node" "^4.0.30"
-caniuse-lite@^1.0.30001181:
- version "1.0.30001208"
- resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001208.tgz#a999014a35cebd4f98c405930a057a0d75352eb9"
- integrity sha512-OE5UE4+nBOro8Dyvv0lfx+SRtfVIOM9uhKqFmJeUbGriqhhStgp1A0OyBpgy3OUF8AhYCT+PVwPC1gMl2ZcQMA==
+caniuse-lite@^1.0.30001251:
+ version "1.0.30001251"
+ resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001251.tgz#6853a606ec50893115db660f82c094d18f096d85"
+ integrity sha512-HOe1r+9VkU4TFmnU70z+r7OLmtR+/chB1rdcJUeQlAinjEeb0cKL20tlAtOagNZhbrtLnCvV19B4FmF1rgzl6A==
capture-stack-trace@^1.0.0:
version "1.0.1"
@@ -2710,9 +2666,9 @@
integrity sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=
chalk@*, chalk@^4.0.0, chalk@^4.1.0:
- version "4.1.0"
- resolved "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz"
- integrity sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==
+ 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"
@@ -2730,7 +2686,7 @@
chalk@^2.0.0, chalk@^2.0.1, chalk@^2.3.0, chalk@^2.4.1, chalk@^2.4.2:
version "2.4.2"
- resolved "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz"
+ resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424"
integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==
dependencies:
ansi-styles "^3.2.1"
@@ -2748,7 +2704,7 @@
chardet@^0.7.0:
version "0.7.0"
- resolved "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz"
+ resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e"
integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==
charenc@0.0.2:
@@ -2796,7 +2752,7 @@
ci-info@^2.0.0:
version "2.0.0"
- resolved "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz"
+ resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-2.0.0.tgz#67a9e964be31a51e15e5010d58e6f12834002f46"
integrity sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==
class-utils@^0.3.5:
@@ -2828,7 +2784,7 @@
cli-boxes@^2.2.1:
version "2.2.1"
- resolved "https://registry.npmjs.org/cli-boxes/-/cli-boxes-2.2.1.tgz"
+ resolved "https://registry.yarnpkg.com/cli-boxes/-/cli-boxes-2.2.1.tgz#ddd5035d25094fce220e9cab40a45840a440318f"
integrity sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==
cli-cursor@^1.0.1:
@@ -2840,7 +2796,7 @@
cli-cursor@^3.1.0:
version "3.1.0"
- resolved "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz"
+ resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-3.1.0.tgz#264305a7ae490d1d03bf0c9ba7c925d1753af307"
integrity sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==
dependencies:
restore-cursor "^3.1.0"
@@ -2859,7 +2815,7 @@
cli-width@^3.0.0:
version "3.0.0"
- resolved "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz"
+ resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-3.0.0.tgz#a2f48437a2caa9a22436e794bf071ec9e61cedf6"
integrity sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==
clone-buffer@^1.0.0:
@@ -2878,7 +2834,7 @@
clone-response@^1.0.2:
version "1.0.2"
- resolved "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz"
+ resolved "https://registry.yarnpkg.com/clone-response/-/clone-response-1.0.2.tgz#d1dc973920314df67fbeb94223b4ee350239e96b"
integrity sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=
dependencies:
mimic-response "^1.0.0"
@@ -2927,32 +2883,32 @@
color-convert@^1.9.0, color-convert@^1.9.1:
version "1.9.3"
- resolved "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz"
+ resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8"
integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==
dependencies:
color-name "1.1.3"
color-convert@^2.0.1:
version "2.0.1"
- resolved "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz"
+ resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3"
integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==
dependencies:
color-name "~1.1.4"
color-name@1.1.3:
version "1.1.3"
- resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz"
+ resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25"
integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=
color-name@^1.0.0, color-name@~1.1.4:
version "1.1.4"
- resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz"
+ resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2"
integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==
color-string@^1.5.2:
- version "1.5.5"
- resolved "https://registry.yarnpkg.com/color-string/-/color-string-1.5.5.tgz#65474a8f0e7439625f3d27a6a19d89fc45223014"
- integrity sha512-jgIoum0OfQfq9Whcfc2z/VhCNcmQjWbey6qBX0vqt7YICflUmBCh9E9CiQD5GSJ+Uehixm3NUwHVhqUAWRivZg==
+ version "1.6.0"
+ resolved "https://registry.yarnpkg.com/color-string/-/color-string-1.6.0.tgz#c3915f61fe267672cb7e1e064c9d692219f6c312"
+ integrity sha512-c/hGS+kRWJutUBEngKKmk4iH3sD59MBkoxVapS/0wgpCz2u7XsNloxknyvBhzwEs1IbV36D9PwqLPJ2DTu3vMA==
dependencies:
color-name "^1.0.0"
simple-swizzle "^0.2.2"
@@ -2965,10 +2921,10 @@
color-convert "^1.9.1"
color-string "^1.5.2"
-colorette@^1.2.1:
- version "1.2.2"
- resolved "https://registry.yarnpkg.com/colorette/-/colorette-1.2.2.tgz#cbcc79d5e99caea2dbf10eb3a26fd8b3e6acfa94"
- integrity sha512-MKGMzyfeuutC/ZJ1cba9NqcNpfeqMUcYmyF1ZFY6/Cn7CNSAKx6a+s48sqLqyAiZuaP2TcqMhoo+dlwFnVxT9w==
+colorette@^1.3.0:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/colorette/-/colorette-1.3.0.tgz#ff45d2f0edb244069d3b772adeb04fed38d0a0af"
+ integrity sha512-ecORCqbSFP7Wm8Y6lyqMJjexBQqXSF7SSeaTyGGphogUjBlFP9m9o08wy86HL2uB7fMTxtOUzLMk7ogKcxMg1w==
colors@1.0.3:
version "1.0.3"
@@ -2996,11 +2952,11 @@
delayed-stream "~1.0.0"
command-line-args@^5.0.2:
- version "5.1.1"
- resolved "https://registry.yarnpkg.com/command-line-args/-/command-line-args-5.1.1.tgz#88e793e5bb3ceb30754a86863f0401ac92fd369a"
- integrity sha512-hL/eG8lrll1Qy1ezvkant+trihbGnaKaeEjj6Scyr3DN+RC7iQ5Rz84IeLERfAWDGo0HBSNAakczwgCilDXnWg==
+ version "5.2.0"
+ resolved "https://registry.yarnpkg.com/command-line-args/-/command-line-args-5.2.0.tgz#087b02748272169741f1fd7c785b295df079b9be"
+ integrity sha512-4zqtU1hYsSJzcJBOcNZIbW5Fbk9BkjCp1pZVhQKoRaWL5J7N4XphDLwo8aWwdQpTugxwu+jf9u2ZhkXiqp5Z6A==
dependencies:
- array-back "^3.0.1"
+ array-back "^3.1.0"
find-replace "^3.0.0"
lodash.camelcase "^4.3.0"
typical "^4.0.0"
@@ -3037,10 +2993,10 @@
resolved "https://registry.yarnpkg.com/commander/-/commander-2.19.0.tgz#f6198aa84e5b83c46054b94ddedbfed5ee9ff12a"
integrity sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg==
-comment-parser@1.1.2:
- version "1.1.2"
- resolved "https://registry.yarnpkg.com/comment-parser/-/comment-parser-1.1.2.tgz#e5317d7a2ec22b470dcb54a29b25426c30bf39d8"
- integrity sha512-AOdq0i8ghZudnYv8RUnHrhTgafUGs61Rdz9jemU5x2lnZwAWyOq7vySo626K59e1fVKH1xSRorJwPVRLSWOoAQ==
+comment-parser@1.1.5:
+ version "1.1.5"
+ resolved "https://registry.yarnpkg.com/comment-parser/-/comment-parser-1.1.5.tgz#453627ef8f67dbcec44e79a9bd5baa37f0bce9b2"
+ integrity sha512-RePCE4leIhBlmrqiYTvaqEeGYg7qpSl4etaIabKtdOQVi+mSTIBBklGUwIr79GXYnl3LpMwmDw4KeR2stNc6FA==
commondir@^1.0.1:
version "1.0.1"
@@ -3099,7 +3055,7 @@
concat-map@0.0.1:
version "0.0.1"
- resolved "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz"
+ resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b"
integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=
concat-stream@^1.4.7, concat-stream@^1.5.2:
@@ -3141,7 +3097,7 @@
configstore@^5.0.1:
version "5.0.1"
- resolved "https://registry.npmjs.org/configstore/-/configstore-5.0.1.tgz"
+ resolved "https://registry.yarnpkg.com/configstore/-/configstore-5.0.1.tgz#d365021b5df4b98cdd187d6a3b0e3f6a7cc5ed96"
integrity sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA==
dependencies:
dot-prop "^5.2.0"
@@ -3151,11 +3107,6 @@
write-file-atomic "^3.0.0"
xdg-basedir "^4.0.0"
-contains-path@^0.1.0:
- version "0.1.0"
- resolved "https://registry.npmjs.org/contains-path/-/contains-path-0.1.0.tgz"
- integrity sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo=
-
content-disposition@0.5.3:
version "0.5.3"
resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.3.tgz#e130caf7e7279087c5616c2007d0485698984fbd"
@@ -3169,9 +3120,9 @@
integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==
convert-source-map@^1.1.1, convert-source-map@^1.7.0:
- version "1.7.0"
- resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.7.0.tgz#17a2cb882d7f77d3490585e2ce6c524424a3a442"
- integrity sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==
+ version "1.8.0"
+ resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.8.0.tgz#f3373c32d21b4d780dd8004514684fb791ca4369"
+ integrity sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==
dependencies:
safe-buffer "~5.1.1"
@@ -3257,7 +3208,7 @@
cross-spawn@^7.0.0, cross-spawn@^7.0.2, cross-spawn@^7.0.3:
version "7.0.3"
- resolved "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz"
+ resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6"
integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==
dependencies:
path-key "^3.1.0"
@@ -3276,7 +3227,7 @@
crypto-random-string@^2.0.0:
version "2.0.0"
- resolved "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz"
+ resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-2.0.0.tgz#ef2a7a966ec11083388369baa02ebead229b30d5"
integrity sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==
css-select@~1.2.0:
@@ -3336,19 +3287,19 @@
debug@2.6.9, debug@^2.0.0, debug@^2.2.0, debug@^2.3.3, debug@^2.6.8, debug@^2.6.9:
version "2.6.9"
- resolved "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz"
+ resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f"
integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==
dependencies:
ms "2.0.0"
debug@4, debug@^4.0.1, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1:
- version "4.3.1"
- resolved "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz"
- integrity sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==
+ version "4.3.2"
+ resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.2.tgz#f0a49c18ac8779e31d4a0c6029dfb76873c7428b"
+ integrity sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==
dependencies:
ms "2.1.2"
-debug@^3.1.0:
+debug@^3.1.0, debug@^3.2.7:
version "3.2.7"
resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a"
integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==
@@ -3371,7 +3322,7 @@
decamelize-keys@^1.1.0:
version "1.1.0"
- resolved "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.0.tgz"
+ resolved "https://registry.yarnpkg.com/decamelize-keys/-/decamelize-keys-1.1.0.tgz#d171a87933252807eb3cb61dc1c1445d078df2d9"
integrity sha1-0XGoeTMlKAfrPLYdwcFEXQeN8tk=
dependencies:
decamelize "^1.1.0"
@@ -3379,7 +3330,7 @@
decamelize@^1.1.0, decamelize@^1.1.2, decamelize@^1.2.0:
version "1.2.0"
- resolved "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz"
+ resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290"
integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=
decode-uri-component@^0.2.0:
@@ -3389,7 +3340,7 @@
decompress-response@^3.2.0, decompress-response@^3.3.0:
version "3.3.0"
- resolved "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz"
+ resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-3.3.0.tgz#80a4dd323748384bfa248083622aedec982adff3"
integrity sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=
dependencies:
mimic-response "^1.0.0"
@@ -3408,17 +3359,17 @@
deep-extend@^0.6.0, deep-extend@~0.6.0:
version "0.6.0"
- resolved "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz"
+ resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac"
integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==
deep-is@^0.1.3:
version "0.1.3"
- resolved "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz"
+ resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34"
integrity sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=
defer-to-connect@^1.0.1:
version "1.1.3"
- resolved "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.3.tgz"
+ resolved "https://registry.yarnpkg.com/defer-to-connect/-/defer-to-connect-1.1.3.tgz#331ae050c08dcf789f8c83a7b81f0ed94f4ac591"
integrity sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==
defer-to-connect@^2.0.0:
@@ -3428,7 +3379,7 @@
define-properties@^1.1.3:
version "1.1.3"
- resolved "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz"
+ resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1"
integrity sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==
dependencies:
object-keys "^1.0.12"
@@ -3512,9 +3463,9 @@
repeating "^2.0.0"
detect-node@^2.0.3:
- version "2.0.5"
- resolved "https://registry.yarnpkg.com/detect-node/-/detect-node-2.0.5.tgz#9d270aa7eaa5af0b72c4c9d9b814e7f4ce738b79"
- integrity sha512-qi86tE6hRcFHy8jI1m2VG+LaPUR1LhqDa5G8tVjuUXmOrpuAgqsA1pN0+ldgr3aKUH+QLI9hCY/OcRYisERejw==
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/detect-node/-/detect-node-2.1.0.tgz#c9c70775a49c3d03bc2c06d9a73be550f978f8b1"
+ integrity sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==
dicer@0.2.5:
version "0.2.5"
@@ -3556,20 +3507,12 @@
dir-glob@^3.0.1:
version "3.0.1"
- resolved "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz"
+ resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f"
integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==
dependencies:
path-type "^4.0.0"
-doctrine@1.5.0:
- version "1.5.0"
- resolved "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz"
- integrity sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=
- dependencies:
- esutils "^2.0.2"
- isarray "^1.0.0"
-
-doctrine@^2.0.2:
+doctrine@^2.0.2, doctrine@^2.1.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d"
integrity sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==
@@ -3578,7 +3521,7 @@
doctrine@^3.0.0:
version "3.0.0"
- resolved "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz"
+ resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961"
integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==
dependencies:
esutils "^2.0.2"
@@ -3592,12 +3535,12 @@
entities "^2.0.0"
dom-serializer@^1.0.1:
- version "1.3.1"
- resolved "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.3.1.tgz"
- integrity sha512-Pv2ZluG5ife96udGgEDovOOOA5UELkltfJpnIExPrAk1LTvecolUGn6lIaoLh86d83GiB86CjzciMd9BuRB71Q==
+ version "1.3.2"
+ resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-1.3.2.tgz#6206437d32ceefaec7161803230c7a20bc1b4d91"
+ integrity sha512-5c54Bk5Dw4qAxNOI1pFEizPSjVsx5+bpJKmL2kPn8JhBUq2q09tTCa3mjijun2NfK78NMouDYNMBkOrPZiS+ig==
dependencies:
domelementtype "^2.0.1"
- domhandler "^4.0.0"
+ domhandler "^4.2.0"
entities "^2.0.0"
dom-serializer@~0.1.0:
@@ -3631,7 +3574,7 @@
domelementtype@^2.0.1, domelementtype@^2.2.0:
version "2.2.0"
- resolved "https://registry.npmjs.org/domelementtype/-/domelementtype-2.2.0.tgz"
+ resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.2.0.tgz#9a0b6c2782ed6a1c7323d42267183df9bd8b1d57"
integrity sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A==
domhandler@^2.3.0:
@@ -3641,10 +3584,10 @@
dependencies:
domelementtype "1"
-domhandler@^4.0.0, domhandler@^4.1.0:
- version "4.1.0"
- resolved "https://registry.npmjs.org/domhandler/-/domhandler-4.1.0.tgz"
- integrity sha512-/6/kmsGlMY4Tup/nGVutdrK9yQi4YjWVcVeoQmixpzjOUK1U7pQkvAPHBJeUxOgxF0J8f8lwCJSlCfD0V4CMGQ==
+domhandler@^4.0.0, domhandler@^4.2.0:
+ version "4.2.0"
+ resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-4.2.0.tgz#f9768a5f034be60a89a27c2e4d0f74eba0d8b059"
+ integrity sha512-zk7sgt970kzPks2Bf+dwT/PLzghLnsivb9CcxkvR8Mzr66Olr0Ofd8neSbglHJHaHa2MadfoSdNlKYAaafmWfA==
dependencies:
domelementtype "^2.2.0"
@@ -3665,13 +3608,13 @@
domelementtype "1"
domutils@^2.5.2:
- version "2.5.2"
- resolved "https://registry.npmjs.org/domutils/-/domutils-2.5.2.tgz"
- integrity sha512-MHTthCb1zj8f1GVfRpeZUbohQf/HdBos0oX5gZcQFepOZPLLRyj6Wn7XS7EMnY7CVpwv8863u2vyE83Hfu28HQ==
+ version "2.7.0"
+ resolved "https://registry.yarnpkg.com/domutils/-/domutils-2.7.0.tgz#8ebaf0c41ebafcf55b0b72ec31c56323712c5442"
+ integrity sha512-8eaHa17IwJUPAiB+SoTYBo5mCdeMgdcAoXJ59m6DT1vw+5iLS3gNoqYaRowaBKtGVrOF1Jz4yDTgYKLK2kvfJg==
dependencies:
dom-serializer "^1.0.1"
domelementtype "^2.2.0"
- domhandler "^4.1.0"
+ domhandler "^4.2.0"
dot-prop@^3.0.0:
version "3.0.0"
@@ -3689,7 +3632,7 @@
dot-prop@^5.2.0:
version "5.3.0"
- resolved "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz"
+ resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-5.3.0.tgz#90ccce708cd9cd82cc4dc8c3ddd9abdd55b20e88"
integrity sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==
dependencies:
is-obj "^2.0.0"
@@ -3712,7 +3655,7 @@
duplexer3@^0.1.4:
version "0.1.4"
- resolved "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz"
+ resolved "https://registry.yarnpkg.com/duplexer3/-/duplexer3-0.1.4.tgz#ee01dd1cac0ed3cbc7fdbea37dc0a8f1ce002ce2"
integrity sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=
duplexify@^3.2.0, duplexify@^3.5.0, duplexify@^3.6.0:
@@ -3758,10 +3701,10 @@
dependencies:
jake "^10.6.1"
-electron-to-chromium@^1.3.649:
- version "1.3.712"
- resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.712.tgz#ae467ffe5f95961c6d41ceefe858fc36eb53b38f"
- integrity sha512-3kRVibBeCM4vsgoHHGKHmPocLqtFAGTrebXxxtgKs87hNUzXrX2NuS3jnBys7IozCnw7viQlozxKkmty2KNfrw==
+electron-to-chromium@^1.3.811:
+ version "1.3.818"
+ resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.818.tgz#32ed024fa8316e5d469c96eecbea7d2463d80085"
+ integrity sha512-c/Z9gIr+jDZAR9q+mn40hEc1NharBT+8ejkarjbCDnBNFviI6hvcC5j2ezkAXru//bTnQp5n6iPi0JA83Tla1Q==
emitter-component@^1.1.1:
version "1.1.1"
@@ -3770,12 +3713,12 @@
emoji-regex@^7.0.1:
version "7.0.3"
- resolved "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz"
+ resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156"
integrity sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==
emoji-regex@^8.0.0:
version "8.0.0"
- resolved "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz"
+ resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37"
integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==
enabled@2.0.x:
@@ -3790,7 +3733,7 @@
end-of-stream@^1.0.0, end-of-stream@^1.1.0, end-of-stream@^1.4.1:
version "1.4.4"
- resolved "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz"
+ resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0"
integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==
dependencies:
once "^1.4.0"
@@ -3801,9 +3744,9 @@
integrity sha1-L52pjVelDP2kVxzkM5AAUA9Oa4o=
engine.io-client@~3.5.0:
- version "3.5.1"
- resolved "https://registry.yarnpkg.com/engine.io-client/-/engine.io-client-3.5.1.tgz#b500458a39c0cd197a921e0e759721a746d0bdb9"
- integrity sha512-oVu9kBkGbcggulyVF0kz6BV3ganqUeqXvD79WOFKa+11oK692w1NyFkuEj4xrkFRpZhn92QOqTk4RQq5LiBXbQ==
+ version "3.5.2"
+ resolved "https://registry.yarnpkg.com/engine.io-client/-/engine.io-client-3.5.2.tgz#0ef473621294004e9ceebe73cef0af9e36f2f5fa"
+ integrity sha512-QEqIp+gJ/kMHeUun7f5Vv3bteRHppHH/FMBQX/esFj/fuYfjyUKWGMo3VCvIP/V8bE9KcjHmRZrhIz2Z9oNsDA==
dependencies:
component-emitter "~1.3.0"
component-inherit "0.0.3"
@@ -3814,7 +3757,7 @@
parseqs "0.0.6"
parseuri "0.0.6"
ws "~7.4.2"
- xmlhttprequest-ssl "~1.5.4"
+ xmlhttprequest-ssl "~1.6.2"
yeast "0.1.2"
engine.io-parser@~2.2.0:
@@ -3842,7 +3785,7 @@
enquirer@^2.3.5:
version "2.3.6"
- resolved "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz"
+ resolved "https://registry.yarnpkg.com/enquirer/-/enquirer-2.3.6.tgz#2a7fe5dd634a1e4125a975ec994ff5456dc3734d"
integrity sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==
dependencies:
ansi-colors "^4.1.1"
@@ -3854,7 +3797,7 @@
entities@^2.0.0:
version "2.2.0"
- resolved "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz"
+ resolved "https://registry.yarnpkg.com/entities/-/entities-2.2.0.tgz#098dc90ebb83d8dffa089d55256b351d34c4da55"
integrity sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==
errlop@^2.0.0:
@@ -3864,7 +3807,7 @@
error-ex@^1.2.0, error-ex@^1.3.1:
version "1.3.2"
- resolved "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz"
+ resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf"
integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==
dependencies:
is-arrayish "^0.2.1"
@@ -3876,10 +3819,10 @@
dependencies:
string-template "~0.2.1"
-es-abstract@^1.18.0-next.1, es-abstract@^1.18.0-next.2:
- version "1.18.0"
- resolved "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.0.tgz"
- integrity sha512-LJzK7MrQa8TS0ja2w3YNLzUgJCGPdPOV1yVvezjNnS89D+VR08+Szt2mz3YB2Dck/+w5tfIq/RoUAFqJJGM2yw==
+es-abstract@^1.18.0-next.1, es-abstract@^1.18.0-next.2, es-abstract@^1.18.2:
+ version "1.18.5"
+ resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.18.5.tgz#9b10de7d4c206a3581fd5b2124233e04db49ae19"
+ integrity sha512-DDggyJLoS91CkJjgauM5c0yZMjiD1uK3KcaCeAmffGwZ+ODWzOkPN4QwRbsK5DOFf06fywmyLci3ZD8jLGhVYA==
dependencies:
call-bind "^1.0.2"
es-to-primitive "^1.2.1"
@@ -3887,20 +3830,21 @@
get-intrinsic "^1.1.1"
has "^1.0.3"
has-symbols "^1.0.2"
+ internal-slot "^1.0.3"
is-callable "^1.2.3"
is-negative-zero "^2.0.1"
- is-regex "^1.1.2"
- is-string "^1.0.5"
- object-inspect "^1.9.0"
+ is-regex "^1.1.3"
+ is-string "^1.0.6"
+ object-inspect "^1.11.0"
object-keys "^1.1.1"
object.assign "^4.1.2"
string.prototype.trimend "^1.0.4"
string.prototype.trimstart "^1.0.4"
- unbox-primitive "^1.0.0"
+ unbox-primitive "^1.0.1"
es-to-primitive@^1.2.1:
version "1.2.1"
- resolved "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz"
+ resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a"
integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==
dependencies:
is-callable "^1.1.4"
@@ -3931,7 +3875,7 @@
escape-goat@^2.0.0:
version "2.1.1"
- resolved "https://registry.npmjs.org/escape-goat/-/escape-goat-2.1.1.tgz"
+ resolved "https://registry.yarnpkg.com/escape-goat/-/escape-goat-2.1.1.tgz#1b2dc77003676c457ec760b2dc68edb648188675"
integrity sha512-8/uIhbG12Csjy2JEW7D9pHbreaVaS/OpN3ycnyvElTdwM5n6GY6W6e2IPemfvGZeUMqZ9A/3GqIZMgKnBhAw/Q==
escape-html@^1.0.3, escape-html@~1.0.3:
@@ -3941,38 +3885,43 @@
escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.4, escape-string-regexp@^1.0.5:
version "1.0.5"
- resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz"
+ resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4"
integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=
+escape-string-regexp@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34"
+ integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==
+
eslint-config-google@^0.14.0:
version "0.14.0"
- resolved "https://registry.npmjs.org/eslint-config-google/-/eslint-config-google-0.14.0.tgz"
+ resolved "https://registry.yarnpkg.com/eslint-config-google/-/eslint-config-google-0.14.0.tgz#4f5f8759ba6e11b424294a219dbfa18c508bcc1a"
integrity sha512-WsbX4WbjuMvTdeVL6+J3rK1RGhCTqjsFjX7UMSMgZiyxxaNLkoJENbrGExzERFeoTpGw3F3FypTiWAP9ZXzkEw==
eslint-config-prettier@^7.0.0:
version "7.2.0"
- resolved "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-7.2.0.tgz"
+ resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-7.2.0.tgz#f4a4bd2832e810e8cc7c1411ec85b3e85c0c53f9"
integrity sha512-rV4Qu0C3nfJKPOAhFujFxB7RMP+URFyQqqOZW9DMRD7ZDTFyjaIlETU3xzHELt++4ugC0+Jm084HQYkkJe+Ivg==
-eslint-import-resolver-node@^0.3.4:
- version "0.3.4"
- resolved "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.4.tgz"
- integrity sha512-ogtf+5AB/O+nM6DIeBUNr2fuT7ot9Qg/1harBfBtaP13ekEWFQEEMP94BCB7zaNW3gyY+8SHYF00rnqYwXKWOA==
+eslint-import-resolver-node@^0.3.6:
+ version "0.3.6"
+ resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.6.tgz#4048b958395da89668252001dbd9eca6b83bacbd"
+ integrity sha512-0En0w03NRVMn9Uiyn8YRPDKvWjxCWkslUEhGNTdGx15RvPJYQ+lbOlqrlNI2vEAs4pDYK4f/HN2TbDmk5TP0iw==
dependencies:
- debug "^2.6.9"
- resolve "^1.13.1"
+ debug "^3.2.7"
+ resolve "^1.20.0"
-eslint-module-utils@^2.6.0:
- version "2.6.0"
- resolved "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.6.0.tgz"
- integrity sha512-6j9xxegbqe8/kZY8cYpcp0xhbK0EgJlg3g9mib3/miLaExuuwc3n5UEfSnU6hWMbT0FAYVvDbL9RrRgpUeQIvA==
+eslint-module-utils@^2.6.2:
+ version "2.6.2"
+ resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.6.2.tgz#94e5540dd15fe1522e8ffa3ec8db3b7fa7e7a534"
+ integrity sha512-QG8pcgThYOuqxupd06oYTZoNOGaUdTY1PqK+oS6ElF6vs4pBdk/aYxFVQQXzcrAqp9m7cl7lb2ubazX+g16k2Q==
dependencies:
- debug "^2.6.9"
+ debug "^3.2.7"
pkg-dir "^2.0.0"
eslint-plugin-es@^3.0.0:
version "3.0.1"
- resolved "https://registry.npmjs.org/eslint-plugin-es/-/eslint-plugin-es-3.0.1.tgz"
+ resolved "https://registry.yarnpkg.com/eslint-plugin-es/-/eslint-plugin-es-3.0.1.tgz#75a7cdfdccddc0589934aeeb384175f221c57893"
integrity sha512-GUmAsJaN4Fc7Gbtl8uOBlayo2DqhwWvEzykMHSCZHU3XdJ+NSzzZcVhXh3VxX5icqQ+oQdIEawXX8xkR3mIFmQ==
dependencies:
eslint-utils "^2.0.0"
@@ -3986,40 +3935,42 @@
htmlparser2 "^6.0.1"
eslint-plugin-import@^2.22.1:
- version "2.22.1"
- resolved "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.22.1.tgz"
- integrity sha512-8K7JjINHOpH64ozkAhpT3sd+FswIZTfMZTjdx052pnWrgRCVfp8op9tbjpAk3DdUeI/Ba4C8OjdC0r90erHEOw==
+ version "2.24.2"
+ resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.24.2.tgz#2c8cd2e341f3885918ee27d18479910ade7bb4da"
+ integrity sha512-hNVtyhiEtZmpsabL4neEj+6M5DCLgpYyG9nzJY8lZQeQXEn5UPW1DpUdsMHMXsq98dbNm7nt1w9ZMSVpfJdi8Q==
dependencies:
- array-includes "^3.1.1"
- array.prototype.flat "^1.2.3"
- contains-path "^0.1.0"
+ array-includes "^3.1.3"
+ array.prototype.flat "^1.2.4"
debug "^2.6.9"
- doctrine "1.5.0"
- eslint-import-resolver-node "^0.3.4"
- eslint-module-utils "^2.6.0"
+ doctrine "^2.1.0"
+ eslint-import-resolver-node "^0.3.6"
+ eslint-module-utils "^2.6.2"
+ find-up "^2.0.0"
has "^1.0.3"
+ is-core-module "^2.6.0"
minimatch "^3.0.4"
- object.values "^1.1.1"
- read-pkg-up "^2.0.0"
- resolve "^1.17.0"
- tsconfig-paths "^3.9.0"
+ object.values "^1.1.4"
+ pkg-up "^2.0.0"
+ read-pkg-up "^3.0.0"
+ resolve "^1.20.0"
+ tsconfig-paths "^3.11.0"
eslint-plugin-jsdoc@^32.3.0:
- version "32.3.0"
- resolved "https://registry.yarnpkg.com/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-32.3.0.tgz#7c9fa5da8c72bd6ad7d97bbf8dee8bc29bec3f9e"
- integrity sha512-zyx7kajDK+tqS1bHuY5sapkad8P8KT0vdd/lE55j47VPG2MeenSYuIY/M/Pvmzq5g0+3JB+P3BJGUXmHxtuKPQ==
+ version "32.3.4"
+ resolved "https://registry.yarnpkg.com/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-32.3.4.tgz#6888f3b2dbb9f73fb551458c639a4e8c84fe9ddc"
+ integrity sha512-xSWfsYvffXnN0OkwLnB7MoDDDDjqcp46W7YlY1j7JyfAQBQ+WnGCfLov3gVNZjUGtK9Otj8mEhTZTqJu4QtIGA==
dependencies:
- comment-parser "1.1.2"
+ comment-parser "1.1.5"
debug "^4.3.1"
jsdoctypeparser "^9.0.0"
- lodash "^4.17.20"
+ lodash "^4.17.21"
regextras "^0.7.1"
- semver "^7.3.4"
+ semver "^7.3.5"
spdx-expression-parse "^3.0.1"
eslint-plugin-node@^11.1.0:
version "11.1.0"
- resolved "https://registry.npmjs.org/eslint-plugin-node/-/eslint-plugin-node-11.1.0.tgz"
+ resolved "https://registry.yarnpkg.com/eslint-plugin-node/-/eslint-plugin-node-11.1.0.tgz#c95544416ee4ada26740a30474eefc5402dc671d"
integrity sha512-oUwtPJ1W0SKD0Tr+wqu92c5xuCeQqB3hSCHasn/ZgjFdA9iDGNkNf2Zi9ztY7X+hNuMib23LNGRm6+uN+KLE3g==
dependencies:
eslint-plugin-es "^3.0.0"
@@ -4029,23 +3980,16 @@
resolve "^1.10.1"
semver "^6.1.0"
-eslint-plugin-prettier@^3.1.4:
- version "3.3.1"
- resolved "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-3.3.1.tgz"
- integrity sha512-Rq3jkcFY8RYeQLgk2cCwuc0P7SEFwDravPhsJZOQ5N4YI4DSg50NyqJ/9gdZHzQlHf8MvafSesbNJCcP/FF6pQ==
+eslint-plugin-prettier@^3.1.4, eslint-plugin-prettier@^3.4.0:
+ version "3.4.1"
+ resolved "https://registry.yarnpkg.com/eslint-plugin-prettier/-/eslint-plugin-prettier-3.4.1.tgz#e9ddb200efb6f3d05ffe83b1665a716af4a387e5"
+ integrity sha512-htg25EUYUeIhKHXjOinK4BgCcDwtLHjqaxCDsMy5nbnUMkKFvIhMVCp+5GFUXQ4Nr8lBsPqtGAqBenbpFqAA2g==
dependencies:
prettier-linter-helpers "^1.0.0"
-eslint-plugin-prettier@^3.4.0:
- version "3.4.0"
- resolved "https://registry.yarnpkg.com/eslint-plugin-prettier/-/eslint-plugin-prettier-3.4.0.tgz#cdbad3bf1dbd2b177e9825737fe63b476a08f0c7"
- integrity sha512-UDK6rJT6INSfcOo545jiaOwB701uAIt2/dR7WnFQoGCVl1/EMqdANBmwUaqqQ45aXprsTGzSa39LI1PyuRBxxw==
- dependencies:
- prettier-linter-helpers "^1.0.0"
-
-eslint-scope@^5.0.0, eslint-scope@^5.1.1:
+eslint-scope@^5.1.1:
version "5.1.1"
- resolved "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz"
+ 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"
@@ -4053,7 +3997,7 @@
eslint-utils@^2.0.0, eslint-utils@^2.1.0:
version "2.1.0"
- resolved "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz"
+ resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-2.1.0.tgz#d2de5e03424e707dc10c74068ddedae708741b27"
integrity sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==
dependencies:
eslint-visitor-keys "^1.1.0"
@@ -4067,36 +4011,39 @@
eslint-visitor-keys@^1.1.0, eslint-visitor-keys@^1.3.0:
version "1.3.0"
- resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz"
+ resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz#30ebd1ef7c2fdff01c3a4f151044af25fab0523e"
integrity sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==
eslint-visitor-keys@^2.0.0:
- version "2.0.0"
- resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.0.0.tgz"
- integrity sha512-QudtT6av5WXels9WjIM7qz1XD1cWGvX4gGXvp/zBn9nXG02D0utdU3Em2m/QjTnrsk6bBjmCygl3rmj118msQQ==
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz#f65328259305927392c938ed44eb0a5c9b2bd303"
+ integrity sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==
-eslint@^7.10.0:
- version "7.23.0"
- resolved "https://registry.npmjs.org/eslint/-/eslint-7.23.0.tgz"
- integrity sha512-kqvNVbdkjzpFy0XOszNwjkKzZ+6TcwCQ/h+ozlcIWwaimBBuhlQ4nN6kbiM2L+OjDcznkTJxzYfRFH92sx4a0Q==
+eslint@^7.10.0, eslint@^7.24.0:
+ version "7.32.0"
+ resolved "https://registry.yarnpkg.com/eslint/-/eslint-7.32.0.tgz#c6d328a14be3fb08c8d1d21e12c02fdb7a2a812d"
+ integrity sha512-VHZ8gX+EDfz+97jGcgyGCyRia/dPOd6Xh9yPv8Bl1+SoaIwD+a/vlrOmGRUyOYu7MwUhc7CxqeaDZU13S4+EpA==
dependencies:
"@babel/code-frame" "7.12.11"
- "@eslint/eslintrc" "^0.4.0"
+ "@eslint/eslintrc" "^0.4.3"
+ "@humanwhocodes/config-array" "^0.5.0"
ajv "^6.10.0"
chalk "^4.0.0"
cross-spawn "^7.0.2"
debug "^4.0.1"
doctrine "^3.0.0"
enquirer "^2.3.5"
+ escape-string-regexp "^4.0.0"
eslint-scope "^5.1.1"
eslint-utils "^2.1.0"
eslint-visitor-keys "^2.0.0"
espree "^7.3.1"
esquery "^1.4.0"
esutils "^2.0.2"
+ fast-deep-equal "^3.1.3"
file-entry-cache "^6.0.1"
functional-red-black-tree "^1.0.1"
- glob-parent "^5.0.0"
+ glob-parent "^5.1.2"
globals "^13.6.0"
ignore "^4.0.6"
import-fresh "^3.0.0"
@@ -4105,7 +4052,7 @@
js-yaml "^3.13.1"
json-stable-stringify-without-jsonify "^1.0.1"
levn "^0.4.1"
- lodash "^4.17.21"
+ lodash.merge "^4.6.2"
minimatch "^3.0.4"
natural-compare "^1.4.0"
optionator "^0.9.1"
@@ -4114,50 +4061,7 @@
semver "^7.2.1"
strip-ansi "^6.0.0"
strip-json-comments "^3.1.0"
- table "^6.0.4"
- text-table "^0.2.0"
- v8-compile-cache "^2.0.3"
-
-eslint@^7.24.0:
- version "7.24.0"
- resolved "https://registry.yarnpkg.com/eslint/-/eslint-7.24.0.tgz#2e44fa62d93892bfdb100521f17345ba54b8513a"
- integrity sha512-k9gaHeHiFmGCDQ2rEfvULlSLruz6tgfA8DEn+rY9/oYPFFTlz55mM/Q/Rij1b2Y42jwZiK3lXvNTw6w6TXzcKQ==
- dependencies:
- "@babel/code-frame" "7.12.11"
- "@eslint/eslintrc" "^0.4.0"
- ajv "^6.10.0"
- chalk "^4.0.0"
- cross-spawn "^7.0.2"
- debug "^4.0.1"
- doctrine "^3.0.0"
- enquirer "^2.3.5"
- eslint-scope "^5.1.1"
- eslint-utils "^2.1.0"
- eslint-visitor-keys "^2.0.0"
- espree "^7.3.1"
- esquery "^1.4.0"
- esutils "^2.0.2"
- file-entry-cache "^6.0.1"
- functional-red-black-tree "^1.0.1"
- glob-parent "^5.0.0"
- globals "^13.6.0"
- ignore "^4.0.6"
- import-fresh "^3.0.0"
- imurmurhash "^0.1.4"
- is-glob "^4.0.0"
- js-yaml "^3.13.1"
- json-stable-stringify-without-jsonify "^1.0.1"
- levn "^0.4.1"
- lodash "^4.17.21"
- minimatch "^3.0.4"
- natural-compare "^1.4.0"
- optionator "^0.9.1"
- progress "^2.0.0"
- regexpp "^3.1.0"
- semver "^7.2.1"
- strip-ansi "^6.0.0"
- strip-json-comments "^3.1.0"
- table "^6.0.4"
+ table "^6.0.9"
text-table "^0.2.0"
v8-compile-cache "^2.0.3"
@@ -4171,7 +4075,7 @@
espree@^7.3.0, espree@^7.3.1:
version "7.3.1"
- resolved "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz"
+ resolved "https://registry.yarnpkg.com/espree/-/espree-7.3.1.tgz#f2df330b752c6f55019f8bd89b7660039c1bbbb6"
integrity sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==
dependencies:
acorn "^7.4.0"
@@ -4180,36 +4084,36 @@
esprima@^4.0.0:
version "4.0.1"
- resolved "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz"
+ resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71"
integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==
esquery@^1.4.0:
version "1.4.0"
- resolved "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz"
+ resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.4.0.tgz#2148ffc38b82e8c7057dfed48425b3e61f0f24a5"
integrity sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==
dependencies:
estraverse "^5.1.0"
esrecurse@^4.3.0:
version "4.3.0"
- resolved "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz"
+ resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921"
integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==
dependencies:
estraverse "^5.2.0"
estraverse@^4.1.1:
version "4.3.0"
- resolved "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz"
+ resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d"
integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==
estraverse@^5.1.0, estraverse@^5.2.0:
version "5.2.0"
- resolved "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz"
+ resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.2.0.tgz#307df42547e6cc7324d3cf03c155d5cdb8c53880"
integrity sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==
esutils@^2.0.2:
version "2.0.3"
- resolved "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz"
+ resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64"
integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==
etag@~1.8.1:
@@ -4264,9 +4168,9 @@
strip-final-newline "^2.0.0"
execa@^5.0.0:
- version "5.0.0"
- resolved "https://registry.npmjs.org/execa/-/execa-5.0.0.tgz"
- integrity sha512-ov6w/2LCiuyO4RLYGdpFGjkcs0wMTgGE8PrkTHikeUy5iJekXyPIKUjifk5CsE0pt7sMCrMZ3YNqoCj6idQOnQ==
+ 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"
@@ -4398,7 +4302,7 @@
external-editor@^3.0.3:
version "3.1.0"
- resolved "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz"
+ resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-3.1.0.tgz#cb03f740befae03ea4d283caed2741a83f335495"
integrity sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==
dependencies:
chardet "^0.7.0"
@@ -4436,14 +4340,14 @@
resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.0.tgz#e2689f8f356fad62cca65a3a91c5df5f9551692f"
integrity sha1-4mifjzVvrWLMplo6kcXfX5VRaS8=
-fast-deep-equal@^3.1.1:
+fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3:
version "3.1.3"
- resolved "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz"
+ resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525"
integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==
fast-diff@^1.1.2:
version "1.2.0"
- resolved "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz"
+ resolved "https://registry.yarnpkg.com/fast-diff/-/fast-diff-1.2.0.tgz#73ee11982d86caaf7959828d519cfe927fac5f03"
integrity sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==
fast-glob@^2.0.2, fast-glob@^2.2.6:
@@ -4459,36 +4363,35 @@
micromatch "^3.1.10"
fast-glob@^3.1.1:
- version "3.2.5"
- resolved "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.5.tgz"
- integrity sha512-2DtFcgT68wiTTiwZ2hNdJfcHNke9XOfnwmBRWXhmeKM8rF0TGwmC/Qto3S7RoZKp5cilZbxzO5iTNTQsJ+EeDg==
+ version "3.2.7"
+ resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.7.tgz#fd6cb7a2d7e9aa7a7846111e85a196d6b2f766a1"
+ integrity sha512-rYGMRwip6lUMvYD3BTScMwT1HtAs2d71SMv66Vrxs0IekGZEjhM0pcMfjQPnknBt2zeCwQMEupiN02ZP4DiT1Q==
dependencies:
"@nodelib/fs.stat" "^2.0.2"
"@nodelib/fs.walk" "^1.2.3"
- glob-parent "^5.1.0"
+ glob-parent "^5.1.2"
merge2 "^1.3.0"
- micromatch "^4.0.2"
- picomatch "^2.2.1"
+ micromatch "^4.0.4"
fast-json-stable-stringify@^2.0.0:
version "2.1.0"
- resolved "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz"
+ resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633"
integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==
fast-levenshtein@^2.0.6:
version "2.0.6"
- resolved "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz"
+ resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917"
integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=
fast-safe-stringify@^2.0.4:
- version "2.0.7"
- resolved "https://registry.yarnpkg.com/fast-safe-stringify/-/fast-safe-stringify-2.0.7.tgz#124aa885899261f68aedb42a7c080de9da608743"
- integrity sha512-Utm6CdzT+6xsDk2m8S6uL8VHxNwI6Jub+e9NYTcAms28T84pTa25GJQV9j0CY0N1rM8hK4x6grpF2BQf+2qwVA==
+ version "2.0.8"
+ resolved "https://registry.yarnpkg.com/fast-safe-stringify/-/fast-safe-stringify-2.0.8.tgz#dc2af48c46cf712b683e849b2bbd446b32de936f"
+ integrity sha512-lXatBjf3WPjmWD6DpIZxkeSsCOwqI0maYMpgDlx8g4U2qi4lbjA9oH/HD2a87G+KfsUmo5WbJFmqBZlPxtptag==
fastq@^1.6.0:
- version "1.11.0"
- resolved "https://registry.npmjs.org/fastq/-/fastq-1.11.0.tgz"
- integrity sha512-7Eczs8gIPDrVzT+EksYBcupqMyxSHXXrHOLRRxU2/DicV8789MRBRR8+Hc2uWzUupOs4YS4JzBmBxjjCVBxD/g==
+ version "1.12.0"
+ resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.12.0.tgz#ed7b6ab5d62393fb2cc591c853652a5c318bf794"
+ integrity sha512-VNX0QkHK3RsXVKr9KrlUv/FoTa0NdbYoHHl7uXHv2rzyHSlxjdNAKug2twd9luJxpcyNeAgf5iPPMutJO67Dfg==
dependencies:
reusify "^1.0.4"
@@ -4519,14 +4422,14 @@
figures@^3.0.0:
version "3.2.0"
- resolved "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz"
+ resolved "https://registry.yarnpkg.com/figures/-/figures-3.2.0.tgz#625c18bd293c604dc4a8ddb2febf0c88341746af"
integrity sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==
dependencies:
escape-string-regexp "^1.0.5"
file-entry-cache@^6.0.1:
version "6.0.1"
- resolved "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz"
+ resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027"
integrity sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==
dependencies:
flat-cache "^3.0.4"
@@ -4571,7 +4474,7 @@
fill-range@^7.0.1:
version "7.0.1"
- resolved "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz"
+ 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"
@@ -4618,7 +4521,7 @@
find-up@^2.0.0, find-up@^2.1.0:
version "2.1.0"
- resolved "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz"
+ resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7"
integrity sha1-RdG35QbHF93UgndaK3eSCjwMV6c=
dependencies:
locate-path "^2.0.0"
@@ -4632,7 +4535,7 @@
find-up@^4.1.0:
version "4.1.0"
- resolved "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz"
+ 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"
@@ -4672,16 +4575,16 @@
flat-cache@^3.0.4:
version "3.0.4"
- resolved "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz"
+ resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.0.4.tgz#61b0338302b2fe9f957dcc32fc2a87f1c3048b11"
integrity sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==
dependencies:
flatted "^3.1.0"
rimraf "^3.0.2"
flatted@^3.1.0:
- version "3.1.1"
- resolved "https://registry.npmjs.org/flatted/-/flatted-3.1.1.tgz"
- integrity sha512-zAoAQiudy+r5SvnSw3KJy5os/oRJYHzrzja/tBDqrZtNhUw8bt6y8OBzMWcjWr+8liV8Eb6yOhw8WZ7VFZ5ZzA==
+ version "3.2.2"
+ resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.2.tgz#64bfed5cb68fe3ca78b3eb214ad97b63bedce561"
+ integrity sha512-JaTY/wtrcSyvXJl4IMFHPKyFur1sE9AUqc0QnhOaJ0CxHtAoIV8pYDzeEfAaNEtGkOfq4gr3LBFmdXW5mOQFnA==
fn.name@1.x.x:
version "1.1.0"
@@ -4689,9 +4592,9 @@
integrity sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==
follow-redirects@^1.0.0, follow-redirects@^1.10.0:
- version "1.13.3"
- resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.13.3.tgz#e5598ad50174c1bc4e872301e82ac2cd97f90267"
- integrity sha512-DUgl6+HDzB0iEptNQEXLx/KhTmDb8tZUHSeLqpnjpknR70H0nC2t9N73BK6fN4hOvJ84pKlIQVQ4k5FFlBedKA==
+ version "1.14.2"
+ resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.14.2.tgz#cecb825047c00f5e66b142f90fed4f515dec789b"
+ integrity sha512-yLR6WaE2lbF0x4K2qE2p9PEXKLDjUjnR/xmjS3wHAYxtlsI9MLLBJUZirAHKzUZDGLxje7w/cXR49WOUo4rbsA==
for-in@^1.0.1, for-in@^1.0.2:
version "1.0.2"
@@ -4740,10 +4643,10 @@
dependencies:
samsam "1.x"
-forwarded@~0.1.2:
- version "0.1.2"
- resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.1.2.tgz#98c23dab1175657b8c0573e8ceccd91b0ff18c84"
- integrity sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=
+forwarded@0.2.0:
+ version "0.2.0"
+ resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811"
+ integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==
fragment-cache@^0.2.1:
version "0.2.1"
@@ -4774,7 +4677,7 @@
fs.realpath@^1.0.0:
version "1.0.0"
- resolved "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz"
+ resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f"
integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8=
fsevents@^1.0.0:
@@ -4785,19 +4688,19 @@
bindings "^1.5.0"
nan "^2.12.1"
-fsevents@~2.3.1:
+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.npmjs.org/function-bind/-/function-bind-1.1.1.tgz"
+ resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d"
integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==
functional-red-black-tree@^1.0.1:
version "1.0.1"
- resolved "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz"
+ resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327"
integrity sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=
gensync@^1.0.0-beta.2:
@@ -4805,9 +4708,9 @@
resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0"
integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==
-get-intrinsic@^1.0.2, get-intrinsic@^1.1.1:
+get-intrinsic@^1.0.2, get-intrinsic@^1.1.0, get-intrinsic@^1.1.1:
version "1.1.1"
- resolved "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz"
+ resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.1.1.tgz#15f59f376f855c446963948f0d24cd3637b4abc6"
integrity sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==
dependencies:
function-bind "^1.1.1"
@@ -4826,22 +4729,22 @@
get-stream@^4.0.0, get-stream@^4.1.0:
version "4.1.0"
- resolved "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz"
+ resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5"
integrity sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==
dependencies:
pump "^3.0.0"
get-stream@^5.0.0, get-stream@^5.1.0:
version "5.2.0"
- resolved "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz"
+ resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-5.2.0.tgz#4966a1795ee5ace65e706c4b7beb71257d6e22d3"
integrity sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==
dependencies:
pump "^3.0.0"
get-stream@^6.0.0:
- version "6.0.0"
- resolved "https://registry.npmjs.org/get-stream/-/get-stream-6.0.0.tgz"
- integrity sha512-A1B3Bh1UmL0bidM/YX2NsCOTnGJePL9rO/M+Mw3m9f2gUpfokS0hi5Eah0WSUEWZdZhIZtMjkIYS7mDfOqNHbg==
+ version "6.0.1"
+ resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7"
+ integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==
get-value@^2.0.3, get-value@^2.0.6:
version "2.0.6"
@@ -4908,9 +4811,9 @@
is-glob "^3.1.0"
path-dirname "^1.0.0"
-glob-parent@^5.0.0, glob-parent@^5.1.0:
+glob-parent@^5.1.2:
version "5.1.2"
- resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz"
+ 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"
@@ -4957,9 +4860,9 @@
path-is-absolute "^1.0.0"
glob@^7.0.0, glob@^7.0.3, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4:
- version "7.1.6"
- resolved "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz"
- integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==
+ version "7.1.7"
+ resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.7.tgz#3b193e9233f01d42d0b3f78294bbeeb418f94a90"
+ integrity sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==
dependencies:
fs.realpath "^1.0.0"
inflight "^1.0.4"
@@ -4977,7 +4880,7 @@
global-dirs@^3.0.0:
version "3.0.0"
- resolved "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.0.tgz"
+ resolved "https://registry.yarnpkg.com/global-dirs/-/global-dirs-3.0.0.tgz#70a76fe84ea315ab37b1f5576cbde7d48ef72686"
integrity sha512-v8ho2DS5RiCjftj1nD9NmnfaOzTdud7RRnVd9kFNOjqZbISlx5DQ+OrTkywgd0dIt7oFCvKetZSHoHcP3sDdiA==
dependencies:
ini "2.0.0"
@@ -5025,17 +4928,10 @@
resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e"
integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==
-globals@^12.1.0:
- version "12.4.0"
- resolved "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz"
- integrity sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==
- dependencies:
- type-fest "^0.8.1"
-
-globals@^13.6.0:
- version "13.8.0"
- resolved "https://registry.npmjs.org/globals/-/globals-13.8.0.tgz"
- integrity sha512-rHtdA6+PDBIjeEvA91rpqzEvk/k3/i7EeNQiryiWuJH0Hw9cpyJMAt2jtbAwUaRdhD+573X4vWw6IcjKPasi9Q==
+globals@^13.6.0, globals@^13.9.0:
+ version "13.11.0"
+ resolved "https://registry.yarnpkg.com/globals/-/globals-13.11.0.tgz#40ef678da117fe7bd2e28f1fab24951bd0255be7"
+ integrity sha512-08/xrJ7wQjK9kkkRoI3OFUBbLx4f+6x3SGwcPvQ0QH6goFDrOU2oyAWrmh3dJezu65buo+HBMzAMQy6rovVC3g==
dependencies:
type-fest "^0.20.2"
@@ -5044,18 +4940,6 @@
resolved "https://registry.yarnpkg.com/globals/-/globals-9.18.0.tgz#aa3896b3e69b487f17e31ed2143d69a8e30c2d8a"
integrity sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==
-globby@^11.0.1:
- version "11.0.3"
- resolved "https://registry.npmjs.org/globby/-/globby-11.0.3.tgz"
- integrity sha512-ffdmosjA807y7+lA1NM0jELARVmYul/715xiILEjo3hBLPTcirgQNnXECn5g3mtR8TOLCVbkfua1Hpen25/Xcg==
- dependencies:
- array-union "^2.1.0"
- dir-glob "^3.0.1"
- fast-glob "^3.1.1"
- ignore "^5.1.4"
- merge2 "^1.3.0"
- slash "^3.0.0"
-
globby@^11.0.3:
version "11.0.4"
resolved "https://registry.yarnpkg.com/globby/-/globby-11.0.4.tgz#2cbaff77c2f2a62e71e9b2813a67b97a3a3001a5"
@@ -5118,7 +5002,7 @@
pify "^4.0.1"
slash "^2.0.0"
-got@^11.8.0:
+got@^11.8.2:
version "11.8.2"
resolved "https://registry.yarnpkg.com/got/-/got-11.8.2.tgz#7abb3959ea28c31f3576f1576c1effce23f33599"
integrity sha512-D0QywKgIe30ODs+fm8wMZiAcZjypcCodPNuMz5H9Mny7RJ+IjJ10BdmGW7OM7fHXP+O7r6ZwapQ/YQmMSvB0UQ==
@@ -5195,7 +5079,7 @@
got@^9.6.0:
version "9.6.0"
- resolved "https://registry.npmjs.org/got/-/got-9.6.0.tgz"
+ resolved "https://registry.yarnpkg.com/got/-/got-9.6.0.tgz#edf45e7d67f99545705de1f7bbeeeb121765ed85"
integrity sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==
dependencies:
"@sindresorhus/is" "^0.14.0"
@@ -5211,9 +5095,9 @@
url-parse-lax "^3.0.0"
graceful-fs@^4.0.0, graceful-fs@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.1.3, graceful-fs@^4.2.0:
- version "4.2.6"
- resolved "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz"
- integrity sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==
+ version "4.2.8"
+ resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.8.tgz#e412b8d33f5e006593cbd3cee6df9f2cebbe802a"
+ integrity sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==
grouped-queue@^0.3.0:
version "0.3.3"
@@ -5310,7 +5194,7 @@
hard-rejection@^2.1.0:
version "2.1.0"
- resolved "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz"
+ resolved "https://registry.yarnpkg.com/hard-rejection/-/hard-rejection-2.1.0.tgz#1c6eda5c1685c63942766d79bb40ae773cecd883"
integrity sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==
has-ansi@^2.0.0:
@@ -5322,7 +5206,7 @@
has-bigints@^1.0.1:
version "1.0.1"
- resolved "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.1.tgz"
+ resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.1.tgz#64fe6acb020673e3b78db035a5af69aa9d07b113"
integrity sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA==
has-binary2@~1.0.2:
@@ -5344,12 +5228,12 @@
has-flag@^3.0.0:
version "3.0.0"
- resolved "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz"
+ resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd"
integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0=
has-flag@^4.0.0:
version "4.0.0"
- resolved "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz"
+ resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b"
integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==
has-symbol-support-x@^1.4.1:
@@ -5359,7 +5243,7 @@
has-symbols@^1.0.1, has-symbols@^1.0.2:
version "1.0.2"
- resolved "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz"
+ resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.2.tgz#165d3070c00309752a1236a479331e3ac56f1423"
integrity sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==
has-to-string-tag-x@^1.2.0:
@@ -5369,6 +5253,13 @@
dependencies:
has-symbol-support-x "^1.4.1"
+has-tostringtag@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.0.tgz#7e133818a7d394734f941e73c3d3f9291e658b25"
+ integrity sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==
+ dependencies:
+ has-symbols "^1.0.2"
+
has-value@^0.3.1:
version "0.3.1"
resolved "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f"
@@ -5402,12 +5293,12 @@
has-yarn@^2.1.0:
version "2.1.0"
- resolved "https://registry.npmjs.org/has-yarn/-/has-yarn-2.1.0.tgz"
+ resolved "https://registry.yarnpkg.com/has-yarn/-/has-yarn-2.1.0.tgz#137e11354a7b5bf11aa5cb649cf0c6f3ff2b2e77"
integrity sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw==
has@^1.0.3:
version "1.0.3"
- resolved "https://registry.npmjs.org/has/-/has-1.0.3.tgz"
+ resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796"
integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==
dependencies:
function-bind "^1.1.1"
@@ -5426,12 +5317,12 @@
hosted-git-info@^2.1.4:
version "2.8.9"
- resolved "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz"
+ resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.9.tgz#dffc0bf9a21c02209090f2aa69429e1414daf3f9"
integrity sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==
hosted-git-info@^4.0.1:
version "4.0.2"
- resolved "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.0.2.tgz"
+ resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-4.0.2.tgz#5e425507eede4fea846b7262f0838456c4209961"
integrity sha512-c9OGXbZ3guC/xOlCg1Ci/VgWlwsqDv1yMQL1CWqXDL0hDjXuNcq0zuR4xqPSuasI3kqFDhqSyTjREz5gzq0fXg==
dependencies:
lru-cache "^6.0.0"
@@ -5473,7 +5364,7 @@
htmlparser2@^6.0.1:
version "6.1.0"
- resolved "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz"
+ resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-6.1.0.tgz#c4d762b6c3371a05dbe65e94ae43a9f845fb8fb7"
integrity sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==
dependencies:
domelementtype "^2.0.1"
@@ -5483,7 +5374,7 @@
http-cache-semantics@^4.0.0:
version "4.1.0"
- resolved "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz"
+ resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz#49e91c5cbf36c9b94bcfcd71c23d5249ec74e390"
integrity sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==
http-deceiver@^1.2.7:
@@ -5582,12 +5473,12 @@
human-signals@^2.1.0:
version "2.1.0"
- resolved "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz"
+ resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0"
integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==
iconv-lite@0.4.24, iconv-lite@^0.4.24:
version "0.4.24"
- resolved "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz"
+ 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"
@@ -5604,17 +5495,17 @@
ignore@^4.0.3, ignore@^4.0.6:
version "4.0.6"
- resolved "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz"
+ resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc"
integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==
ignore@^5.1.1, ignore@^5.1.4:
version "5.1.8"
- resolved "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz"
+ resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.1.8.tgz#f150a8b50a34289b33e22f5889abd4d8016f0e57"
integrity sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==
import-fresh@^3.0.0, import-fresh@^3.2.1:
version "3.3.0"
- resolved "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz"
+ resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b"
integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==
dependencies:
parent-module "^1.0.0"
@@ -5622,12 +5513,12 @@
import-lazy@^2.1.0:
version "2.1.0"
- resolved "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz"
+ resolved "https://registry.yarnpkg.com/import-lazy/-/import-lazy-2.1.0.tgz#05698e3d45c88e8d7e9d92cb0584e77f096f3e43"
integrity sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=
imurmurhash@^0.1.4:
version "0.1.4"
- resolved "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz"
+ resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea"
integrity sha1-khi5srkoojixPcT7a21XbyMUU+o=
indent-string@^2.1.0:
@@ -5639,7 +5530,7 @@
indent-string@^4.0.0:
version "4.0.0"
- resolved "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz"
+ resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251"
integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==
indent@0.0.2:
@@ -5654,7 +5545,7 @@
inflight@^1.0.4:
version "1.0.6"
- resolved "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz"
+ resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9"
integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=
dependencies:
once "^1.3.0"
@@ -5662,7 +5553,7 @@
inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.1, inherits@~2.0.3:
version "2.0.4"
- resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz"
+ resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c"
integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==
inherits@2.0.3:
@@ -5672,12 +5563,12 @@
ini@2.0.0:
version "2.0.0"
- resolved "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz"
+ resolved "https://registry.yarnpkg.com/ini/-/ini-2.0.0.tgz#e5fd556ecdd5726be978fa1001862eacb0a94bc5"
integrity sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==
ini@^1.3.4, ini@~1.3.0:
version "1.3.8"
- resolved "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz"
+ resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c"
integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==
inquirer@^1.0.2:
@@ -5702,7 +5593,7 @@
inquirer@^7.1.0, inquirer@^7.3.3:
version "7.3.3"
- resolved "https://registry.npmjs.org/inquirer/-/inquirer-7.3.3.tgz"
+ resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-7.3.3.tgz#04d176b2af04afc157a83fd7c100e98ee0aad003"
integrity sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA==
dependencies:
ansi-escapes "^4.2.1"
@@ -5719,6 +5610,15 @@
strip-ansi "^6.0.0"
through "^2.3.6"
+internal-slot@^1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.3.tgz#7347e307deeea2faac2ac6205d4bc7d34967f59c"
+ integrity sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==
+ dependencies:
+ get-intrinsic "^1.1.0"
+ has "^1.0.3"
+ side-channel "^1.0.4"
+
interpret@^1.0.0:
version "1.4.0"
resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.4.0.tgz#665ab8bc4da27a774a40584e812e3e0fa45b1a1e"
@@ -5757,7 +5657,7 @@
is-arrayish@^0.2.1:
version "0.2.1"
- resolved "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz"
+ resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d"
integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=
is-arrayish@^0.3.1:
@@ -5766,9 +5666,11 @@
integrity sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==
is-bigint@^1.0.1:
- version "1.0.1"
- resolved "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.1.tgz"
- integrity sha512-J0ELF4yHFxHy0cmSxZuheDOz2luOdVvqjwmEcj8H/L1JHeuEDSDbeRP+Dk9kFVk5RTFzbucJ2Kb9F7ixY2QaCg==
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.0.4.tgz#08147a1875bc2b32005d41ccd8291dffc6691df3"
+ integrity sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==
+ dependencies:
+ has-bigints "^1.0.1"
is-binary-path@^1.0.0:
version "1.0.1"
@@ -5778,11 +5680,12 @@
binary-extensions "^1.0.0"
is-boolean-object@^1.1.0:
- version "1.1.0"
- resolved "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.0.tgz"
- integrity sha512-a7Uprx8UtD+HWdyYwnD1+ExtTgqQtD2k/1yJgtXP6wnMm8byhkoTZRl+95LLThpzNZJ5aEvi46cdH+ayMFRwmA==
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.1.2.tgz#5c6dc200246dd9321ae4b885a114bb1f75f63719"
+ integrity sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==
dependencies:
- call-bind "^1.0.0"
+ call-bind "^1.0.2"
+ has-tostringtag "^1.0.0"
is-buffer@^1.1.5, is-buffer@~1.1.6:
version "1.1.6"
@@ -5790,9 +5693,9 @@
integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==
is-callable@^1.1.4, is-callable@^1.2.3:
- version "1.2.3"
- resolved "https://registry.npmjs.org/is-callable/-/is-callable-1.2.3.tgz"
- integrity sha512-J1DcMe8UYTBSrKezuIUTUwjXsho29693unXM2YhJUTR2txK/eG47bvNa/wipPFmZFgr/N6f1GA66dv0mEyTIyQ==
+ version "1.2.4"
+ resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.4.tgz#47301d58dd0259407865547853df6d61fe471945"
+ integrity sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w==
is-ci@^1.0.10:
version "1.2.1"
@@ -5803,15 +5706,15 @@
is-ci@^2.0.0:
version "2.0.0"
- resolved "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz"
+ resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-2.0.0.tgz#6bc6334181810e04b5c22b3d589fdca55026404c"
integrity sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==
dependencies:
ci-info "^2.0.0"
-is-core-module@^2.2.0:
- version "2.2.0"
- resolved "https://registry.npmjs.org/is-core-module/-/is-core-module-2.2.0.tgz"
- integrity sha512-XRAfAdyyY5F5cOXn7hYQDqh2Xmii+DEfIcQGxK/uNwMHhIkPWO0g8msXcbzLe+MpGoR951MlqM/2iIlU4vKDdQ==
+is-core-module@^2.2.0, is-core-module@^2.5.0, is-core-module@^2.6.0:
+ version "2.6.0"
+ resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.6.0.tgz#d7553b2526fe59b92ba3e40c8df757ec8a709e19"
+ integrity sha512-wShG8vs60jKfPWpF2KZRaAtvt3a20OAn7+IJ6hLPECpSABLcKtFKTTI4ZtH5QcBruBHlq+WsdHWyz0BCZW7svQ==
dependencies:
has "^1.0.3"
@@ -5830,9 +5733,11 @@
kind-of "^6.0.0"
is-date-object@^1.0.1:
- version "1.0.2"
- resolved "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.2.tgz"
- integrity sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.5.tgz#0841d5536e724c25597bf6ea62e1bd38298df31f"
+ integrity sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==
+ dependencies:
+ has-tostringtag "^1.0.0"
is-deflate@^1.0.0:
version "1.0.0"
@@ -5888,7 +5793,7 @@
is-extglob@^2.1.0, is-extglob@^2.1.1:
version "2.1.1"
- resolved "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz"
+ resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2"
integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=
is-finite@^1.0.0:
@@ -5905,12 +5810,12 @@
is-fullwidth-code-point@^2.0.0:
version "2.0.0"
- resolved "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz"
+ resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f"
integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=
is-fullwidth-code-point@^3.0.0:
version "3.0.0"
- resolved "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz"
+ 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@^2.0.0, is-glob@^2.0.1:
@@ -5929,7 +5834,7 @@
is-glob@^4.0.0, is-glob@^4.0.1:
version "4.0.1"
- resolved "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz"
+ resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.1.tgz#7567dbe9f2f5e2467bc77ab83c4a29482407a5dc"
integrity sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==
dependencies:
is-extglob "^2.1.1"
@@ -5949,7 +5854,7 @@
is-installed-globally@^0.4.0:
version "0.4.0"
- resolved "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.4.0.tgz"
+ resolved "https://registry.yarnpkg.com/is-installed-globally/-/is-installed-globally-0.4.0.tgz#9a0fd407949c30f86eb6959ef1b7994ed0b7b520"
integrity sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==
dependencies:
global-dirs "^3.0.0"
@@ -5957,7 +5862,7 @@
is-negative-zero@^2.0.1:
version "2.0.1"
- resolved "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.1.tgz"
+ resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.1.tgz#3de746c18dda2319241a53675908d8f766f11c24"
integrity sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w==
is-npm@^1.0.0:
@@ -5967,13 +5872,15 @@
is-npm@^5.0.0:
version "5.0.0"
- resolved "https://registry.npmjs.org/is-npm/-/is-npm-5.0.0.tgz"
+ resolved "https://registry.yarnpkg.com/is-npm/-/is-npm-5.0.0.tgz#43e8d65cc56e1b67f8d47262cf667099193f45a8"
integrity sha512-WW/rQLOazUq+ST/bCAVBp/2oMERWLsR7OrKyt052dNDk4DHcDE0/7QSXITlmi+VBcV13DfIbysG3tZJm5RfdBA==
is-number-object@^1.0.4:
- version "1.0.4"
- resolved "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.4.tgz"
- integrity sha512-zohwelOAur+5uXtk8O3GPQ1eAcu4ZX3UwxQhUlfFFMNpUd83gXgjbhJh6HmB6LUNV/ieOLQuDwJO3dWJosUeMw==
+ version "1.0.6"
+ resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.6.tgz#6a7aaf838c7f0686a50b4553f7e54a96494e89f0"
+ integrity sha512-bEVOqiRcvo3zO1+G2lVMy+gkkEm9Yh7cDMRusKKu5ZJKPUYSJwICTKZrNKHA2EbSP0Tu0+6B/emsYNHZyn6K8g==
+ dependencies:
+ has-tostringtag "^1.0.0"
is-number@^2.1.0:
version "2.1.0"
@@ -5996,7 +5903,7 @@
is-number@^7.0.0:
version "7.0.0"
- resolved "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz"
+ resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b"
integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==
is-obj@^1.0.0:
@@ -6006,7 +5913,7 @@
is-obj@^2.0.0:
version "2.0.0"
- resolved "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz"
+ resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-2.0.0.tgz#473fb05d973705e3fd9620545018ca8e22ef4982"
integrity sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==
is-object@^1.0.1:
@@ -6035,12 +5942,12 @@
is-path-inside@^3.0.2:
version "3.0.3"
- resolved "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz"
+ resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283"
integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==
is-plain-obj@^1.0.0, is-plain-obj@^1.1.0:
version "1.1.0"
- resolved "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz"
+ resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e"
integrity sha1-caUMhCnfync8kqOQpKA7OfzVHT4=
is-plain-object@^2.0.3, is-plain-object@^2.0.4:
@@ -6075,13 +5982,13 @@
resolved "https://registry.yarnpkg.com/is-redirect/-/is-redirect-1.0.0.tgz#1d03dded53bd8db0f30c26e4f95d36fc7c87dc24"
integrity sha1-HQPd7VO9jbDzDCbk+V02/HyH3CQ=
-is-regex@^1.1.2:
- version "1.1.2"
- resolved "https://registry.npmjs.org/is-regex/-/is-regex-1.1.2.tgz"
- integrity sha512-axvdhb5pdhEVThqJzYXwMlVuZwC+FF2DpcOhTS+y/8jVq4trxyPgfcwIxIKiyeuLlSQYKkmUaPQJ8ZE4yNKXDg==
+is-regex@^1.1.3:
+ version "1.1.4"
+ resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.4.tgz#eef5663cd59fa4c0ae339505323df6854bb15958"
+ integrity sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==
dependencies:
call-bind "^1.0.2"
- has-symbols "^1.0.1"
+ has-tostringtag "^1.0.0"
is-retry-allowed@^1.0.0:
version "1.2.0"
@@ -6101,25 +6008,27 @@
integrity sha1-EtSj3U5o4Lec6428hBc66A2RykQ=
is-stream@^2.0.0:
- version "2.0.0"
- resolved "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz"
- integrity sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077"
+ integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==
-is-string@^1.0.5:
- version "1.0.5"
- resolved "https://registry.npmjs.org/is-string/-/is-string-1.0.5.tgz"
- integrity sha512-buY6VNRjhQMiF1qWDouloZlQbRhDPCebwxSjxMjxgemYT46YMd2NR0/H+fBhEfWX4A/w9TBJ+ol+okqJKFE6vQ==
+is-string@^1.0.5, is-string@^1.0.6:
+ version "1.0.7"
+ resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.7.tgz#0dd12bf2006f255bb58f695110eff7491eebc0fd"
+ integrity sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==
+ dependencies:
+ has-tostringtag "^1.0.0"
is-symbol@^1.0.2, is-symbol@^1.0.3:
- version "1.0.3"
- resolved "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz"
- integrity sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.4.tgz#a6dac93b635b063ca6872236de88910a57af139c"
+ integrity sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==
dependencies:
- has-symbols "^1.0.1"
+ has-symbols "^1.0.2"
is-typedarray@^1.0.0, is-typedarray@~1.0.0:
version "1.0.0"
- resolved "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz"
+ resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a"
integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=
is-utf8@^0.2.0, is-utf8@^0.2.1:
@@ -6144,7 +6053,7 @@
is-yarn-global@^0.3.0:
version "0.3.0"
- resolved "https://registry.npmjs.org/is-yarn-global/-/is-yarn-global-0.3.0.tgz"
+ resolved "https://registry.yarnpkg.com/is-yarn-global/-/is-yarn-global-0.3.0.tgz#d502d3382590ea3004893746754c89139973e232"
integrity sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw==
isarray@0.0.1:
@@ -6152,9 +6061,9 @@
resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf"
integrity sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=
-isarray@1.0.0, isarray@^1.0.0, isarray@~1.0.0:
+isarray@1.0.0, isarray@~1.0.0:
version "1.0.0"
- resolved "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz"
+ resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11"
integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=
isarray@2.0.1:
@@ -6170,13 +6079,13 @@
buffer-alloc "^1.2.0"
isbinaryfile@^4.0.0:
- version "4.0.6"
- resolved "https://registry.yarnpkg.com/isbinaryfile/-/isbinaryfile-4.0.6.tgz#edcb62b224e2b4710830b67498c8e4e5a4d2610b"
- integrity sha512-ORrEy+SNVqUhrCaal4hA4fBzhggQQ+BaLntyPOdoEiwlKZW9BZiJXjg3RMiruE4tPEI3pyVPpySHQF/dKWperg==
+ version "4.0.8"
+ resolved "https://registry.yarnpkg.com/isbinaryfile/-/isbinaryfile-4.0.8.tgz#5d34b94865bd4946633ecc78a026fc76c5b11fcf"
+ integrity sha512-53h6XFniq77YdW+spoRrebh0mnmTxRPTlcuIArO57lmMdq4uBKFKaeTjnb92oYWrSn/LVL+LT+Hap2tFQj8V+w==
isexe@^2.0.0:
version "2.0.0"
- resolved "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz"
+ resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10"
integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=
isobject@^2.0.0:
@@ -6225,7 +6134,7 @@
"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0:
version "4.0.0"
- resolved "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz"
+ resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499"
integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==
js-tokens@^3.0.2:
@@ -6235,7 +6144,7 @@
js-yaml@^3.13.1:
version "3.14.1"
- resolved "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz"
+ resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537"
integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==
dependencies:
argparse "^1.0.7"
@@ -6248,7 +6157,7 @@
jsdoctypeparser@^9.0.0:
version "9.0.0"
- resolved "https://registry.npmjs.org/jsdoctypeparser/-/jsdoctypeparser-9.0.0.tgz"
+ resolved "https://registry.yarnpkg.com/jsdoctypeparser/-/jsdoctypeparser-9.0.0.tgz#8c97e2fb69315eb274b0f01377eaa5c940bd7b26"
integrity sha512-jrTA2jJIL6/DAEILBEh2/w9QxCuwmvNXIry39Ay/HVfhE3o2yVV0U44blYkqdHA/OKloJEqvJy0xU+GSdE2SIw==
jsesc@^1.3.0:
@@ -6268,7 +6177,7 @@
json-buffer@3.0.0:
version "3.0.0"
- resolved "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz"
+ resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.0.tgz#5b1f397afc75d677bde8bcfc0e47e1f9a3d9a898"
integrity sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg=
json-buffer@3.0.1:
@@ -6283,17 +6192,17 @@
json-parse-even-better-errors@^2.3.0:
version "2.3.1"
- resolved "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz"
+ 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.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz"
+ 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.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz"
+ resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz#ae7bcb3656ab77a73ba5c49bf654f38e6b6860e2"
integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==
json-schema@0.2.3:
@@ -6303,7 +6212,7 @@
json-stable-stringify-without-jsonify@^1.0.1:
version "1.0.1"
- resolved "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz"
+ resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651"
integrity sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=
json-stringify-safe@~5.0.1:
@@ -6313,14 +6222,14 @@
json5@^1.0.1:
version "1.0.1"
- resolved "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz"
+ resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.1.tgz#779fb0018604fa854eacbf6252180d83543e3dbe"
integrity sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==
dependencies:
minimist "^1.2.0"
json5@^2.1.2, json5@^2.1.3:
version "2.2.0"
- resolved "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz"
+ resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.0.tgz#2dfefe720c6ba525d9ebd909950f0515316c89a3"
integrity sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==
dependencies:
minimist "^1.2.5"
@@ -6347,7 +6256,7 @@
keyv@^3.0.0:
version "3.1.0"
- resolved "https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz"
+ resolved "https://registry.yarnpkg.com/keyv/-/keyv-3.1.0.tgz#ecc228486f69991e49e9476485a5be1e8fc5c4d9"
integrity sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==
dependencies:
json-buffer "3.0.0"
@@ -6380,7 +6289,7 @@
kind-of@^6.0.0, kind-of@^6.0.2, kind-of@^6.0.3:
version "6.0.3"
- resolved "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz"
+ resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd"
integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==
kuler@^2.0.0:
@@ -6404,7 +6313,7 @@
latest-version@^5.1.0:
version "5.1.0"
- resolved "https://registry.npmjs.org/latest-version/-/latest-version-5.1.0.tgz"
+ resolved "https://registry.yarnpkg.com/latest-version/-/latest-version-5.1.0.tgz#119dfe908fe38d15dfa43ecd13fa12ec8832face"
integrity sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA==
dependencies:
package-json "^6.3.0"
@@ -6444,7 +6353,7 @@
levn@^0.4.1:
version "0.4.1"
- resolved "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz"
+ resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade"
integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==
dependencies:
prelude-ls "^1.2.1"
@@ -6452,7 +6361,7 @@
lines-and-columns@^1.1.6:
version "1.1.6"
- resolved "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz"
+ resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.1.6.tgz#1c00c743b433cd0a4e80758f7b64a57440d9ff00"
integrity sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=
load-json-file@^1.0.0:
@@ -6466,16 +6375,6 @@
pinkie-promise "^2.0.0"
strip-bom "^2.0.0"
-load-json-file@^2.0.0:
- version "2.0.0"
- resolved "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz"
- integrity sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=
- dependencies:
- graceful-fs "^4.1.2"
- parse-json "^2.2.0"
- pify "^2.0.0"
- strip-bom "^3.0.0"
-
load-json-file@^4.0.0:
version "4.0.0"
resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-4.0.0.tgz#2f5f45ab91e33216234fd53adab668eb4ec0993b"
@@ -6488,7 +6387,7 @@
locate-path@^2.0.0:
version "2.0.0"
- resolved "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz"
+ resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e"
integrity sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=
dependencies:
p-locate "^2.0.0"
@@ -6504,7 +6403,7 @@
locate-path@^5.0.0:
version "5.0.0"
- resolved "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz"
+ resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0"
integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==
dependencies:
p-locate "^4.1.0"
@@ -6521,7 +6420,7 @@
lodash.clonedeep@^4.5.0:
version "4.5.0"
- resolved "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz"
+ resolved "https://registry.yarnpkg.com/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz#e23f3f9c4f8fbdde872529c1071857a086e5ccef"
integrity sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=
lodash.defaults@^4.2.0:
@@ -6536,7 +6435,7 @@
lodash.flatten@^4.4.0:
version "4.4.0"
- resolved "https://registry.npmjs.org/lodash.flatten/-/lodash.flatten-4.4.0.tgz"
+ resolved "https://registry.yarnpkg.com/lodash.flatten/-/lodash.flatten-4.4.0.tgz#f31c22225a9632d2bbf8e4addbef240aa765a61f"
integrity sha1-8xwiIlqWMtK7+OSt2+8kCqdlph8=
lodash.get@^4.4.2:
@@ -6596,7 +6495,7 @@
lodash.truncate@^4.4.2:
version "4.4.2"
- resolved "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz"
+ resolved "https://registry.yarnpkg.com/lodash.truncate/-/lodash.truncate-4.4.2.tgz#5a350da0b1113b837ecfffd5812cbe58d6eae193"
integrity sha1-WjUNoLERO4N+z//VgSy+WNbq4ZM=
lodash.union@^4.6.0:
@@ -6614,9 +6513,9 @@
resolved "https://registry.yarnpkg.com/lodash/-/lodash-3.10.1.tgz#5bf45e8e49ba4189e17d482789dfd15bd140b7b6"
integrity sha1-W/Rejkm6QYnhfUgnid/RW9FAt7Y=
-lodash@^4.0.0, lodash@^4.11.1, lodash@^4.15.0, lodash@^4.16.6, lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.2, lodash@^4.17.20, lodash@^4.17.21, lodash@^4.17.4, lodash@^4.3.0:
+lodash@^4.0.0, lodash@^4.11.1, lodash@^4.15.0, lodash@^4.16.6, lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.2, lodash@^4.17.21, lodash@^4.17.4, lodash@^4.3.0:
version "4.17.21"
- resolved "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz"
+ resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c"
integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==
log-symbols@^1.0.0, log-symbols@^1.0.1:
@@ -6662,7 +6561,7 @@
long@^4.0.0:
version "4.0.0"
- resolved "https://registry.npmjs.org/long/-/long-4.0.0.tgz"
+ resolved "https://registry.yarnpkg.com/long/-/long-4.0.0.tgz#9a7b71cfb7d361a194ea555241c92f7468d5bf28"
integrity sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==
loose-envify@^1.0.0:
@@ -6687,12 +6586,12 @@
lowercase-keys@^1.0.0, lowercase-keys@^1.0.1:
version "1.0.1"
- resolved "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz"
+ resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.1.tgz#6f9e30b47084d971a7c820ff15a6c5167b74c26f"
integrity sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==
lowercase-keys@^2.0.0:
version "2.0.0"
- resolved "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz"
+ resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-2.0.0.tgz#2603e78b7b4b0006cbca2fbcc8a3202558ac9479"
integrity sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==
lru-cache@^4.0.1, lru-cache@^4.0.2:
@@ -6705,15 +6604,15 @@
lru-cache@^6.0.0:
version "6.0.0"
- resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz"
+ 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"
macos-release@^2.2.0:
- version "2.4.1"
- resolved "https://registry.yarnpkg.com/macos-release/-/macos-release-2.4.1.tgz#64033d0ec6a5e6375155a74b1a1eba8e509820ac"
- integrity sha512-H/QHeBIN1fIGJX517pvK8IEK53yQOW7YcEI55oYtgjDdoCQQz7eJS94qt5kNrscReEyuD/JcdFCm2XBEcGOITg==
+ version "2.5.0"
+ resolved "https://registry.yarnpkg.com/macos-release/-/macos-release-2.5.0.tgz#067c2c88b5f3fb3c56a375b2ec93826220fa1ff2"
+ integrity sha512-EIgv+QZ9r+814gjJj0Bt5vSLJLzswGmSUbUpbi9AIr/fsN2IWFBl2NucV9PAiek+U1STK468tEkxmVYUtuAN3g==
magic-string@^0.22.4:
version "0.22.5"
@@ -6731,7 +6630,7 @@
make-dir@^3.0.0:
version "3.1.0"
- resolved "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz"
+ resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f"
integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==
dependencies:
semver "^6.0.0"
@@ -6743,12 +6642,12 @@
map-obj@^1.0.0, map-obj@^1.0.1:
version "1.0.1"
- resolved "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz"
+ resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-1.0.1.tgz#d933ceb9205d82bdcf4886f6742bdc2b4dea146d"
integrity sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=
map-obj@^4.0.0:
version "4.2.1"
- resolved "https://registry.npmjs.org/map-obj/-/map-obj-4.2.1.tgz"
+ resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-4.2.1.tgz#e4ea399dbc979ae735c83c863dd31bdf364277b7"
integrity sha512-+WA2/1sPmDj1dlvvJmB5G6JKfY9dpn7EVBUL06+y6PoljPkh+6V1QihwxNkbcGxCRjt2b0F9K0taiCuo7MbdFQ==
map-visit@^1.0.0:
@@ -6862,7 +6761,7 @@
meow@^9.0.0:
version "9.0.0"
- resolved "https://registry.npmjs.org/meow/-/meow-9.0.0.tgz"
+ resolved "https://registry.yarnpkg.com/meow/-/meow-9.0.0.tgz#cd9510bc5cac9dee7d03c73ee1f9ad959f4ea364"
integrity sha512-+obSblOQmRhcyBt62furQqRAQpNyWXo8BuQ5bN7dG8wmwQ+vwHKp/rCFD4CrTP8CsDQD1sjoZ94K417XEUk8IQ==
dependencies:
"@types/minimist" "^1.2.0"
@@ -6892,12 +6791,12 @@
merge-stream@^2.0.0:
version "2.0.0"
- resolved "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz"
+ resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60"
integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==
merge2@^1.2.3, merge2@^1.3.0:
version "1.4.1"
- resolved "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz"
+ resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae"
integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==
methods@~1.1.2:
@@ -6943,25 +6842,25 @@
snapdragon "^0.8.1"
to-regex "^3.0.2"
-micromatch@^4.0.2:
- version "4.0.2"
- resolved "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz"
- integrity sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==
+micromatch@^4.0.4:
+ version "4.0.4"
+ resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.4.tgz#896d519dfe9db25fce94ceb7a500919bf881ebf9"
+ integrity sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==
dependencies:
braces "^3.0.1"
- picomatch "^2.0.5"
+ picomatch "^2.2.3"
-mime-db@1.47.0, "mime-db@>= 1.43.0 < 2", mime-db@^1.28.0:
- version "1.47.0"
- resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.47.0.tgz#8cb313e59965d3c05cfbf898915a267af46a335c"
- integrity sha512-QBmA/G2y+IfeS4oktet3qRZ+P5kPhCKRXxXnQEudYqUaEioAU1/Lq2us3D/t1Jfo4hE9REQPrbB7K5sOczJVIw==
+mime-db@1.49.0, "mime-db@>= 1.43.0 < 2", mime-db@^1.28.0:
+ version "1.49.0"
+ resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.49.0.tgz#f3dfde60c99e9cf3bc9701d687778f537001cbed"
+ integrity sha512-CIc8j9URtOVApSFCQIF+VBkX1RwXp/oMMOrqdyXSBXq5RWNEsRfyj1kiRnQgmNXmHxPoFIxOroKA3zcU9P+nAA==
mime-types@^2.1.12, mime-types@~2.1.19, mime-types@~2.1.24:
- version "2.1.30"
- resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.30.tgz#6e7be8b4c479825f85ed6326695db73f9305d62d"
- integrity sha512-crmjA4bLtR8m9qLpHvgxSChT+XoSlZi8J4n/aIdn3z92e/U47Z0V/yl+Wh9W046GgFVAmoNR/fmdbZYcSSIUeg==
+ version "2.1.32"
+ resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.32.tgz#1d00e89e7de7fe02008db61001d9e02852670fd5"
+ integrity sha512-hJGaVS4G4c9TSMYh2n6SQAGrC4RnfU+daP8G7cSCmaqNjiOoUY0VHCMS42pxnQmVF1GWwFhbHWn3RIxCqTmZ9A==
dependencies:
- mime-db "1.47.0"
+ mime-db "1.49.0"
mime@1.4.1:
version "1.4.1"
@@ -6980,12 +6879,12 @@
mimic-fn@^2.1.0:
version "2.1.0"
- resolved "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz"
+ resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b"
integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==
mimic-response@^1.0.0, mimic-response@^1.0.1:
version "1.0.1"
- resolved "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz"
+ resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-1.0.1.tgz#4923538878eef42063cb8a3e3b0798781487ab1b"
integrity sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==
mimic-response@^3.1.0:
@@ -6995,7 +6894,7 @@
min-indent@^1.0.0:
version "1.0.1"
- resolved "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz"
+ resolved "https://registry.yarnpkg.com/min-indent/-/min-indent-1.0.1.tgz#a63f681673b30571fbe8bc25686ae746eefa9869"
integrity sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==
minimalistic-assert@^1.0.0:
@@ -7012,7 +6911,7 @@
"minimatch@2 || 3", minimatch@^3.0.0, minimatch@^3.0.2, minimatch@^3.0.3, minimatch@^3.0.4:
version "3.0.4"
- resolved "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz"
+ resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083"
integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==
dependencies:
brace-expansion "^1.1.7"
@@ -7026,7 +6925,7 @@
minimist-options@4.1.0:
version "4.1.0"
- resolved "https://registry.npmjs.org/minimist-options/-/minimist-options-4.1.0.tgz"
+ resolved "https://registry.yarnpkg.com/minimist-options/-/minimist-options-4.1.0.tgz#c0655713c53a8a2ebd77ffa247d342c40f010619"
integrity sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==
dependencies:
arrify "^1.0.1"
@@ -7040,7 +6939,7 @@
minimist@^1.1.3, minimist@^1.2.0, minimist@^1.2.5:
version "1.2.5"
- resolved "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz"
+ resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602"
integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==
mixin-deep@^1.2.0:
@@ -7051,7 +6950,7 @@
for-in "^1.0.2"
is-extendable "^1.0.1"
-mkdirp@^0.5.0, mkdirp@^0.5.1:
+mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@^0.5.4:
version "0.5.5"
resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def"
integrity sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==
@@ -7075,7 +6974,7 @@
ms@2.0.0:
version "2.0.0"
- resolved "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz"
+ resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8"
integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=
ms@2.1.1:
@@ -7085,7 +6984,7 @@
ms@2.1.2:
version "2.1.2"
- resolved "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz"
+ resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009"
integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==
ms@^2.1.1:
@@ -7094,14 +6993,14 @@
integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==
multer@^1.3.0:
- version "1.4.2"
- resolved "https://registry.yarnpkg.com/multer/-/multer-1.4.2.tgz#2f1f4d12dbaeeba74cb37e623f234bf4d3d2057a"
- integrity sha512-xY8pX7V+ybyUpbYMxtjM9KAiD9ixtg5/JkeKUTD6xilfDv0vzzOFcCp4Ljb1UU3tSOM3VTZtKo63OmzOrGi3Cg==
+ version "1.4.3"
+ resolved "https://registry.yarnpkg.com/multer/-/multer-1.4.3.tgz#4db352d6992e028ac0eacf7be45c6efd0264297b"
+ integrity sha512-np0YLKncuZoTzufbkM6wEKp68EhWJXcU6fq6QqrSwkckd2LlMgd1UqhUJLj6NS/5sZ8dE8LYDWslsltJznnXlg==
dependencies:
append-field "^1.0.0"
busboy "^0.2.11"
concat-stream "^1.5.2"
- mkdirp "^0.5.1"
+ mkdirp "^0.5.4"
object-assign "^4.1.1"
on-finished "^2.3.0"
type-is "^1.6.4"
@@ -7143,7 +7042,7 @@
mute-stream@0.0.8:
version "0.0.8"
- resolved "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz"
+ resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d"
integrity sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==
mz@^2.4.0, mz@^2.6.0:
@@ -7156,9 +7055,9 @@
thenify-all "^1.0.0"
nan@^2.12.1:
- version "2.14.2"
- resolved "https://registry.yarnpkg.com/nan/-/nan-2.14.2.tgz#f5376400695168f4cc694ac9393d0c9585eeea19"
- integrity sha512-M2ufzIiINKCuDfBSAUr1vWQ+vuVcA9kqx8JJUsbQi6yf1uGRyb7HfpdfUr5qLXf3B/t8dPvcjhKMmlfnP47EzQ==
+ version "2.15.0"
+ resolved "https://registry.yarnpkg.com/nan/-/nan-2.15.0.tgz#3f34a473ff18e15c1b5626b62903b5ad6e665fee"
+ integrity sha512-8ZtvEnA2c5aYCZYd1cvgdnU6cqwixRoYg70xPLWUws5ORTa/lnw+u4amixRS/Ac5U5mQVgp9pnlSUnbNWFaWZQ==
nanomatch@^1.2.9:
version "1.2.13"
@@ -7184,12 +7083,12 @@
natural-compare@^1.4.0:
version "1.4.0"
- resolved "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz"
+ resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7"
integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=
ncp@^2.0.0:
version "2.0.0"
- resolved "https://registry.npmjs.org/ncp/-/ncp-2.0.0.tgz"
+ resolved "https://registry.yarnpkg.com/ncp/-/ncp-2.0.0.tgz#195a21d6c46e361d2fb1281ba38b91e9df7bdbb3"
integrity sha1-GVoh1sRuNh0vsSgbo4uR6d9727M=
negotiator@0.6.2:
@@ -7214,10 +7113,10 @@
resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.1.tgz#045bd323631f76ed2e2b55573394416b639a0052"
integrity sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw==
-node-releases@^1.1.70:
- version "1.1.71"
- resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.71.tgz#cb1334b179896b1c89ecfdd4b725fb7bbdfc7dbb"
- integrity sha512-zR6HoT6LrLCRBwukmrVbHv0EpEQjksO6GmFcZQQuCAy139BEsoVKPYnf3jongYW83fAa1torLGYwxxky/p28sg==
+node-releases@^1.1.75:
+ version "1.1.75"
+ resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.75.tgz#6dd8c876b9897a1b8e5a02de26afa79bb54ebbfe"
+ integrity sha512-Qe5OUajvqrqDSy6wrWFmMwfJ0jVgwiw4T3KqmbTcZ62qW0gQkheXYhcFM1+lOVcGUoRxcEcfyvFMAnDgaF1VWw==
node-status-codes@^1.0.0:
version "1.0.0"
@@ -7234,7 +7133,7 @@
normalize-package-data@^2.3.2, normalize-package-data@^2.3.4, normalize-package-data@^2.5.0:
version "2.5.0"
- resolved "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz"
+ resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8"
integrity sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==
dependencies:
hosted-git-info "^2.1.4"
@@ -7243,12 +7142,12 @@
validate-npm-package-license "^3.0.1"
normalize-package-data@^3.0.0:
- version "3.0.2"
- resolved "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.2.tgz"
- integrity sha512-6CdZocmfGaKnIHPVFhJJZ3GuR8SsLKvDANFp47Jmy51aKIr8akjAWTSxtpI+MBgBFdSMRyo4hMpDlT6dTffgZg==
+ version "3.0.3"
+ resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-3.0.3.tgz#dbcc3e2da59509a0983422884cd172eefdfa525e"
+ integrity sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==
dependencies:
hosted-git-info "^4.0.1"
- resolve "^1.20.0"
+ is-core-module "^2.5.0"
semver "^7.3.4"
validate-npm-package-license "^3.0.1"
@@ -7265,9 +7164,14 @@
integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==
normalize-url@^4.1.0:
- version "4.5.0"
- resolved "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.0.tgz"
- integrity sha512-2s47yzUxdexf1OhyRi4Em83iQk0aPvwTddtFz4hnSSw9dCEsLEGf6SwIO8ss/19S9iBb5sJaOuTvTGDeZI00BQ==
+ version "4.5.1"
+ resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-4.5.1.tgz#0dd90cf1288ee1d1313b87081c9a5932ee48518a"
+ integrity sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA==
+
+normalize-url@^6.0.1:
+ version "6.1.0"
+ resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-6.1.0.tgz#40d0885b535deffe3f3147bec877d05fe4c5668a"
+ integrity sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==
npm-api@^1.0.0:
version "1.0.1"
@@ -7290,7 +7194,7 @@
npm-run-path@^4.0.0, npm-run-path@^4.0.1:
version "4.0.1"
- resolved "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz"
+ 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"
@@ -7326,14 +7230,14 @@
define-property "^0.2.5"
kind-of "^3.0.3"
-object-inspect@^1.9.0:
- version "1.9.0"
- resolved "https://registry.npmjs.org/object-inspect/-/object-inspect-1.9.0.tgz"
- integrity sha512-i3Bp9iTqwhaLZBxGkRfo5ZbE07BQRT7MGu8+nNgwW9ItGp1TzCTw2DLEoWwjClxBjOFI/hWljTAmYGCEwmtnOw==
+object-inspect@^1.11.0, object-inspect@^1.9.0:
+ version "1.11.0"
+ resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.11.0.tgz#9dceb146cedd4148a0d9e51ab88d34cf509922b1"
+ integrity sha512-jp7ikS6Sd3GxQfZJPyH3cjcbJF6GZPClgdV+EFygjFLQ5FmW/dRUnTd9PQ9k0JhoNDabWFbpF1yCdSWCC6gexg==
object-keys@^1.0.12, object-keys@^1.1.1:
version "1.1.1"
- resolved "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz"
+ resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e"
integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==
object-visit@^1.0.0:
@@ -7345,7 +7249,7 @@
object.assign@^4.1.0, object.assign@^4.1.2:
version "4.1.2"
- resolved "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz"
+ resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.2.tgz#0ed54a342eceb37b38ff76eb831a0e788cb63940"
integrity sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==
dependencies:
call-bind "^1.0.0"
@@ -7368,15 +7272,14 @@
dependencies:
isobject "^3.0.1"
-object.values@^1.1.1:
- version "1.1.3"
- resolved "https://registry.npmjs.org/object.values/-/object.values-1.1.3.tgz"
- integrity sha512-nkF6PfDB9alkOUxpf1HNm/QlkeW3SReqL5WXeBLpEJJnlPSvRaDQpW3gQTksTN3fgJX4hL42RzKyOin6ff3tyw==
+object.values@^1.1.4:
+ version "1.1.4"
+ resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.4.tgz#0d273762833e816b693a637d30073e7051535b30"
+ integrity sha512-TnGo7j4XSnKQoK3MfvkzqKCi0nVe/D9I9IjwTNYdb/fxYHpjrluHVOgw0AF6jrRFGMPHdfuidR09tIDiIvnaSg==
dependencies:
call-bind "^1.0.2"
define-properties "^1.1.3"
- es-abstract "^1.18.0-next.2"
- has "^1.0.3"
+ es-abstract "^1.18.2"
obuf@^1.0.0, obuf@^1.1.1:
version "1.1.2"
@@ -7402,7 +7305,7 @@
once@^1.3.0, once@^1.3.1, once@^1.4.0:
version "1.4.0"
- resolved "https://registry.npmjs.org/once/-/once-1.4.0.tgz"
+ resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1"
integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E=
dependencies:
wrappy "1"
@@ -7421,7 +7324,7 @@
onetime@^5.1.0, onetime@^5.1.2:
version "5.1.2"
- resolved "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz"
+ resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e"
integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==
dependencies:
mimic-fn "^2.1.0"
@@ -7435,7 +7338,7 @@
optionator@^0.9.1:
version "0.9.1"
- resolved "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz"
+ resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.1.tgz#4f236a6373dae0566a6d43e1326674f50c291499"
integrity sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==
dependencies:
deep-is "^0.1.3"
@@ -7473,7 +7376,7 @@
os-tmpdir@^1.0.0, os-tmpdir@^1.0.1, os-tmpdir@~1.0.1, os-tmpdir@~1.0.2:
version "1.0.2"
- resolved "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz"
+ resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274"
integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=
osenv@^0.1.0, osenv@^0.1.3:
@@ -7491,13 +7394,13 @@
p-cancelable@^1.0.0:
version "1.1.0"
- resolved "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz"
+ resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-1.1.0.tgz#d078d15a3af409220c886f1d9a0ca2e441ab26cc"
integrity sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==
p-cancelable@^2.0.0:
- version "2.1.0"
- resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-2.1.0.tgz#4d51c3b91f483d02a0d300765321fca393d758dd"
- integrity sha512-HAZyB3ZodPo+BDpb4/Iu7Jv4P6cSazBz9ZM0ChhEXp70scx834aWCEjQRwgt41UzzejUAPdbqqONfRWTPYrPAQ==
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-2.1.1.tgz#aab7fbd416582fa32a3db49859c122487c5ed2cf"
+ integrity sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==
p-finally@^1.0.0:
version "1.0.0"
@@ -7506,21 +7409,21 @@
p-limit@^1.1.0:
version "1.3.0"
- resolved "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz"
+ resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.3.0.tgz#b86bd5f0c25690911c7590fcbfc2010d54b3ccb8"
integrity sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==
dependencies:
p-try "^1.0.0"
p-limit@^2.0.0, p-limit@^2.2.0:
version "2.3.0"
- resolved "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz"
+ resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1"
integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==
dependencies:
p-try "^2.0.0"
p-locate@^2.0.0:
version "2.0.0"
- resolved "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz"
+ resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43"
integrity sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=
dependencies:
p-limit "^1.1.0"
@@ -7534,7 +7437,7 @@
p-locate@^4.1.0:
version "4.1.0"
- resolved "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz"
+ 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"
@@ -7553,12 +7456,12 @@
p-try@^1.0.0:
version "1.0.0"
- resolved "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz"
+ resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3"
integrity sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=
p-try@^2.0.0, p-try@^2.1.0:
version "2.2.0"
- resolved "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz"
+ resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6"
integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==
package-json@^2.0.0:
@@ -7583,7 +7486,7 @@
package-json@^6.3.0:
version "6.5.0"
- resolved "https://registry.npmjs.org/package-json/-/package-json-6.5.0.tgz"
+ resolved "https://registry.yarnpkg.com/package-json/-/package-json-6.5.0.tgz#6feedaca35e75725876d0b0e64974697fed145b0"
integrity sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ==
dependencies:
got "^9.6.0"
@@ -7612,7 +7515,7 @@
parent-module@^1.0.0:
version "1.0.1"
- resolved "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz"
+ resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2"
integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==
dependencies:
callsites "^3.0.0"
@@ -7629,7 +7532,7 @@
parse-json@^2.1.0, parse-json@^2.2.0:
version "2.2.0"
- resolved "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz"
+ resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9"
integrity sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=
dependencies:
error-ex "^1.2.0"
@@ -7644,7 +7547,7 @@
parse-json@^5.0.0:
version "5.2.0"
- resolved "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz"
+ resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd"
integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==
dependencies:
"@babel/code-frame" "^7.0.0"
@@ -7703,17 +7606,17 @@
path-exists@^3.0.0:
version "3.0.0"
- resolved "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz"
+ resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515"
integrity sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=
path-exists@^4.0.0:
version "4.0.0"
- resolved "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz"
+ 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.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz"
+ resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f"
integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18=
path-is-inside@^1.0.1, path-is-inside@^1.0.2:
@@ -7728,13 +7631,13 @@
path-key@^3.0.0, path-key@^3.1.0:
version "3.1.1"
- resolved "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz"
+ resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375"
integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==
path-parse@^1.0.6:
- version "1.0.6"
- resolved "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz"
- integrity sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==
+ 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"
@@ -7757,13 +7660,6 @@
pify "^2.0.0"
pinkie-promise "^2.0.0"
-path-type@^2.0.0:
- version "2.0.0"
- resolved "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz"
- integrity sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=
- dependencies:
- pify "^2.0.0"
-
path-type@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/path-type/-/path-type-3.0.0.tgz#cef31dc8e0a1a3bb0d105c0cd97cf3bf47f4e36f"
@@ -7773,7 +7669,7 @@
path-type@^4.0.0:
version "4.0.0"
- resolved "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz"
+ resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b"
integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==
peek-stream@^1.1.0:
@@ -7805,14 +7701,14 @@
resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b"
integrity sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=
-picomatch@^2.0.5, picomatch@^2.2.1:
- version "2.2.2"
- resolved "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz"
- integrity sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==
+picomatch@^2.2.3:
+ version "2.3.0"
+ resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.0.tgz#f1f061de8f6a4bf022892e2d128234fb98302972"
+ integrity sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==
pify@^2.0.0, pify@^2.3.0:
version "2.3.0"
- resolved "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz"
+ resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c"
integrity sha1-7RQaasBDqEnqWISY59yosVMw6Qw=
pify@^3.0.0:
@@ -7839,11 +7735,18 @@
pkg-dir@^2.0.0:
version "2.0.0"
- resolved "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz"
+ resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-2.0.0.tgz#f6d5d1109e19d63edf428e0bd57e12777615334b"
integrity sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=
dependencies:
find-up "^2.1.0"
+pkg-up@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/pkg-up/-/pkg-up-2.0.0.tgz#c819ac728059a461cab1c3889a2be3c49a004d7f"
+ integrity sha1-yBmscoBZpGHKscOImivjxJoATX8=
+ dependencies:
+ find-up "^2.1.0"
+
plist@^2.0.1:
version "2.1.0"
resolved "https://registry.yarnpkg.com/plist/-/plist-2.1.0.tgz#57ccdb7a0821df21831217a3cad54e3e146a1025"
@@ -8001,7 +7904,7 @@
polymer-cli@^1.9.11:
version "1.9.11"
- resolved "https://registry.npmjs.org/polymer-cli/-/polymer-cli-1.9.11.tgz"
+ resolved "https://registry.yarnpkg.com/polymer-cli/-/polymer-cli-1.9.11.tgz#0b5310732b787e07b811af96627ef0fd1263f5da"
integrity sha512-tiURjHDCOUUtDVPuVYvrfFI9PXe4OOUmBbn6Sg5GJNQ2POtP7r7hv+I5yI8P9qsxmalHTa19chVtf5/t9IBXDg==
dependencies:
"@octokit/rest" "^16.2.0"
@@ -8135,7 +8038,7 @@
prelude-ls@^1.2.1:
version "1.2.1"
- resolved "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz"
+ resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396"
integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==
prepend-http@^1.0.1:
@@ -8145,7 +8048,7 @@
prepend-http@^2.0.0:
version "2.0.0"
- resolved "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz"
+ resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-2.0.0.tgz#e92434bfa5ea8c19f41cdfd401d741a3c819d897"
integrity sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=
preserve@^0.2.0:
@@ -8155,7 +8058,7 @@
prettier-linter-helpers@^1.0.0:
version "1.0.0"
- resolved "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz"
+ resolved "https://registry.yarnpkg.com/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz#d23d41fe1375646de2d0104d3454a3008802cf7b"
integrity sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==
dependencies:
fast-diff "^1.1.2"
@@ -8166,9 +8069,9 @@
integrity sha512-p+vNbgpLjif/+D+DwAZAbndtRrR0md0MwfmOVN9N+2RgyACMT+7tfaRnT+WDPkqnuVwleyuBIG2XBxKDme3hPA==
prettier@^2.1.2:
- version "2.2.1"
- resolved "https://registry.npmjs.org/prettier/-/prettier-2.2.1.tgz"
- integrity sha512-PqyhM2yCjg/oKkFPtTGUojv7gnZAoG80ttl45O6x2Ug/rMJw4wcc9k6aaf2hibP7BGVCCM33gZoGjyvt9mm16Q==
+ version "2.3.2"
+ resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.3.2.tgz#ef280a05ec253712e486233db5c6f23441e7342d"
+ integrity sha512-lnJzDfJ66zkMy58OL5/NY5zp70S7Nz6KqcKkXYzn2tMVrNxvbqaBpg7H3qHaLxCJ5lNMsGuM8+ohS7cZrthdLQ==
pretty-bytes@^4.0.2:
version "4.0.2"
@@ -8187,12 +8090,12 @@
progress@2.0.3, progress@^2.0.0:
version "2.0.3"
- resolved "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz"
+ resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8"
integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==
protobufjs@6.8.8:
version "6.8.8"
- resolved "https://registry.npmjs.org/protobufjs/-/protobufjs-6.8.8.tgz"
+ resolved "https://registry.yarnpkg.com/protobufjs/-/protobufjs-6.8.8.tgz#c8b4f1282fd7a90e6f5b109ed11c84af82908e7c"
integrity sha512-AAmHtD5pXgZfi7GMpllpO3q1Xw1OYldr+dMUlAnffGTAhqkg72WdmSY71uKBF/JuyiKs8psYbtKrhi0ASCD8qw==
dependencies:
"@protobufjs/aspromise" "^1.1.2"
@@ -8210,11 +8113,11 @@
long "^4.0.0"
proxy-addr@~2.0.5:
- version "2.0.6"
- resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.6.tgz#fdc2336505447d3f2f2c638ed272caf614bbb2bf"
- integrity sha512-dh/frvCBVmSsDYzw6n926jv974gddhkFPfiN8hPOi30Wax25QZyZEGveluCgliBnqmuM+UJmBErbAUFIoDbjOw==
+ 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.1.2"
+ forwarded "0.2.0"
ipaddr.js "1.9.1"
pseudomap@^1.0.2:
@@ -8245,7 +8148,7 @@
pump@^3.0.0:
version "3.0.0"
- resolved "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz"
+ resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64"
integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==
dependencies:
end-of-stream "^1.1.0"
@@ -8267,12 +8170,12 @@
punycode@^2.1.0, punycode@^2.1.1:
version "2.1.1"
- resolved "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz"
+ resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec"
integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==
pupa@^2.1.1:
version "2.1.1"
- resolved "https://registry.npmjs.org/pupa/-/pupa-2.1.1.tgz"
+ resolved "https://registry.yarnpkg.com/pupa/-/pupa-2.1.1.tgz#f5e8fd4afc2c5d97828faa523549ed8744a20d62"
integrity sha512-l1jNAspIBSFqbT+y+5FosojNpVpF94nlI+wDUpqP9enwOTfHx9f0gh5nB96vl+6yTpsJsypeNrwfzPrKuHB41A==
dependencies:
escape-goat "^2.0.0"
@@ -8294,12 +8197,12 @@
queue-microtask@^1.2.2:
version "1.2.3"
- resolved "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz"
+ resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243"
integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==
quick-lru@^4.0.1:
version "4.0.1"
- resolved "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz"
+ resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-4.0.1.tgz#5b8878f113a58217848c6482026c73e1ba57727f"
integrity sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==
quick-lru@^5.1.1:
@@ -8333,7 +8236,7 @@
rc@^1.0.1, rc@^1.1.6, rc@^1.2.8:
version "1.2.8"
- resolved "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz"
+ resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed"
integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==
dependencies:
deep-extend "^0.6.0"
@@ -8365,13 +8268,13 @@
find-up "^1.0.0"
read-pkg "^1.0.0"
-read-pkg-up@^2.0.0:
- version "2.0.0"
- resolved "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz"
- integrity sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=
+read-pkg-up@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-3.0.0.tgz#3ed496685dba0f8fe118d0691dc51f4a1ff96f07"
+ integrity sha1-PtSWaF26D4/hGNBpHcUfSh/5bwc=
dependencies:
find-up "^2.0.0"
- read-pkg "^2.0.0"
+ read-pkg "^3.0.0"
read-pkg-up@^4.0.0:
version "4.0.0"
@@ -8391,7 +8294,7 @@
read-pkg-up@^7.0.1:
version "7.0.1"
- resolved "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz"
+ resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-7.0.1.tgz#f3a6135758459733ae2b95638056e1854e7ef507"
integrity sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==
dependencies:
find-up "^4.1.0"
@@ -8407,15 +8310,6 @@
normalize-package-data "^2.3.2"
path-type "^1.0.0"
-read-pkg@^2.0.0:
- version "2.0.0"
- resolved "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz"
- integrity sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=
- dependencies:
- load-json-file "^2.0.0"
- normalize-package-data "^2.3.2"
- path-type "^2.0.0"
-
read-pkg@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-3.0.0.tgz#9cbc686978fee65d16c00e2b19c237fcf6e38389"
@@ -8427,7 +8321,7 @@
read-pkg@^5.0.0, read-pkg@^5.2.0:
version "5.2.0"
- resolved "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz"
+ resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-5.2.0.tgz#7bf295438ca5a33e56cd30e053b34ee7250c93cc"
integrity sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==
dependencies:
"@types/normalize-package-data" "^2.4.0"
@@ -8503,7 +8397,7 @@
redent@^3.0.0:
version "3.0.0"
- resolved "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz"
+ resolved "https://registry.yarnpkg.com/redent/-/redent-3.0.0.tgz#e557b7998316bb53c9f1f56fa626352c6963059f"
integrity sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==
dependencies:
indent-string "^4.0.0"
@@ -8532,9 +8426,9 @@
integrity sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==
regenerator-runtime@^0.13.4:
- version "0.13.7"
- resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz#cac2dacc8a1ea675feaabaeb8ae833898ae46f55"
- integrity sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew==
+ version "0.13.9"
+ resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz#8925742a98ffd90814988d7566ad30ca3b263b52"
+ integrity sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==
regenerator-transform@^0.14.2:
version "0.14.5"
@@ -8559,9 +8453,9 @@
safe-regex "^1.1.0"
regexpp@^3.0.0, regexpp@^3.1.0:
- version "3.1.0"
- resolved "https://registry.npmjs.org/regexpp/-/regexpp-3.1.0.tgz"
- integrity sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q==
+ version "3.2.0"
+ resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.2.0.tgz#0425a2768d8f23bad70ca4b90461fa2f1213e1b2"
+ integrity sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==
regexpu-core@^4.7.1:
version "4.7.1"
@@ -8577,7 +8471,7 @@
regextras@^0.7.1:
version "0.7.1"
- resolved "https://registry.npmjs.org/regextras/-/regextras-0.7.1.tgz"
+ resolved "https://registry.yarnpkg.com/regextras/-/regextras-0.7.1.tgz#be95719d5f43f9ef0b9fa07ad89b7c606995a3b2"
integrity sha512-9YXf6xtW+qzQ+hcMQXx95MOvfqXFgsKDZodX3qZB0x2n5Z94ioetIITsBtvJbiOyxa/6s9AtyweBLCdPmPko/w==
registry-auth-token@^3.0.1:
@@ -8590,7 +8484,7 @@
registry-auth-token@^4.0.0:
version "4.2.1"
- resolved "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-4.2.1.tgz"
+ resolved "https://registry.yarnpkg.com/registry-auth-token/-/registry-auth-token-4.2.1.tgz#6d7b4006441918972ccd5fedcd41dc322c79b250"
integrity sha512-6gkSb4U6aWJB4SF2ZvLb76yCBjcvufXBqvvEx1HbmKPkutswjW1xNVRY0+daljIYRbogN7O0etYSlbiaEQyMyw==
dependencies:
rc "^1.2.8"
@@ -8604,7 +8498,7 @@
registry-url@^5.0.0:
version "5.1.0"
- resolved "https://registry.npmjs.org/registry-url/-/registry-url-5.1.0.tgz"
+ resolved "https://registry.yarnpkg.com/registry-url/-/registry-url-5.1.0.tgz#e98334b50d5434b81136b44ec638d9c2009c5009"
integrity sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw==
dependencies:
rc "^1.2.8"
@@ -8712,7 +8606,7 @@
require-from-string@^2.0.2:
version "2.0.2"
- resolved "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz"
+ 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==
requirejs@^2.3.4:
@@ -8726,9 +8620,9 @@
integrity sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=
resolve-alpn@^1.0.0:
- version "1.1.1"
- resolved "https://registry.yarnpkg.com/resolve-alpn/-/resolve-alpn-1.1.1.tgz#4a006a7d533c81a5dd04681612090fde227cd6e1"
- integrity sha512-0KbFjFPR2bnJhNx1t8Ad6RqVc8+QPJC4y561FYyC/Q/6OzB3fhUzB5PEgitYhPK6aifwR5gXBSnDMllaDWixGQ==
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/resolve-alpn/-/resolve-alpn-1.2.0.tgz#058bb0888d1cd4d12474e9a4b6eb17bdd5addc44"
+ integrity sha512-e4FNQs+9cINYMO5NMFc6kOUCdohjqFPSgMuwuZAOUWqrfWsen+Yjy5qZFkV5K7VO7tFSLKcUL97olkED7sCBHA==
resolve-dir@^0.1.0:
version "0.1.1"
@@ -8748,7 +8642,7 @@
resolve-from@^4.0.0:
version "4.0.0"
- resolved "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz"
+ resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6"
integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==
resolve-url@^0.2.1:
@@ -8756,9 +8650,9 @@
resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a"
integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=
-resolve@^1.1.6, resolve@^1.10.0, resolve@^1.10.1, resolve@^1.13.1, resolve@^1.17.0, resolve@^1.20.0, resolve@^1.5.0:
+resolve@^1.1.6, resolve@^1.10.0, resolve@^1.10.1, resolve@^1.20.0, resolve@^1.5.0:
version "1.20.0"
- resolved "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz"
+ resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.20.0.tgz#629a013fb3f70755d6f0b7935cc1c2c5378b1975"
integrity sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==
dependencies:
is-core-module "^2.2.0"
@@ -8766,7 +8660,7 @@
responselike@^1.0.2:
version "1.0.2"
- resolved "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz"
+ resolved "https://registry.yarnpkg.com/responselike/-/responselike-1.0.2.tgz#918720ef3b631c5642be068f15ade5a46f4ba1e7"
integrity sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec=
dependencies:
lowercase-keys "^1.0.0"
@@ -8788,7 +8682,7 @@
restore-cursor@^3.1.0:
version "3.1.0"
- resolved "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz"
+ resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-3.1.0.tgz#39f67c54b3a7a58cea5236d95cf0034239631f7e"
integrity sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==
dependencies:
onetime "^5.1.0"
@@ -8801,7 +8695,7 @@
reusify@^1.0.4:
version "1.0.4"
- resolved "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz"
+ resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76"
integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==
rimraf@^2.2.8, rimraf@^2.5.4, rimraf@^2.6.1, rimraf@^2.6.2, rimraf@^2.6.3:
@@ -8813,7 +8707,7 @@
rimraf@^3.0.0, rimraf@^3.0.2:
version "3.0.2"
- resolved "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz"
+ resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a"
integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==
dependencies:
glob "^7.1.3"
@@ -8835,20 +8729,20 @@
acorn "^7.1.0"
rollup@^2.45.2:
- version "2.45.2"
- resolved "https://registry.yarnpkg.com/rollup/-/rollup-2.45.2.tgz#8fb85917c9f35605720e92328f3ccbfba6f78b48"
- integrity sha512-kRRU7wXzFHUzBIv0GfoFFIN3m9oteY4uAsKllIpQDId5cfnkWF2J130l+27dzDju0E6MScKiV0ZM5Bw8m4blYQ==
+ version "2.56.3"
+ resolved "https://registry.yarnpkg.com/rollup/-/rollup-2.56.3.tgz#b63edadd9851b0d618a6d0e6af8201955a77aeff"
+ integrity sha512-Au92NuznFklgQCUcV96iXlxUbHuB1vQMaH76DHl5M11TotjOHwqk9CwcrT78+Tnv4FN9uTBxq6p4EJoYkpyekg==
optionalDependencies:
- fsevents "~2.3.1"
+ fsevents "~2.3.2"
run-async@^2.0.0, run-async@^2.2.0, run-async@^2.4.0:
version "2.4.1"
- resolved "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz"
+ resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.4.1.tgz#8440eccf99ea3e70bd409d49aab88e10c189a455"
integrity sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==
run-parallel@^1.1.9:
version "1.2.0"
- resolved "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz"
+ resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee"
integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==
dependencies:
queue-microtask "^1.2.2"
@@ -8860,7 +8754,7 @@
rxjs@^6.4.0, rxjs@^6.6.0:
version "6.6.7"
- resolved "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz"
+ resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.6.7.tgz#90ac018acabf491bf65044235d5863c4dab804c9"
integrity sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==
dependencies:
tslib "^1.9.0"
@@ -8884,7 +8778,7 @@
"safer-buffer@>= 2.1.2 < 3", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0:
version "2.1.2"
- resolved "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz"
+ resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a"
integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==
samsam@1.x, samsam@^1.1.3:
@@ -8914,20 +8808,20 @@
integrity sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo=
selenium-standalone@^6.7.0:
- version "6.23.0"
- resolved "https://registry.yarnpkg.com/selenium-standalone/-/selenium-standalone-6.23.0.tgz#91a7d12b1c8ba077a82b44323445c5882eb20ff1"
- integrity sha512-6dVLSEvbixd/MRSEmrcRQD8dmABrzNsxRqroKFQY+RVzm1JVPgGHIlo6qJzG6akfjc2V8SadHslE6lN4BFVM3w==
+ version "6.24.0"
+ resolved "https://registry.yarnpkg.com/selenium-standalone/-/selenium-standalone-6.24.0.tgz#cca7c1c36bfa3429078a8e6a1a4fd373f641a7c8"
+ integrity sha512-Dun2XgNAgCfJNrrSzuv7Z7Wj7QTvBKpqx0VXFz7bW9T9FUe5ytzgzoCEEshwDVMh0Dv6sCgdZg7VDhM/q2yPPQ==
dependencies:
commander "^2.20.3"
cross-spawn "^7.0.3"
debug "^4.3.1"
- got "^11.8.0"
+ got "^11.8.2"
lodash.mapvalues "^4.6.0"
lodash.merge "^4.6.2"
minimist "^1.2.5"
mkdirp "^1.0.4"
progress "2.0.3"
- tar-stream "2.1.4"
+ tar-stream "2.2.0"
which "^2.0.2"
yauzl "^2.10.0"
@@ -8940,27 +8834,27 @@
semver-diff@^3.1.1:
version "3.1.1"
- resolved "https://registry.npmjs.org/semver-diff/-/semver-diff-3.1.1.tgz"
+ resolved "https://registry.yarnpkg.com/semver-diff/-/semver-diff-3.1.1.tgz#05f77ce59f325e00e2706afd67bb506ddb1ca32b"
integrity sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg==
dependencies:
semver "^6.3.0"
-"semver@2 || 3 || 4 || 5", semver@5.6.0, semver@^5.3.0:
- version "5.6.0"
- resolved "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz"
- integrity sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==
-
-semver@^5.0.3, semver@^5.1.0, semver@^5.5.0:
+"semver@2 || 3 || 4 || 5", semver@^5.0.3, semver@^5.1.0, semver@^5.3.0, semver@^5.5.0:
version "5.7.1"
resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7"
integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==
+semver@5.6.0:
+ version "5.6.0"
+ resolved "https://registry.yarnpkg.com/semver/-/semver-5.6.0.tgz#7e74256fbaa49c75aa7c7a205cc22799cac80004"
+ integrity sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==
+
semver@^6.0.0, semver@^6.1.0, semver@^6.2.0, semver@^6.3.0:
version "6.3.0"
- resolved "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz"
+ resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d"
integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==
-semver@^7.1.3, semver@^7.2.1, semver@^7.3.2, semver@^7.3.4, semver@^7.3.5:
+semver@^7.1.3, semver@^7.2.1, semver@^7.3.4, semver@^7.3.5:
version "7.3.5"
resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.5.tgz#0b621c879348d8998e4b0e4be94b3f12e6018ef7"
integrity sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==
@@ -9026,9 +8920,9 @@
integrity sha1-3hnuc77yGrPAdAo3sz22JGS6ves=
set-getter@^0.1.0:
- version "0.1.0"
- resolved "https://registry.yarnpkg.com/set-getter/-/set-getter-0.1.0.tgz#d769c182c9d5a51f409145f2fba82e5e86e80376"
- integrity sha1-12nBgsnVpR9AkUXy+6guXoboA3Y=
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/set-getter/-/set-getter-0.1.1.tgz#a3110e1b461d31a9cfc8c5c9ee2e9737ad447102"
+ integrity sha512-9sVWOy+gthr+0G9DzqqLaYNA7+5OKkSmcqjL9cBpDEaZrr3ShQlyX2cZ/O/ozE41oxn/Tt0LGEM/w4Rub3A3gw==
dependencies:
to-object-path "^0.3.0"
@@ -9073,7 +8967,7 @@
shebang-command@^2.0.0:
version "2.0.0"
- resolved "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz"
+ 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"
@@ -9085,7 +8979,7 @@
shebang-regex@^3.0.0:
version "3.0.0"
- resolved "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz"
+ resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172"
integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==
shelljs@^0.8.0, shelljs@^0.8.4:
@@ -9097,9 +8991,18 @@
interpret "^1.0.0"
rechoir "^0.6.2"
+side-channel@^1.0.4:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf"
+ integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==
+ dependencies:
+ call-bind "^1.0.0"
+ get-intrinsic "^1.0.2"
+ object-inspect "^1.9.0"
+
signal-exit@^3.0.0, signal-exit@^3.0.2, signal-exit@^3.0.3:
version "3.0.3"
- resolved "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz"
+ resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.3.tgz#a1410c2edd8f077b08b4e253c8eacfcaf057461c"
integrity sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==
simple-swizzle@^0.2.2:
@@ -9140,12 +9043,12 @@
slash@^3.0.0:
version "3.0.0"
- resolved "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz"
+ resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634"
integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==
slice-ansi@^4.0.0:
version "4.0.0"
- resolved "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz"
+ resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-4.0.0.tgz#500e8dd0fd55b05815086255b3195adf2a45fe6b"
integrity sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==
dependencies:
ansi-styles "^4.0.0"
@@ -9266,7 +9169,7 @@
source-map-support@0.5.9:
version "0.5.9"
- resolved "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.9.tgz"
+ resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.9.tgz#41bc953b2534267ea2d605bccfa7bfa3111ced5f"
integrity sha512-gR6Rw4MvUlYy83vP0vxoVNzM6t8MUXqNuRsuBmBHQDu1Fh6X015FrLdgoDKcNdkwGubozq0P4N0Q37UyFVr1EA==
dependencies:
buffer-from "^1.0.0"
@@ -9292,7 +9195,7 @@
source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.0, source-map@~0.6.1:
version "0.6.1"
- resolved "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz"
+ resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263"
integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==
source-map@~0.7.2:
@@ -9310,7 +9213,7 @@
spdx-correct@^3.0.0:
version "3.1.1"
- resolved "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz"
+ resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.1.1.tgz#dece81ac9c1e6713e5f7d1b6f17d468fa53d89a9"
integrity sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==
dependencies:
spdx-expression-parse "^3.0.0"
@@ -9318,21 +9221,21 @@
spdx-exceptions@^2.1.0:
version "2.3.0"
- resolved "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz"
+ resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz#3f28ce1a77a00372683eade4a433183527a2163d"
integrity sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==
spdx-expression-parse@^3.0.0, spdx-expression-parse@^3.0.1:
version "3.0.1"
- resolved "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz"
+ resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz#cf70f50482eefdc98e3ce0a6833e4a53ceeba679"
integrity sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==
dependencies:
spdx-exceptions "^2.1.0"
spdx-license-ids "^3.0.0"
spdx-license-ids@^3.0.0:
- version "3.0.7"
- resolved "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.7.tgz"
- integrity sha512-U+MTEOO0AiDzxwFvoa4JVnMV6mZlJKk2sBLt90s7G0Gd0Mlknc7kxEn3nuDPNZRta7O2uy8oLcZLVT+4sqNZHQ==
+ version "3.0.10"
+ resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.10.tgz#0d9becccde7003d6c658d487dd48a32f0bf3014b"
+ integrity sha512-oie3/+gKf7QtpitB0LYLETe+k8SifzsX4KixvpOsbI6S0kRiRQ5MKOio8eMSAKQ17N06+wdEOXRiId+zOxo0hA==
spdy-transport@^2.0.18:
version "2.1.1"
@@ -9368,7 +9271,7 @@
sprintf-js@~1.0.2:
version "1.0.3"
- resolved "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz"
+ resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c"
integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=
sshpk@^1.7.0:
@@ -9463,7 +9366,7 @@
string-width@^3.0.0:
version "3.1.0"
- resolved "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz"
+ resolved "https://registry.yarnpkg.com/string-width/-/string-width-3.1.0.tgz#22767be21b62af1081574306f69ac51b62203961"
integrity sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==
dependencies:
emoji-regex "^7.0.1"
@@ -9472,7 +9375,7 @@
string-width@^4.0.0, string-width@^4.1.0, string-width@^4.2.0:
version "4.2.2"
- resolved "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz"
+ resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.2.tgz#dafd4f9559a7585cfba529c6a0a4f73488ebd4c5"
integrity sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==
dependencies:
emoji-regex "^8.0.0"
@@ -9481,7 +9384,7 @@
string.prototype.trimend@^1.0.4:
version "1.0.4"
- resolved "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz"
+ resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz#e75ae90c2942c63504686c18b287b4a0b1a45f80"
integrity sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A==
dependencies:
call-bind "^1.0.2"
@@ -9489,7 +9392,7 @@
string.prototype.trimstart@^1.0.4:
version "1.0.4"
- resolved "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz"
+ resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz#b36399af4ab2999b4c9c648bd7a3fb2bb26feeed"
integrity sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw==
dependencies:
call-bind "^1.0.2"
@@ -9530,14 +9433,14 @@
strip-ansi@^5.1.0:
version "5.2.0"
- resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz"
+ resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae"
integrity sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==
dependencies:
ansi-regex "^4.1.0"
strip-ansi@^6.0.0:
version "6.0.0"
- resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz"
+ resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.0.tgz#0b1571dd7669ccd4f3e06e14ef1eed26225ae532"
integrity sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==
dependencies:
ansi-regex "^5.0.0"
@@ -9579,7 +9482,7 @@
strip-bom@^3.0.0:
version "3.0.0"
- resolved "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz"
+ resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3"
integrity sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=
strip-eof@^1.0.0:
@@ -9589,7 +9492,7 @@
strip-final-newline@^2.0.0:
version "2.0.0"
- resolved "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz"
+ resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad"
integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==
strip-indent@^1.0.1:
@@ -9606,19 +9509,19 @@
strip-indent@^3.0.0:
version "3.0.0"
- resolved "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz"
+ resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-3.0.0.tgz#c32e1cee940b6b3432c771bc2c54bcce73cd3001"
integrity sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==
dependencies:
min-indent "^1.0.0"
strip-json-comments@^3.1.0, strip-json-comments@^3.1.1:
version "3.1.1"
- resolved "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz"
+ resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006"
integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==
strip-json-comments@~2.0.1:
version "2.0.1"
- resolved "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz"
+ resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a"
integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo=
supports-color@^2.0.0:
@@ -9628,14 +9531,14 @@
supports-color@^5.3.0:
version "5.5.0"
- resolved "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz"
+ resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f"
integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==
dependencies:
has-flag "^3.0.0"
supports-color@^7.1.0:
version "7.2.0"
- resolved "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz"
+ 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"
@@ -9675,20 +9578,17 @@
typical "^2.6.1"
wordwrapjs "^3.0.0"
-table@^6.0.4:
- version "6.0.9"
- resolved "https://registry.npmjs.org/table/-/table-6.0.9.tgz"
- integrity sha512-F3cLs9a3hL1Z7N4+EkSscsel3z55XT950AvB05bwayrNg5T1/gykXtigioTAjbltvbMSJvvhFCbnf6mX+ntnJQ==
+table@^6.0.9:
+ version "6.7.1"
+ resolved "https://registry.yarnpkg.com/table/-/table-6.7.1.tgz#ee05592b7143831a8c94f3cee6aae4c1ccef33e2"
+ integrity sha512-ZGum47Yi6KOOFDE8m223td53ath2enHcYLgOCjGr5ngu8bdIARQk6mN/wRMv4yMRcHnCSnHbCEha4sobQx5yWg==
dependencies:
ajv "^8.0.1"
- is-boolean-object "^1.1.0"
- is-number-object "^1.0.4"
- is-string "^1.0.5"
lodash.clonedeep "^4.5.0"
- lodash.flatten "^4.4.0"
lodash.truncate "^4.4.2"
slice-ansi "^4.0.0"
string-width "^4.2.0"
+ strip-ansi "^6.0.0"
tar-fs@^1.12.0:
version "1.16.3"
@@ -9700,10 +9600,10 @@
pump "^1.0.0"
tar-stream "^1.1.2"
-tar-stream@2.1.4:
- version "2.1.4"
- resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-2.1.4.tgz#c4fb1a11eb0da29b893a5b25476397ba2d053bfa"
- integrity sha512-o3pS2zlG4gxr67GmFYBLlq+dM8gyRGUOvsrHclSkvtVtQbjV0s/+ZE8OpICbaj8clrX3tjeHngYGP7rweaBnuw==
+tar-stream@2.2.0, tar-stream@^2.1.0:
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-2.2.0.tgz#acad84c284136b060dc3faa64474aa9aebd77287"
+ integrity sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==
dependencies:
bl "^4.0.3"
end-of-stream "^1.4.1"
@@ -9724,17 +9624,6 @@
to-buffer "^1.1.1"
xtend "^4.0.0"
-tar-stream@^2.1.0:
- version "2.2.0"
- resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-2.2.0.tgz#acad84c284136b060dc3faa64474aa9aebd77287"
- integrity sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==
- dependencies:
- bl "^4.0.3"
- end-of-stream "^1.4.1"
- fs-constants "^1.0.0"
- inherits "^2.0.3"
- readable-stream "^3.1.1"
-
temp@^0.8.1, temp@^0.8.3:
version "0.8.4"
resolved "https://registry.yarnpkg.com/temp/-/temp-0.8.4.tgz#8c97a33a4770072e0a05f919396c7665a7dd59f2"
@@ -9760,9 +9649,9 @@
through2 "^2.0.1"
terser@^5.6.1:
- version "5.6.1"
- resolved "https://registry.yarnpkg.com/terser/-/terser-5.6.1.tgz#a48eeac5300c0a09b36854bf90d9c26fb201973c"
- integrity sha512-yv9YLFQQ+3ZqgWCUk+pvNJwgUTdlIxUk1WTN+RnaFJe2L7ipG2csPT0ra2XRm7Cs8cxN7QXmK1rFzEwYEQkzXw==
+ version "5.7.2"
+ resolved "https://registry.yarnpkg.com/terser/-/terser-5.7.2.tgz#d4d95ed4f8bf735cb933e802f2a1829abf545e3f"
+ integrity sha512-0Omye+RD4X7X69O0eql3lC4Heh/5iLj3ggxR/B5ketZLOtLiOqukUgjw3q4PDnNQbsrkKr3UMypqStQG3XKRvw==
dependencies:
commander "^2.20.0"
source-map "~0.7.2"
@@ -9780,7 +9669,7 @@
text-table@^0.2.0:
version "0.2.0"
- resolved "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz"
+ resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4"
integrity sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=
textextensions@^2.5.0:
@@ -9844,7 +9733,7 @@
"through@>=2.2.7 <3", through@^2.3.6:
version "2.3.8"
- resolved "https://registry.npmjs.org/through/-/through-2.3.8.tgz"
+ resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5"
integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=
timed-out@^3.0.0:
@@ -9866,7 +9755,7 @@
tmp@^0.0.33:
version "0.0.33"
- resolved "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz"
+ resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9"
integrity sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==
dependencies:
os-tmpdir "~1.0.2"
@@ -9907,7 +9796,7 @@
to-readable-stream@^1.0.0:
version "1.0.0"
- resolved "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-1.0.0.tgz"
+ resolved "https://registry.yarnpkg.com/to-readable-stream/-/to-readable-stream-1.0.0.tgz#ce0aa0c2f3df6adf852efb404a783e77c0475771"
integrity sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==
to-regex-range@^2.1.0:
@@ -9920,7 +9809,7 @@
to-regex-range@^5.0.1:
version "5.0.1"
- resolved "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz"
+ 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"
@@ -9969,9 +9858,9 @@
integrity sha1-WIeWa7WCpFA6QetST301ARgVphM=
trim-newlines@^3.0.0:
- version "3.0.0"
- resolved "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.0.tgz"
- integrity sha512-C4+gOpvmxaSMKuEf9Qc134F1ZuOHVXKRbtEflf4NTtuuJDEIJ9p5PXsalL8SkeRw+qit1Mo+yuvMPAKwWg/1hA==
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-3.0.1.tgz#260a5d962d8b752425b32f3a7db0dcacd176c144"
+ integrity sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==
trim-right@^1.0.1:
version "1.0.1"
@@ -9983,10 +9872,10 @@
resolved "https://registry.yarnpkg.com/triple-beam/-/triple-beam-1.3.0.tgz#a595214c7298db8339eeeee083e4d10bd8cb8dd9"
integrity sha512-XrHUvV5HpdLmIj4uVMxHggLbFSZYIn7HEWsqePZcI50pco+MPqJ50wMGY794X7AOOhxOBAjbkqfAbEe/QMp2Lw==
-tsconfig-paths@^3.9.0:
- version "3.9.0"
- resolved "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.9.0.tgz"
- integrity sha512-dRcuzokWhajtZWkQsDVKbWyY+jgcLC5sqJhg2PSgf4ZkH2aHPvaOY8YWGhmjb68b5qqTfasSsDO9k7RUiEmZAw==
+tsconfig-paths@^3.11.0:
+ version "3.11.0"
+ resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.11.0.tgz#954c1fe973da6339c78e06b03ce2e48810b65f36"
+ integrity sha512-7ecdYDnIdmv639mmDwslG6KQg1Z9STTz1j7Gcz0xa+nshh/gKDAHcPxRbWOsA3SPp0tXP2leTcY9Kw+NAkfZzA==
dependencies:
"@types/json5" "^0.0.29"
json5 "^1.0.1"
@@ -9995,17 +9884,17 @@
tslib@^1.8.1, tslib@^1.9.0:
version "1.14.1"
- resolved "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz"
+ resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00"
integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==
tsutils@2.27.2:
version "2.27.2"
- resolved "https://registry.npmjs.org/tsutils/-/tsutils-2.27.2.tgz"
+ resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-2.27.2.tgz#60ba88a23d6f785ec4b89c6e8179cac9b431f1c7"
integrity sha512-qf6rmT84TFMuxAKez2pIfR8UCai49iQsfB7YWVjV1bKpy/d0PWT5rEOSM6La9PiHZ0k1RRZQiwVdVJfQ3BPHgg==
dependencies:
tslib "^1.8.1"
-tsutils@^3.17.1, tsutils@^3.21.0:
+tsutils@^3.21.0:
version "3.21.0"
resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.21.0.tgz#b48717d394cea6c1e096983eed58e9d61715b623"
integrity sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==
@@ -10036,7 +9925,7 @@
type-check@^0.4.0, type-check@~0.4.0:
version "0.4.0"
- resolved "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz"
+ resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1"
integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==
dependencies:
prelude-ls "^1.2.1"
@@ -10048,27 +9937,27 @@
type-fest@^0.18.0:
version "0.18.1"
- resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz"
+ resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.18.1.tgz#db4bc151a4a2cf4eebf9add5db75508db6cc841f"
integrity sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==
type-fest@^0.20.2:
version "0.20.2"
- resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz"
+ resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4"
integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==
type-fest@^0.21.3:
version "0.21.3"
- resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz"
+ resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.21.3.tgz#d260a24b0198436e133fa26a524a6d65fa3b2e37"
integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==
type-fest@^0.6.0:
version "0.6.0"
- resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz"
+ resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.6.0.tgz#8d2a2370d3df886eb5c90ada1c5bf6188acf838b"
integrity sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==
type-fest@^0.8.1:
version "0.8.1"
- resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz"
+ resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d"
integrity sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==
type-is@^1.6.4, type-is@~1.6.17, type-is@~1.6.18:
@@ -10081,7 +9970,7 @@
typedarray-to-buffer@^3.1.5:
version "3.1.5"
- resolved "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz"
+ resolved "https://registry.yarnpkg.com/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz#a97ee7a9ff42691b9f783ff1bc5112fe3fca9080"
integrity sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==
dependencies:
is-typedarray "^1.0.0"
@@ -10124,9 +10013,9 @@
commander "~2.19.0"
source-map "~0.6.1"
-unbox-primitive@^1.0.0:
+unbox-primitive@^1.0.1:
version "1.0.1"
- resolved "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.1.tgz"
+ resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.1.tgz#085e215625ec3162574dc8859abee78a59b14471"
integrity sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw==
dependencies:
function-bind "^1.1.1"
@@ -10135,9 +10024,9 @@
which-boxed-primitive "^1.0.2"
underscore@^1.8.3:
- version "1.13.0"
- resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.13.0.tgz#3ccdcbb824230fc6bf234ad0ddcd83dff4eafe5f"
- integrity sha512-sCs4H3pCytsb5K7i072FAEC9YlSYFIbosvM0tAKAlpSSUgD7yC1iXSEGdl5XrDKQ1YUB+p/HDzYrSG2H2Vl36g==
+ version "1.13.1"
+ resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.13.1.tgz#0c1c6bd2df54b6b69f2314066d65b6cde6fcf9d1"
+ integrity sha512-hzSoAVtJF+3ZtiFX0VgfFPHEDRm7Y/QPjGyNo4TVdnDTdft3tr8hEkD25a1jC+TjTuE7tkHGKkhwCgs9dgBB2g==
underscore@~1.6.0:
version "1.6.0"
@@ -10194,7 +10083,7 @@
unique-string@^2.0.0:
version "2.0.0"
- resolved "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz"
+ resolved "https://registry.yarnpkg.com/unique-string/-/unique-string-2.0.0.tgz#39c6451f81afb2749de2b233e3f7c5e8843bd89d"
integrity sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==
dependencies:
crypto-random-string "^2.0.0"
@@ -10278,7 +10167,7 @@
update-notifier@^5.0.0:
version "5.1.0"
- resolved "https://registry.npmjs.org/update-notifier/-/update-notifier-5.1.0.tgz"
+ resolved "https://registry.yarnpkg.com/update-notifier/-/update-notifier-5.1.0.tgz#4ab0d7c7f36a231dd7316cf7729313f0214d9ad9"
integrity sha512-ItnICHbeMh9GqUy31hFPrD1kcuZ3rpxDZbf4KUDavXwS0bW5m7SLbDQpGX3UYr072cbrF5hFUs3r5tUsPwjfHw==
dependencies:
boxen "^5.0.0"
@@ -10303,15 +10192,15 @@
uri-js@^4.2.2:
version "4.4.1"
- resolved "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz"
+ resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e"
integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==
dependencies:
punycode "^2.1.0"
urijs@^1.16.1:
- version "1.19.6"
- resolved "https://registry.yarnpkg.com/urijs/-/urijs-1.19.6.tgz#51f8cb17ca16faefb20b9a31ac60f84aa2b7c870"
- integrity sha512-eSXsXZ2jLvGWeLYlQA3Gh36BcjF+0amo92+wHPyN1mdR8Nxf75fuEuYTd9c0a+m/vhCjRK0ESlE9YNLW+E1VEw==
+ version "1.19.7"
+ resolved "https://registry.yarnpkg.com/urijs/-/urijs-1.19.7.tgz#4f594e59113928fea63c00ce688fb395b1168ab9"
+ integrity sha512-Id+IKjdU0Hx+7Zx717jwLPsPeUqz7rAtuVBRLLs+qn+J2nf9NGITWVCxcijgYxBqe83C7sqsQPs6H1pyz3x9gA==
urix@^0.1.0:
version "0.1.0"
@@ -10327,7 +10216,7 @@
url-parse-lax@^3.0.0:
version "3.0.0"
- resolved "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz"
+ resolved "https://registry.yarnpkg.com/url-parse-lax/-/url-parse-lax-3.0.0.tgz#16b5cafc07dbe3676c1b1999177823d6503acb0c"
integrity sha1-FrXK/Afb42dsGxmZF3gj1lA6yww=
dependencies:
prepend-http "^2.0.0"
@@ -10364,7 +10253,7 @@
v8-compile-cache@^2.0.3:
version "2.3.0"
- resolved "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz"
+ resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz#2de19618c66dc247dcfb6f99338035d8245a2cee"
integrity sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==
vali-date@^1.0.0:
@@ -10383,7 +10272,7 @@
validate-npm-package-license@^3.0.1:
version "3.0.4"
- resolved "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz"
+ resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a"
integrity sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==
dependencies:
spdx-correct "^3.0.0"
@@ -10573,7 +10462,7 @@
which-boxed-primitive@^1.0.2:
version "1.0.2"
- resolved "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz"
+ resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz#13757bc89b209b049fe5d86430e21cf40a89a8e6"
integrity sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==
dependencies:
is-bigint "^1.0.1"
@@ -10591,7 +10480,7 @@
which@^2.0.1, which@^2.0.2:
version "2.0.2"
- resolved "https://registry.npmjs.org/which/-/which-2.0.2.tgz"
+ resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1"
integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==
dependencies:
isexe "^2.0.0"
@@ -10612,7 +10501,7 @@
widest-line@^3.1.0:
version "3.1.0"
- resolved "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz"
+ resolved "https://registry.yarnpkg.com/widest-line/-/widest-line-3.1.0.tgz#8292333bbf66cb45ff0de1603b136b7ae1496eca"
integrity sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==
dependencies:
string-width "^4.0.0"
@@ -10658,7 +10547,7 @@
word-wrap@^1.2.3:
version "1.2.3"
- resolved "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz"
+ resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c"
integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==
wordwrap@^0.0.3:
@@ -10676,7 +10565,7 @@
wrap-ansi@^7.0.0:
version "7.0.0"
- resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz"
+ 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"
@@ -10685,7 +10574,7 @@
wrappy@1:
version "1.0.2"
- resolved "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz"
+ resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f"
integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=
write-file-atomic@^1.1.2:
@@ -10708,7 +10597,7 @@
write-file-atomic@^3.0.0, write-file-atomic@^3.0.3:
version "3.0.3"
- resolved "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz"
+ resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-3.0.3.tgz#56bd5c5a5c70481cd19c571bd39ab965a5de56e8"
integrity sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==
dependencies:
imurmurhash "^0.1.4"
@@ -10717,9 +10606,9 @@
typedarray-to-buffer "^3.1.5"
ws@~7.4.2:
- version "7.4.4"
- resolved "https://registry.yarnpkg.com/ws/-/ws-7.4.4.tgz#383bc9742cb202292c9077ceab6f6047b17f2d59"
- integrity sha512-Qm8k8ojNQIMx7S+Zp8u/uHOx7Qazv3Yv4q68MiWWWOJhiwG5W3x7iqmRtJo8xxrciZUY4vRxUTJCKuRnF28ZZw==
+ version "7.4.6"
+ resolved "https://registry.yarnpkg.com/ws/-/ws-7.4.6.tgz#5654ca8ecdeee47c33a9a4bf6d28e2be2980377c"
+ integrity sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==
xdg-basedir@^2.0.0:
version "2.0.0"
@@ -10735,7 +10624,7 @@
xdg-basedir@^4.0.0:
version "4.0.0"
- resolved "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-4.0.0.tgz"
+ resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-4.0.0.tgz#4bc8d9984403696225ef83a1573cbbcb4e79db13"
integrity sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==
xmlbuilder@8.2.2:
@@ -10748,10 +10637,10 @@
resolved "https://registry.yarnpkg.com/xmldom/-/xmldom-0.1.31.tgz#b76c9a1bd9f0a9737e5a72dc37231cf38375e2ff"
integrity sha512-yS2uJflVQs6n+CyjHoaBmVSqIDevTAWrzMmjG1Gc7h1qQ7uVozNhEPJAwZXWyGQ/Gafo3fCwrcaokezLPupVyQ==
-xmlhttprequest-ssl@~1.5.4:
- version "1.5.5"
- resolved "https://registry.yarnpkg.com/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.5.tgz#c2876b06168aadc40e57d97e81191ac8f4398b3e"
- integrity sha1-wodrBhaKrcQOV9l+gRkayPQ5iz4=
+xmlhttprequest-ssl@~1.6.2:
+ version "1.6.3"
+ resolved "https://registry.yarnpkg.com/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.6.3.tgz#03b713873b01659dfa2c1c5d056065b27ddc2de6"
+ integrity sha512-3XfeQE/wNkvrIktn2Kf0869fC0BN6UpydVasGIeSm2B1Llihf7/0UfZM+eCkOw3P7bP4+qPgqhm7ZoxuJtFU0Q==
"xtend@>=4.0.0 <4.1.0-0", xtend@^4.0.0, xtend@~4.0.0, xtend@~4.0.1:
version "4.0.2"
@@ -10765,13 +10654,13 @@
yallist@^4.0.0:
version "4.0.0"
- resolved "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz"
+ resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72"
integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==
yargs-parser@^20.2.3:
- version "20.2.7"
- resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.7.tgz"
- integrity sha512-FiNkvbeHzB/syOjIUxFDCnhSfzAL8R5vs40MgLFBorXACCOAEaWu0gRZl14vG8MR9AOJIZbmkjhusqBYZ3HTHw==
+ 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==
yauzl@^2.10.0:
version "2.10.0"