From c28d99ee98ea9ccaa44ab7548d49c2f12b257c56 Mon Sep 17 00:00:00 2001 From: bglynn Date: Fri, 19 Jan 2024 11:32:12 -0800 Subject: [PATCH 01/18] Initial restructuring to move towards a more linear user flow in the docs. --- .gitignore | 1 + .../AWS IAM/Examples}/_category_.json | 2 +- .../AWS IAM/Examples}/aws-iam-eks.mdx | 4 +- docs/access-types/AWS IAM/Overview.mdx | 8 +++ docs/access-types/AWS IAM/Reference.mdx | 4 ++ docs/access-types/AWS IAM/_category_.json | 5 ++ .../Istio/Examples/_category_.json | 5 ++ .../k8s-istio-authorization-policies.mdx | 14 ++-- .../Istio/Examples}/k8s-istio-watcher.mdx | 16 ++--- docs/access-types/Istio/Overview.mdx | 4 ++ docs/access-types/Istio/Reference.mdx | 4 ++ docs/access-types/Istio/_category_.json | 5 ++ .../Kafka/Examples/_category_.json | 5 ++ .../Kafka/Examples}/k8s-kafka-mapping.mdx | 10 +-- .../Examples}/k8s-kafka-mtls-cert-manager.mdx | 28 ++++---- .../Kafka/Examples}/k8s-kafka-mtls.mdx | 24 +++---- docs/access-types/Kafka/Overview.mdx | 4 ++ docs/access-types/Kafka/Reference.mdx | 4 ++ docs/access-types/Kafka/_category_.json | 5 ++ .../Networking/Examples/_category_.json | 5 ++ .../Networking/Examples}/aws-eks-cni-mini.mdx | 14 ++-- .../Examples}/k8s-network-mapper.mdx | 14 ++-- .../Examples}/k8s-network-policies.mdx | 22 +++--- .../protect-1-service-network-policies.mdx | 13 ++-- docs/access-types/Networking/Overview.mdx | 4 ++ .../Reference/Network-Policies-Deep-Dive.mdx} | 2 +- .../Networking/Reference/README.mdx | 4 ++ docs/access-types/Networking/_category_.json | 5 ++ .../Postgres/Examples/_category_.json | 5 ++ .../Postgres/Examples}/postgres.mdx | 0 docs/access-types/Postgres/Overview.mdx | 4 ++ docs/access-types/Postgres/Reference.mdx | 4 ++ .../Postgres}/_category_.json | 2 +- docs/access-types/README.mdx | 4 ++ docs/access-types/_category_.json | 5 ++ docs/getting-started/README.mdx | 4 +- docs/getting-started/_category_.json | 3 +- docs/guides/_category_.json | 5 -- docs/overview/README.mdx | 4 ++ docs/overview/_category_.json | 4 ++ docs/{ => overview}/installation/README.mdx | 12 ++-- .../intent-based-access-control.mdx} | 8 +-- docs/{ => overview}/otterize-cloud/README.mdx | 0 .../otterize-cloud/_category_.json | 0 .../_environments_and_namespaces.mdx | 0 .../otterize-cloud/object-model.mdx | 0 docs/{ => overview}/otterize-oss/README.mdx | 0 .../otterize-oss/_category_.json | 0 .../otterize-oss/error-telemetry.mdx | 0 .../otterize-oss/usage-telemetry.mdx | 0 docs/quickstart/_category_.json | 5 -- .../quickstart/access-control/_category_.json | 5 -- .../IBAC-Overview.mdx} | 0 docs/reference/_category_.json | 2 +- .../shadow-vs-active-enforcement/README.mdx | 0 .../troubleshooting/README.mdx | 0 docusaurus.config.js | 70 +++++++++++++------ src/css/custom.css | 11 ++- 58 files changed, 255 insertions(+), 137 deletions(-) rename docs/{quickstart/visualization => access-types/AWS IAM/Examples}/_category_.json (60%) rename docs/{quickstart/access-control => access-types/AWS IAM/Examples}/aws-iam-eks.mdx (98%) create mode 100644 docs/access-types/AWS IAM/Overview.mdx create mode 100644 docs/access-types/AWS IAM/Reference.mdx create mode 100644 docs/access-types/AWS IAM/_category_.json create mode 100644 docs/access-types/Istio/Examples/_category_.json rename docs/{quickstart/access-control => access-types/Istio/Examples}/k8s-istio-authorization-policies.mdx (95%) rename docs/{quickstart/visualization => access-types/Istio/Examples}/k8s-istio-watcher.mdx (92%) create mode 100644 docs/access-types/Istio/Overview.mdx create mode 100644 docs/access-types/Istio/Reference.mdx create mode 100644 docs/access-types/Istio/_category_.json create mode 100644 docs/access-types/Kafka/Examples/_category_.json rename docs/{quickstart/visualization => access-types/Kafka/Examples}/k8s-kafka-mapping.mdx (95%) rename docs/{quickstart/access-control => access-types/Kafka/Examples}/k8s-kafka-mtls-cert-manager.mdx (93%) rename docs/{quickstart/access-control => access-types/Kafka/Examples}/k8s-kafka-mtls.mdx (93%) create mode 100644 docs/access-types/Kafka/Overview.mdx create mode 100644 docs/access-types/Kafka/Reference.mdx create mode 100644 docs/access-types/Kafka/_category_.json create mode 100644 docs/access-types/Networking/Examples/_category_.json rename docs/{quickstart/access-control => access-types/Networking/Examples}/aws-eks-cni-mini.mdx (94%) rename docs/{quickstart/visualization => access-types/Networking/Examples}/k8s-network-mapper.mdx (93%) rename docs/{quickstart/access-control => access-types/Networking/Examples}/k8s-network-policies.mdx (92%) rename docs/{guides => access-types/Networking/Examples}/protect-1-service-network-policies.mdx (97%) create mode 100644 docs/access-types/Networking/Overview.mdx rename docs/{reference/access-controls/network-policies/README.mdx => access-types/Networking/Reference/Network-Policies-Deep-Dive.mdx} (99%) create mode 100644 docs/access-types/Networking/Reference/README.mdx create mode 100644 docs/access-types/Networking/_category_.json create mode 100644 docs/access-types/Postgres/Examples/_category_.json rename docs/{quickstart/access-control => access-types/Postgres/Examples}/postgres.mdx (100%) create mode 100644 docs/access-types/Postgres/Overview.mdx create mode 100644 docs/access-types/Postgres/Reference.mdx rename docs/{concepts => access-types/Postgres}/_category_.json (62%) create mode 100644 docs/access-types/README.mdx create mode 100644 docs/access-types/_category_.json delete mode 100644 docs/guides/_category_.json create mode 100644 docs/overview/README.mdx create mode 100644 docs/overview/_category_.json rename docs/{ => overview}/installation/README.mdx (90%) rename docs/{reference/intents-and-intents-files/README.mdx => overview/intent-based-access-control.mdx} (96%) rename docs/{ => overview}/otterize-cloud/README.mdx (100%) rename docs/{ => overview}/otterize-cloud/_category_.json (100%) rename docs/{ => overview}/otterize-cloud/_environments_and_namespaces.mdx (100%) rename docs/{ => overview}/otterize-cloud/object-model.mdx (100%) rename docs/{ => overview}/otterize-oss/README.mdx (100%) rename docs/{ => overview}/otterize-oss/_category_.json (100%) rename docs/{ => overview}/otterize-oss/error-telemetry.mdx (100%) rename docs/{ => overview}/otterize-oss/usage-telemetry.mdx (100%) delete mode 100644 docs/quickstart/_category_.json delete mode 100644 docs/quickstart/access-control/_category_.json rename docs/{intent-based-access-control/README.mdx => reference/IBAC-Overview.mdx} (100%) rename docs/{ => reference}/shadow-vs-active-enforcement/README.mdx (100%) rename docs/{ => reference}/troubleshooting/README.mdx (100%) diff --git a/.gitignore b/.gitignore index 26328349a..fc9af2b85 100644 --- a/.gitignore +++ b/.gitignore @@ -21,3 +21,4 @@ yarn-error.log* .idea package-lock.json +.vercel diff --git a/docs/quickstart/visualization/_category_.json b/docs/access-types/AWS IAM/Examples/_category_.json similarity index 60% rename from docs/quickstart/visualization/_category_.json rename to docs/access-types/AWS IAM/Examples/_category_.json index 4564c5be8..bbac434cd 100644 --- a/docs/quickstart/visualization/_category_.json +++ b/docs/access-types/AWS IAM/Examples/_category_.json @@ -1,5 +1,5 @@ { - "label": "Visualization", + "label": "Examples", "position": 2, "collapsed": false } diff --git a/docs/quickstart/access-control/aws-iam-eks.mdx b/docs/access-types/AWS IAM/Examples/aws-iam-eks.mdx similarity index 98% rename from docs/quickstart/access-control/aws-iam-eks.mdx rename to docs/access-types/AWS IAM/Examples/aws-iam-eks.mdx index 7bb03fa5a..94b8fd774 100644 --- a/docs/quickstart/access-control/aws-iam-eks.mdx +++ b/docs/access-types/AWS IAM/Examples/aws-iam-eks.mdx @@ -187,7 +187,7 @@ kubectl patch deployment -n otterize-tutorial-iam server --type='json' -p="[{\"o Expand to see the deployment YAML ```yaml -{@include: ../../../static/code-examples/aws-iam-eks/client-and-server.yaml} +{@include: ../../../../static/code-examples/aws-iam-eks/client-and-server.yaml} ``` @@ -287,7 +287,7 @@ By annotating the pod, we've created an IAM role. We now need to specify what we We will specify the following ClientIntents, granting the PutObject permission to the `otterize-tutorial-bucket` S3 bucket. ```yaml -{@include: ../../../static/code-examples/aws-iam-eks/clientintents.yaml} +{@include: ../../../../static/code-examples/aws-iam-eks/clientintents.yaml} ``` To apply these intents, run the following command: diff --git a/docs/access-types/AWS IAM/Overview.mdx b/docs/access-types/AWS IAM/Overview.mdx new file mode 100644 index 000000000..cf6694baa --- /dev/null +++ b/docs/access-types/AWS IAM/Overview.mdx @@ -0,0 +1,8 @@ +--- +sidebar_position: 1 +title: Overview +hide_table_of_contents: false +--- + + + diff --git a/docs/access-types/AWS IAM/Reference.mdx b/docs/access-types/AWS IAM/Reference.mdx new file mode 100644 index 000000000..626ea0452 --- /dev/null +++ b/docs/access-types/AWS IAM/Reference.mdx @@ -0,0 +1,4 @@ +--- +sidebar_position: 3 +title: Reference +--- \ No newline at end of file diff --git a/docs/access-types/AWS IAM/_category_.json b/docs/access-types/AWS IAM/_category_.json new file mode 100644 index 000000000..aca2a23bb --- /dev/null +++ b/docs/access-types/AWS IAM/_category_.json @@ -0,0 +1,5 @@ +{ + "label": "AWS IAM", + "position": 2, + "collapsed": true +} diff --git a/docs/access-types/Istio/Examples/_category_.json b/docs/access-types/Istio/Examples/_category_.json new file mode 100644 index 000000000..0e3676464 --- /dev/null +++ b/docs/access-types/Istio/Examples/_category_.json @@ -0,0 +1,5 @@ +{ + "label": "Examples", + "position": 2, + "collapsed": true +} diff --git a/docs/quickstart/access-control/k8s-istio-authorization-policies.mdx b/docs/access-types/Istio/Examples/k8s-istio-authorization-policies.mdx similarity index 95% rename from docs/quickstart/access-control/k8s-istio-authorization-policies.mdx rename to docs/access-types/Istio/Examples/k8s-istio-authorization-policies.mdx index 41582428c..4f26a65ef 100644 --- a/docs/quickstart/access-control/k8s-istio-authorization-policies.mdx +++ b/docs/access-types/Istio/Examples/k8s-istio-authorization-policies.mdx @@ -29,7 +29,7 @@ In this tutorial, we will: Before you start, you'll need a Kubernetes cluster. Having a cluster with a [CNI](https://kubernetes.io/docs/concepts/extend-kubernetes/compute-storage-net/network-plugins/) that supports [NetworkPolicies](https://kubernetes.io/docs/concepts/services-networking/network-policies/) isn't required for this tutorial, but is recommended so that your cluster works with other tutorials. -{@include: ../../_common/cluster-setup.md} +{@include: ../../../_common/cluster-setup.md} @@ -42,7 +42,7 @@ So either forego browser visualization and:
Install Otterize in your cluster, without Otterize Cloud -{@include: ../../_common/install-otterize-istio-enabled.md} +{@include: ../../../_common/install-otterize-istio-enabled.md}
@@ -53,11 +53,11 @@ Or choose to include browser visualization and: #### Create an Otterize Cloud account -{@include: ../../_common/create-account.md} +{@include: ../../../_common/create-account.md} #### Install Otterize OSS, connected to Otterize Cloud -{@include: ../../_common/install-otterize-from-cloud-with-istio-enforcement.md} +{@include: ../../../_common/install-otterize-from-cloud-with-istio-enforcement.md} @@ -66,7 +66,7 @@ Or choose to include browser visualization and:
Install Istio in the cluster via Helm -{@include: ../../_common/install-istio.md} +{@include: ../../../_common/install-istio.md}
@@ -79,7 +79,7 @@ kubectl apply -f ${ABSOLUTE_URL}/code-examples/network-mapper/istio-telemetry-en ``` ```yaml -{@include: ../../../static/code-examples/network-mapper/istio-telemetry-enablement.yaml} +{@include: ../../../../static/code-examples/network-mapper/istio-telemetry-enablement.yaml} ```
@@ -116,7 +116,7 @@ You can click on the services or the lines connecting them to see which ClientIn 1. Here is the `intents.yaml` declaration of the client, which we will apply below: ```yaml -{@include: ../../../static/code-examples/istio-authorization-policies/intents.yaml} +{@include: ../../../../static/code-examples/istio-authorization-policies/intents.yaml} ``` To apply it, use: diff --git a/docs/quickstart/visualization/k8s-istio-watcher.mdx b/docs/access-types/Istio/Examples/k8s-istio-watcher.mdx similarity index 92% rename from docs/quickstart/visualization/k8s-istio-watcher.mdx rename to docs/access-types/Istio/Examples/k8s-istio-watcher.mdx index 93f87c243..422daa522 100644 --- a/docs/quickstart/visualization/k8s-istio-watcher.mdx +++ b/docs/access-types/Istio/Examples/k8s-istio-watcher.mdx @@ -23,7 +23,7 @@ In this tutorial, we will: Before you start, you'll need a Kubernetes cluster. Having a cluster with a [CNI](https://kubernetes.io/docs/concepts/extend-kubernetes/compute-storage-net/network-plugins/) that supports [NetworkPolicies](https://kubernetes.io/docs/concepts/services-networking/network-policies/) isn't required for this tutorial, but is recommended so that your cluster works with other tutorials. -{@include: ../../_common/cluster-setup.md} +{@include: ../../../_common/cluster-setup.md} @@ -36,7 +36,7 @@ So either forego browser visualization and:
Install the Otterize network mapper in your cluster with the Istio watcher component enabled, and without Otterize Cloud -{@include: ../../_common/install-otterize-istio-watcher.md} +{@include: ../../../_common/install-otterize-istio-watcher.md}
@@ -47,11 +47,11 @@ Or choose to include browser visualization and: #### Create an Otterize Cloud account -{@include: ../../_common/create-account.md} +{@include: ../../../_common/create-account.md} #### Install Otterize OSS, connected to Otterize Cloud -{@include: ../../_common/install-otterize-from-cloud-with-enforcement-with-istiowatcher.md} +{@include: ../../../_common/install-otterize-from-cloud-with-enforcement-with-istiowatcher.md} @@ -60,7 +60,7 @@ Finally, you'll need to install the Otterize CLI (if you haven't already) to int
Install the Otterize CLI -{@include: ../../_common/install-otterize-cli.md} +{@include: ../../../_common/install-otterize-cli.md}
@@ -69,7 +69,7 @@ Finally, you'll need to install the Otterize CLI (if you haven't already) to int
Install Istio in the cluster via Helm -{@include: ../../_common/install-istio.md} +{@include: ../../../_common/install-istio.md}
@@ -91,7 +91,7 @@ kubectl apply -f ${ABSOLUTE_URL}/code-examples/network-mapper/istio-telemetry-en ``` ```yaml -{@include: ../../../static/code-examples/network-mapper/istio-telemetry-enablement.yaml} +{@include: ../../../../static/code-examples/network-mapper/istio-telemetry-enablement.yaml} ```
@@ -122,7 +122,7 @@ For a complete list of the CLI capabilities read the [CLI command reference](/re ### Extract and see the network map -{@include: ../../getting-started/_show_mapped_istio_traffic_cli.mdx} +{@include: ../../../getting-started/_show_mapped_istio_traffic_cli.mdx} ### Show the access graph in Otterize Cloud diff --git a/docs/access-types/Istio/Overview.mdx b/docs/access-types/Istio/Overview.mdx new file mode 100644 index 000000000..7e4dcc2d8 --- /dev/null +++ b/docs/access-types/Istio/Overview.mdx @@ -0,0 +1,4 @@ +--- +sidebar_position: 1 +title: Overview +--- \ No newline at end of file diff --git a/docs/access-types/Istio/Reference.mdx b/docs/access-types/Istio/Reference.mdx new file mode 100644 index 000000000..626ea0452 --- /dev/null +++ b/docs/access-types/Istio/Reference.mdx @@ -0,0 +1,4 @@ +--- +sidebar_position: 3 +title: Reference +--- \ No newline at end of file diff --git a/docs/access-types/Istio/_category_.json b/docs/access-types/Istio/_category_.json new file mode 100644 index 000000000..1654bce0e --- /dev/null +++ b/docs/access-types/Istio/_category_.json @@ -0,0 +1,5 @@ +{ + "label": "Istio", + "position": 4, + "collapsed": true +} diff --git a/docs/access-types/Kafka/Examples/_category_.json b/docs/access-types/Kafka/Examples/_category_.json new file mode 100644 index 000000000..bbac434cd --- /dev/null +++ b/docs/access-types/Kafka/Examples/_category_.json @@ -0,0 +1,5 @@ +{ + "label": "Examples", + "position": 2, + "collapsed": false +} diff --git a/docs/quickstart/visualization/k8s-kafka-mapping.mdx b/docs/access-types/Kafka/Examples/k8s-kafka-mapping.mdx similarity index 95% rename from docs/quickstart/visualization/k8s-kafka-mapping.mdx rename to docs/access-types/Kafka/Examples/k8s-kafka-mapping.mdx index c4bdc8a9d..56ad8433f 100644 --- a/docs/quickstart/visualization/k8s-kafka-mapping.mdx +++ b/docs/access-types/Kafka/Examples/k8s-kafka-mapping.mdx @@ -24,7 +24,7 @@ We will **not** be doing any access control in this demo, just purely mapping cl Before you start, you'll need a Kubernetes cluster. Having a cluster with a [CNI](https://kubernetes.io/docs/concepts/extend-kubernetes/compute-storage-net/network-plugins/) that supports [NetworkPolicies](https://kubernetes.io/docs/concepts/services-networking/network-policies/) isn't required for this tutorial, but is recommended so that your cluster works with other tutorials. -{@include: ../../_common/cluster-setup.md} +{@include: ../../../_common/cluster-setup.md} @@ -53,11 +53,11 @@ Or choose to include browser visualization and: #### Create an Otterize Cloud account -{@include: ../../_common/create-account.md} +{@include: ../../../_common/create-account.md} #### Install Otterize OSS, connected to Otterize Cloud -{@include: ../../_common/install-otterize-from-cloud-with-shadow-mode-and-kafka-watcher.md} +{@include: ../../../_common/install-otterize-from-cloud-with-shadow-mode-and-kafka-watcher.md} @@ -66,7 +66,7 @@ Finally, you'll need to install the Otterize CLI (if you haven't already) to int
Install the Otterize CLI -{@include: ../../_common/install-otterize-cli.md} +{@include: ../../../_common/install-otterize-cli.md}
@@ -82,7 +82,7 @@ In the chart we will configure Kafka to: Expand to see the Helm values.yaml used with the Bitnami chart ```yaml -{@include: ../../../static/code-examples/kafka-mapping/helm/values.yaml} +{@include: ../../../../static/code-examples/kafka-mapping/helm/values.yaml} ``` diff --git a/docs/quickstart/access-control/k8s-kafka-mtls-cert-manager.mdx b/docs/access-types/Kafka/Examples/k8s-kafka-mtls-cert-manager.mdx similarity index 93% rename from docs/quickstart/access-control/k8s-kafka-mtls-cert-manager.mdx rename to docs/access-types/Kafka/Examples/k8s-kafka-mtls-cert-manager.mdx index 4b8813a89..ec754ba6c 100644 --- a/docs/quickstart/access-control/k8s-kafka-mtls-cert-manager.mdx +++ b/docs/access-types/Kafka/Examples/k8s-kafka-mtls-cert-manager.mdx @@ -1,6 +1,6 @@ --- sidebar_position: 5 -title: Kafka access automation using cert-manager mTLS +title: Kafka Access Automation Using Cert-Manager mTLS image: /img/quick-tutorials/k8s-kafka-mtls-cert-mgr/social.png --- @@ -29,7 +29,7 @@ In this tutorial, we will: Before you start, you'll need a Kubernetes cluster. -{@include: ../../_common/cluster-setup.md} +{@include: ../../../_common/cluster-setup.md} @@ -50,7 +50,7 @@ This tutorial uses the built-in and easy-to-setup `CA` Issuer type so that the t ::: ```yaml -{@include: ../../../static/code-examples/kafka-mtls-cert-manager/clusterissuer.yaml} +{@include: ../../../../static/code-examples/kafka-mtls-cert-manager/clusterissuer.yaml} ``` Deploy this `ClusterIssuer`: @@ -72,7 +72,7 @@ You can now install Otterize in your cluster, and connect to Otterize Cloud. Con -{@include: ../../_common/install-otterize-from-cloud-with-shadow-mode-and-kafka-watcher-and-cert-manager.md} +{@include: ../../../_common/install-otterize-from-cloud-with-shadow-mode-and-kafka-watcher-and-cert-manager.md} #### Configure the access graph in Otterize Cloud to only show Kafka authorization status @@ -80,7 +80,7 @@ You want to make sure that under **Istio Policies** _Use in access graph_ is tur Keep _Use in access graph_ **on** under **Kafka ACLs** so that the access graph only shows the authorization status for Kafka ACLs. -![Make sure access graph is configured correctly](../../../static/img/quick-tutorials/k8s-kafka-mtls-cert-mgr//cloud-settings.png) +![Make sure access graph is configured correctly](/img/quick-tutorials/k8s-kafka-mtls-cert-mgr//cloud-settings.png) @@ -119,7 +119,7 @@ In the chart we will configure Kafka to: Expand to see the Helm values.yaml used with the Bitnami chart ```yaml -{@include: ../../../static/code-examples/kafka-mtls-cert-manager/helm/values.yaml} +{@include: ../../../../static/code-examples/kafka-mtls-cert-manager/helm/values.yaml} ``` @@ -145,7 +145,7 @@ kubectl apply -f ${ABSOLUTE_URL}/code-examples/kafka-mtls-cert-manager/kafkaserv ``` ```yaml -{@include: ../../../static/code-examples/kafka-mtls-cert-manager/kafkaserverconfig.yaml} +{@include: ../../../../static/code-examples/kafka-mtls-cert-manager/kafkaserverconfig.yaml} ``` ## Deploy clients @@ -203,7 +203,7 @@ spec: ```yaml -{@include: ../../../static/code-examples/kafka-mtls-cert-manager/client-deployment.yaml} +{@include: ../../../../static/code-examples/kafka-mtls-cert-manager/client-deployment.yaml} ``` @@ -211,7 +211,7 @@ spec: ```yaml -{@include: ../../../static/code-examples/kafka-mtls-cert-manager/client-other-deployment.yaml} +{@include: ../../../../static/code-examples/kafka-mtls-cert-manager/client-other-deployment.yaml} ``` @@ -348,7 +348,7 @@ You can click on the services or the lines connecting them to see which ClientIn 1. The client declares its intent to call the `kafka.kafka` server with this `intents.yaml` file: ```yaml -{@include: ../../../static/code-examples/kafka-mtls-cert-manager/client-intents.yaml} +{@include: ../../../../static/code-examples/kafka-mtls-cert-manager/client-intents.yaml} ``` We can apply intents for the `client` by applying the `client-intents.yaml` file: @@ -361,11 +361,11 @@ If you go back to your access graph, you'll now see that the `client` has a soli If you click on that solid line, you will see that the declared intents match the discovered intents, so access is assured. -![client intents applied](../../../static/img/quick-tutorials/k8s-kafka-mtls-cert-mgr/client-intents.png) +![client intents applied](/img/quick-tutorials/k8s-kafka-mtls-cert-mgr/client-intents.png) 2. At this point, since the Kafka server is not actually protected, the `client-other` can still access the topics. The line is orange, indicating that it has no declared intents. -![Declared Intent](../../../static/img/quick-tutorials/k8s-kafka-mtls-cert-mgr/declared-intent.png) +![Declared Intent](/img/quick-tutorials/k8s-kafka-mtls-cert-mgr/declared-intent.png) We can see what happened: @@ -382,7 +382,7 @@ Let's see that in action. Our clients that have not declared intents will be blo We need to turn protection on in for this Kafka broker by declaring it as a protected service: ```yaml -{@include: ../../../static/code-examples/kafka-mtls-cert-manager/protectedservice.yaml} +{@include: ../../../../static/code-examples/kafka-mtls-cert-manager/protectedservice.yaml} ``` Apply this `ProtectedService` resource: @@ -406,7 +406,7 @@ error="kafka server: The client is not authorized to access this topic And if you look back at your access graph, you'll see that the Kafka broker is now protected, and that the `client-other` and `client-authenticated` are blocked. -![Clients blocked](../../../static/img/quick-tutorials/k8s-kafka-mtls-cert-mgr//clients-blocked.png) +![Clients blocked](/img/quick-tutorials/k8s-kafka-mtls-cert-mgr//clients-blocked.png) ## What did we accomplish? diff --git a/docs/quickstart/access-control/k8s-kafka-mtls.mdx b/docs/access-types/Kafka/Examples/k8s-kafka-mtls.mdx similarity index 93% rename from docs/quickstart/access-control/k8s-kafka-mtls.mdx rename to docs/access-types/Kafka/Examples/k8s-kafka-mtls.mdx index 75c58068c..f06e2d51d 100644 --- a/docs/quickstart/access-control/k8s-kafka-mtls.mdx +++ b/docs/access-types/Kafka/Examples/k8s-kafka-mtls.mdx @@ -28,7 +28,7 @@ In this tutorial, we will: Before you start, you'll need a Kubernetes cluster. -{@include: ../../_common/cluster-setup.md} +{@include: ../../../_common/cluster-setup.md} @@ -40,7 +40,7 @@ You can now install Otterize in your cluster, and connect to Otterize Cloud. Con 2. Generate certificates using the Otterize Cloud hosted service. If you prefer to generate certificates in-cluster, you can [follow the tutorial for cert-manager](/quickstart/access-control/k8s-kafka-mtls-cert-manager). #### Install Otterize OSS, connected to Otterize Cloud -{@include: ../../_common/install-otterize-from-cloud-with-shadow-mode-and-kafka-watcher.md} +{@include: ../../../_common/install-otterize-from-cloud-with-shadow-mode-and-kafka-watcher.md} #### Configure the access graph in Otterize Cloud to only show Kafka authorization status @@ -48,7 +48,7 @@ You want to make sure that under **Istio Policies** _Use in access graph_ is tur Keep _Use in access graph_ **on** under **Kafka ACLs** so that the access graph only shows the authorization status for Kafka ACLs. -![Make sure access graph is configured correctly](../../../static/img/quick-tutorials/k8s-kafka-mtls//cloud-settings.png) +![Make sure access graph is configured correctly](/img/quick-tutorials/k8s-kafka-mtls//cloud-settings.png) ## Install Kafka @@ -65,7 +65,7 @@ In the chart we will configure Kafka to: Expand to see the Helm values.yaml used with the Bitnami chart ```yaml -{@include: ../../../static/code-examples/kafka-mtls/helm/values.yaml} +{@include: ../../../../static/code-examples/kafka-mtls/helm/values.yaml} ``` @@ -91,7 +91,7 @@ kubectl apply -f ${ABSOLUTE_URL}/code-examples/kafka-mtls/kafkaserverconfig.yaml ``` ```yaml -{@include: ../../../static/code-examples/kafka-mtls/kafkaserverconfig.yaml} +{@include: ../../../../static/code-examples/kafka-mtls/kafkaserverconfig.yaml} ``` ## Deploy clients @@ -149,7 +149,7 @@ spec: ```yaml -{@include: ../../../static/code-examples/kafka-mtls/client-deployment.yaml} +{@include: ../../../../static/code-examples/kafka-mtls/client-deployment.yaml} ``` @@ -157,7 +157,7 @@ spec: ```yaml -{@include: ../../../static/code-examples/kafka-mtls/client-other-deployment.yaml} +{@include: ../../../../static/code-examples/kafka-mtls/client-other-deployment.yaml} ``` @@ -259,7 +259,7 @@ You can click on the services or the lines connecting them to see which ClientIn 1. The client declares its intent to call the `kafka.kafka` server with this `intents.yaml` file: ```yaml -{@include: ../../../static/code-examples/kafka-mtls/client-intents.yaml} +{@include: ../../../../static/code-examples/kafka-mtls/client-intents.yaml} ``` We can apply intents for the `client` by applying the `client-intents.yaml` file: @@ -272,11 +272,11 @@ If you go back to your access graph, you'll now see that the `client` has a soli If you click on that solid line, you will see that the declared intents match the discovered intents, so access is assured. -![client intents applied](../../../static/img/quick-tutorials/k8s-kafka-mtls/client-intents.png) +![client intents applied](/img/quick-tutorials/k8s-kafka-mtls/client-intents.png) 2. At this point, since the Kafka server is not actually protected, the `client-other` can still access the topics. The line is orange, indicating that it has no declared intents. -![Declared Intent](../../../static/img/quick-tutorials/k8s-kafka-mtls/declared-intent.png) +![Declared Intent](/img/quick-tutorials/k8s-kafka-mtls/declared-intent.png) We can see what happened: @@ -295,7 +295,7 @@ Let's see that in action. Our clients that have not declared intents will be blo We need to turn protection on in for this Kafka broker by declaring it as a protected service: ```yaml -{@include: ../../../static/code-examples/kafka-mtls/protectedservice.yaml} +{@include: ../../../../static/code-examples/kafka-mtls/protectedservice.yaml} ``` Apply this `ProtectedService` resource: @@ -319,7 +319,7 @@ error="kafka server: The client is not authorized to access this topic And if you look back at your access graph, you'll see that the Kafka broker is now protected, and that the `client-other` and `client-authenticated` are blocked. -![Clients blocked](../../../static/img/quick-tutorials/k8s-kafka-mtls/clients-blocked.png) +![Clients blocked](/img/quick-tutorials/k8s-kafka-mtls/clients-blocked.png) ## What did we accomplish? diff --git a/docs/access-types/Kafka/Overview.mdx b/docs/access-types/Kafka/Overview.mdx new file mode 100644 index 000000000..7e4dcc2d8 --- /dev/null +++ b/docs/access-types/Kafka/Overview.mdx @@ -0,0 +1,4 @@ +--- +sidebar_position: 1 +title: Overview +--- \ No newline at end of file diff --git a/docs/access-types/Kafka/Reference.mdx b/docs/access-types/Kafka/Reference.mdx new file mode 100644 index 000000000..626ea0452 --- /dev/null +++ b/docs/access-types/Kafka/Reference.mdx @@ -0,0 +1,4 @@ +--- +sidebar_position: 3 +title: Reference +--- \ No newline at end of file diff --git a/docs/access-types/Kafka/_category_.json b/docs/access-types/Kafka/_category_.json new file mode 100644 index 000000000..4861435c0 --- /dev/null +++ b/docs/access-types/Kafka/_category_.json @@ -0,0 +1,5 @@ +{ + "label": "Kafka", + "position": 3, + "collapsed": true +} diff --git a/docs/access-types/Networking/Examples/_category_.json b/docs/access-types/Networking/Examples/_category_.json new file mode 100644 index 000000000..0e3676464 --- /dev/null +++ b/docs/access-types/Networking/Examples/_category_.json @@ -0,0 +1,5 @@ +{ + "label": "Examples", + "position": 2, + "collapsed": true +} diff --git a/docs/quickstart/access-control/aws-eks-cni-mini.mdx b/docs/access-types/Networking/Examples/aws-eks-cni-mini.mdx similarity index 94% rename from docs/quickstart/access-control/aws-eks-cni-mini.mdx rename to docs/access-types/Networking/Examples/aws-eks-cni-mini.mdx index fbf8809dc..f49bd7e7b 100644 --- a/docs/quickstart/access-control/aws-eks-cni-mini.mdx +++ b/docs/access-types/Networking/Examples/aws-eks-cni-mini.mdx @@ -1,6 +1,6 @@ --- -sidebar_position: 2 -title: Network policies on AWS EKS with the VPC CNI +sidebar_position: 4 +title: AWS EKS Network policies With The VPC CNI image: /img/quick-tutorials/aws-eks-mini/social.png --- @@ -86,7 +86,7 @@ So either forego browser visualization and:
Install Otterize in your cluster, without Otterize Cloud -{@include: ../../_common/install-otterize.md} +{@include: ../../../_common/install-otterize.md}
@@ -97,11 +97,11 @@ Or choose to include browser visualization and: #### Create an Otterize Cloud account -{@include: ../../_common/create-account.md} +{@include: ../../../_common/create-account.md} #### Install Otterize OSS, connected to Otterize Cloud -{@include: ../../_common/install-otterize-from-cloud.md} +{@include: ../../../_common/install-otterize-from-cloud.md} @@ -110,7 +110,7 @@ Finally, you'll need to install the Otterize CLI (if you haven't already) to int
Install the Otterize CLI -{@include: ../../_common/install-otterize-cli.md} +{@include: ../../../_common/install-otterize-cli.md}
@@ -173,7 +173,7 @@ At which point you should see that the `server` service is ready to be protected And you can then protect the `server` service by applying the following `yaml` file: ```yaml -{@include: ../../../static/code-examples/aws-eks-mini/protect-server.yaml} +{@include: ../../../../static/code-examples/aws-eks-mini/protect-server.yaml} ``` Protect the server by applying the resource: diff --git a/docs/quickstart/visualization/k8s-network-mapper.mdx b/docs/access-types/Networking/Examples/k8s-network-mapper.mdx similarity index 93% rename from docs/quickstart/visualization/k8s-network-mapper.mdx rename to docs/access-types/Networking/Examples/k8s-network-mapper.mdx index b703b3cf7..0db7cfd8b 100644 --- a/docs/quickstart/visualization/k8s-network-mapper.mdx +++ b/docs/access-types/Networking/Examples/k8s-network-mapper.mdx @@ -1,6 +1,6 @@ --- sidebar_position: 1 -title: Network mapping a Kubernetes cluster +title: Visualizing a Kubernetes Network image: /img/visualization/k8s-network-mapper/social.png --- @@ -22,7 +22,7 @@ In this tutorial, we will: Before you start, you'll need a Kubernetes cluster. Having a cluster with a [CNI](https://kubernetes.io/docs/concepts/extend-kubernetes/compute-storage-net/network-plugins/) that supports [NetworkPolicies](https://kubernetes.io/docs/concepts/services-networking/network-policies/) isn't required for this tutorial, but is recommended so that your cluster works with other tutorials. -{@include: ../../_common/cluster-setup.md} +{@include: ../../../_common/cluster-setup.md} @@ -36,7 +36,7 @@ So either forego browser visualization and:
Install Otterize in your cluster, without Otterize Cloud -{@include: ../../_common/install-otterize.md} +{@include: ../../../_common/install-otterize.md}
@@ -47,11 +47,11 @@ Or choose to include browser visualization and: #### Create an Otterize Cloud account -{@include: ../../_common/create-account.md} +{@include: ../../../_common/create-account.md} #### Install Otterize OSS, connected to Otterize Cloud -{@include: ../../_common/install-otterize-from-cloud-with-enforcement.md} +{@include: ../../../_common/install-otterize-from-cloud-with-enforcement.md} @@ -60,7 +60,7 @@ Finally, you'll need to install the Otterize CLI (if you haven't already) to int
Install the Otterize CLI -{@include: ../../_common/install-otterize-cli.md} +{@include: ../../../_common/install-otterize-cli.md}
@@ -92,7 +92,7 @@ For a complete list of the CLI capabilities read the [CLI command reference](/re ### Extract and see the network map -{@include: ../../getting-started/_show_mapped_traffic_cli.mdx} +{@include: ../../../getting-started/_show_mapped_traffic_cli.mdx} ### Show the access graph in Otterize Cloud diff --git a/docs/quickstart/access-control/k8s-network-policies.mdx b/docs/access-types/Networking/Examples/k8s-network-policies.mdx similarity index 92% rename from docs/quickstart/access-control/k8s-network-policies.mdx rename to docs/access-types/Networking/Examples/k8s-network-policies.mdx index 2117d5210..781e43f1c 100644 --- a/docs/quickstart/access-control/k8s-network-policies.mdx +++ b/docs/access-types/Networking/Examples/k8s-network-policies.mdx @@ -1,6 +1,6 @@ --- sidebar_position: 1 -title: NetworkPolicy automation +title: Network Policy Automation image: /img/quick-tutorials/network-policies/social.png --- @@ -28,7 +28,7 @@ In this tutorial, we will: Before you start, you'll need a Kubernetes cluster with a [CNI](https://kubernetes.io/docs/concepts/extend-kubernetes/compute-storage-net/network-plugins/) that supports [NetworkPolicies](https://kubernetes.io/docs/concepts/services-networking/network-policies/). -{@include: ../../_common/cluster-setup.md} +{@include: ../../../_common/cluster-setup.md} @@ -42,7 +42,7 @@ So either forego browser visualization and:
Install Otterize in your cluster, without Otterize Cloud -{@include: ../../_common/install-otterize.md} +{@include: ../../../_common/install-otterize.md}
@@ -53,11 +53,11 @@ Or choose to include browser visualization and: #### Create an Otterize Cloud account -{@include: ../../_common/create-account.md} +{@include: ../../../_common/create-account.md} #### Install Otterize OSS, connected to Otterize Cloud -{@include: ../../_common/install-otterize-from-cloud-with-enforcement.md} +{@include: ../../../_common/install-otterize-from-cloud-with-enforcement.md} @@ -72,7 +72,7 @@ Our simple example consists of three pods: an HTTP server and two clients that c ```yaml -{@include: ../../../static/code-examples/automate-network-policies/namespace.yaml} +{@include: ../../../../static/code-examples/automate-network-policies/namespace.yaml} ``` @@ -80,23 +80,23 @@ Our simple example consists of three pods: an HTTP server and two clients that c ```yaml -{@include: ../../../static/code-examples/automate-network-policies/server-deployment.yaml} +{@include: ../../../../static/code-examples/automate-network-policies/server-deployment.yaml} --- -{@include: ../../../static/code-examples/automate-network-policies/server-service.yaml} +{@include: ../../../../static/code-examples/automate-network-policies/server-service.yaml} ``` ```yaml -{@include: ../../../static/code-examples/automate-network-policies/client-deployment.yaml} +{@include: ../../../../static/code-examples/automate-network-policies/client-deployment.yaml} ``` ```yaml -{@include: ../../../static/code-examples/automate-network-policies/client-other-deployment.yaml} +{@include: ../../../../static/code-examples/automate-network-policies/client-other-deployment.yaml} ``` @@ -193,7 +193,7 @@ You can click on the services or the lines connecting them to see which ClientIn 1. Here is the `intents.yaml` declaration of the client, which we will apply below: ```yaml -{@include: ../../../static/code-examples/automate-network-policies/intents.yaml} +{@include: ../../../../static/code-examples/automate-network-policies/intents.yaml} ``` ### See it in action diff --git a/docs/guides/protect-1-service-network-policies.mdx b/docs/access-types/Networking/Examples/protect-1-service-network-policies.mdx similarity index 97% rename from docs/guides/protect-1-service-network-policies.mdx rename to docs/access-types/Networking/Examples/protect-1-service-network-policies.mdx index 13b485874..7bcaacd3e 100644 --- a/docs/guides/protect-1-service-network-policies.mdx +++ b/docs/access-types/Networking/Examples/protect-1-service-network-policies.mdx @@ -1,7 +1,6 @@ --- sidebar_position: 1 -title: "Protecting one service with network policies" -sidebar_label: "Protecting one service with network policies" +title: "Protecting A Service With Network Policies" --- import CodeBlock from "@theme/CodeBlock"; @@ -32,7 +31,7 @@ Note: all the capabilities of IBAC are within Otterize OSS, while the access gra Before you start, you'll need a Kubernetes cluster. -{@include: ../_common/cluster-setup.md} +{@include: ../../../_common/cluster-setup.md}
@@ -106,21 +105,21 @@ Go ahead and browse to the URL above to "shop" and get a feel for the demo's beh
Create an Otterize Cloud account -{@include: ../_common/create-account.md} +{@include: ../../../_common/create-account.md}
Install Otterize OSS -{@include: ../_common/install-otterize-from-cloud.md} +{@include: ../../../_common/install-otterize-from-cloud.md}
Install the Otterize CLI -{@include: ../_common/install-otterize-cli.md} +{@include: ../../../_common/install-otterize-cli.md}
@@ -305,7 +304,7 @@ Now that we've verified no intended clients would be blocked, we can safely prot To do so, recall that we configured Otterize OSS to be in the `defaultShadow` mode: by default, it's in shadow mode for all services, not actually managing network policies for them. To protect a service is a simple matter of applying a `ProtectedService` YAML for it, overriding the default for it: ```yaml -{@include: ../../static/code-examples/guides/protect-1-service-network-policies/protect-productcatalogservice.yaml} +{@include: ../../../../static/code-examples/guides/protect-1-service-network-policies/protect-productcatalogservice.yaml} ``` Let's apply this file to our cluster: diff --git a/docs/access-types/Networking/Overview.mdx b/docs/access-types/Networking/Overview.mdx new file mode 100644 index 000000000..7e4dcc2d8 --- /dev/null +++ b/docs/access-types/Networking/Overview.mdx @@ -0,0 +1,4 @@ +--- +sidebar_position: 1 +title: Overview +--- \ No newline at end of file diff --git a/docs/reference/access-controls/network-policies/README.mdx b/docs/access-types/Networking/Reference/Network-Policies-Deep-Dive.mdx similarity index 99% rename from docs/reference/access-controls/network-policies/README.mdx rename to docs/access-types/Networking/Reference/Network-Policies-Deep-Dive.mdx index fb5e5ad53..10517004d 100644 --- a/docs/reference/access-controls/network-policies/README.mdx +++ b/docs/access-types/Networking/Reference/Network-Policies-Deep-Dive.mdx @@ -1,6 +1,6 @@ --- sidebar_position: 1 -title: Network policies deep dive +title: Network Policies Deep Dive --- import Tabs from '@theme/Tabs'; import TabItem from '@theme/TabItem'; diff --git a/docs/access-types/Networking/Reference/README.mdx b/docs/access-types/Networking/Reference/README.mdx new file mode 100644 index 000000000..626ea0452 --- /dev/null +++ b/docs/access-types/Networking/Reference/README.mdx @@ -0,0 +1,4 @@ +--- +sidebar_position: 3 +title: Reference +--- \ No newline at end of file diff --git a/docs/access-types/Networking/_category_.json b/docs/access-types/Networking/_category_.json new file mode 100644 index 000000000..cffc70f0d --- /dev/null +++ b/docs/access-types/Networking/_category_.json @@ -0,0 +1,5 @@ +{ + "label": "Networking", + "position": 1, + "collapsed": true +} diff --git a/docs/access-types/Postgres/Examples/_category_.json b/docs/access-types/Postgres/Examples/_category_.json new file mode 100644 index 000000000..0e3676464 --- /dev/null +++ b/docs/access-types/Postgres/Examples/_category_.json @@ -0,0 +1,5 @@ +{ + "label": "Examples", + "position": 2, + "collapsed": true +} diff --git a/docs/quickstart/access-control/postgres.mdx b/docs/access-types/Postgres/Examples/postgres.mdx similarity index 100% rename from docs/quickstart/access-control/postgres.mdx rename to docs/access-types/Postgres/Examples/postgres.mdx diff --git a/docs/access-types/Postgres/Overview.mdx b/docs/access-types/Postgres/Overview.mdx new file mode 100644 index 000000000..7e4dcc2d8 --- /dev/null +++ b/docs/access-types/Postgres/Overview.mdx @@ -0,0 +1,4 @@ +--- +sidebar_position: 1 +title: Overview +--- \ No newline at end of file diff --git a/docs/access-types/Postgres/Reference.mdx b/docs/access-types/Postgres/Reference.mdx new file mode 100644 index 000000000..626ea0452 --- /dev/null +++ b/docs/access-types/Postgres/Reference.mdx @@ -0,0 +1,4 @@ +--- +sidebar_position: 3 +title: Reference +--- \ No newline at end of file diff --git a/docs/concepts/_category_.json b/docs/access-types/Postgres/_category_.json similarity index 62% rename from docs/concepts/_category_.json rename to docs/access-types/Postgres/_category_.json index b8adac8f0..bc6190e1f 100644 --- a/docs/concepts/_category_.json +++ b/docs/access-types/Postgres/_category_.json @@ -1,5 +1,5 @@ { - "label": "Concepts", + "label": "PostgreSQL", "position": 5, "collapsed": true } diff --git a/docs/access-types/README.mdx b/docs/access-types/README.mdx new file mode 100644 index 000000000..ce1f892fc --- /dev/null +++ b/docs/access-types/README.mdx @@ -0,0 +1,4 @@ +--- +sidebar_position: 1 +title: Access Types +--- \ No newline at end of file diff --git a/docs/access-types/_category_.json b/docs/access-types/_category_.json new file mode 100644 index 000000000..867232c84 --- /dev/null +++ b/docs/access-types/_category_.json @@ -0,0 +1,5 @@ +{ + "label": "Access Types", + "position": 3, + "collapsed": false +} diff --git a/docs/getting-started/README.mdx b/docs/getting-started/README.mdx index 2da7691cd..b8d8d040b 100644 --- a/docs/getting-started/README.mdx +++ b/docs/getting-started/README.mdx @@ -1,7 +1,7 @@ --- sidebar_position: 1 slug: / -title: Getting started +title: Getting Started --- export const LinkButton = (props) => ( @@ -24,7 +24,7 @@ Otterize is a platform for implementing intent-based access control ([IBAC](/int The platform is composed of **Otterize OSS**, which is tailored for a single Kubernetes cluster, and **Otterize Cloud**, which adds visibility and operationalization across Kubernetes clusters and non-Kubernetes infrastructures. Otterize enables platform engineers to easily implement, expand, and unify secured access for their Kubernetes workloads. -## Let's go! +## Let's go! 🚀 Dive right in with simple demos to manage access control: * [Create and manage network policies](/quickstart/access-control/k8s-network-policies). * [Network policies on AWS EKS with the VPC CNI](/quickstart/access-control/aws-eks-cni-mini). diff --git a/docs/getting-started/_category_.json b/docs/getting-started/_category_.json index 38eabb7ef..594203d97 100644 --- a/docs/getting-started/_category_.json +++ b/docs/getting-started/_category_.json @@ -1,3 +1,4 @@ { - "collapsed": false + "collapsed": true, + "label": "Getting Started" } \ No newline at end of file diff --git a/docs/guides/_category_.json b/docs/guides/_category_.json deleted file mode 100644 index 7cb5603b2..000000000 --- a/docs/guides/_category_.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "label": "Guides", - "position": 4, - "collapsed": false -} \ No newline at end of file diff --git a/docs/overview/README.mdx b/docs/overview/README.mdx new file mode 100644 index 000000000..7e4dcc2d8 --- /dev/null +++ b/docs/overview/README.mdx @@ -0,0 +1,4 @@ +--- +sidebar_position: 1 +title: Overview +--- \ No newline at end of file diff --git a/docs/overview/_category_.json b/docs/overview/_category_.json new file mode 100644 index 000000000..ef3474b29 --- /dev/null +++ b/docs/overview/_category_.json @@ -0,0 +1,4 @@ +{ + "collapsed": true, + "label": "Overview" +} \ No newline at end of file diff --git a/docs/installation/README.mdx b/docs/overview/installation/README.mdx similarity index 90% rename from docs/installation/README.mdx rename to docs/overview/installation/README.mdx index 102d628a5..503ea7a3b 100644 --- a/docs/installation/README.mdx +++ b/docs/overview/installation/README.mdx @@ -1,12 +1,12 @@ --- -sidebar_position: 5 +sidebar_position: 1 title: Installation --- import Tabs from '@theme/Tabs'; import TabItem from '@theme/TabItem'; ## Install Otterize without Otterize Cloud (OSS only) -{@include: ../_common/install-otterize.md} +{@include: ../../_common/install-otterize.md}
@@ -17,11 +17,11 @@ import TabItem from '@theme/TabItem'; Before you start, you need to have a Kubernetes cluster with a [CNI](https://kubernetes.io/docs/concepts/extend-kubernetes/compute-storage-net/network-plugins/) that supports [NetworkPolicies](https://kubernetes.io/docs/concepts/services-networking/network-policies/). -{@include: ../_common/cluster-setup.md} +{@include: ../../_common/cluster-setup.md}
### Upgrade Otterize -{@include: ../_common/upgrade-otterize.md} +{@include: ../../_common/upgrade-otterize.md} ## Connect Otterize OSS to Otterize Cloud, or install Otterize with Otterize Cloud To connect Otterize OSS to Otterize Cloud you will need to [login](https://app.otterize.com), create a cluster, and follow the instructions. @@ -29,7 +29,7 @@ To connect Otterize OSS to Otterize Cloud you will need to [login](https://app.o In a nutshell, you need to `helm upgrade` the same Helm chart, but provide Otterize Cloud credentials. Upon creating a cluster, a guide will appear that walks you through doing this with the new credentials jut created. ## Install just the Otterize network mapper -{@include: ../_common/install-otterize-network-mapper.md} +{@include: ../../_common/install-otterize-network-mapper.md} ## Install the Otterize CLI @@ -37,7 +37,7 @@ The [Otterize CLI](/reference/cli) is a command-line utility used to control and To install the CLI: -{@include: ../_common/install-otterize-cli.md} +{@include: ../../_common/install-otterize-cli.md} ## Uninstall Otterize diff --git a/docs/reference/intents-and-intents-files/README.mdx b/docs/overview/intent-based-access-control.mdx similarity index 96% rename from docs/reference/intents-and-intents-files/README.mdx rename to docs/overview/intent-based-access-control.mdx index 9f7e76924..ade9e2477 100644 --- a/docs/reference/intents-and-intents-files/README.mdx +++ b/docs/overview/intent-based-access-control.mdx @@ -1,6 +1,6 @@ --- -sidebar_position: 4 -title: Intents and intents files +sidebar_position: 2 +title: Intent-Based Access Control (IBAC) --- Intent-based access control is, not surprisingly, centered around declaring intents — specifically, declaring **client** intents @@ -39,7 +39,7 @@ As an example, let's look at the core of a client intents file for a service cal It declares that it will call the `emailservice`, the `orderservice`, and the `ecomm-events` Kafka service. It also provides more granular information for some of the calls: ```yaml -{@include: ../../../static/resources/example-intents.yaml} +{@include: ../../static/resources/example-intents.yaml} ``` You can actually create and use such "plain" or "vanilla" intents files without any other metadata. Currently, Otterize only supports processing client intents via the Otterize OSS intents operator for Kubernetes, so you'll need to run the plain intents files through the Otterize CLI (`otterize intents convert`) to convert them into Kubernetes custom resource YAML files. @@ -55,7 +55,7 @@ Here is the same client intents file, now formatted as a Kubernetes custom resou so it can be applied directly via `kubectl apply`: ```yaml -{@include: ../../../static/resources/example-intents-resource-highlighted.yaml} +{@include: ../../static/resources/example-intents-resource-highlighted.yaml} ``` ## Intents file specification diff --git a/docs/otterize-cloud/README.mdx b/docs/overview/otterize-cloud/README.mdx similarity index 100% rename from docs/otterize-cloud/README.mdx rename to docs/overview/otterize-cloud/README.mdx diff --git a/docs/otterize-cloud/_category_.json b/docs/overview/otterize-cloud/_category_.json similarity index 100% rename from docs/otterize-cloud/_category_.json rename to docs/overview/otterize-cloud/_category_.json diff --git a/docs/otterize-cloud/_environments_and_namespaces.mdx b/docs/overview/otterize-cloud/_environments_and_namespaces.mdx similarity index 100% rename from docs/otterize-cloud/_environments_and_namespaces.mdx rename to docs/overview/otterize-cloud/_environments_and_namespaces.mdx diff --git a/docs/otterize-cloud/object-model.mdx b/docs/overview/otterize-cloud/object-model.mdx similarity index 100% rename from docs/otterize-cloud/object-model.mdx rename to docs/overview/otterize-cloud/object-model.mdx diff --git a/docs/otterize-oss/README.mdx b/docs/overview/otterize-oss/README.mdx similarity index 100% rename from docs/otterize-oss/README.mdx rename to docs/overview/otterize-oss/README.mdx diff --git a/docs/otterize-oss/_category_.json b/docs/overview/otterize-oss/_category_.json similarity index 100% rename from docs/otterize-oss/_category_.json rename to docs/overview/otterize-oss/_category_.json diff --git a/docs/otterize-oss/error-telemetry.mdx b/docs/overview/otterize-oss/error-telemetry.mdx similarity index 100% rename from docs/otterize-oss/error-telemetry.mdx rename to docs/overview/otterize-oss/error-telemetry.mdx diff --git a/docs/otterize-oss/usage-telemetry.mdx b/docs/overview/otterize-oss/usage-telemetry.mdx similarity index 100% rename from docs/otterize-oss/usage-telemetry.mdx rename to docs/overview/otterize-oss/usage-telemetry.mdx diff --git a/docs/quickstart/_category_.json b/docs/quickstart/_category_.json deleted file mode 100644 index 69cd49661..000000000 --- a/docs/quickstart/_category_.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "label": "Quickstart", - "position": 1, - "collapsed": false -} diff --git a/docs/quickstart/access-control/_category_.json b/docs/quickstart/access-control/_category_.json deleted file mode 100644 index 58976741d..000000000 --- a/docs/quickstart/access-control/_category_.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "label": "Access control", - "position": 1, - "collapsed": false -} diff --git a/docs/intent-based-access-control/README.mdx b/docs/reference/IBAC-Overview.mdx similarity index 100% rename from docs/intent-based-access-control/README.mdx rename to docs/reference/IBAC-Overview.mdx diff --git a/docs/reference/_category_.json b/docs/reference/_category_.json index 8c87aa627..323775976 100644 --- a/docs/reference/_category_.json +++ b/docs/reference/_category_.json @@ -1,5 +1,5 @@ { "label": "Reference", "position": 11, - "collapsed": false + "collapsed": true } diff --git a/docs/shadow-vs-active-enforcement/README.mdx b/docs/reference/shadow-vs-active-enforcement/README.mdx similarity index 100% rename from docs/shadow-vs-active-enforcement/README.mdx rename to docs/reference/shadow-vs-active-enforcement/README.mdx diff --git a/docs/troubleshooting/README.mdx b/docs/reference/troubleshooting/README.mdx similarity index 100% rename from docs/troubleshooting/README.mdx rename to docs/reference/troubleshooting/README.mdx diff --git a/docusaurus.config.js b/docusaurus.config.js index 1fdac1096..cc13b705f 100644 --- a/docusaurus.config.js +++ b/docusaurus.config.js @@ -137,6 +137,28 @@ const config = { { redirects: [ { + from: ['/getting-started/oss-installation', '/installation'], + to: '/overview/installation', + }, + { + from: ['/intent-based-access-control', '/reference/intents-and-intents-files'], + to: '/overview/intent-based-access-control' + }, + { + from: ['/otterize-oss'], + to: '/overview/otterize-oss' + }, + { + from: ['/reference/access-controls/network-policies'], + to: '/access-types/Networking/Reference/Network-Policies-Deep-Dive' + }, + { + from: ['/shadow-vs-active-enforcement'], + to: '/reference/shadow-vs-active-enforcement' + }, + { + from: ['/otterize-cloud'], + to: '/overview/otterize-cloud' from: '/quick-tutorials', to: '/', }, @@ -149,48 +171,52 @@ const config = { to: '/installation', }, { - from: '/quick-tutorials/k8s-network-policies', - to: '/quickstart/access-control/k8s-network-policies', + from: ['/otterize-oss/usage-telemetry'], + to: '/overview/otterize-oss/usage-telemetry' }, { - from: '/quick-tutorials/k8s-istio-authorization-policies', - to: '/quickstart/access-control/k8s-istio-authorization-policies', + from: ['/otterize-oss/error-telemetry'], + to: '/overview/otterize-oss/error-telemetry' }, { - from: '/quick-tutorials/k8s-kafka-mtls', - to: '/quickstart/access-control/k8s-kafka-mtls', + from: ['/otterize-cloud/object-model'], + to: '/overview/otterize-cloud/object-model' }, { - from: '/quick-tutorials/aws-eks-cni-mini', - to: '/quickstart/access-control/aws-eks-cni-mini', + from: ['/guides/protect-1-service-network-policies'], + to: '/access-types/Networking/Examples/protect-1-service-network-policies' }, { - from: '/quick-tutorials/k8s-kafka-mtls-cert-manager', - to: '/quickstart/access-control/k8s-kafka-mtls-cert-manager', + from: ['/quick-tutorials/k8s-kafka-mtls', '/quickstart/access-control/k8s-kafka-mtls'], + to: '/access-types/Kafka/Examples/k8s-kafka-mtls', + }, + { + from: ['/quick-tutorials/aws-eks-cni-mini','/quickstart/access-control/aws-eks-cni-mini'], + to: '/access-types/Networking/Examples/aws-eks-cni-mini', }, { - from: '/quick-tutorials/k8s-network-mapper', - to: '/quickstart/visualization/k8s-network-mapper', + from: ['/quick-tutorials/k8s-kafka-mtls-cert-manager', '/quickstart/access-control/k8s-kafka-mtls-cert-manager'], + to: '/access-types/Kafka/Examples/k8s-kafka-mtls-cert-manager', }, { - from: '/quick-tutorials/k8s-istio-watcher', - to: '/quickstart/visualization/k8s-istio-watcher', + from: ['/quick-tutorials/k8s-istio-watcher', '/quickstart/visualization/k8s-istio-watcher'], + to: '/access-types/Istio/Examples/k8s-istio-watcher', }, { - from: '/quick-visual-tutorials/visual-ibac-istio-authorization-policies', - to: '/quickstart/access-control/k8s-istio-authorization-policies', + from: ['/quick-visual-tutorials/visual-ibac-istio-authorization-policies','/quickstart/access-control/k8s-istio-authorization-policies', '/quickstart/k8s-istio-authorization-policies'], + to: '/access-types/Istio/Examples/k8s-istio-authorization-policies', }, { - from: '/quick-visual-tutorials/visual-ibac-kafka-k8s', - to: '/quickstart/access-control/k8s-kafka-mtls', + from: ['/quick-visual-tutorials/visual-ibac-kafka-k8s'], + to: '/access-types/Kafka/Examples/k8s-kafka-mapping', }, { - from: '/quick-visual-tutorials/visual-ibac-network-policies', - to: '/quickstart/access-control/k8s-network-policies', + from: ['/quick-visual-tutorials/visual-ibac-network-policies', '/quick-tutorials/k8s-network-policies', '/quickstart/access-control/k8s-network-policies'], + to: '/access-types/Networking/Examples/k8s-network-policies', }, { - from: '/quick-visual-tutorials/visual-k8s-cluster-mapping', - to: '/quickstart/visualization/k8s-network-mapper', + from: ['/quick-visual-tutorials/visual-k8s-cluster-mapping', '/quickstart/visualization/k8s-network-mapper', '/quick-tutorials/k8s-network-mapper'], + to: '/access-types/Networking/Examples/k8s-network-mapper', }, // Redirect from multiple old paths to the new path // { diff --git a/src/css/custom.css b/src/css/custom.css index 39fa32fb8..01d80d9cb 100644 --- a/src/css/custom.css +++ b/src/css/custom.css @@ -10,18 +10,22 @@ /* You can override the default Infima variables here. */ :root { - --ifm-color-primary: #306e96; + --ifm-color-primary: #4d3df7; --ifm-color-primary-dark: #2b6387; --ifm-color-primary-darker: #295e80; --ifm-color-primary-darkest: #224d69; --ifm-color-primary-light: #3579a5; --ifm-color-primary-lighter: #377fad; --ifm-color-primary-lightest: #408fc2; - --ifm-code-font-size: 95%; + --ifm-code-font-size: 85%; + --ifm-font-size-base: 0.9rem; + --ifm-font-weight-base: 400; + --ifm-h1-font-size: 2.5rem; --ifm-code-border-radius: 5px; --docusaurus-highlighted-code-line-bg: rgba(255, 255, 255, 0.2); --ifm-navbar-height: 5rem; + --ifm-menu-color: #333; --ifm-footer-background-color: white; --ifm-footer-color: white; @@ -31,11 +35,12 @@ } .navbar__title { - color: #2186e6; + color: #4d3df7; } .navbar__item { margin-left: 10px; + font-size: 12px; white-space: nowrap; } From 1af2efff93890c0afd4928c4f20ed02c5623b7a6 Mon Sep 17 00:00:00 2001 From: bglynn Date: Mon, 22 Jan 2024 10:08:14 -0800 Subject: [PATCH 02/18] * Added support to tailwind in the documents * Access Type / AWS IAM Draft content --- docs/access-types/AWS IAM/Overview.mdx | 8 -- docs/access-types/AWS IAM/Reference.mdx | 4 - .../Istio/Examples/_category_.json | 2 +- .../Networking/Examples/_category_.json | 2 +- .../Postgres/Examples/_category_.json | 2 +- docs/access-types/README.mdx | 82 ++++++++++++++++++- .../Examples/_category_.json | 0 .../Examples/aws-iam-eks.mdx | 0 docs/access-types/aws-iam/Overview.mdx | 46 +++++++++++ docs/access-types/aws-iam/Reference.mdx | 40 +++++++++ .../{AWS IAM => aws-iam}/_category_.json | 2 +- package.json | 1 + src/css/custom.css | 6 ++ tailwind.config.js | 2 +- yarn.lock | 5 ++ 15 files changed, 184 insertions(+), 18 deletions(-) delete mode 100644 docs/access-types/AWS IAM/Overview.mdx delete mode 100644 docs/access-types/AWS IAM/Reference.mdx rename docs/access-types/{AWS IAM => aws-iam}/Examples/_category_.json (100%) rename docs/access-types/{AWS IAM => aws-iam}/Examples/aws-iam-eks.mdx (100%) create mode 100644 docs/access-types/aws-iam/Overview.mdx create mode 100644 docs/access-types/aws-iam/Reference.mdx rename docs/access-types/{AWS IAM => aws-iam}/_category_.json (67%) diff --git a/docs/access-types/AWS IAM/Overview.mdx b/docs/access-types/AWS IAM/Overview.mdx deleted file mode 100644 index cf6694baa..000000000 --- a/docs/access-types/AWS IAM/Overview.mdx +++ /dev/null @@ -1,8 +0,0 @@ ---- -sidebar_position: 1 -title: Overview -hide_table_of_contents: false ---- - - - diff --git a/docs/access-types/AWS IAM/Reference.mdx b/docs/access-types/AWS IAM/Reference.mdx deleted file mode 100644 index 626ea0452..000000000 --- a/docs/access-types/AWS IAM/Reference.mdx +++ /dev/null @@ -1,4 +0,0 @@ ---- -sidebar_position: 3 -title: Reference ---- \ No newline at end of file diff --git a/docs/access-types/Istio/Examples/_category_.json b/docs/access-types/Istio/Examples/_category_.json index 0e3676464..bbac434cd 100644 --- a/docs/access-types/Istio/Examples/_category_.json +++ b/docs/access-types/Istio/Examples/_category_.json @@ -1,5 +1,5 @@ { "label": "Examples", "position": 2, - "collapsed": true + "collapsed": false } diff --git a/docs/access-types/Networking/Examples/_category_.json b/docs/access-types/Networking/Examples/_category_.json index 0e3676464..bbac434cd 100644 --- a/docs/access-types/Networking/Examples/_category_.json +++ b/docs/access-types/Networking/Examples/_category_.json @@ -1,5 +1,5 @@ { "label": "Examples", "position": 2, - "collapsed": true + "collapsed": false } diff --git a/docs/access-types/Postgres/Examples/_category_.json b/docs/access-types/Postgres/Examples/_category_.json index 0e3676464..bbac434cd 100644 --- a/docs/access-types/Postgres/Examples/_category_.json +++ b/docs/access-types/Postgres/Examples/_category_.json @@ -1,5 +1,5 @@ { "label": "Examples", "position": 2, - "collapsed": true + "collapsed": false } diff --git a/docs/access-types/README.mdx b/docs/access-types/README.mdx index ce1f892fc..176cb8bf0 100644 --- a/docs/access-types/README.mdx +++ b/docs/access-types/README.mdx @@ -1,4 +1,84 @@ --- sidebar_position: 1 title: Access Types ---- \ No newline at end of file +hide_title: true +--- + +export const types = [ + { + name: 'Networking', + role: 'Admin', + url: '/access-types/Networking/Overview', + imageUrl: '/img/icons/networking.png', + }, + { + name: 'AWS IAM', + role: 'Admin', + url: '/access-types/aws-iam/Overview', + imageUrl: '/img/icons/aws.png', + }, + { + name: 'Kafka', + role: 'Admin', + url: '/access-types/Kafka/Overview', + imageUrl: '/img/icons/kafka.png', + }, + { + name: 'Istio', + role: 'Admin', + url: '/access-types/Istio/Overview', + imageUrl: '/img/icons/istio.png', + }, + { + name: 'PostgreSQL', + role: 'Cloud', + url: '/access-types/Postgres/Overview', + imageUrl: '/img/icons/postgresql.png', + }, + // More types... +] + +export default function AccessTypesCards() { + return ( +
+

Access Types

+

+ Otterize makes it easy to create authorization for your Kubernetes clusters across a variety of + different types of access. Explore each below. +

+ +
+ ) +} + + + + + + diff --git a/docs/access-types/AWS IAM/Examples/_category_.json b/docs/access-types/aws-iam/Examples/_category_.json similarity index 100% rename from docs/access-types/AWS IAM/Examples/_category_.json rename to docs/access-types/aws-iam/Examples/_category_.json diff --git a/docs/access-types/AWS IAM/Examples/aws-iam-eks.mdx b/docs/access-types/aws-iam/Examples/aws-iam-eks.mdx similarity index 100% rename from docs/access-types/AWS IAM/Examples/aws-iam-eks.mdx rename to docs/access-types/aws-iam/Examples/aws-iam-eks.mdx diff --git a/docs/access-types/aws-iam/Overview.mdx b/docs/access-types/aws-iam/Overview.mdx new file mode 100644 index 000000000..13fcffd3c --- /dev/null +++ b/docs/access-types/aws-iam/Overview.mdx @@ -0,0 +1,46 @@ +--- +sidebar_position: 1 +title: Overview +hide_table_of_contents: true +hide_title: true +--- + +# AWS IAM + +Otterize can provide least-privilege access from your EKS Kubernetes clusters to AWS Resources with [IBAC](/overview/intent-based-access-control/) support for AWS's IAM policies. + +### About + +In many workloads, EKS clusters must access external cloud resources such as databases, object storage, or additional services. Otterize provides unique credentials and policies for each pod for exactly the authorization they require. + +### How does it work + +To follow along with a full example, take a look at [Automate AWS IAM for EKS](/access-types/aws-iam/Examples/aws-iam-eks) + +1. First, the EKS cluster must have [Otterize installed](/overview/installation). +2. We must label the pod with `credentials-operator.otterize.com/create-aws-role: "true"` +3. Once that is complete, Otterize’s credential operator will create a role and an `AssumeRolePolicy` bound to ServiceAccount. +4. At this point, the role does not have the ability to perform any actions. We will need to create a ClientIntents YAML for the access the service requires and apply it to our cluster. Below is an example of a ClientIntents file for accessing an S3 bucket. View the [reference](/access-types/aws-iam/Reference) to learn more about the AWS IAM Client Intent syntax. +5. Once the intent is applied, a new policy will be attached to the service’s role with the appropriate access. + +```yaml +apiVersion: k8s.otterize.com/v1alpha3 +kind: ClientIntents +metadata: + name: server +spec: + service: + name: server + calls: + - name: arn:aws:s3:::example-bucket-*/* + type: aws + awsActions: + - "s3:PutObject" + - "s3:GetObject" +``` + +### Coming Soon + +Building least-privilege access can be difficult. Many actions have dependent actions, or services can require a lot of access to perform their functions. To help reduce this burden, Otterize will provide automated ClientIntents based on the actions your service actually requires by detecting the calls being made and converting them into the necessary YAML syntax. + + diff --git a/docs/access-types/aws-iam/Reference.mdx b/docs/access-types/aws-iam/Reference.mdx new file mode 100644 index 000000000..bfc777d18 --- /dev/null +++ b/docs/access-types/aws-iam/Reference.mdx @@ -0,0 +1,40 @@ +--- +sidebar_position: 3 +title: Reference +--- +**Metadata/Labels** + +| label | type | Description | +|---------------------------------------------------|---------|--------------------------------------------------------------| +| credentials-operator.otterize.com/create-aws-role | boolean | By setting to **true** the credential operator will create an unique AWS Role for the associated pod | +**ClientIntents** (YAML) + +| key | sub-ley | type | type | Description | +|-------------|------------|-------|--------|--------------------------------------------------------------| +| **service** | name | value | string | The name of the pod that will be granted access | +| **calls** | name | list | ARN | The AWS ARN or ARN wildcard that references the resource(s) for the authorization. See [ARN Formats - Amazon QuickSight](https://docs.aws.amazon.com/quicksight/latest/APIReference/qs-arn-format.html) for more information | +| **calls** | type | value | string | a value of “aws” to indicate the type of calls being authorized and specified. | +| **calls** | awsActions | list | Action | The [AWS Actions](https://docs.aws.amazon.com/service-authorization/latest/reference/reference_policies_actions-resources-contextkeys.html) or action wildcards that will be provided to the specified resources. | +Multiple call definitions can be defined for a single service. + +**Example YAML** + +```yaml +apiVersion: k8s.otterize.com/v1alpha3 +kind: ClientIntents +metadata: + name: server +spec: + service: + name: server + calls: + - name: arn:aws:s3:::example-bucket-*/* + type: aws + awsActions: + - "s3:PutObject" + - "s3:GetObject" + - name: arn:aws:s3:::read-only-bucket-*/* + type: aws + awsActions: + - "s3:GetObject" +``` diff --git a/docs/access-types/AWS IAM/_category_.json b/docs/access-types/aws-iam/_category_.json similarity index 67% rename from docs/access-types/AWS IAM/_category_.json rename to docs/access-types/aws-iam/_category_.json index aca2a23bb..31268af38 100644 --- a/docs/access-types/AWS IAM/_category_.json +++ b/docs/access-types/aws-iam/_category_.json @@ -1,5 +1,5 @@ { "label": "AWS IAM", "position": 2, - "collapsed": true + "collapsed": false } diff --git a/package.json b/package.json index 70dbf3159..d1c852a70 100644 --- a/package.json +++ b/package.json @@ -24,6 +24,7 @@ "clsx": "^1.2.1", "docusaurus-plugin-hotjar": "^0.0.2", "docusaurus-plugin-includes": "^1.1.4", + "heroicons": "^2.1.1", "prism-react-renderer": "^1.3.5", "react": "^17.0.2", "react-dom": "^17.0.2" diff --git a/src/css/custom.css b/src/css/custom.css index 01d80d9cb..7232bddbf 100644 --- a/src/css/custom.css +++ b/src/css/custom.css @@ -34,6 +34,12 @@ --ifm-footer-padding-horizontal: 20px; } +article { + max-width: 800px; + margin-left: 2rem; + margin-right: auto; +} + .navbar__title { color: #4d3df7; } diff --git a/tailwind.config.js b/tailwind.config.js index 066cdd952..a1768b0f8 100644 --- a/tailwind.config.js +++ b/tailwind.config.js @@ -1,6 +1,6 @@ /** @type {import('tailwindcss').Config} */ module.exports = { - content: ['./src/**/*.{js,jsx,ts,tsx}', './docusaurus.config.js'], + content: ['./src/**/*.{js,jsx,ts,tsx}', './docusaurus.config.js', './docs/**/*.mdx'], prefix: 'tw-', // This is important to avoid conflicts with Docusaurus styles. theme: { screens: { diff --git a/yarn.lock b/yarn.lock index 2aab033f1..199721d77 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4416,6 +4416,11 @@ he@^1.2.0: resolved "https://registry.npmjs.org/he/-/he-1.2.0.tgz" integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== +heroicons@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/heroicons/-/heroicons-2.1.1.tgz#b574c2d87bc504bf7f4fefacc20960c5672b0202" + integrity sha512-54kHbrxsTyAJJU7z07XN1OrVBX8ogN/tbclP8Doxk0X4IQmR6LEhLzJBkFK9Yc814NoXG6ZJBh9Bi/qvauzjfA== + history@^4.9.0: version "4.10.1" resolved "https://registry.npmjs.org/history/-/history-4.10.1.tgz" From 784d60db2d7bc4b344151c383f98c21783b072c0 Mon Sep 17 00:00:00 2001 From: bglynn Date: Wed, 24 Jan 2024 12:21:46 -0800 Subject: [PATCH 03/18] * "Features" * Draft content for new getting started page --- docs/access-types/Istio/_category_.json | 5 - docs/access-types/Kafka/_category_.json | 5 - docs/access-types/Networking/_category_.json | 5 - docs/access-types/Postgres/_category_.json | 5 - docs/access-types/README.mdx | 84 ------- docs/access-types/_category_.json | 5 - docs/access-types/aws-iam/_category_.json | 5 - .../Istio/Examples/_category_.json | 0 .../k8s-istio-authorization-policies.mdx | 0 .../Istio/Examples/k8s-istio-watcher.mdx | 0 .../Istio/Overview.mdx | 0 .../Istio/Reference.mdx | 0 docs/features/Istio/_category_.json | 8 + .../Kafka/Examples/_category_.json | 0 .../Kafka/Examples/k8s-kafka-mapping.mdx | 0 .../Examples/k8s-kafka-mtls-cert-manager.mdx | 2 +- .../Kafka/Examples/k8s-kafka-mtls.mdx | 0 .../Kafka/Overview.mdx | 0 .../Kafka/Reference.mdx | 0 docs/features/Kafka/_category_.json | 9 + .../Networking/Examples/_category_.json | 0 .../Networking/Examples/aws-eks-cni-mini.mdx | 2 +- .../Examples/k8s-network-mapper.mdx | 2 +- .../Examples/k8s-network-policies.mdx | 2 +- .../protect-1-service-network-policies.mdx | 2 +- .../Networking/Overview.mdx | 0 .../Reference/Network-Policies-Deep-Dive.mdx | 0 .../Networking/Reference/README.mdx | 0 docs/features/Networking/_category_.json | 8 + .../Postgres/Examples/_category_.json | 0 .../Postgres/Examples/postgres.mdx | 0 .../Postgres/Overview.mdx | 0 .../Postgres/Reference.mdx | 0 docs/features/Postgres/_category_.json | 8 + docs/features/README.mdx | 55 +++++ docs/features/_category_.json | 8 + .../aws-iam/Examples/_category_.json | 0 .../aws-iam/Examples/aws-iam-eks.mdx | 0 .../aws-iam/Overview.mdx | 4 +- .../aws-iam/Reference.mdx | 0 docs/features/aws-iam/_category_.json | 8 + docs/getting-started/README.mdx | 224 ++++++++++++++---- docusaurus.config.js | 20 +- src/components/CardList/index.js | 29 +++ src/components/LinkCard/index.js | 35 +++ static/img/icons/aws.png | Bin 0 -> 46809 bytes static/img/icons/istio.png | Bin 0 -> 20852 bytes static/img/icons/kafka.png | Bin 0 -> 13675 bytes static/img/icons/networking.png | Bin 0 -> 21015 bytes static/img/icons/postgresql.png | Bin 0 -> 35042 bytes 50 files changed, 365 insertions(+), 175 deletions(-) delete mode 100644 docs/access-types/Istio/_category_.json delete mode 100644 docs/access-types/Kafka/_category_.json delete mode 100644 docs/access-types/Networking/_category_.json delete mode 100644 docs/access-types/Postgres/_category_.json delete mode 100644 docs/access-types/README.mdx delete mode 100644 docs/access-types/_category_.json delete mode 100644 docs/access-types/aws-iam/_category_.json rename docs/{access-types => features}/Istio/Examples/_category_.json (100%) rename docs/{access-types => features}/Istio/Examples/k8s-istio-authorization-policies.mdx (100%) rename docs/{access-types => features}/Istio/Examples/k8s-istio-watcher.mdx (100%) rename docs/{access-types => features}/Istio/Overview.mdx (100%) rename docs/{access-types => features}/Istio/Reference.mdx (100%) create mode 100644 docs/features/Istio/_category_.json rename docs/{access-types => features}/Kafka/Examples/_category_.json (100%) rename docs/{access-types => features}/Kafka/Examples/k8s-kafka-mapping.mdx (100%) rename docs/{access-types => features}/Kafka/Examples/k8s-kafka-mtls-cert-manager.mdx (99%) rename docs/{access-types => features}/Kafka/Examples/k8s-kafka-mtls.mdx (100%) rename docs/{access-types => features}/Kafka/Overview.mdx (100%) rename docs/{access-types => features}/Kafka/Reference.mdx (100%) create mode 100644 docs/features/Kafka/_category_.json rename docs/{access-types => features}/Networking/Examples/_category_.json (100%) rename docs/{access-types => features}/Networking/Examples/aws-eks-cni-mini.mdx (99%) rename docs/{access-types => features}/Networking/Examples/k8s-network-mapper.mdx (99%) rename docs/{access-types => features}/Networking/Examples/k8s-network-policies.mdx (99%) rename docs/{access-types => features}/Networking/Examples/protect-1-service-network-policies.mdx (99%) rename docs/{access-types => features}/Networking/Overview.mdx (100%) rename docs/{access-types => features}/Networking/Reference/Network-Policies-Deep-Dive.mdx (100%) rename docs/{access-types => features}/Networking/Reference/README.mdx (100%) create mode 100644 docs/features/Networking/_category_.json rename docs/{access-types => features}/Postgres/Examples/_category_.json (100%) rename docs/{access-types => features}/Postgres/Examples/postgres.mdx (100%) rename docs/{access-types => features}/Postgres/Overview.mdx (100%) rename docs/{access-types => features}/Postgres/Reference.mdx (100%) create mode 100644 docs/features/Postgres/_category_.json create mode 100644 docs/features/README.mdx create mode 100644 docs/features/_category_.json rename docs/{access-types => features}/aws-iam/Examples/_category_.json (100%) rename docs/{access-types => features}/aws-iam/Examples/aws-iam-eks.mdx (100%) rename docs/{access-types => features}/aws-iam/Overview.mdx (91%) rename docs/{access-types => features}/aws-iam/Reference.mdx (100%) create mode 100644 docs/features/aws-iam/_category_.json create mode 100644 src/components/CardList/index.js create mode 100644 src/components/LinkCard/index.js create mode 100644 static/img/icons/aws.png create mode 100644 static/img/icons/istio.png create mode 100644 static/img/icons/kafka.png create mode 100644 static/img/icons/networking.png create mode 100644 static/img/icons/postgresql.png diff --git a/docs/access-types/Istio/_category_.json b/docs/access-types/Istio/_category_.json deleted file mode 100644 index 1654bce0e..000000000 --- a/docs/access-types/Istio/_category_.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "label": "Istio", - "position": 4, - "collapsed": true -} diff --git a/docs/access-types/Kafka/_category_.json b/docs/access-types/Kafka/_category_.json deleted file mode 100644 index 4861435c0..000000000 --- a/docs/access-types/Kafka/_category_.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "label": "Kafka", - "position": 3, - "collapsed": true -} diff --git a/docs/access-types/Networking/_category_.json b/docs/access-types/Networking/_category_.json deleted file mode 100644 index cffc70f0d..000000000 --- a/docs/access-types/Networking/_category_.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "label": "Networking", - "position": 1, - "collapsed": true -} diff --git a/docs/access-types/Postgres/_category_.json b/docs/access-types/Postgres/_category_.json deleted file mode 100644 index bc6190e1f..000000000 --- a/docs/access-types/Postgres/_category_.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "label": "PostgreSQL", - "position": 5, - "collapsed": true -} diff --git a/docs/access-types/README.mdx b/docs/access-types/README.mdx deleted file mode 100644 index 176cb8bf0..000000000 --- a/docs/access-types/README.mdx +++ /dev/null @@ -1,84 +0,0 @@ ---- -sidebar_position: 1 -title: Access Types -hide_title: true ---- - -export const types = [ - { - name: 'Networking', - role: 'Admin', - url: '/access-types/Networking/Overview', - imageUrl: '/img/icons/networking.png', - }, - { - name: 'AWS IAM', - role: 'Admin', - url: '/access-types/aws-iam/Overview', - imageUrl: '/img/icons/aws.png', - }, - { - name: 'Kafka', - role: 'Admin', - url: '/access-types/Kafka/Overview', - imageUrl: '/img/icons/kafka.png', - }, - { - name: 'Istio', - role: 'Admin', - url: '/access-types/Istio/Overview', - imageUrl: '/img/icons/istio.png', - }, - { - name: 'PostgreSQL', - role: 'Cloud', - url: '/access-types/Postgres/Overview', - imageUrl: '/img/icons/postgresql.png', - }, - // More types... -] - -export default function AccessTypesCards() { - return ( -
-

Access Types

-

- Otterize makes it easy to create authorization for your Kubernetes clusters across a variety of - different types of access. Explore each below. -

- -
- ) -} - - - - - - diff --git a/docs/access-types/_category_.json b/docs/access-types/_category_.json deleted file mode 100644 index 867232c84..000000000 --- a/docs/access-types/_category_.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "label": "Access Types", - "position": 3, - "collapsed": false -} diff --git a/docs/access-types/aws-iam/_category_.json b/docs/access-types/aws-iam/_category_.json deleted file mode 100644 index 31268af38..000000000 --- a/docs/access-types/aws-iam/_category_.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "label": "AWS IAM", - "position": 2, - "collapsed": false -} diff --git a/docs/access-types/Istio/Examples/_category_.json b/docs/features/Istio/Examples/_category_.json similarity index 100% rename from docs/access-types/Istio/Examples/_category_.json rename to docs/features/Istio/Examples/_category_.json diff --git a/docs/access-types/Istio/Examples/k8s-istio-authorization-policies.mdx b/docs/features/Istio/Examples/k8s-istio-authorization-policies.mdx similarity index 100% rename from docs/access-types/Istio/Examples/k8s-istio-authorization-policies.mdx rename to docs/features/Istio/Examples/k8s-istio-authorization-policies.mdx diff --git a/docs/access-types/Istio/Examples/k8s-istio-watcher.mdx b/docs/features/Istio/Examples/k8s-istio-watcher.mdx similarity index 100% rename from docs/access-types/Istio/Examples/k8s-istio-watcher.mdx rename to docs/features/Istio/Examples/k8s-istio-watcher.mdx diff --git a/docs/access-types/Istio/Overview.mdx b/docs/features/Istio/Overview.mdx similarity index 100% rename from docs/access-types/Istio/Overview.mdx rename to docs/features/Istio/Overview.mdx diff --git a/docs/access-types/Istio/Reference.mdx b/docs/features/Istio/Reference.mdx similarity index 100% rename from docs/access-types/Istio/Reference.mdx rename to docs/features/Istio/Reference.mdx diff --git a/docs/features/Istio/_category_.json b/docs/features/Istio/_category_.json new file mode 100644 index 000000000..1768d992d --- /dev/null +++ b/docs/features/Istio/_category_.json @@ -0,0 +1,8 @@ +{ + "label": "Istio", + "position": 4, + "collapsed": true, + "customProps": { + "image": "/img/icons/istio.png" + } +} diff --git a/docs/access-types/Kafka/Examples/_category_.json b/docs/features/Kafka/Examples/_category_.json similarity index 100% rename from docs/access-types/Kafka/Examples/_category_.json rename to docs/features/Kafka/Examples/_category_.json diff --git a/docs/access-types/Kafka/Examples/k8s-kafka-mapping.mdx b/docs/features/Kafka/Examples/k8s-kafka-mapping.mdx similarity index 100% rename from docs/access-types/Kafka/Examples/k8s-kafka-mapping.mdx rename to docs/features/Kafka/Examples/k8s-kafka-mapping.mdx diff --git a/docs/access-types/Kafka/Examples/k8s-kafka-mtls-cert-manager.mdx b/docs/features/Kafka/Examples/k8s-kafka-mtls-cert-manager.mdx similarity index 99% rename from docs/access-types/Kafka/Examples/k8s-kafka-mtls-cert-manager.mdx rename to docs/features/Kafka/Examples/k8s-kafka-mtls-cert-manager.mdx index ec754ba6c..8bd74c7dd 100644 --- a/docs/access-types/Kafka/Examples/k8s-kafka-mtls-cert-manager.mdx +++ b/docs/features/Kafka/Examples/k8s-kafka-mtls-cert-manager.mdx @@ -1,6 +1,6 @@ --- sidebar_position: 5 -title: Kafka Access Automation Using Cert-Manager mTLS +title: Kafka access automation using cert-manager mTLS image: /img/quick-tutorials/k8s-kafka-mtls-cert-mgr/social.png --- diff --git a/docs/access-types/Kafka/Examples/k8s-kafka-mtls.mdx b/docs/features/Kafka/Examples/k8s-kafka-mtls.mdx similarity index 100% rename from docs/access-types/Kafka/Examples/k8s-kafka-mtls.mdx rename to docs/features/Kafka/Examples/k8s-kafka-mtls.mdx diff --git a/docs/access-types/Kafka/Overview.mdx b/docs/features/Kafka/Overview.mdx similarity index 100% rename from docs/access-types/Kafka/Overview.mdx rename to docs/features/Kafka/Overview.mdx diff --git a/docs/access-types/Kafka/Reference.mdx b/docs/features/Kafka/Reference.mdx similarity index 100% rename from docs/access-types/Kafka/Reference.mdx rename to docs/features/Kafka/Reference.mdx diff --git a/docs/features/Kafka/_category_.json b/docs/features/Kafka/_category_.json new file mode 100644 index 000000000..671f785b5 --- /dev/null +++ b/docs/features/Kafka/_category_.json @@ -0,0 +1,9 @@ +{ + "label": "Kafka", + "position": 3, + "collapsed": true, + "customProps": { + "image": "/img/icons/kafka.png", + "cloud-only": "true" + } +} diff --git a/docs/access-types/Networking/Examples/_category_.json b/docs/features/Networking/Examples/_category_.json similarity index 100% rename from docs/access-types/Networking/Examples/_category_.json rename to docs/features/Networking/Examples/_category_.json diff --git a/docs/access-types/Networking/Examples/aws-eks-cni-mini.mdx b/docs/features/Networking/Examples/aws-eks-cni-mini.mdx similarity index 99% rename from docs/access-types/Networking/Examples/aws-eks-cni-mini.mdx rename to docs/features/Networking/Examples/aws-eks-cni-mini.mdx index f49bd7e7b..9e6ea6e55 100644 --- a/docs/access-types/Networking/Examples/aws-eks-cni-mini.mdx +++ b/docs/features/Networking/Examples/aws-eks-cni-mini.mdx @@ -1,6 +1,6 @@ --- sidebar_position: 4 -title: AWS EKS Network policies With The VPC CNI +title: AWS EKS network policies with the VPC CNI image: /img/quick-tutorials/aws-eks-mini/social.png --- diff --git a/docs/access-types/Networking/Examples/k8s-network-mapper.mdx b/docs/features/Networking/Examples/k8s-network-mapper.mdx similarity index 99% rename from docs/access-types/Networking/Examples/k8s-network-mapper.mdx rename to docs/features/Networking/Examples/k8s-network-mapper.mdx index 0db7cfd8b..7c3db3339 100644 --- a/docs/access-types/Networking/Examples/k8s-network-mapper.mdx +++ b/docs/features/Networking/Examples/k8s-network-mapper.mdx @@ -1,6 +1,6 @@ --- sidebar_position: 1 -title: Visualizing a Kubernetes Network +title: Visualizing a Kubernetes network image: /img/visualization/k8s-network-mapper/social.png --- diff --git a/docs/access-types/Networking/Examples/k8s-network-policies.mdx b/docs/features/Networking/Examples/k8s-network-policies.mdx similarity index 99% rename from docs/access-types/Networking/Examples/k8s-network-policies.mdx rename to docs/features/Networking/Examples/k8s-network-policies.mdx index 781e43f1c..3686dc23f 100644 --- a/docs/access-types/Networking/Examples/k8s-network-policies.mdx +++ b/docs/features/Networking/Examples/k8s-network-policies.mdx @@ -1,6 +1,6 @@ --- sidebar_position: 1 -title: Network Policy Automation +title: NetworkPolicy Automation image: /img/quick-tutorials/network-policies/social.png --- diff --git a/docs/access-types/Networking/Examples/protect-1-service-network-policies.mdx b/docs/features/Networking/Examples/protect-1-service-network-policies.mdx similarity index 99% rename from docs/access-types/Networking/Examples/protect-1-service-network-policies.mdx rename to docs/features/Networking/Examples/protect-1-service-network-policies.mdx index 7bcaacd3e..d43d3b445 100644 --- a/docs/access-types/Networking/Examples/protect-1-service-network-policies.mdx +++ b/docs/features/Networking/Examples/protect-1-service-network-policies.mdx @@ -1,6 +1,6 @@ --- sidebar_position: 1 -title: "Protecting A Service With Network Policies" +title: "Protecting a service with network policies" --- import CodeBlock from "@theme/CodeBlock"; diff --git a/docs/access-types/Networking/Overview.mdx b/docs/features/Networking/Overview.mdx similarity index 100% rename from docs/access-types/Networking/Overview.mdx rename to docs/features/Networking/Overview.mdx diff --git a/docs/access-types/Networking/Reference/Network-Policies-Deep-Dive.mdx b/docs/features/Networking/Reference/Network-Policies-Deep-Dive.mdx similarity index 100% rename from docs/access-types/Networking/Reference/Network-Policies-Deep-Dive.mdx rename to docs/features/Networking/Reference/Network-Policies-Deep-Dive.mdx diff --git a/docs/access-types/Networking/Reference/README.mdx b/docs/features/Networking/Reference/README.mdx similarity index 100% rename from docs/access-types/Networking/Reference/README.mdx rename to docs/features/Networking/Reference/README.mdx diff --git a/docs/features/Networking/_category_.json b/docs/features/Networking/_category_.json new file mode 100644 index 000000000..d8135a87a --- /dev/null +++ b/docs/features/Networking/_category_.json @@ -0,0 +1,8 @@ +{ + "label": "Networking", + "position": 1, + "collapsed": true, + "customProps": { + "image": "/img/icons/networking.png" + } +} diff --git a/docs/access-types/Postgres/Examples/_category_.json b/docs/features/Postgres/Examples/_category_.json similarity index 100% rename from docs/access-types/Postgres/Examples/_category_.json rename to docs/features/Postgres/Examples/_category_.json diff --git a/docs/access-types/Postgres/Examples/postgres.mdx b/docs/features/Postgres/Examples/postgres.mdx similarity index 100% rename from docs/access-types/Postgres/Examples/postgres.mdx rename to docs/features/Postgres/Examples/postgres.mdx diff --git a/docs/access-types/Postgres/Overview.mdx b/docs/features/Postgres/Overview.mdx similarity index 100% rename from docs/access-types/Postgres/Overview.mdx rename to docs/features/Postgres/Overview.mdx diff --git a/docs/access-types/Postgres/Reference.mdx b/docs/features/Postgres/Reference.mdx similarity index 100% rename from docs/access-types/Postgres/Reference.mdx rename to docs/features/Postgres/Reference.mdx diff --git a/docs/features/Postgres/_category_.json b/docs/features/Postgres/_category_.json new file mode 100644 index 000000000..02b31b4a4 --- /dev/null +++ b/docs/features/Postgres/_category_.json @@ -0,0 +1,8 @@ +{ + "label": "PostgreSQL", + "position": 5, + "collapsed": true, + "customProps": { + "image": "/img/icons/postgresql.png" + } +} diff --git a/docs/features/README.mdx b/docs/features/README.mdx new file mode 100644 index 000000000..1513e9df8 --- /dev/null +++ b/docs/features/README.mdx @@ -0,0 +1,55 @@ +--- +sidebar_position: 1 +title: Features +hide_title: true +--- + + +import { + useCurrentSidebarCategory +} from '@docusaurus/theme-common'; + + + +export default function FeatureCards() { + const category = useCurrentSidebarCategory(); + const features = category.items; + return ( +
+

Features

+

+ Otterize makes it easy to create and visualize authorization for your Kubernetes clusters across a + variety of + services. Explore each below. +

+
+ {features.map((feature) => ( +
+ {feature.items && feature.items[0] && feature.items[0].href && + +
+
+ {feature.customProps && feature.customProps.image && + + } +
+

{feature.label}

+
+
+ } +
+ ))} +
+
+ ) +} + + + + + + diff --git a/docs/features/_category_.json b/docs/features/_category_.json new file mode 100644 index 000000000..5299b8d4f --- /dev/null +++ b/docs/features/_category_.json @@ -0,0 +1,8 @@ +{ + "label": "Features", + "position": 3, + "collapsed": false, + "customProps": { + "image": "/img/icons/aws.png" + } +} diff --git a/docs/access-types/aws-iam/Examples/_category_.json b/docs/features/aws-iam/Examples/_category_.json similarity index 100% rename from docs/access-types/aws-iam/Examples/_category_.json rename to docs/features/aws-iam/Examples/_category_.json diff --git a/docs/access-types/aws-iam/Examples/aws-iam-eks.mdx b/docs/features/aws-iam/Examples/aws-iam-eks.mdx similarity index 100% rename from docs/access-types/aws-iam/Examples/aws-iam-eks.mdx rename to docs/features/aws-iam/Examples/aws-iam-eks.mdx diff --git a/docs/access-types/aws-iam/Overview.mdx b/docs/features/aws-iam/Overview.mdx similarity index 91% rename from docs/access-types/aws-iam/Overview.mdx rename to docs/features/aws-iam/Overview.mdx index 13fcffd3c..c55d04df4 100644 --- a/docs/access-types/aws-iam/Overview.mdx +++ b/docs/features/aws-iam/Overview.mdx @@ -15,12 +15,12 @@ In many workloads, EKS clusters must access external cloud resources such as dat ### How does it work -To follow along with a full example, take a look at [Automate AWS IAM for EKS](/access-types/aws-iam/Examples/aws-iam-eks) +To follow along with a full example, take a look at [Automate AWS IAM for EKS](/features/aws-iam/Examples/aws-iam-eks) 1. First, the EKS cluster must have [Otterize installed](/overview/installation). 2. We must label the pod with `credentials-operator.otterize.com/create-aws-role: "true"` 3. Once that is complete, Otterize’s credential operator will create a role and an `AssumeRolePolicy` bound to ServiceAccount. -4. At this point, the role does not have the ability to perform any actions. We will need to create a ClientIntents YAML for the access the service requires and apply it to our cluster. Below is an example of a ClientIntents file for accessing an S3 bucket. View the [reference](/access-types/aws-iam/Reference) to learn more about the AWS IAM Client Intent syntax. +4. At this point, the role does not have the ability to perform any actions. We will need to create a ClientIntents YAML for the access the service requires and apply it to our cluster. Below is an example of a ClientIntents file for accessing an S3 bucket. View the [reference](/features/aws-iam/Reference) to learn more about the AWS IAM Client Intent syntax. 5. Once the intent is applied, a new policy will be attached to the service’s role with the appropriate access. ```yaml diff --git a/docs/access-types/aws-iam/Reference.mdx b/docs/features/aws-iam/Reference.mdx similarity index 100% rename from docs/access-types/aws-iam/Reference.mdx rename to docs/features/aws-iam/Reference.mdx diff --git a/docs/features/aws-iam/_category_.json b/docs/features/aws-iam/_category_.json new file mode 100644 index 000000000..793b7a8c4 --- /dev/null +++ b/docs/features/aws-iam/_category_.json @@ -0,0 +1,8 @@ +{ + "label": "AWS IAM", + "position": 2, + "collapsed": true, + "customProps": { + "image": "/img/icons/aws.png" + } +} diff --git a/docs/getting-started/README.mdx b/docs/getting-started/README.mdx index b8d8d040b..480851c46 100644 --- a/docs/getting-started/README.mdx +++ b/docs/getting-started/README.mdx @@ -2,63 +2,199 @@ sidebar_position: 1 slug: / title: Getting Started +hide_title: true --- -export const LinkButton = (props) => ( - -); - -Otterize is a platform for implementing intent-based access control ([IBAC](/intent-based-access-control)) for workloads. +export const introduction = [ + { + title: 'What is Otterize', + description: 'Learn how Otterize helps visualize and manages your authorization', + }, + { + title: 'Intent-Based Access Control', + description: 'Dive into declarative access.', + url: '/overview/intent-based-access-control' + }, +]; + +export const features = [ + { + title: 'Network Policies', + icon: '/img/icons/networking.png', + url: '/features/Networking/Overview' + }, + { + title: 'AWS IAM', + icon: '/img/icons/aws.png', + url: '/features/aws-iam/Overview' + }, + { + title: 'Kafka', + icon: '/img/icons/kafka.png', + url: '/features/kafka/Overview' + }, + { + title: 'PostgreSQL', + icon: '/img/icons/postgresql.png', + url: '/features/postgresql/Overview' + }, + { + title: 'Istio', + icon: '/img/icons/istio.png', + url: '/features/istio/Overview' + }, +]; + +export const tutorials_access = [ + { + title: 'Create and manage network policies', + description: 'Create Kubernetes network policies using IBAC', + url: '/features/Networking/Examples/k8s-network-policies' + }, + { + title: 'Network policies on AWS EKS', + description: 'Jump start network policies using AWS EKS and VPC CNI', + url: '/features/Networking/Examples/aws-eks-cni-mini' + }, + { + title: 'Create and manage Istio authorization policies', + description: 'Using Istio and IBAC to secure your K8s cluster', + url: '/features/Istio/Examples/k8s-istio-authorization-policies' + }, + { + title: 'Configure secure access for Kafka using Otterize Cloud mTLS', + description: 'Declaring and applying intents to easily secure access to Kafka', + url: '/features/Kafka/Examples/k8s-kafka-mtls-cert-manager' + } +]; + +export const tutorials_visualization = [ + { + title: 'Network mapping a Kubernetes cluster', + description: 'Map pod-to-pod traffic within your K8s cluster', + url: '/features/Networking/Examples/k8s-network-mapper' + }, + { + title: 'Istio HTTP-level access mapping', + description: 'The network mapper allows you to map pod-to-pod Istio traffic', + url: '/features/Istio/Examples/k8s-istio-watcher' + }, + { + title: 'Kafka topic-level access mapping', + description: 'View topic-level access to Kafka servers within your Kubernetes cluster', + url: 'features/Kafka/Examples/k8s-kafka-mapping' + } +]; + +export const editions = [ + { + title: 'Community Edition', + description: 'Our open source edition focuses on a single Kubernetes cluster. ', + url: '/overview/otterize-oss' + }, + { + title: 'Cloud', + description: 'Visualize all your clusters, automate policies, and more', + url: '/overview/otterize-cloud' + } +]; + + +import DocsLinkCard from "@site/src/components/LinkCard"; + + + +Otterize is a platform that allows you to visualize, and build secure access for Kubernetes workloads. +Secure access is managed through declarative intent-based access control ([IBAC](/intent-based-access-control)) providing an easy understood and centralized approach to auth. + The platform is composed of **Otterize OSS**, which is tailored for a single Kubernetes cluster, and **Otterize Cloud**, which adds visibility and operationalization across Kubernetes clusters and non-Kubernetes infrastructures. -Otterize enables platform engineers to easily implement, expand, and unify secured access for their Kubernetes workloads. -## Let's go! 🚀 -Dive right in with simple demos to manage access control: -* [Create and manage network policies](/quickstart/access-control/k8s-network-policies). -* [Network policies on AWS EKS with the VPC CNI](/quickstart/access-control/aws-eks-cni-mini). -* [Create and manage Istio authorization policies](/quickstart/access-control/k8s-istio-authorization-policies). -* [Configure secure access for Kafka using Otterize Cloud mTLS](/quickstart/access-control/k8s-kafka-mtls), or [using cert-manager mTLS](/quickstart/access-control/k8s-kafka-mtls-cert-manager). +### Introduction + + + +### Features + +Otterize makes it easy to create and visualize authorization for your Kubernetes clusters across a variety of services. Explore each below. + + + +### Tutorials + +#### Learn more about access control + + + +#### See how to visualize access + + + +### Editions + + + + +[//]: # () +[//]: # (## Let's go! 🚀) + +[//]: # (Dive right in with simple demos to manage access control:) + +[//]: # (* [Create and manage network policies](/quickstart/access-control/k8s-network-policies).) + +[//]: # (* [Network policies on AWS EKS with the VPC CNI](/quickstart/access-control/aws-eks-cni-mini).) + +[//]: # (* [Create and manage Istio authorization policies](/quickstart/access-control/k8s-istio-authorization-policies).) + +[//]: # (* [Configure secure access for Kafka using Otterize Cloud mTLS](/quickstart/access-control/k8s-kafka-mtls), or [using cert-manager mTLS](/quickstart/access-control/k8s-kafka-mtls-cert-manager).) + +[//]: # () +[//]: # (Or visualize communication in your cluster:) + +[//]: # (* [Network mapping a Kubernetes cluster](/quickstart/visualization/k8s-network-mapper).) + +[//]: # (* [Istio HTTP-level access mapping](/quickstart/visualization/k8s-istio-watcher).) + +[//]: # (* [Kafka topic-level access mapping](/quickstart/visualization/k8s-network-mapper).) + +[//]: # () +[//]: # (## Components) + +[//]: # () +[//]: # (### Otterize OSS) + +[//]: # (The Otterize OSS components are standalone open-source projects that implement intent-based access control (IBAC) for a single Kubernetes cluster. This same set of components is used to integrate with Otterize Cloud.) + +[//]: # (- The [Otterize intents operator](/reference/configuration/intents-operator) translates ClientIntents resources to access controls: currently, network policies for pod-to-pod access, and ACLs for in-cluster Kafka client access. [See it in GitHub](https://github.com/otterize/intents-operator)) -Or visualize communication in your cluster: -* [Network mapping a Kubernetes cluster](/quickstart/visualization/k8s-network-mapper). -* [Istio HTTP-level access mapping](/quickstart/visualization/k8s-istio-watcher). -* [Kafka topic-level access mapping](/quickstart/visualization/k8s-network-mapper). +[//]: # (- The [Otterize credentials operator](/reference/configuration/credentials-operator) integrates with SPIFFE/SPIRE to handle pod identities and manage certificates. [See it in GitHub](https://github.com/otterize/credentials-operator)) -## Components +[//]: # (- The [Otterize network mapper](/reference/configuration/network-mapper) sniffs pod-to-pod traffic and builds a network map, which is useful on its own and may also be exported as client intents files for bootstrapping IBAC. [See it in GitHub](https://github.com/otterize/network-mapper)) -### Otterize OSS -The Otterize OSS components are standalone open-source projects that implement intent-based access control (IBAC) for a single Kubernetes cluster. This same set of components is used to integrate with Otterize Cloud. -- The [Otterize intents operator](/reference/configuration/intents-operator) translates ClientIntents resources to access controls: currently, network policies for pod-to-pod access, and ACLs for in-cluster Kafka client access. [See it in GitHub](https://github.com/otterize/intents-operator) -- The [Otterize credentials operator](/reference/configuration/credentials-operator) integrates with SPIFFE/SPIRE to handle pod identities and manage certificates. [See it in GitHub](https://github.com/otterize/credentials-operator) -- The [Otterize network mapper](/reference/configuration/network-mapper) sniffs pod-to-pod traffic and builds a network map, which is useful on its own and may also be exported as client intents files for bootstrapping IBAC. [See it in GitHub](https://github.com/otterize/network-mapper) +[//]: # () +[//]: # () +[//]: # (### Otterize CLI) +[//]: # () +[//]: # (The [Otterize CLI](/reference/cli) is used to control the network mapper or output its data, convert non-Kubernetes client) -### Otterize CLI +[//]: # (intents files (if needed) to Kubernetes custom resource YAMLs, interface with the Otterize Cloud.) -The [Otterize CLI](/reference/cli) is used to control the network mapper or output its data, convert non-Kubernetes client -intents files (if needed) to Kubernetes custom resource YAMLs, interface with the Otterize Cloud. +[//]: # () +[//]: # (## Open source and Cloud) -## Open source and Cloud +[//]: # () +[//]: # (### Otterize OSS) -### Otterize OSS +[//]: # () +[//]: # (Otterize OSS is a standalone open-source implementation of intent-based access control (IBAC) for a single Kubernetes cluster. As well as being open source, Otterize OSS is completely free, licensed under the Apache 2.0 license and does not require Otterize Cloud.) -Otterize OSS is a standalone open-source implementation of intent-based access control (IBAC) for a single Kubernetes cluster. As well as being open source, Otterize OSS is completely free, licensed under the Apache 2.0 license and does not require Otterize Cloud. +[//]: # () +[//]: # (### Otterize Cloud) -### Otterize Cloud +[//]: # () +[//]: # (Otterize Cloud adds unified visibility and operationalization,) -Otterize Cloud adds unified visibility and operationalization, -and spans multiple Kubernetes clusters as well as (coming soon) non-Kubernetes infrastructures. +[//]: # (and spans multiple Kubernetes clusters as well as (coming soon) non-Kubernetes infrastructures.) -Read more in our [product page](https://otterize.com/product). \ No newline at end of file +[//]: # () +[//]: # (Read more in our [product page](https://otterize.com/product).) \ No newline at end of file diff --git a/docusaurus.config.js b/docusaurus.config.js index cc13b705f..e5dfddc06 100644 --- a/docusaurus.config.js +++ b/docusaurus.config.js @@ -150,7 +150,7 @@ const config = { }, { from: ['/reference/access-controls/network-policies'], - to: '/access-types/Networking/Reference/Network-Policies-Deep-Dive' + to: '/features/Networking/Reference/Network-Policies-Deep-Dive' }, { from: ['/shadow-vs-active-enforcement'], @@ -184,39 +184,39 @@ const config = { }, { from: ['/guides/protect-1-service-network-policies'], - to: '/access-types/Networking/Examples/protect-1-service-network-policies' + to: '/features/Networking/Examples/protect-1-service-network-policies' }, { from: ['/quick-tutorials/k8s-kafka-mtls', '/quickstart/access-control/k8s-kafka-mtls'], - to: '/access-types/Kafka/Examples/k8s-kafka-mtls', + to: '/features/Kafka/Examples/k8s-kafka-mtls', }, { from: ['/quick-tutorials/aws-eks-cni-mini','/quickstart/access-control/aws-eks-cni-mini'], - to: '/access-types/Networking/Examples/aws-eks-cni-mini', + to: '/features/Networking/Examples/aws-eks-cni-mini', }, { from: ['/quick-tutorials/k8s-kafka-mtls-cert-manager', '/quickstart/access-control/k8s-kafka-mtls-cert-manager'], - to: '/access-types/Kafka/Examples/k8s-kafka-mtls-cert-manager', + to: '/features/Kafka/Examples/k8s-kafka-mtls-cert-manager', }, { from: ['/quick-tutorials/k8s-istio-watcher', '/quickstart/visualization/k8s-istio-watcher'], - to: '/access-types/Istio/Examples/k8s-istio-watcher', + to: '/features/Istio/Examples/k8s-istio-watcher', }, { from: ['/quick-visual-tutorials/visual-ibac-istio-authorization-policies','/quickstart/access-control/k8s-istio-authorization-policies', '/quickstart/k8s-istio-authorization-policies'], - to: '/access-types/Istio/Examples/k8s-istio-authorization-policies', + to: '/features/Istio/Examples/k8s-istio-authorization-policies', }, { from: ['/quick-visual-tutorials/visual-ibac-kafka-k8s'], - to: '/access-types/Kafka/Examples/k8s-kafka-mapping', + to: '/features/Kafka/Examples/k8s-kafka-mapping', }, { from: ['/quick-visual-tutorials/visual-ibac-network-policies', '/quick-tutorials/k8s-network-policies', '/quickstart/access-control/k8s-network-policies'], - to: '/access-types/Networking/Examples/k8s-network-policies', + to: '/features/Networking/Examples/k8s-network-policies', }, { from: ['/quick-visual-tutorials/visual-k8s-cluster-mapping', '/quickstart/visualization/k8s-network-mapper', '/quick-tutorials/k8s-network-mapper'], - to: '/access-types/Networking/Examples/k8s-network-mapper', + to: '/features/Networking/Examples/k8s-network-mapper', }, // Redirect from multiple old paths to the new path // { diff --git a/src/components/CardList/index.js b/src/components/CardList/index.js new file mode 100644 index 000000000..c7f8a5e8e --- /dev/null +++ b/src/components/CardList/index.js @@ -0,0 +1,29 @@ +import React from 'react'; + +export default function CardList(props) { + console.log(JSON.stringify(props)); + return ( + + ); +} \ No newline at end of file diff --git a/src/components/LinkCard/index.js b/src/components/LinkCard/index.js new file mode 100644 index 000000000..414c2df27 --- /dev/null +++ b/src/components/LinkCard/index.js @@ -0,0 +1,35 @@ +import React from 'react'; + +export default function DocsLinkCard({items, colSize}) { + let colClasses = "lg:tw-grid-cols-2 tw-gap-4 xs:tw-grid-cols-1 "; + if (colSize === "lg") { + colClasses = "lg:tw-grid-cols-4 tw-gap-2 xs:tw-grid-cols-2" + }else if (colSize === "md") { + colClasses = "lg:tw-grid-cols-3 tw-gap-2 xs:tw-grid-cols-1 md:tw-grid-cols-2" + } + return ( +
+ {items.map((item) => ( + + ))} +
+ ) +} diff --git a/static/img/icons/aws.png b/static/img/icons/aws.png new file mode 100644 index 0000000000000000000000000000000000000000..3b53d8f20f9a6fb407c82e7e219369729669ff47 GIT binary patch literal 46809 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�o{usSBR|TKal)yzKy!3ncJ0 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 literal 0 HcmV?d00001 From 305f55c2706cd3e6362f6de7810d04b290bb524a Mon Sep 17 00:00:00 2001 From: bglynn Date: Thu, 25 Jan 2024 12:12:41 -0800 Subject: [PATCH 04/18] * Network overview and Reference pages --- .../Istio/{Overview.mdx => index.mdx} | 0 .../Kafka/{Overview.mdx => index.mdx} | 0 docs/features/Networking/Reference/README.mdx | 160 +++++++++++++++++- docs/features/Networking/index.mdx | 44 +++++ docs/features/Postgres/Overview.mdx | 4 - docs/features/README.mdx | 5 +- docs/features/aws-iam/Reference.mdx | 2 +- .../aws-iam/{Overview.mdx => index.mdx} | 0 .../Examples/_category_.json | 0 .../Examples/postgres.mdx | 0 .../{Postgres => postgresql}/Reference.mdx | 0 .../{Postgres => postgresql}/_category_.json | 0 .../Overview.mdx => postgresql/index.mdx} | 0 docs/getting-started/README.mdx | 10 +- .../configuration/intents-operator/README.mdx | 2 +- docusaurus.config.js | 5 + src/css/custom.css | 8 + 17 files changed, 225 insertions(+), 15 deletions(-) rename docs/features/Istio/{Overview.mdx => index.mdx} (100%) rename docs/features/Kafka/{Overview.mdx => index.mdx} (100%) create mode 100644 docs/features/Networking/index.mdx delete mode 100644 docs/features/Postgres/Overview.mdx rename docs/features/aws-iam/{Overview.mdx => index.mdx} (100%) rename docs/features/{Postgres => postgresql}/Examples/_category_.json (100%) rename docs/features/{Postgres => postgresql}/Examples/postgres.mdx (100%) rename docs/features/{Postgres => postgresql}/Reference.mdx (100%) rename docs/features/{Postgres => postgresql}/_category_.json (100%) rename docs/features/{Networking/Overview.mdx => postgresql/index.mdx} (100%) diff --git a/docs/features/Istio/Overview.mdx b/docs/features/Istio/index.mdx similarity index 100% rename from docs/features/Istio/Overview.mdx rename to docs/features/Istio/index.mdx diff --git a/docs/features/Kafka/Overview.mdx b/docs/features/Kafka/index.mdx similarity index 100% rename from docs/features/Kafka/Overview.mdx rename to docs/features/Kafka/index.mdx diff --git a/docs/features/Networking/Reference/README.mdx b/docs/features/Networking/Reference/README.mdx index 626ea0452..f7ad43bcd 100644 --- a/docs/features/Networking/Reference/README.mdx +++ b/docs/features/Networking/Reference/README.mdx @@ -1,4 +1,162 @@ --- sidebar_position: 3 title: Reference ---- \ No newline at end of file +hide_table_of_contents: true +--- + +## Client Intents + +**Example ClientIntent (yaml)** +``` +apiVersion: k8s.otterize.com/v1alpha3 +kind: ClientIntents +metadata: + name: client-server-access + namespace: otterize-example +spec: + service: + name: client #The name of the service initiating the connection + calls: + - name: server #The name of the service recieving the connection. Multiple names can be provided +``` + + +## Helm Chart Options + +| Key | Description | Default | +|-----------------------------------------|---------------------------------------------------------------------------------------------------------------------------------------|---------| +| `global.deployment.networkMapper` | Whether or not to deploy network-mapper. | `true` | +| `operator.autoCreateNetworkPoliciesForExternalTraffic` | (deprecated, use `allowExternalTraffic` instead) Automatically allow external traffic, if a new ClientIntents resource would result in blocking external (internet) traffic and there is an Ingress/Service resource indicating external traffic is expected. | `true` | +| `operator.autoCreateNetworkPoliciesForExternalTrafficDisableIntentsRequirement` | (deprecated, use `allowExternalTraffic` instead) **experimental** - If `autoCreateNetworkPoliciesForExternalTraffic` is enabled, do not require ClientIntents resources - simply create network policies based off of the existence of an Ingress/Service resource. | `false` | + +## Network mapper parameters +All configurable parameters of the network mapper can be configured under the alias `networkMapper`. +Further information about network mapper parameters can be found [in the network mapper's chart](https://github.com/otterize/helm-charts/tree/main/network-mapper). + + +## CLI: Network mapper + +All `otterize network-mapper` commands share a set of optional flags which will not be repeated in the documentation +for each command. + +#### Common options + +| Name | Default | Description | +|-------------------------|---------------------------|-----------------------------------------------------------------| +| `--mapper-namespace` | `otterize-system` | Specifies the namespace where the mapper service was installed. | +| `--mapper-service-name` | `otterize-network-mapper` | Specifies the name of the mapper service as it was installed. | +| `--mapper-service-name` | `otterize-service-port` | Specifies the port on which the mapper service is listening. | + + +`otterize network-mapper reset` + +Resets the network mapper by deleting all map information built up so far in memory. + +`otterize network-mapper list [-n ,,...]` + +Return the network map built by the network mapper since it started, or since it was reset, +as a list of clients and the servers they call. + +#### Options + +| Name | Default | Description | +|------------------------|---------|-------------------------------------------------------------| +| `-n` or `--namespaces` | | Include only clients in these namespaces (comma-separated). | + +#### Returns + +Here's a partial output from `otterize network-mapper list -n otterize-ecom-demo`: + +```shell +cartservice in namespace otterize-ecom-demo calls: + - redis-cart +checkoutservice in namespace otterize-ecom-demo calls: + - cartservice + - currencyservice + - emailservice + - paymentservice + - productcatalogservice + - shippingservice +frontend in namespace otterize-ecom-demo calls: + - adservice + - cartservice + - checkoutservice + - currencyservice + - productcatalogservice + - recommendationservice + - shippingservice +loadgenerator in namespace otterize-ecom-demo calls: + - frontend +recommendationservice in namespace otterize-ecom-demo calls: + - productcatalogservice +``` + +`otterize network-mapper visualize [--format=png | --format=jpg] [-n ,,...] -o ` +Return the network map built by the network mapper since it started, or since it was reset, +as an image. + +Uses GraphViz (specifically go-graphviz) to generate the image. + +#### Options + +| Name | Default | Description | +|-------------------------|---------|-----------------------------------------------------------------------------------------| +| `--format` | `png` | Image output format: "png" or "jpg". | +| `-n` or `--namespaces` | | Include only clients in these namespaces (comma-separated). | +| `-o` or `--output-path` | | Filename for the image. | +| `--exclude-labels` | | A list of labels that would exclude services from list/export. example: "include=false" | +| `--exclude-services` | | A list of service to exclude from list/export. example: "service1,service2" | + +#### Returns + +Here's the image generated by running `otterize network-mapper visualize -n otterize-ecom-demo -o otterize-ecom-demo.png`: +![graph](https://user-images.githubusercontent.com/29180932/221423644-df8fbba2-dca1-4c56-baeb-f0d0afc55eb1.png) + +`otterize network-mapper export [--format] [-n ,,...] [-o ] [--output-type ]` + +Return the network map built by the network mapper since it started, or since it was reset, +as YAML [client intents file(s)](/reference/intents-and-intents-files/#intents-file-formats) or as JSON file(s). + +#### Options + +| Name | Default | Description | +|------------------------|---------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| `--format` | `yaml` | Specifies the format for the export: either `yaml` or `json`. | +| `-n` or `--namespaces` | | Export only clients in these namespaces (comma-separated). | +| `-o` or `--output` | `STDOUT` | Filename or directory for redirecting the output. | +| `--output-type` | `single-file` | Whether the output should be written as a single file (`single-file`) or as multiple files in a directory (`dir`). Requires the `-o` or `--output` to point to a directory. | +| `--server` | | Export only intents for clients that call this server. The server name must be specified with both service name and namespace, in the format `.`. Example: `cartservice.otterize-ecom-demo`. | +| `--exclude-labels` | | A list of labels that would exclude services from list/export. Example: `include=false` would exclude any service labeled with `include=false` from being included in list/export. | +| `--exclude-services` | | A list of services to exclude from list/export. Example: `service1,service2`. | + +#### Returns + +Here's a partial output from `otterize network-mapper export -n otterize-ecom-demo`: + +```shell +apiVersion: k8s.otterize.com/v1alpha3 +kind: ClientIntents +metadata: + name: cartservice + namespace: otterize-ecom-demo +spec: + service: + name: cartservice + calls: + - name: redis-cart + type: http +--- +apiVersion: k8s.otterize.com/v1alpha3 +kind: ClientIntents +metadata: + name: checkoutservice + namespace: otterize-ecom-demo +spec: + service: + name: checkoutservice + calls: + - name: cartservice + type: http + - name: currencyservice + type: http +``` \ No newline at end of file diff --git a/docs/features/Networking/index.mdx b/docs/features/Networking/index.mdx new file mode 100644 index 000000000..79d3ae993 --- /dev/null +++ b/docs/features/Networking/index.mdx @@ -0,0 +1,44 @@ +--- +sidebar_position: 1 +title: Networking +--- +import DocsLinkCard from "@site/src/components/LinkCard"; + +export const network_access_tutorials = [ + { + title: 'Create and manage network policies', + description: 'Create Kubernetes network policies using IBAC', + url: '/features/Networking/Examples/k8s-network-policies' + }, + { + title: 'Protecting a service with network policies', + description: 'An example on how to secure a single service', + url: '/features/Networking/Examples/protect-1-service-network-policies' + }, + { + title: 'AWS EKS network policies with the VPC CNI', + description: 'Leverage AWS VPC CNI to apply network policies in EKS', + url: '/features/Networking/Examples/aws-eks-cni-mini' + } +]; + +### Overview + +You can use Otterize to understand, visualize, and manage access for Kubernetes networks. Upon installation, Otterize inspects network traffic and builds an in-memory network map of connections. The network map can then be exported or viewed in various ways to understand the connections within your networks. With IBAC-based policies, Otterize becomes a control plane for your K8s networks. Mapped network traffic can autogenerate declarative intent-based access policies to create least privileged pod-to-pod access easily. + +### Visualizing + +After installation, Otterize collects network traffic data in memory, creating a graph of relationships between pod-to-pod and pod-to-public internet traffic. Once the graph is in place, the data can be exported or viewed in various ways. Otterize Cloud users can see and interact with the graph structures within the Otterize application. OSS users can use the CLI tool to export the data into JSON, list the relationship, or generate IBAC policies reflecting the existing traffic. + +To learn more about Visualizing, check out [Visualizing a Kubernetes Network](/features/Networking/Examples/k8s-network-mapper) + + +### Access Control + +By default, Kubernetes pods allow all egress and ingress traffic. Kubernetes [NetworkPolicies](/reference/terminology#network-policies) provide `policyTypes` to restrict egress or ingress traffic, providing a more secure and compliant environment. Utilizing the in-memory tariff map, Otterize can automatically generate IBAC policies to reflect the current traffic flow within a cluster. Once the IBAC policies are submitted, Otterize will generate and apply the corresponding NetworkPolicies to your namespaces. + +Further details are available within the [Network Policies Deep Dive](/features/Networking/Reference/Network-Policies-Deep-Dive) + +View the tutorials below to learn more about how to get started + + diff --git a/docs/features/Postgres/Overview.mdx b/docs/features/Postgres/Overview.mdx deleted file mode 100644 index 7e4dcc2d8..000000000 --- a/docs/features/Postgres/Overview.mdx +++ /dev/null @@ -1,4 +0,0 @@ ---- -sidebar_position: 1 -title: Overview ---- \ No newline at end of file diff --git a/docs/features/README.mdx b/docs/features/README.mdx index 1513e9df8..e6bf58974 100644 --- a/docs/features/README.mdx +++ b/docs/features/README.mdx @@ -14,6 +14,7 @@ import { export default function FeatureCards() { const category = useCurrentSidebarCategory(); const features = category.items; + console.log(JSON.stringify(features)); return (

Features

@@ -26,8 +27,7 @@ export default function FeatureCards() { {features.map((feature) => (
- {feature.items && feature.items[0] && feature.items[0].href && - + ))}
diff --git a/docs/features/aws-iam/Reference.mdx b/docs/features/aws-iam/Reference.mdx index bfc777d18..62a8acd22 100644 --- a/docs/features/aws-iam/Reference.mdx +++ b/docs/features/aws-iam/Reference.mdx @@ -9,7 +9,7 @@ title: Reference | credentials-operator.otterize.com/create-aws-role | boolean | By setting to **true** the credential operator will create an unique AWS Role for the associated pod | **ClientIntents** (YAML) -| key | sub-ley | type | type | Description | +| key | sub-key | type | type | Description | |-------------|------------|-------|--------|--------------------------------------------------------------| | **service** | name | value | string | The name of the pod that will be granted access | | **calls** | name | list | ARN | The AWS ARN or ARN wildcard that references the resource(s) for the authorization. See [ARN Formats - Amazon QuickSight](https://docs.aws.amazon.com/quicksight/latest/APIReference/qs-arn-format.html) for more information | diff --git a/docs/features/aws-iam/Overview.mdx b/docs/features/aws-iam/index.mdx similarity index 100% rename from docs/features/aws-iam/Overview.mdx rename to docs/features/aws-iam/index.mdx diff --git a/docs/features/Postgres/Examples/_category_.json b/docs/features/postgresql/Examples/_category_.json similarity index 100% rename from docs/features/Postgres/Examples/_category_.json rename to docs/features/postgresql/Examples/_category_.json diff --git a/docs/features/Postgres/Examples/postgres.mdx b/docs/features/postgresql/Examples/postgres.mdx similarity index 100% rename from docs/features/Postgres/Examples/postgres.mdx rename to docs/features/postgresql/Examples/postgres.mdx diff --git a/docs/features/Postgres/Reference.mdx b/docs/features/postgresql/Reference.mdx similarity index 100% rename from docs/features/Postgres/Reference.mdx rename to docs/features/postgresql/Reference.mdx diff --git a/docs/features/Postgres/_category_.json b/docs/features/postgresql/_category_.json similarity index 100% rename from docs/features/Postgres/_category_.json rename to docs/features/postgresql/_category_.json diff --git a/docs/features/Networking/Overview.mdx b/docs/features/postgresql/index.mdx similarity index 100% rename from docs/features/Networking/Overview.mdx rename to docs/features/postgresql/index.mdx diff --git a/docs/getting-started/README.mdx b/docs/getting-started/README.mdx index 480851c46..5436707d2 100644 --- a/docs/getting-started/README.mdx +++ b/docs/getting-started/README.mdx @@ -21,27 +21,27 @@ export const features = [ { title: 'Network Policies', icon: '/img/icons/networking.png', - url: '/features/Networking/Overview' + url: '/features/networking/' }, { title: 'AWS IAM', icon: '/img/icons/aws.png', - url: '/features/aws-iam/Overview' + url: '/features/aws-iam/' }, { title: 'Kafka', icon: '/img/icons/kafka.png', - url: '/features/kafka/Overview' + url: '/features/kafka/' }, { title: 'PostgreSQL', icon: '/img/icons/postgresql.png', - url: '/features/postgresql/Overview' + url: '/features/postgresql/' }, { title: 'Istio', icon: '/img/icons/istio.png', - url: '/features/istio/Overview' + url: '/features/istio/' }, ]; diff --git a/docs/reference/configuration/intents-operator/README.mdx b/docs/reference/configuration/intents-operator/README.mdx index d8543be88..61e64358a 100644 --- a/docs/reference/configuration/intents-operator/README.mdx +++ b/docs/reference/configuration/intents-operator/README.mdx @@ -78,7 +78,7 @@ it is attempting to read, so the end result is that the topic ACLs determine act ### PostgreSQL users & access The intents operator automatically creates, and updates credentials in PostgreSQL databases according to the declared intents. It works together with the Otterize credentials operator to easily enable secure access to PostgreSQL from client pods, all in your Kubernetes cluster. -Try the [Just-in-time PostgreSQL users & access](https://docs.otterize.com/quickstart/access-control/postgresql) tutorial to learn more. +Try the [Just-in-time PostgreSQL users & access](/features/postgresql/Examples/postgresql) tutorial to learn more. ### Istio AuthorizationPolicy The intents operator automatically creates, updates and deletes Istio authorization policies, automatically looks up service accounts for client pods and labels server pods, to reflect precisely the client-to-server calls declared in client intents files. diff --git a/docusaurus.config.js b/docusaurus.config.js index e5dfddc06..b99c0badf 100644 --- a/docusaurus.config.js +++ b/docusaurus.config.js @@ -415,6 +415,11 @@ const config = { theme: lightCodeTheme, darkTheme: darkCodeTheme, }, + docs: { + sidebar: { + autoCollapseCategories: true, + }, + }, colorMode: { defaultMode: "light", disableSwitch: true, diff --git a/src/css/custom.css b/src/css/custom.css index 7232bddbf..5a1341d3b 100644 --- a/src/css/custom.css +++ b/src/css/custom.css @@ -23,6 +23,14 @@ --ifm-h1-font-size: 2.5rem; --ifm-code-border-radius: 5px; --docusaurus-highlighted-code-line-bg: rgba(255, 255, 255, 0.2); + --docusaurus-details-decoration-color: #4d3df7; + --ifm-alert-border-color: #4d3df7; + --ifm-alert-background-color-highlight: #4d3df7; + --ifm-alert-background-color: #e9e9ec; + --ifm-color-info-contrast-background: #f5f5f8; + --ifm-alert-padding-vertical: 8px; + --ifm-color-info-dark: #4d3df7; + --ifm-alert-border-radius: 2px; --ifm-navbar-height: 5rem; --ifm-menu-color: #333; From 0ef28f327a217afd75cd48551b8d48b93d7446e9 Mon Sep 17 00:00:00 2001 From: bglynn Date: Mon, 29 Jan 2024 09:58:50 -0800 Subject: [PATCH 05/18] * Kafka Overview / Reference * PosgreSQL Overview / Reference * Istio Overview / Reference --- docs/features/Istio/Reference.mdx | 34 +- docs/features/Istio/index.mdx | 99 +- docs/features/Kafka/Reference.mdx | 50 +- docs/features/Kafka/index.mdx | 130 +- docs/features/Networking/Reference/README.mdx | 26 +- docs/features/Networking/index.mdx | 29 +- docs/features/README.mdx | 2 +- docs/features/aws-iam/Reference.mdx | 35 +- docs/features/aws-iam/index.mdx | 2 +- docs/features/postgresql/Reference.mdx | 30 +- docs/features/postgresql/index.mdx | 98 +- package.json | 3 +- src/css/custom.css | 5 +- yarn.lock | 2337 +++++++++++++---- 14 files changed, 2270 insertions(+), 610 deletions(-) diff --git a/docs/features/Istio/Reference.mdx b/docs/features/Istio/Reference.mdx index 626ea0452..4adb25e10 100644 --- a/docs/features/Istio/Reference.mdx +++ b/docs/features/Istio/Reference.mdx @@ -1,4 +1,36 @@ --- sidebar_position: 3 title: Reference ---- \ No newline at end of file +--- + +### Client Intents (YAML) + +```yaml +apiVersion: k8s.otterize.com/v1alpha3 +kind: ClientIntents +metadata: + name: client + namespace: otterize-tutorial-istio +spec: + service: + name: client + calls: + - name: nginx + type: http + HTTPResources: + - path: /client-path + methods: [ GET ] +``` + + +### Helm Chart Options + +| Key | Description | Default | +|---------------------------------|-----------------------------------------|--------------------------------| +| `istiowatcher.enable` | Enable Istio watcher deployment (beta). | `false` | +| `istiowatcher.image.repository` | Istio watcher image repository. | `otterize` | +| `istiowatcher.image.image` | Istio watcher image. | `network-mapper-istio-watcher` | +| `istiowatcher.image.tag` | Istio watcher image tag. | `latest` | +| `istiowatcher.pullPolicy` | Istio watcher pull policy. | `(none)` | +| `istiowatcher.pullSecrets` | Istio watcher pull secrets. | `(none)` | +| `istiowatcher.resources` | Resources override. | `(none)` | diff --git a/docs/features/Istio/index.mdx b/docs/features/Istio/index.mdx index 7e4dcc2d8..a07d425d9 100644 --- a/docs/features/Istio/index.mdx +++ b/docs/features/Istio/index.mdx @@ -1,4 +1,99 @@ --- sidebar_position: 1 -title: Overview ---- \ No newline at end of file +title: Istio | Overview +hide_title: true +--- + +import DocsLinkCard from "@site/src/components/LinkCard"; + +export const istio_tutorials = [ + { + title: 'Istio AuthorizationPolicy automation', + description: 'Generate AuthorizationPolicy docs from existing connections', + url: '/features/istio/examples/k8s-istio-authorization-policies' + }, + { + title: 'Istio HTTP-level access mapping', + description: 'View the HTTP methods being used across services', + url: '/features/istio/examples/k8s-istio-water' + } +]; + + + +# Istio + +Otterize can map and secure access with Istio HTTP connections across your Kubernetes services. + +### About + +When enabling Istio support, Otterize's network mapping tool can determine which Kubernetes services are connected and which HTTP methods are being used. This graph of connections can then be leveraged to automate IBAC based access policies that result in Istio AuthorizationPolicy(s). + +### How does it work + +1. First, the cluster must have [Otterize installed](/overview/installation). With Istio support enabled by setting the following flag: + +```bash +--set networkMapper.istiowatcher.enable=true +``` + +2. To monitor connections and HTTP methods, we need to enable connection telemetry data within Istio. This can be enabled with the following YAML: + +```yaml +apiVersion: telemetry.istio.io/v1alpha1 +kind: Telemetry +metadata: + name: mesh-default + namespace: istio-system +spec: + # Configure access logging for Istio services + accessLogging: + # Define the access logging provider, in this case, Envoy + - providers: + - name: envoy + metrics: + # Configure metrics collection for Istio services using Prometheus + - providers: + - name: prometheus + # Customize metric tag overrides + overrides: + - tagOverrides: + # Map the "request_method" metric tag to "request.method" value + request_method: + value: request.method + # Map the "request_path" metric tag to "request.path" value + request_path: + value: request.path + +``` + +Once installed, Otterize will query Envoy sidecars for known connections and building an in-memory map of the relationships. After the map is built your can then view those relationships. + +**To Manage Access** + +You simply need to define and apply your intent based access control ([IBAC](/overview/intent-based-access-control)) policies for your services. + +```yaml + +apiVersion: k8s.otterize.com/v1alpha3 +kind: ClientIntents +metadata: + name: client + namespace: otterize-tutorial-istio +spec: + service: + name: client + calls: + - name: server-abc + type: http + HTTPResources: + - path: /client-path + methods: [ GET ] + +``` + +### Tutorials + +For further details about mapping, or access automation, view the tutorials below: + + diff --git a/docs/features/Kafka/Reference.mdx b/docs/features/Kafka/Reference.mdx index 626ea0452..8bbbbdb09 100644 --- a/docs/features/Kafka/Reference.mdx +++ b/docs/features/Kafka/Reference.mdx @@ -1,4 +1,52 @@ --- sidebar_position: 3 title: Reference ---- \ No newline at end of file +--- + +### KafkaServerConfig (YAML) + +```yaml +apiVersion: k8s.otterize.com/v1alpha3 +kind: KafkaServerConfig +metadata: + name: kafkaserverconfig + namespace: kafka +spec: + service: + name: kafka #name of the Kafka service broker + addr: kafka.kafka:9092 +``` + +### ClientIntents (YAML) + +```yaml +apiVersion: k8s.otterize.com/v1alpha3 +kind: ClientIntents +metadata: + name: client + namespace: otterize-tutorial-kafka-mtls +spec: + service: + name: client # The service requiring access to a topic + calls: + - name: kafka.kafka # name of the Kafka service broker + type: kafka + kafkaTopics: + - name: mytopic # Topic name + operations: [ produce,describe,consume ] # ACL Operations like alter, delete, all, etc + - name: transactions # Multiple topics can be added + operations: [ produce,describe,consume ] +``` + +### Helm Chart Options + +| Key | Description | Default | +|---------------------------------|-------------------------------------------------------------|--------------------------------| +| `kafkawatcher.enable` | Enable Kafka watcher deployment (beta). | `false` | +| `kafkawatcher.image.repository` | Kafka watcher image repository. | `otterize` | +| `kafkawatcher.image.image` | Kafka watcher image. | `network-mapper-kafka-watcher` | +| `kafkawatcher.image.tag` | Kafka watcher image tag. | `latest` | +| `kafkawatcher.pullPolicy` | Kafka watcher pull policy. | `(none)` | +| `kafkawatcher.pullSecrets` | Kafka watcher pull secrets. | `(none)` | +| `kafkawatcher.resources` | Resources override. | `(none)` | +| `kafkawatcher.kafkaServers` | Kafka servers to watch, specified as `pod.namespace` items. | `(none)` | diff --git a/docs/features/Kafka/index.mdx b/docs/features/Kafka/index.mdx index 7e4dcc2d8..233c9b134 100644 --- a/docs/features/Kafka/index.mdx +++ b/docs/features/Kafka/index.mdx @@ -1,4 +1,130 @@ --- sidebar_position: 1 -title: Overview ---- \ No newline at end of file +title: Kafka +hide_table_of_contents: true +hide_title: true +--- + +import DocsLinkCard from "@site/src/components/LinkCard"; + +export const kafka_tutorials = [ + { + title: 'Kafka topic-level access mapping', + description: 'View Kafka network connections', + url: '/features/Kafka/Examples/k8s-kafka-mapping' + }, + { + title: 'Kafka access automation using Otterize Cloud mTLS', + description: 'Manage access to Kafka topics with Otterize Cloud mTLS', + url: '/features/Kafka/Examples/k8s-kafka-mtls' + }, + { + title: 'Kafka access automation using cert-manager mTLS', + description: 'Manage access to Kafka topics with a cert-manager', + url: '/features/Kafka/Examples/k8s-kafka-mtls-cert-manager' + } +]; + +# Kafka + +Otterize can map and secure access to Kafka Topics from your Kubernetes clusters. + +### About + +By enabling Kafka support, Otterize's network mapping tool can determine which Kubernetes services are connecting to topics and the determine their access privileges. This graph of connections can then be leveraged to automate IBAC based access policies that result in Kakfa ACLs. + +### How does it work + +1. First, the cluster must have [Otterize installed](/overview/installation). With Kakfa support enabled by setting the following flags: + +```bash +--set kafkawatcher.enable=true \ +--set kafkawatcher.kafkaServers={"kafka-0.kafka"} +``` + +Once installed, Otterize will map Kafka connections allowing you to view those relationships, but to manage access we need to: + +2. Configure Otterize to manage Kafka access with a `KafkaServerConfig`. See the example yaml below. + +```bash +kubectl apply -f ${ABSOLUTE_URL}/code-examples/kafka-mtls/kafkaserverconfig.yaml +``` + +```yaml +apiVersion: k8s.otterize.com/v1alpha3 +kind: KafkaServerConfig +metadata: + name: kafkaserverconfig + namespace: kafka +spec: + service: + name: kafka #name of the Kafka service broker + addr: kafka.kafka:9092 +``` + + +3. Once that is complete, the Kafka broker and it's clients require mTLS credentials, which they can receive from Otterize or through a [cert-manager](/features/Kafka/Examples/k8s-kafka-mtls-cert-manager). This requires a annotation to inform Otterize to generate the credentials and volume mount to store them. To orchestrate this, see the example deployment below: + +```yaml +spec: + template: + metadata: + annotations: + # 1. Generate credentials as a secret called "client-credentials-secret": + credentials-operator.otterize.com/tls-secret-name: client-credentials-secret + ... + spec: + volumes: + # 2. Create a volume containing this secret: + - name: otterize-credentials + secret: + secretName: client-credentials-secret + ... + containers: + - name: client + ... + volumeMounts: + # 3. Mount volume into container + - name: otterize-credentials + mountPath: /var/otterize/credentials + readOnly: true +``` + +4. Once the Kafka clients are deployed with the mTLS credentials they should be able to access their associated topics as there's no active enforcement enabled. By applying IBAC ClientIntents we can declare access for our Services. See an example of a Kafka policy. + +```yaml +apiVersion: k8s.otterize.com/v1alpha3 +kind: ClientIntents +metadata: + name: client + namespace: otterize-tutorial-kafka-mtls +spec: + service: + name: client + calls: + - name: kafka.kafka + type: kafka + kafkaTopics: + - name: mytopic + operations: [ produce,describe,consume ] + - name: transactions + operations: [ produce,describe,consume ] +--- +apiVersion: k8s.otterize.com/v1alpha3 +kind: ClientIntents +metadata: + name: kafka + namespace: kafka +spec: + service: + name: kafka + calls: + - name: kafka + - name: kafka-zookeeper +``` +### Tutorials + +For further details about mapping, or access automation, view the tutorials below: + + + diff --git a/docs/features/Networking/Reference/README.mdx b/docs/features/Networking/Reference/README.mdx index f7ad43bcd..4c7ae3fd0 100644 --- a/docs/features/Networking/Reference/README.mdx +++ b/docs/features/Networking/Reference/README.mdx @@ -4,10 +4,9 @@ title: Reference hide_table_of_contents: true --- -## Client Intents +### Client Intents (YAML) -**Example ClientIntent (yaml)** -``` +```yaml apiVersion: k8s.otterize.com/v1alpha3 kind: ClientIntents metadata: @@ -21,7 +20,7 @@ spec: ``` -## Helm Chart Options +### Helm Chart Options | Key | Description | Default | |-----------------------------------------|---------------------------------------------------------------------------------------------------------------------------------------|---------| @@ -29,29 +28,22 @@ spec: | `operator.autoCreateNetworkPoliciesForExternalTraffic` | (deprecated, use `allowExternalTraffic` instead) Automatically allow external traffic, if a new ClientIntents resource would result in blocking external (internet) traffic and there is an Ingress/Service resource indicating external traffic is expected. | `true` | | `operator.autoCreateNetworkPoliciesForExternalTrafficDisableIntentsRequirement` | (deprecated, use `allowExternalTraffic` instead) **experimental** - If `autoCreateNetworkPoliciesForExternalTraffic` is enabled, do not require ClientIntents resources - simply create network policies based off of the existence of an Ingress/Service resource. | `false` | -## Network mapper parameters +### Network mapper parameters All configurable parameters of the network mapper can be configured under the alias `networkMapper`. Further information about network mapper parameters can be found [in the network mapper's chart](https://github.com/otterize/helm-charts/tree/main/network-mapper). -## CLI: Network mapper +### CLI: Network mapper commands All `otterize network-mapper` commands share a set of optional flags which will not be repeated in the documentation for each command. -#### Common options - -| Name | Default | Description | -|-------------------------|---------------------------|-----------------------------------------------------------------| -| `--mapper-namespace` | `otterize-system` | Specifies the namespace where the mapper service was installed. | -| `--mapper-service-name` | `otterize-network-mapper` | Specifies the name of the mapper service as it was installed. | -| `--mapper-service-name` | `otterize-service-port` | Specifies the port on which the mapper service is listening. | - - `otterize network-mapper reset` Resets the network mapper by deleting all map information built up so far in memory. +--- + `otterize network-mapper list [-n ,,...]` Return the network map built by the network mapper since it started, or since it was reset, @@ -90,7 +82,7 @@ loadgenerator in namespace otterize-ecom-demo calls: recommendationservice in namespace otterize-ecom-demo calls: - productcatalogservice ``` - +--- `otterize network-mapper visualize [--format=png | --format=jpg] [-n ,,...] -o ` Return the network map built by the network mapper since it started, or since it was reset, as an image. @@ -112,6 +104,8 @@ Uses GraphViz (specifically go-graphviz) to generate the image. Here's the image generated by running `otterize network-mapper visualize -n otterize-ecom-demo -o otterize-ecom-demo.png`: ![graph](https://user-images.githubusercontent.com/29180932/221423644-df8fbba2-dca1-4c56-baeb-f0d0afc55eb1.png) +--- + `otterize network-mapper export [--format] [-n ,,...] [-o ] [--output-type ]` Return the network map built by the network mapper since it started, or since it was reset, diff --git a/docs/features/Networking/index.mdx b/docs/features/Networking/index.mdx index 79d3ae993..7dcc80a9b 100644 --- a/docs/features/Networking/index.mdx +++ b/docs/features/Networking/index.mdx @@ -1,6 +1,7 @@ --- sidebar_position: 1 title: Networking +hide_title: true --- import DocsLinkCard from "@site/src/components/LinkCard"; @@ -22,8 +23,9 @@ export const network_access_tutorials = [ } ]; -### Overview +# Networking +### About You can use Otterize to understand, visualize, and manage access for Kubernetes networks. Upon installation, Otterize inspects network traffic and builds an in-memory network map of connections. The network map can then be exported or viewed in various ways to understand the connections within your networks. With IBAC-based policies, Otterize becomes a control plane for your K8s networks. Mapped network traffic can autogenerate declarative intent-based access policies to create least privileged pod-to-pod access easily. ### Visualizing @@ -39,6 +41,27 @@ By default, Kubernetes pods allow all egress and ingress traffic. Kubernetes [Ne Further details are available within the [Network Policies Deep Dive](/features/Networking/Reference/Network-Policies-Deep-Dive) -View the tutorials below to learn more about how to get started +```yaml - +apiVersion: k8s.otterize.com/v1alpha3 +kind: ClientIntents +metadata: + name: client + namespace: otterize-tutorial-istio +spec: + service: + name: client + calls: + - name: nginx + type: http + HTTPResources: + - path: /client-path + methods: [ GET ] + +``` + +### Tutorials + +View the tutorials below to learn more about how to get started: + + diff --git a/docs/features/README.mdx b/docs/features/README.mdx index e6bf58974..28c41d948 100644 --- a/docs/features/README.mdx +++ b/docs/features/README.mdx @@ -26,7 +26,7 @@ export default function FeatureCards() {
{features.map((feature) => (
+ className="tw-col-span-1 tw-flex tw-flex-col tw-divide-y tw-divide-gray-200 tw-rounded-lg tw-border tw-border-solid tw-border-primary-500 tw-bg-white tw-text-center tw-border-1 tw-border-primary-400 tw-border-solid hover:tw-border-primary-600 hover:tw-shadow-md">
+ diff --git a/package.json b/package.json index d1c852a70..d2beb76e9 100644 --- a/package.json +++ b/package.json @@ -27,7 +27,8 @@ "heroicons": "^2.1.1", "prism-react-renderer": "^1.3.5", "react": "^17.0.2", - "react-dom": "^17.0.2" + "react-dom": "^17.0.2", + "vercel": "^33.4.0" }, "devDependencies": { "@docusaurus/module-type-aliases": "^2.4.3", diff --git a/src/css/custom.css b/src/css/custom.css index 5a1341d3b..403a55a7b 100644 --- a/src/css/custom.css +++ b/src/css/custom.css @@ -18,7 +18,7 @@ --ifm-color-primary-lighter: #377fad; --ifm-color-primary-lightest: #408fc2; --ifm-code-font-size: 85%; - --ifm-font-size-base: 0.9rem; + --ifm-font-size-base: 0.85rem; --ifm-font-weight-base: 400; --ifm-h1-font-size: 2.5rem; --ifm-code-border-radius: 5px; @@ -33,7 +33,8 @@ --ifm-alert-border-radius: 2px; --ifm-navbar-height: 5rem; - --ifm-menu-color: #333; + --ifm-menu-color: rgb(28, 30, 33); + --ifm-footer-background-color: white; --ifm-footer-color: white; diff --git a/yarn.lock b/yarn.lock index 199721d77..dd4fda918 100644 --- a/yarn.lock +++ b/yarn.lock @@ -84,7 +84,7 @@ "@algolia/requester-common" "4.20.0" "@algolia/transporter" "4.20.0" -"@algolia/client-search@4.20.0": +"@algolia/client-search@>= 4.9.1 < 6", "@algolia/client-search@4.20.0": version "4.20.0" resolved "https://registry.npmjs.org/@algolia/client-search/-/client-search-4.20.0.tgz" integrity sha512-zgwqnMvhWLdpzKTpd3sGmMlr4c+iS7eyyLGiaO51zDZWGMkpgoNVmltkzdBwxOVXz0RsFMznIxB9zuarUv4TZg== @@ -145,26 +145,47 @@ "@ampproject/remapping@^2.2.0": version "2.2.1" - resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.2.1.tgz#99e8e11851128b8702cd57c33684f1d0f260b630" + resolved "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz" integrity sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg== dependencies: "@jridgewell/gen-mapping" "^0.3.0" "@jridgewell/trace-mapping" "^0.3.9" -"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4", "@babel/code-frame@^7.16.0", "@babel/code-frame@^7.22.13", "@babel/code-frame@^7.8.3": - version "7.22.13" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.22.13.tgz#e3c1c099402598483b7a8c46a721d1038803755e" - integrity sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w== +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4", "@babel/code-frame@^7.16.0", "@babel/code-frame@^7.23.5", "@babel/code-frame@^7.8.3": + version "7.23.5" + resolved "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.23.5.tgz" + integrity sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA== dependencies: - "@babel/highlight" "^7.22.13" + "@babel/highlight" "^7.23.4" chalk "^2.4.2" -"@babel/compat-data@^7.22.6", "@babel/compat-data@^7.22.9", "@babel/compat-data@^7.23.2": - version "7.23.2" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.23.2.tgz#6a12ced93455827037bfb5ed8492820d60fc32cc" - integrity sha512-0S9TQMmDHlqAZ2ITT95irXKfxN9bncq8ZCoJhun3nHL/lLUxd2NKBJYoNGWH7S0hz6fRQwWlAWn/ILM0C70KZQ== +"@babel/compat-data@^7.22.6", "@babel/compat-data@^7.22.9", "@babel/compat-data@^7.23.2", "@babel/compat-data@^7.23.5": + version "7.23.5" + resolved "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.23.5.tgz" + integrity sha512-uU27kfDRlhfKl+w1U6vp16IuvSLtjAxdArVXPa9BvLkrr7CYIsxH5adpHObeAGY/41+syctUWOZ140a2Rvkgjw== + +"@babel/core@^7.0.0", "@babel/core@^7.0.0-0", "@babel/core@^7.0.0-0 || ^8.0.0-0 <8.0.0", "@babel/core@^7.12.0", "@babel/core@^7.13.0", "@babel/core@^7.18.6", "@babel/core@^7.19.6", "@babel/core@^7.4.0 || ^8.0.0-0 <8.0.0": + version "7.23.9" + resolved "https://registry.npmjs.org/@babel/core/-/core-7.23.9.tgz" + integrity sha512-5q0175NOjddqpvvzU+kDiSOAk4PfdO6FvwCWoQ6RO7rTzEe8vlo+4HVfcnAREhD4npMs0e9uZypjTwzZPCf/cw== + dependencies: + "@ampproject/remapping" "^2.2.0" + "@babel/code-frame" "^7.23.5" + "@babel/generator" "^7.23.6" + "@babel/helper-compilation-targets" "^7.23.6" + "@babel/helper-module-transforms" "^7.23.3" + "@babel/helpers" "^7.23.9" + "@babel/parser" "^7.23.9" + "@babel/template" "^7.23.9" + "@babel/traverse" "^7.23.9" + "@babel/types" "^7.23.9" + convert-source-map "^2.0.0" + debug "^4.1.0" + gensync "^1.0.0-beta.2" + json5 "^2.2.3" + semver "^6.3.1" -"@babel/core@7.12.9": +"@babel/core@^7.11.6", "@babel/core@7.12.9": version "7.12.9" resolved "https://registry.npmjs.org/@babel/core/-/core-7.12.9.tgz" integrity sha512-gTXYh3M5wb7FRXQy+FErKFAv90BnlOuNn1QkCK2lREoPAjrQCO49+HVSrFoe5uakFAF5eenS75KbO2vQiLrTMQ== @@ -186,65 +207,44 @@ semver "^5.4.1" source-map "^0.5.0" -"@babel/core@^7.18.6", "@babel/core@^7.19.6": - version "7.23.2" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.23.2.tgz#ed10df0d580fff67c5f3ee70fd22e2e4c90a9f94" - integrity sha512-n7s51eWdaWZ3vGT2tD4T7J6eJs3QoBXydv7vkUM06Bf1cbVD2Kc2UrkzhiQwobfV7NwOnQXYL7UBJ5VPU+RGoQ== - dependencies: - "@ampproject/remapping" "^2.2.0" - "@babel/code-frame" "^7.22.13" - "@babel/generator" "^7.23.0" - "@babel/helper-compilation-targets" "^7.22.15" - "@babel/helper-module-transforms" "^7.23.0" - "@babel/helpers" "^7.23.2" - "@babel/parser" "^7.23.0" - "@babel/template" "^7.22.15" - "@babel/traverse" "^7.23.2" - "@babel/types" "^7.23.0" - convert-source-map "^2.0.0" - debug "^4.1.0" - gensync "^1.0.0-beta.2" - json5 "^2.2.3" - semver "^6.3.1" - -"@babel/generator@^7.12.5", "@babel/generator@^7.18.7", "@babel/generator@^7.23.0": - version "7.23.0" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.23.0.tgz#df5c386e2218be505b34837acbcb874d7a983420" - integrity sha512-lN85QRR+5IbYrMWM6Y4pE/noaQtg4pNiqeNGX60eqOfo6gtEj6uw/JagelB8vVztSd7R6M5n1+PQkDbHbBRU4g== +"@babel/generator@^7.12.5", "@babel/generator@^7.18.7", "@babel/generator@^7.23.6": + version "7.23.6" + resolved "https://registry.npmjs.org/@babel/generator/-/generator-7.23.6.tgz" + integrity sha512-qrSfCYxYQB5owCmGLbl8XRpX1ytXlpueOb0N0UmQwA073KZxejgQTzAmJezxvpwQD9uGtK2shHdi55QT+MbjIw== dependencies: - "@babel/types" "^7.23.0" + "@babel/types" "^7.23.6" "@jridgewell/gen-mapping" "^0.3.2" "@jridgewell/trace-mapping" "^0.3.17" jsesc "^2.5.1" "@babel/helper-annotate-as-pure@^7.22.5": version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz#e7f06737b197d580a01edf75d97e2c8be99d3882" + resolved "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz" integrity sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg== dependencies: "@babel/types" "^7.22.5" "@babel/helper-builder-binary-assignment-operator-visitor@^7.22.5": version "7.22.15" - resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.22.15.tgz#5426b109cf3ad47b91120f8328d8ab1be8b0b956" + resolved "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.22.15.tgz" integrity sha512-QkBXwGgaoC2GtGZRoma6kv7Szfv06khvhFav67ZExau2RaXzy8MpHSMO2PNoP2XtmQphJQRHFfg77Bq731Yizw== dependencies: "@babel/types" "^7.22.15" -"@babel/helper-compilation-targets@^7.22.15", "@babel/helper-compilation-targets@^7.22.5", "@babel/helper-compilation-targets@^7.22.6": - version "7.22.15" - resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.15.tgz#0698fc44551a26cf29f18d4662d5bf545a6cfc52" - integrity sha512-y6EEzULok0Qvz8yyLkCvVX+02ic+By2UdOhylwUOvOn9dvYc9mKICJuuU1n1XBI02YWsNsnrY1kc6DVbjcXbtw== +"@babel/helper-compilation-targets@^7.22.15", "@babel/helper-compilation-targets@^7.22.5", "@babel/helper-compilation-targets@^7.22.6", "@babel/helper-compilation-targets@^7.23.6": + version "7.23.6" + resolved "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.23.6.tgz" + integrity sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ== dependencies: - "@babel/compat-data" "^7.22.9" - "@babel/helper-validator-option" "^7.22.15" - browserslist "^4.21.9" + "@babel/compat-data" "^7.23.5" + "@babel/helper-validator-option" "^7.23.5" + browserslist "^4.22.2" lru-cache "^5.1.1" semver "^6.3.1" "@babel/helper-create-class-features-plugin@^7.22.11", "@babel/helper-create-class-features-plugin@^7.22.15", "@babel/helper-create-class-features-plugin@^7.22.5": version "7.22.15" - resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.22.15.tgz#97a61b385e57fe458496fad19f8e63b63c867de4" + resolved "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.22.15.tgz" integrity sha512-jKkwA59IXcvSaiK2UN45kKwSC9o+KuoXsBDvHvU/7BecYIp8GQ2UwrVvFgJASUT+hBnwJx6MhvMCuMzwZZ7jlg== dependencies: "@babel/helper-annotate-as-pure" "^7.22.5" @@ -259,7 +259,7 @@ "@babel/helper-create-regexp-features-plugin@^7.18.6", "@babel/helper-create-regexp-features-plugin@^7.22.5": version "7.22.15" - resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.15.tgz#5ee90093914ea09639b01c711db0d6775e558be1" + resolved "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.15.tgz" integrity sha512-29FkPLFjn4TPEa3RE7GpW+qbE8tlsu3jntNYNfcGsc49LphF1PQIiD+vMZ1z1xVOKt+93khA9tc2JBs3kBjA7w== dependencies: "@babel/helper-annotate-as-pure" "^7.22.5" @@ -268,7 +268,7 @@ "@babel/helper-define-polyfill-provider@^0.4.3": version "0.4.3" - resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.4.3.tgz#a71c10f7146d809f4a256c373f462d9bba8cf6ba" + resolved "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.4.3.tgz" integrity sha512-WBrLmuPP47n7PNwsZ57pqam6G/RGo1vw/87b0Blc53tZNGZ4x7YvZ6HgQe2vo1W/FR20OgjeZuGXzudPiXHFug== dependencies: "@babel/helper-compilation-targets" "^7.22.6" @@ -279,12 +279,12 @@ "@babel/helper-environment-visitor@^7.22.20", "@babel/helper-environment-visitor@^7.22.5": version "7.22.20" - resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz#96159db61d34a29dba454c959f5ae4a649ba9167" + resolved "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz" integrity sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA== "@babel/helper-function-name@^7.22.5", "@babel/helper-function-name@^7.23.0": version "7.23.0" - resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz#1f9a3cdbd5b2698a670c30d2735f9af95ed52759" + resolved "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz" integrity sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw== dependencies: "@babel/template" "^7.22.15" @@ -292,29 +292,29 @@ "@babel/helper-hoist-variables@^7.22.5": version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz#c01a007dac05c085914e8fb652b339db50d823bb" + resolved "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz" integrity sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw== dependencies: "@babel/types" "^7.22.5" "@babel/helper-member-expression-to-functions@^7.22.15": version "7.23.0" - resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.23.0.tgz#9263e88cc5e41d39ec18c9a3e0eced59a3e7d366" + resolved "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.23.0.tgz" integrity sha512-6gfrPwh7OuT6gZyJZvd6WbTfrqAo7vm4xCzAXOusKqq/vWdKXphTpj5klHKNmRUU6/QRGlBsyU9mAIPaWHlqJA== dependencies: "@babel/types" "^7.23.0" "@babel/helper-module-imports@^7.22.15", "@babel/helper-module-imports@^7.22.5": version "7.22.15" - resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz#16146307acdc40cc00c3b2c647713076464bdbf0" + resolved "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz" integrity sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w== dependencies: "@babel/types" "^7.22.15" -"@babel/helper-module-transforms@^7.12.1", "@babel/helper-module-transforms@^7.22.5", "@babel/helper-module-transforms@^7.23.0": - version "7.23.0" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.23.0.tgz#3ec246457f6c842c0aee62a01f60739906f7047e" - integrity sha512-WhDWw1tdrlT0gMgUJSlX0IQvoO1eN279zrAUbVB+KpV2c3Tylz8+GnKOLllCS6Z/iZQEyVYxhZVUdPTqs2YYPw== +"@babel/helper-module-transforms@^7.12.1", "@babel/helper-module-transforms@^7.22.5", "@babel/helper-module-transforms@^7.23.0", "@babel/helper-module-transforms@^7.23.3": + version "7.23.3" + resolved "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz" + integrity sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ== dependencies: "@babel/helper-environment-visitor" "^7.22.20" "@babel/helper-module-imports" "^7.22.15" @@ -324,24 +324,24 @@ "@babel/helper-optimise-call-expression@^7.22.5": version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.22.5.tgz#f21531a9ccbff644fdd156b4077c16ff0c3f609e" + resolved "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.22.5.tgz" integrity sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw== dependencies: "@babel/types" "^7.22.5" +"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.22.5", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz" + integrity sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg== + "@babel/helper-plugin-utils@7.10.4": version "7.10.4" resolved "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz" integrity sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg== -"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.22.5", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz#dd7ee3735e8a313b9f7b05a773d892e88e6d7295" - integrity sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg== - "@babel/helper-remap-async-to-generator@^7.22.20", "@babel/helper-remap-async-to-generator@^7.22.5": version "7.22.20" - resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.20.tgz#7b68e1cb4fa964d2996fd063723fb48eca8498e0" + resolved "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.20.tgz" integrity sha512-pBGyV4uBqOns+0UvhsTO8qgl8hO89PmiDYv+/COyp1aeMcmfrfruz+/nCMFiYyFF/Knn0yfrC85ZzNFjembFTw== dependencies: "@babel/helper-annotate-as-pure" "^7.22.5" @@ -350,7 +350,7 @@ "@babel/helper-replace-supers@^7.22.5", "@babel/helper-replace-supers@^7.22.9": version "7.22.20" - resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.22.20.tgz#e37d367123ca98fe455a9887734ed2e16eb7a793" + resolved "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.22.20.tgz" integrity sha512-qsW0In3dbwQUbK8kejJ4R7IHVGwHJlV6lpG6UA7a9hSa2YEiAib+N1T2kr6PEeUT+Fl7najmSOS6SmAwCHK6Tw== dependencies: "@babel/helper-environment-visitor" "^7.22.20" @@ -359,82 +359,82 @@ "@babel/helper-simple-access@^7.22.5": version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz#4938357dc7d782b80ed6dbb03a0fba3d22b1d5de" + resolved "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz" integrity sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w== dependencies: "@babel/types" "^7.22.5" "@babel/helper-skip-transparent-expression-wrappers@^7.22.5": version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.22.5.tgz#007f15240b5751c537c40e77abb4e89eeaaa8847" + resolved "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.22.5.tgz" integrity sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q== dependencies: "@babel/types" "^7.22.5" "@babel/helper-split-export-declaration@^7.22.6": version "7.22.6" - resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz#322c61b7310c0997fe4c323955667f18fcefb91c" + resolved "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz" integrity sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g== dependencies: "@babel/types" "^7.22.5" -"@babel/helper-string-parser@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz#533f36457a25814cf1df6488523ad547d784a99f" - integrity sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw== +"@babel/helper-string-parser@^7.23.4": + version "7.23.4" + resolved "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.23.4.tgz" + integrity sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ== "@babel/helper-validator-identifier@^7.22.20": version "7.22.20" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz#c4ae002c61d2879e724581d96665583dbc1dc0e0" + resolved "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz" integrity sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A== -"@babel/helper-validator-option@^7.22.15": - version "7.22.15" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.22.15.tgz#694c30dfa1d09a6534cdfcafbe56789d36aba040" - integrity sha512-bMn7RmyFjY/mdECUbgn9eoSY4vqvacUnS9i9vGAGttgFWesO6B4CYWA7XlpbWgBt71iv/hfbPlynohStqnu5hA== +"@babel/helper-validator-option@^7.22.15", "@babel/helper-validator-option@^7.23.5": + version "7.23.5" + resolved "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz" + integrity sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw== "@babel/helper-wrap-function@^7.22.20": version "7.22.20" - resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.22.20.tgz#15352b0b9bfb10fc9c76f79f6342c00e3411a569" + resolved "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.22.20.tgz" integrity sha512-pms/UwkOpnQe/PDAEdV/d7dVCoBbB+R4FvYoHGZz+4VPcg7RtYy2KP7S2lbuWM6FCSgob5wshfGESbC/hzNXZw== dependencies: "@babel/helper-function-name" "^7.22.5" "@babel/template" "^7.22.15" "@babel/types" "^7.22.19" -"@babel/helpers@^7.12.5", "@babel/helpers@^7.23.2": - version "7.23.2" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.23.2.tgz#2832549a6e37d484286e15ba36a5330483cac767" - integrity sha512-lzchcp8SjTSVe/fPmLwtWVBFC7+Tbn8LGHDVfDp9JGxpAY5opSaEFgt8UQvrnECWOTdji2mOWMz1rOhkHscmGQ== +"@babel/helpers@^7.12.5", "@babel/helpers@^7.23.9": + version "7.23.9" + resolved "https://registry.npmjs.org/@babel/helpers/-/helpers-7.23.9.tgz" + integrity sha512-87ICKgU5t5SzOT7sBMfCOZQ2rHjRU+Pcb9BoILMYz600W6DkVRLFBPwQ18gwUVvggqXivaUakpnxWQGbpywbBQ== dependencies: - "@babel/template" "^7.22.15" - "@babel/traverse" "^7.23.2" - "@babel/types" "^7.23.0" + "@babel/template" "^7.23.9" + "@babel/traverse" "^7.23.9" + "@babel/types" "^7.23.9" -"@babel/highlight@^7.22.13": - version "7.22.20" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.22.20.tgz#4ca92b71d80554b01427815e06f2df965b9c1f54" - integrity sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg== +"@babel/highlight@^7.23.4": + version "7.23.4" + resolved "https://registry.npmjs.org/@babel/highlight/-/highlight-7.23.4.tgz" + integrity sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A== dependencies: "@babel/helper-validator-identifier" "^7.22.20" chalk "^2.4.2" js-tokens "^4.0.0" -"@babel/parser@^7.12.7", "@babel/parser@^7.18.8", "@babel/parser@^7.22.15", "@babel/parser@^7.23.0": - version "7.23.0" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.23.0.tgz#da950e622420bf96ca0d0f2909cdddac3acd8719" - integrity sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw== +"@babel/parser@^7.12.7", "@babel/parser@^7.18.8", "@babel/parser@^7.23.9": + version "7.23.9" + resolved "https://registry.npmjs.org/@babel/parser/-/parser-7.23.9.tgz" + integrity sha512-9tcKgqKbs3xGJ+NtKF2ndOBBLVwPjl1SHxPQkd36r3Dlirw3xWUeGaTbqr7uGZcTaxkVNwc+03SVP7aCdWrTlA== "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.22.15": version "7.22.15" - resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.22.15.tgz#02dc8a03f613ed5fdc29fb2f728397c78146c962" + resolved "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.22.15.tgz" integrity sha512-FB9iYlz7rURmRJyXRKEnalYPPdn87H5no108cyuQQyMwlpJ2SJtpIUBI27kdTin956pz+LPypkPVPUTlxOmrsg== dependencies: "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.22.15": version "7.22.15" - resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.22.15.tgz#2aeb91d337d4e1a1e7ce85b76a37f5301781200f" + resolved "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.22.15.tgz" integrity sha512-Hyph9LseGvAeeXzikV88bczhsrLrIZqDPxO+sSmAunMPaGrBGhfMWzCPYTtiW9t+HzSE2wtV8e5cc5P6r1xMDQ== dependencies: "@babel/helper-plugin-utils" "^7.22.5" @@ -452,7 +452,7 @@ "@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2": version "7.21.0-placeholder-for-preset-env.2" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz#7844f9289546efa9febac2de4cfe358a050bd703" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz" integrity sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w== "@babel/plugin-syntax-async-generators@^7.8.4": @@ -492,21 +492,21 @@ "@babel/plugin-syntax-import-assertions@^7.22.5": version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.22.5.tgz#07d252e2aa0bc6125567f742cd58619cb14dce98" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.22.5.tgz" integrity sha512-rdV97N7KqsRzeNGoWUOK6yUsWarLjE5Su/Snk9IYPU9CwkWHs4t+rTGOvffTR8XGkJMTAdLfO0xVnXm8wugIJg== dependencies: "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-syntax-import-attributes@^7.22.5": version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.22.5.tgz#ab840248d834410b829f569f5262b9e517555ecb" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.22.5.tgz" integrity sha512-KwvoWDeNKPETmozyFE0P2rOLqh39EoQHNjqizrI5B8Vt0ZNS7M56s7dAiAqbYfiAYOuIzIh96z3iR2ktgu3tEg== dependencies: "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-syntax-import-meta@^7.10.4": version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz#ee601348c370fa334d2207be158777496521fd51" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz" integrity sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g== dependencies: "@babel/helper-plugin-utils" "^7.10.4" @@ -518,6 +518,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.0" +"@babel/plugin-syntax-jsx@^7.22.5": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.22.5.tgz" + integrity sha512-gvyP4hZrgrs/wWMaocvxZ44Hw0b3W8Pe+cMxc8V1ULQ07oh8VNbIRaoD1LRZVTvD+0nieDKjfgKg89sD7rrKrg== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-jsx@7.12.1": version "7.12.1" resolved "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.12.1.tgz" @@ -525,13 +532,6 @@ dependencies: "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-syntax-jsx@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.22.5.tgz#a6b68e84fb76e759fc3b93e901876ffabbe1d918" - integrity sha512-gvyP4hZrgrs/wWMaocvxZ44Hw0b3W8Pe+cMxc8V1ULQ07oh8VNbIRaoD1LRZVTvD+0nieDKjfgKg89sD7rrKrg== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/plugin-syntax-logical-assignment-operators@^7.10.4": version "7.10.4" resolved "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz" @@ -553,7 +553,7 @@ dependencies: "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-syntax-object-rest-spread@7.8.3", "@babel/plugin-syntax-object-rest-spread@^7.8.0", "@babel/plugin-syntax-object-rest-spread@^7.8.3": +"@babel/plugin-syntax-object-rest-spread@^7.8.0", "@babel/plugin-syntax-object-rest-spread@^7.8.3", "@babel/plugin-syntax-object-rest-spread@7.8.3": version "7.8.3" resolved "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz" integrity sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA== @@ -590,14 +590,14 @@ "@babel/plugin-syntax-typescript@^7.22.5": version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.22.5.tgz#aac8d383b062c5072c647a31ef990c1d0af90272" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.22.5.tgz" integrity sha512-1mS2o03i7t1c6VzH6fdQ3OA8tcEIxwG18zIPRp+UY1Ihv6W+XZzBCVxExF9upussPXJ0xE9XRHwMoNs1ep/nRQ== dependencies: "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-syntax-unicode-sets-regex@^7.18.6": version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz#d49a3b3e6b52e5be6740022317580234a6a47357" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz" integrity sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg== dependencies: "@babel/helper-create-regexp-features-plugin" "^7.18.6" @@ -605,14 +605,14 @@ "@babel/plugin-transform-arrow-functions@^7.22.5": version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.22.5.tgz#e5ba566d0c58a5b2ba2a8b795450641950b71958" + resolved "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.22.5.tgz" integrity sha512-26lTNXoVRdAnsaDXPpvCNUq+OVWEVC6bx7Vvz9rC53F2bagUWW4u4ii2+h8Fejfh7RYqPxn+libeFBBck9muEw== dependencies: "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-transform-async-generator-functions@^7.23.2": version "7.23.2" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.23.2.tgz#054afe290d64c6f576f371ccc321772c8ea87ebb" + resolved "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.23.2.tgz" integrity sha512-BBYVGxbDVHfoeXbOwcagAkOQAm9NxoTdMGfTqghu1GrvadSaw6iW3Je6IcL5PNOw8VwjxqBECXy50/iCQSY/lQ== dependencies: "@babel/helper-environment-visitor" "^7.22.20" @@ -622,7 +622,7 @@ "@babel/plugin-transform-async-to-generator@^7.22.5": version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.22.5.tgz#c7a85f44e46f8952f6d27fe57c2ed3cc084c3775" + resolved "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.22.5.tgz" integrity sha512-b1A8D8ZzE/VhNDoV1MSJTnpKkCG5bJo+19R4o4oy03zM7ws8yEMK755j61Dc3EyvdysbqH5BOOTquJ7ZX9C6vQ== dependencies: "@babel/helper-module-imports" "^7.22.5" @@ -631,21 +631,21 @@ "@babel/plugin-transform-block-scoped-functions@^7.22.5": version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.22.5.tgz#27978075bfaeb9fa586d3cb63a3d30c1de580024" + resolved "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.22.5.tgz" integrity sha512-tdXZ2UdknEKQWKJP1KMNmuF5Lx3MymtMN/pvA+p/VEkhK8jVcQ1fzSy8KM9qRYhAf2/lV33hoMPKI/xaI9sADA== dependencies: "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-transform-block-scoping@^7.23.0": version "7.23.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.23.0.tgz#8744d02c6c264d82e1a4bc5d2d501fd8aff6f022" + resolved "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.23.0.tgz" integrity sha512-cOsrbmIOXmf+5YbL99/S49Y3j46k/T16b9ml8bm9lP6N9US5iQ2yBK7gpui1pg0V/WMcXdkfKbTb7HXq9u+v4g== dependencies: "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-transform-class-properties@^7.22.5": version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.22.5.tgz#97a56e31ad8c9dc06a0b3710ce7803d5a48cca77" + resolved "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.22.5.tgz" integrity sha512-nDkQ0NfkOhPTq8YCLiWNxp1+f9fCobEjCb0n8WdbNUBc4IB5V7P1QnX9IjpSoquKrXF5SKojHleVNs2vGeHCHQ== dependencies: "@babel/helper-create-class-features-plugin" "^7.22.5" @@ -653,7 +653,7 @@ "@babel/plugin-transform-class-static-block@^7.22.11": version "7.22.11" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.22.11.tgz#dc8cc6e498f55692ac6b4b89e56d87cec766c974" + resolved "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.22.11.tgz" integrity sha512-GMM8gGmqI7guS/llMFk1bJDkKfn3v3C4KHK9Yg1ey5qcHcOlKb0QvcMrgzvxo+T03/4szNh5lghY+fEC98Kq9g== dependencies: "@babel/helper-create-class-features-plugin" "^7.22.11" @@ -662,7 +662,7 @@ "@babel/plugin-transform-classes@^7.22.15": version "7.22.15" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.22.15.tgz#aaf4753aee262a232bbc95451b4bdf9599c65a0b" + resolved "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.22.15.tgz" integrity sha512-VbbC3PGjBdE0wAWDdHM9G8Gm977pnYI0XpqMd6LrKISj8/DJXEsWqgRuTYaNE9Bv0JGhTZUzHDlMk18IpOuoqw== dependencies: "@babel/helper-annotate-as-pure" "^7.22.5" @@ -677,7 +677,7 @@ "@babel/plugin-transform-computed-properties@^7.22.5": version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.22.5.tgz#cd1e994bf9f316bd1c2dafcd02063ec261bb3869" + resolved "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.22.5.tgz" integrity sha512-4GHWBgRf0krxPX+AaPtgBAlTgTeZmqDynokHOX7aqqAB4tHs3U2Y02zH6ETFdLZGcg9UQSD1WCmkVrE9ErHeOg== dependencies: "@babel/helper-plugin-utils" "^7.22.5" @@ -685,14 +685,14 @@ "@babel/plugin-transform-destructuring@^7.23.0": version "7.23.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.23.0.tgz#6447aa686be48b32eaf65a73e0e2c0bd010a266c" + resolved "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.23.0.tgz" integrity sha512-vaMdgNXFkYrB+8lbgniSYWHsgqK5gjaMNcc84bMIOMRLH0L9AqYq3hwMdvnyqj1OPqea8UtjPEuS/DCenah1wg== dependencies: "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-transform-dotall-regex@^7.22.5": version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.22.5.tgz#dbb4f0e45766eb544e193fb00e65a1dd3b2a4165" + resolved "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.22.5.tgz" integrity sha512-5/Yk9QxCQCl+sOIB1WelKnVRxTJDSAIxtJLL2/pqL14ZVlbH0fUQUZa/T5/UnQtBNgghR7mfB8ERBKyKPCi7Vw== dependencies: "@babel/helper-create-regexp-features-plugin" "^7.22.5" @@ -700,14 +700,14 @@ "@babel/plugin-transform-duplicate-keys@^7.22.5": version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.22.5.tgz#b6e6428d9416f5f0bba19c70d1e6e7e0b88ab285" + resolved "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.22.5.tgz" integrity sha512-dEnYD+9BBgld5VBXHnF/DbYGp3fqGMsyxKbtD1mDyIA7AkTSpKXFhCVuj/oQVOoALfBs77DudA0BE4d5mcpmqw== dependencies: "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-transform-dynamic-import@^7.22.11": version "7.22.11" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.22.11.tgz#2c7722d2a5c01839eaf31518c6ff96d408e447aa" + resolved "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.22.11.tgz" integrity sha512-g/21plo58sfteWjaO0ZNVb+uEOkJNjAaHhbejrnBmu011l/eNDScmkbjCC3l4FKb10ViaGU4aOkFznSu2zRHgA== dependencies: "@babel/helper-plugin-utils" "^7.22.5" @@ -715,7 +715,7 @@ "@babel/plugin-transform-exponentiation-operator@^7.22.5": version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.22.5.tgz#402432ad544a1f9a480da865fda26be653e48f6a" + resolved "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.22.5.tgz" integrity sha512-vIpJFNM/FjZ4rh1myqIya9jXwrwwgFRHPjT3DkUA9ZLHuzox8jiXkOLvwm1H+PQIP3CqfC++WPKeuDi0Sjdj1g== dependencies: "@babel/helper-builder-binary-assignment-operator-visitor" "^7.22.5" @@ -723,7 +723,7 @@ "@babel/plugin-transform-export-namespace-from@^7.22.11": version "7.22.11" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.22.11.tgz#b3c84c8f19880b6c7440108f8929caf6056db26c" + resolved "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.22.11.tgz" integrity sha512-xa7aad7q7OiT8oNZ1mU7NrISjlSkVdMbNxn9IuLZyL9AJEhs1Apba3I+u5riX1dIkdptP5EKDG5XDPByWxtehw== dependencies: "@babel/helper-plugin-utils" "^7.22.5" @@ -731,14 +731,14 @@ "@babel/plugin-transform-for-of@^7.22.15": version "7.22.15" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.22.15.tgz#f64b4ccc3a4f131a996388fae7680b472b306b29" + resolved "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.22.15.tgz" integrity sha512-me6VGeHsx30+xh9fbDLLPi0J1HzmeIIyenoOQHuw2D4m2SAU3NrspX5XxJLBpqn5yrLzrlw2Iy3RA//Bx27iOA== dependencies: "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-transform-function-name@^7.22.5": version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.22.5.tgz#935189af68b01898e0d6d99658db6b164205c143" + resolved "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.22.5.tgz" integrity sha512-UIzQNMS0p0HHiQm3oelztj+ECwFnj+ZRV4KnguvlsD2of1whUeM6o7wGNj6oLwcDoAXQ8gEqfgC24D+VdIcevg== dependencies: "@babel/helper-compilation-targets" "^7.22.5" @@ -747,7 +747,7 @@ "@babel/plugin-transform-json-strings@^7.22.11": version "7.22.11" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.22.11.tgz#689a34e1eed1928a40954e37f74509f48af67835" + resolved "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.22.11.tgz" integrity sha512-CxT5tCqpA9/jXFlme9xIBCc5RPtdDq3JpkkhgHQqtDdiTnTI0jtZ0QzXhr5DILeYifDPp2wvY2ad+7+hLMW5Pw== dependencies: "@babel/helper-plugin-utils" "^7.22.5" @@ -755,14 +755,14 @@ "@babel/plugin-transform-literals@^7.22.5": version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.22.5.tgz#e9341f4b5a167952576e23db8d435849b1dd7920" + resolved "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.22.5.tgz" integrity sha512-fTLj4D79M+mepcw3dgFBTIDYpbcB9Sm0bpm4ppXPaO+U+PKFFyV9MGRvS0gvGw62sd10kT5lRMKXAADb9pWy8g== dependencies: "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-transform-logical-assignment-operators@^7.22.11": version "7.22.11" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.22.11.tgz#24c522a61688bde045b7d9bc3c2597a4d948fc9c" + resolved "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.22.11.tgz" integrity sha512-qQwRTP4+6xFCDV5k7gZBF3C31K34ut0tbEcTKxlX/0KXxm9GLcO14p570aWxFvVzx6QAfPgq7gaeIHXJC8LswQ== dependencies: "@babel/helper-plugin-utils" "^7.22.5" @@ -770,14 +770,14 @@ "@babel/plugin-transform-member-expression-literals@^7.22.5": version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.22.5.tgz#4fcc9050eded981a468347dd374539ed3e058def" + resolved "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.22.5.tgz" integrity sha512-RZEdkNtzzYCFl9SE9ATaUMTj2hqMb4StarOJLrZRbqqU4HSBE7UlBw9WBWQiDzrJZJdUWiMTVDI6Gv/8DPvfew== dependencies: "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-transform-modules-amd@^7.23.0": version "7.23.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.23.0.tgz#05b2bc43373faa6d30ca89214731f76f966f3b88" + resolved "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.23.0.tgz" integrity sha512-xWT5gefv2HGSm4QHtgc1sYPbseOyf+FFDo2JbpE25GWl5BqTGO9IMwTYJRoIdjsF85GE+VegHxSCUt5EvoYTAw== dependencies: "@babel/helper-module-transforms" "^7.23.0" @@ -785,7 +785,7 @@ "@babel/plugin-transform-modules-commonjs@^7.23.0": version "7.23.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.23.0.tgz#b3dba4757133b2762c00f4f94590cf6d52602481" + resolved "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.23.0.tgz" integrity sha512-32Xzss14/UVc7k9g775yMIvkVK8xwKE0DPdP5JTapr3+Z9w4tzeOuLNY6BXDQR6BdnzIlXnCGAzsk/ICHBLVWQ== dependencies: "@babel/helper-module-transforms" "^7.23.0" @@ -794,7 +794,7 @@ "@babel/plugin-transform-modules-systemjs@^7.23.0": version "7.23.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.23.0.tgz#77591e126f3ff4132a40595a6cccd00a6b60d160" + resolved "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.23.0.tgz" integrity sha512-qBej6ctXZD2f+DhlOC9yO47yEYgUh5CZNz/aBoH4j/3NOlRfJXJbY7xDQCqQVf9KbrqGzIWER1f23doHGrIHFg== dependencies: "@babel/helper-hoist-variables" "^7.22.5" @@ -804,7 +804,7 @@ "@babel/plugin-transform-modules-umd@^7.22.5": version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.22.5.tgz#4694ae40a87b1745e3775b6a7fe96400315d4f98" + resolved "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.22.5.tgz" integrity sha512-+S6kzefN/E1vkSsKx8kmQuqeQsvCKCd1fraCM7zXm4SFoggI099Tr4G8U81+5gtMdUeMQ4ipdQffbKLX0/7dBQ== dependencies: "@babel/helper-module-transforms" "^7.22.5" @@ -812,7 +812,7 @@ "@babel/plugin-transform-named-capturing-groups-regex@^7.22.5": version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.22.5.tgz#67fe18ee8ce02d57c855185e27e3dc959b2e991f" + resolved "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.22.5.tgz" integrity sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ== dependencies: "@babel/helper-create-regexp-features-plugin" "^7.22.5" @@ -820,14 +820,14 @@ "@babel/plugin-transform-new-target@^7.22.5": version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.22.5.tgz#1b248acea54ce44ea06dfd37247ba089fcf9758d" + resolved "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.22.5.tgz" integrity sha512-AsF7K0Fx/cNKVyk3a+DW0JLo+Ua598/NxMRvxDnkpCIGFh43+h/v2xyhRUYf6oD8gE4QtL83C7zZVghMjHd+iw== dependencies: "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-transform-nullish-coalescing-operator@^7.22.11": version "7.22.11" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.22.11.tgz#debef6c8ba795f5ac67cd861a81b744c5d38d9fc" + resolved "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.22.11.tgz" integrity sha512-YZWOw4HxXrotb5xsjMJUDlLgcDXSfO9eCmdl1bgW4+/lAGdkjaEvOnQ4p5WKKdUgSzO39dgPl0pTnfxm0OAXcg== dependencies: "@babel/helper-plugin-utils" "^7.22.5" @@ -835,7 +835,7 @@ "@babel/plugin-transform-numeric-separator@^7.22.11": version "7.22.11" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.22.11.tgz#498d77dc45a6c6db74bb829c02a01c1d719cbfbd" + resolved "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.22.11.tgz" integrity sha512-3dzU4QGPsILdJbASKhF/V2TVP+gJya1PsueQCxIPCEcerqF21oEcrob4mzjsp2Py/1nLfF5m+xYNMDpmA8vffg== dependencies: "@babel/helper-plugin-utils" "^7.22.5" @@ -843,7 +843,7 @@ "@babel/plugin-transform-object-rest-spread@^7.22.15": version "7.22.15" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.22.15.tgz#21a95db166be59b91cde48775310c0df6e1da56f" + resolved "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.22.15.tgz" integrity sha512-fEB+I1+gAmfAyxZcX1+ZUwLeAuuf8VIg67CTznZE0MqVFumWkh8xWtn58I4dxdVf080wn7gzWoF8vndOViJe9Q== dependencies: "@babel/compat-data" "^7.22.9" @@ -854,7 +854,7 @@ "@babel/plugin-transform-object-super@^7.22.5": version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.22.5.tgz#794a8d2fcb5d0835af722173c1a9d704f44e218c" + resolved "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.22.5.tgz" integrity sha512-klXqyaT9trSjIUrcsYIfETAzmOEZL3cBYqOYLJxBHfMFFggmXOv+NYSX/Jbs9mzMVESw/WycLFPRx8ba/b2Ipw== dependencies: "@babel/helper-plugin-utils" "^7.22.5" @@ -862,7 +862,7 @@ "@babel/plugin-transform-optional-catch-binding@^7.22.11": version "7.22.11" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.22.11.tgz#461cc4f578a127bb055527b3e77404cad38c08e0" + resolved "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.22.11.tgz" integrity sha512-rli0WxesXUeCJnMYhzAglEjLWVDF6ahb45HuprcmQuLidBJFWjNnOzssk2kuc6e33FlLaiZhG/kUIzUMWdBKaQ== dependencies: "@babel/helper-plugin-utils" "^7.22.5" @@ -870,7 +870,7 @@ "@babel/plugin-transform-optional-chaining@^7.22.15", "@babel/plugin-transform-optional-chaining@^7.23.0": version "7.23.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.23.0.tgz#73ff5fc1cf98f542f09f29c0631647d8ad0be158" + resolved "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.23.0.tgz" integrity sha512-sBBGXbLJjxTzLBF5rFWaikMnOGOk/BmK6vVByIdEggZ7Vn6CvWXZyRkkLFK6WE0IF8jSliyOkUN6SScFgzCM0g== dependencies: "@babel/helper-plugin-utils" "^7.22.5" @@ -879,14 +879,14 @@ "@babel/plugin-transform-parameters@^7.12.1", "@babel/plugin-transform-parameters@^7.22.15": version "7.22.15" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.22.15.tgz#719ca82a01d177af358df64a514d64c2e3edb114" + resolved "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.22.15.tgz" integrity sha512-hjk7qKIqhyzhhUvRT683TYQOFa/4cQKwQy7ALvTpODswN40MljzNDa0YldevS6tGbxwaEKVn502JmY0dP7qEtQ== dependencies: "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-transform-private-methods@^7.22.5": version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.22.5.tgz#21c8af791f76674420a147ae62e9935d790f8722" + resolved "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.22.5.tgz" integrity sha512-PPjh4gyrQnGe97JTalgRGMuU4icsZFnWkzicB/fUtzlKUqvsWBKEpPPfr5a2JiyirZkHxnAqkQMO5Z5B2kK3fA== dependencies: "@babel/helper-create-class-features-plugin" "^7.22.5" @@ -894,7 +894,7 @@ "@babel/plugin-transform-private-property-in-object@^7.22.11": version "7.22.11" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.22.11.tgz#ad45c4fc440e9cb84c718ed0906d96cf40f9a4e1" + resolved "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.22.11.tgz" integrity sha512-sSCbqZDBKHetvjSwpyWzhuHkmW5RummxJBVbYLkGkaiTOWGxml7SXt0iWa03bzxFIx7wOj3g/ILRd0RcJKBeSQ== dependencies: "@babel/helper-annotate-as-pure" "^7.22.5" @@ -904,35 +904,35 @@ "@babel/plugin-transform-property-literals@^7.22.5": version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.22.5.tgz#b5ddabd73a4f7f26cd0e20f5db48290b88732766" + resolved "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.22.5.tgz" integrity sha512-TiOArgddK3mK/x1Qwf5hay2pxI6wCZnvQqrFSqbtg1GLl2JcNMitVH/YnqjP+M31pLUeTfzY1HAXFDnUBV30rQ== dependencies: "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-transform-react-constant-elements@^7.18.12": version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.22.5.tgz#6dfa7c1c37f7d7279e417ceddf5a04abb8bb9c29" + resolved "https://registry.npmjs.org/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.22.5.tgz" integrity sha512-BF5SXoO+nX3h5OhlN78XbbDrBOffv+AxPP2ENaJOVqjWCgBDeOY3WcaUcddutGSfoap+5NEQ/q/4I3WZIvgkXA== dependencies: "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-transform-react-display-name@^7.22.5": version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.22.5.tgz#3c4326f9fce31c7968d6cb9debcaf32d9e279a2b" + resolved "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.22.5.tgz" integrity sha512-PVk3WPYudRF5z4GKMEYUrLjPl38fJSKNaEOkFuoprioowGuWN6w2RKznuFNSlJx7pzzXXStPUnNSOEO0jL5EVw== dependencies: "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-transform-react-jsx-development@^7.22.5": version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.22.5.tgz#e716b6edbef972a92165cd69d92f1255f7e73e87" + resolved "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.22.5.tgz" integrity sha512-bDhuzwWMuInwCYeDeMzyi7TaBgRQei6DqxhbyniL7/VG4RSS7HtSL2QbY4eESy1KJqlWt8g3xeEBGPuo+XqC8A== dependencies: "@babel/plugin-transform-react-jsx" "^7.22.5" "@babel/plugin-transform-react-jsx@^7.22.15", "@babel/plugin-transform-react-jsx@^7.22.5": version "7.22.15" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.22.15.tgz#7e6266d88705d7c49f11c98db8b9464531289cd6" + resolved "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.22.15.tgz" integrity sha512-oKckg2eZFa8771O/5vi7XeTvmM6+O9cxZu+kanTU7tD4sin5nO/G8jGJhq8Hvt2Z0kUoEDRayuZLaUlYl8QuGA== dependencies: "@babel/helper-annotate-as-pure" "^7.22.5" @@ -943,7 +943,7 @@ "@babel/plugin-transform-react-pure-annotations@^7.22.5": version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.22.5.tgz#1f58363eef6626d6fa517b95ac66fe94685e32c0" + resolved "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.22.5.tgz" integrity sha512-gP4k85wx09q+brArVinTXhWiyzLl9UpmGva0+mWyKxk6JZequ05x3eUcIUE+FyttPKJFRRVtAvQaJ6YF9h1ZpA== dependencies: "@babel/helper-annotate-as-pure" "^7.22.5" @@ -951,7 +951,7 @@ "@babel/plugin-transform-regenerator@^7.22.10": version "7.22.10" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.22.10.tgz#8ceef3bd7375c4db7652878b0241b2be5d0c3cca" + resolved "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.22.10.tgz" integrity sha512-F28b1mDt8KcT5bUyJc/U9nwzw6cV+UmTeRlXYIl2TNqMMJif0Jeey9/RQ3C4NOd2zp0/TRsDns9ttj2L523rsw== dependencies: "@babel/helper-plugin-utils" "^7.22.5" @@ -959,14 +959,14 @@ "@babel/plugin-transform-reserved-words@^7.22.5": version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.22.5.tgz#832cd35b81c287c4bcd09ce03e22199641f964fb" + resolved "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.22.5.tgz" integrity sha512-DTtGKFRQUDm8svigJzZHzb/2xatPc6TzNvAIJ5GqOKDsGFYgAskjRulbR/vGsPKq3OPqtexnz327qYpP57RFyA== dependencies: "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-transform-runtime@^7.18.6": version "7.23.2" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.23.2.tgz#c956a3f8d1aa50816ff6c30c6288d66635c12990" + resolved "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.23.2.tgz" integrity sha512-XOntj6icgzMS58jPVtQpiuF6ZFWxQiJavISGx5KGjRj+3gqZr8+N6Kx+N9BApWzgS+DOjIZfXXj0ZesenOWDyA== dependencies: "@babel/helper-module-imports" "^7.22.15" @@ -978,14 +978,14 @@ "@babel/plugin-transform-shorthand-properties@^7.22.5": version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.22.5.tgz#6e277654be82b5559fc4b9f58088507c24f0c624" + resolved "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.22.5.tgz" integrity sha512-vM4fq9IXHscXVKzDv5itkO1X52SmdFBFcMIBZ2FRn2nqVYqw6dBexUgMvAjHW+KXpPPViD/Yo3GrDEBaRC0QYA== dependencies: "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-transform-spread@^7.22.5": version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.22.5.tgz#6487fd29f229c95e284ba6c98d65eafb893fea6b" + resolved "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.22.5.tgz" integrity sha512-5ZzDQIGyvN4w8+dMmpohL6MBo+l2G7tfC/O2Dg7/hjpgeWvUx8FzfeOKxGog9IimPa4YekaQ9PlDqTLOljkcxg== dependencies: "@babel/helper-plugin-utils" "^7.22.5" @@ -993,28 +993,28 @@ "@babel/plugin-transform-sticky-regex@^7.22.5": version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.22.5.tgz#295aba1595bfc8197abd02eae5fc288c0deb26aa" + resolved "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.22.5.tgz" integrity sha512-zf7LuNpHG0iEeiyCNwX4j3gDg1jgt1k3ZdXBKbZSoA3BbGQGvMiSvfbZRR3Dr3aeJe3ooWFZxOOG3IRStYp2Bw== dependencies: "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-transform-template-literals@^7.22.5": version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.22.5.tgz#8f38cf291e5f7a8e60e9f733193f0bcc10909bff" + resolved "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.22.5.tgz" integrity sha512-5ciOehRNf+EyUeewo8NkbQiUs4d6ZxiHo6BcBcnFlgiJfu16q0bQUw9Jvo0b0gBKFG1SMhDSjeKXSYuJLeFSMA== dependencies: "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-transform-typeof-symbol@^7.22.5": version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.22.5.tgz#5e2ba478da4b603af8673ff7c54f75a97b716b34" + resolved "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.22.5.tgz" integrity sha512-bYkI5lMzL4kPii4HHEEChkD0rkc+nvnlR6+o/qdqR6zrm0Sv/nodmyLhlq2DO0YKLUNd2VePmPRjJXSBh9OIdA== dependencies: "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-transform-typescript@^7.22.15": version "7.22.15" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.22.15.tgz#15adef906451d86349eb4b8764865c960eb54127" + resolved "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.22.15.tgz" integrity sha512-1uirS0TnijxvQLnlv5wQBwOX3E1wCFX7ITv+9pBV2wKEk4K+M5tqDaoNXnTH8tjEIYHLO98MwiTWO04Ggz4XuA== dependencies: "@babel/helper-annotate-as-pure" "^7.22.5" @@ -1024,14 +1024,14 @@ "@babel/plugin-transform-unicode-escapes@^7.22.10": version "7.22.10" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.22.10.tgz#c723f380f40a2b2f57a62df24c9005834c8616d9" + resolved "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.22.10.tgz" integrity sha512-lRfaRKGZCBqDlRU3UIFovdp9c9mEvlylmpod0/OatICsSfuQ9YFthRo1tpTkGsklEefZdqlEFdY4A2dwTb6ohg== dependencies: "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-transform-unicode-property-regex@^7.22.5": version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.22.5.tgz#098898f74d5c1e86660dc112057b2d11227f1c81" + resolved "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.22.5.tgz" integrity sha512-HCCIb+CbJIAE6sXn5CjFQXMwkCClcOfPCzTlilJ8cUatfzwHlWQkbtV0zD338u9dZskwvuOYTuuaMaA8J5EI5A== dependencies: "@babel/helper-create-regexp-features-plugin" "^7.22.5" @@ -1039,7 +1039,7 @@ "@babel/plugin-transform-unicode-regex@^7.22.5": version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.22.5.tgz#ce7e7bb3ef208c4ff67e02a22816656256d7a183" + resolved "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.22.5.tgz" integrity sha512-028laaOKptN5vHJf9/Arr/HiJekMd41hOEZYvNsrsXqJ7YPYuX2bQxh31fkZzGmq3YqHRJzYFFAVYvKfMPKqyg== dependencies: "@babel/helper-create-regexp-features-plugin" "^7.22.5" @@ -1047,7 +1047,7 @@ "@babel/plugin-transform-unicode-sets-regex@^7.22.5": version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.22.5.tgz#77788060e511b708ffc7d42fdfbc5b37c3004e91" + resolved "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.22.5.tgz" integrity sha512-lhMfi4FC15j13eKrh3DnYHjpGj6UKQHtNKTbtc1igvAhRy4+kLhV07OpLcsN0VgDEw/MjAvJO4BdMJsHwMhzCg== dependencies: "@babel/helper-create-regexp-features-plugin" "^7.22.5" @@ -1055,7 +1055,7 @@ "@babel/preset-env@^7.18.6", "@babel/preset-env@^7.19.4": version "7.23.2" - resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.23.2.tgz#1f22be0ff0e121113260337dbc3e58fafce8d059" + resolved "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.23.2.tgz" integrity sha512-BW3gsuDD+rvHL2VO2SjAUNTBe5YrjsTiDyqamPDWY723na3/yPQ65X5oQkFVJZ0o50/2d+svm1rkPoJeR1KxVQ== dependencies: "@babel/compat-data" "^7.23.2" @@ -1141,7 +1141,7 @@ "@babel/preset-modules@0.1.6-no-external-plugins": version "0.1.6-no-external-plugins" - resolved "https://registry.yarnpkg.com/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz#ccb88a2c49c817236861fee7826080573b8a923a" + resolved "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz" integrity sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA== dependencies: "@babel/helper-plugin-utils" "^7.0.0" @@ -1150,7 +1150,7 @@ "@babel/preset-react@^7.18.6": version "7.22.15" - resolved "https://registry.yarnpkg.com/@babel/preset-react/-/preset-react-7.22.15.tgz#9a776892b648e13cc8ca2edf5ed1264eea6b6afc" + resolved "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.22.15.tgz" integrity sha512-Csy1IJ2uEh/PecCBXXoZGAZBeCATTuePzCSB7dLYWS0vOEj6CNpjxIhW4duWwZodBNueH7QO14WbGn8YyeuN9w== dependencies: "@babel/helper-plugin-utils" "^7.22.5" @@ -1162,7 +1162,7 @@ "@babel/preset-typescript@^7.18.6": version "7.23.2" - resolved "https://registry.yarnpkg.com/@babel/preset-typescript/-/preset-typescript-7.23.2.tgz#c8de488130b7081f7e1482936ad3de5b018beef4" + resolved "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.23.2.tgz" integrity sha512-u4UJc1XsS1GhIGteM8rnGiIvf9rJpiVgMEeCnwlLA7WJPC+jcXWJAGxYmeqs5hOZD8BbAfnV5ezBOxQbb4OUxA== dependencies: "@babel/helper-plugin-utils" "^7.22.5" @@ -1173,12 +1173,12 @@ "@babel/regjsgen@^0.8.0": version "0.8.0" - resolved "https://registry.yarnpkg.com/@babel/regjsgen/-/regjsgen-0.8.0.tgz#f0ba69b075e1f05fb2825b7fad991e7adbb18310" + resolved "https://registry.npmjs.org/@babel/regjsgen/-/regjsgen-0.8.0.tgz" integrity sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA== "@babel/runtime-corejs3@^7.18.6": version "7.23.2" - resolved "https://registry.yarnpkg.com/@babel/runtime-corejs3/-/runtime-corejs3-7.23.2.tgz#a5cd9d8b408fb946b2f074b21ea40c04e516795c" + resolved "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.23.2.tgz" integrity sha512-54cIh74Z1rp4oIjsHjqN+WM4fMyCBYe+LpZ9jWm51CZ1fbH3SkAzQD/3XLoNkjbJ7YEmjobLXyvQrFypRHOrXw== dependencies: core-js-pure "^3.30.2" @@ -1191,37 +1191,37 @@ dependencies: regenerator-runtime "^0.14.0" -"@babel/template@^7.12.7", "@babel/template@^7.22.15", "@babel/template@^7.22.5": - version "7.22.15" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.22.15.tgz#09576efc3830f0430f4548ef971dde1350ef2f38" - integrity sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w== +"@babel/template@^7.12.7", "@babel/template@^7.22.15", "@babel/template@^7.22.5", "@babel/template@^7.23.9": + version "7.23.9" + resolved "https://registry.npmjs.org/@babel/template/-/template-7.23.9.tgz" + integrity sha512-+xrD2BWLpvHKNmX2QbpdpsBaWnRxahMwJjO+KZk2JOElj5nSmKezyS1B4u+QbHMTX69t4ukm6hh9lsYQ7GHCKA== dependencies: - "@babel/code-frame" "^7.22.13" - "@babel/parser" "^7.22.15" - "@babel/types" "^7.22.15" + "@babel/code-frame" "^7.23.5" + "@babel/parser" "^7.23.9" + "@babel/types" "^7.23.9" -"@babel/traverse@^7.12.9", "@babel/traverse@^7.18.8", "@babel/traverse@^7.23.2": - version "7.23.2" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.23.2.tgz#329c7a06735e144a506bdb2cad0268b7f46f4ad8" - integrity sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw== +"@babel/traverse@^7.12.9", "@babel/traverse@^7.18.8", "@babel/traverse@^7.23.9": + version "7.23.9" + resolved "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.9.tgz" + integrity sha512-I/4UJ9vs90OkBtY6iiiTORVMyIhJ4kAVmsKo9KFc8UOxMeUfi2hvtIBsET5u9GizXE6/GFSuKCTNfgCswuEjRg== dependencies: - "@babel/code-frame" "^7.22.13" - "@babel/generator" "^7.23.0" + "@babel/code-frame" "^7.23.5" + "@babel/generator" "^7.23.6" "@babel/helper-environment-visitor" "^7.22.20" "@babel/helper-function-name" "^7.23.0" "@babel/helper-hoist-variables" "^7.22.5" "@babel/helper-split-export-declaration" "^7.22.6" - "@babel/parser" "^7.23.0" - "@babel/types" "^7.23.0" - debug "^4.1.0" + "@babel/parser" "^7.23.9" + "@babel/types" "^7.23.9" + debug "^4.3.1" globals "^11.1.0" -"@babel/types@^7.12.7", "@babel/types@^7.20.0", "@babel/types@^7.22.15", "@babel/types@^7.22.19", "@babel/types@^7.22.5", "@babel/types@^7.23.0", "@babel/types@^7.4.4": - version "7.23.0" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.23.0.tgz#8c1f020c9df0e737e4e247c0619f58c68458aaeb" - integrity sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg== +"@babel/types@^7.12.7", "@babel/types@^7.20.0", "@babel/types@^7.22.15", "@babel/types@^7.22.19", "@babel/types@^7.22.5", "@babel/types@^7.23.0", "@babel/types@^7.23.6", "@babel/types@^7.23.9", "@babel/types@^7.4.4": + version "7.23.9" + resolved "https://registry.npmjs.org/@babel/types/-/types-7.23.9.tgz" + integrity sha512-dQjSq/7HaSjRM43FFGnv5keM2HsxpmyV1PfaSVm0nzzjwwTmjOe6J4bC8e3+pTEIgHaHj+1ZlLThRJ2auc/w1Q== dependencies: - "@babel/helper-string-parser" "^7.22.5" + "@babel/helper-string-parser" "^7.23.4" "@babel/helper-validator-identifier" "^7.22.20" to-fast-properties "^2.0.0" @@ -1230,9 +1230,16 @@ resolved "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz" integrity sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ== +"@cspotcode/source-map-support@^0.8.0": + version "0.8.1" + resolved "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz" + integrity sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw== + dependencies: + "@jridgewell/trace-mapping" "0.3.9" + "@discoveryjs/json-ext@0.5.7": version "0.5.7" - resolved "https://registry.yarnpkg.com/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz#1d572bfbbe14b7704e0ba0f39b74815b84870d70" + resolved "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz" integrity sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw== "@docsearch/css@3.5.2": @@ -1250,7 +1257,7 @@ "@docsearch/css" "3.5.2" algoliasearch "^4.19.1" -"@docusaurus/core@2.4.3", "@docusaurus/core@^2.0.0-beta.5", "@docusaurus/core@^2.4.3": +"@docusaurus/core@^2.0.0-beta.5", "@docusaurus/core@^2.4.3", "@docusaurus/core@2.4.3": version "2.4.3" resolved "https://registry.npmjs.org/@docusaurus/core/-/core-2.4.3.tgz" integrity sha512-dWH5P7cgeNSIg9ufReX6gaCl/TmrGKD38Orbwuz05WPhAQtFXHd5B8Qym1TiXfvUNvwoYKkAJOJuGe8ou0Z7PA== @@ -1368,7 +1375,7 @@ url-loader "^4.1.1" webpack "^5.73.0" -"@docusaurus/module-type-aliases@2.4.3", "@docusaurus/module-type-aliases@^2.4.3": +"@docusaurus/module-type-aliases@^2.4.3", "@docusaurus/module-type-aliases@2.4.3": version "2.4.3" resolved "https://registry.npmjs.org/@docusaurus/module-type-aliases/-/module-type-aliases-2.4.3.tgz" integrity sha512-cwkBkt1UCiduuvEAo7XZY01dJfRn7UR/75mBgOdb1hKknhrabJZ8YH+7savd/y9kLExPyrhe0QwdS9GuzsRRIA== @@ -1477,7 +1484,7 @@ "@docusaurus/utils-validation" "2.4.3" tslib "^2.4.0" -"@docusaurus/plugin-google-gtag@2.4.3", "@docusaurus/plugin-google-gtag@^2.4.3": +"@docusaurus/plugin-google-gtag@^2.4.3", "@docusaurus/plugin-google-gtag@2.4.3": version "2.4.3" resolved "https://registry.npmjs.org/@docusaurus/plugin-google-gtag/-/plugin-google-gtag-2.4.3.tgz" integrity sha512-5FMg0rT7sDy4i9AGsvJC71MQrqQZwgLNdDetLEGDHLfSHLvJhQbTCUGbGXknUgWXQJckcV/AILYeJy+HhxeIFA== @@ -1531,7 +1538,7 @@ "@docusaurus/theme-search-algolia" "2.4.3" "@docusaurus/types" "2.4.3" -"@docusaurus/react-loadable@5.5.2", "react-loadable@npm:@docusaurus/react-loadable@5.5.2": +"@docusaurus/react-loadable@5.5.2": version "5.5.2" resolved "https://registry.npmjs.org/@docusaurus/react-loadable/-/react-loadable-5.5.2.tgz" integrity sha512-A3dYjdBGuy0IGT+wyLIGIKLRE+sAk1iNk0f1HjNDysO7u8lhL4N3VEm+FAubmJbAztn94F7MxBTPmnixbiyFdQ== @@ -1592,7 +1599,7 @@ use-sync-external-store "^1.2.0" utility-types "^3.10.0" -"@docusaurus/theme-search-algolia@2.4.3", "@docusaurus/theme-search-algolia@^2.4.3": +"@docusaurus/theme-search-algolia@^2.4.3", "@docusaurus/theme-search-algolia@2.4.3": version "2.4.3" resolved "https://registry.npmjs.org/@docusaurus/theme-search-algolia/-/theme-search-algolia-2.4.3.tgz" integrity sha512-jziq4f6YVUB5hZOB85ELATwnxBz/RmSLD3ksGQOLDPKVzat4pmI8tddNWtriPpxR04BNT+ZfpPUMFkNFetSW1Q== @@ -1622,7 +1629,7 @@ fs-extra "^10.1.0" tslib "^2.4.0" -"@docusaurus/types@2.4.3", "@docusaurus/types@^2.0.0-beta.5": +"@docusaurus/types@*", "@docusaurus/types@^2.0.0-beta.5", "@docusaurus/types@2.4.3": version "2.4.3" resolved "https://registry.npmjs.org/@docusaurus/types/-/types-2.4.3.tgz" integrity sha512-W6zNLGQqfrp/EoPD0bhb9n7OobP+RHpmvVzpA+Z/IuU3Q63njJM24hmT0GYboovWcDtFmnIJC9wcyx4RVPQscw== @@ -1654,7 +1661,7 @@ js-yaml "^4.1.0" tslib "^2.4.0" -"@docusaurus/utils@2.4.3", "@docusaurus/utils@^2.0.0-beta.5": +"@docusaurus/utils@^2.0.0-beta.5", "@docusaurus/utils@2.4.3": version "2.4.3" resolved "https://registry.npmjs.org/@docusaurus/utils/-/utils-2.4.3.tgz" integrity sha512-fKcXsjrD86Smxv8Pt0TBFqYieZZCPh4cbf9oszUq/AMhZn3ujwpKaVYZACPX8mmjtYx0JOgNx52CREBfiGQB4A== @@ -1676,6 +1683,45 @@ url-loader "^4.1.1" webpack "^5.73.0" +"@edge-runtime/cookies@3.4.1": + version "3.4.1" + resolved "https://registry.npmjs.org/@edge-runtime/cookies/-/cookies-3.4.1.tgz" + integrity sha512-z27BvgPxI73CgSlxU/NAUf1Q/shnqi6cobHEowf6VuLdSjGR3NjI2Y5dZUIBbK2zOJVZbXcHsVzJjz8LklteFQ== + +"@edge-runtime/format@2.2.0": + version "2.2.0" + resolved "https://registry.npmjs.org/@edge-runtime/format/-/format-2.2.0.tgz" + integrity sha512-gPrS6AVw/qJJL0vcxMXv4kFXCU3ZTCD1uuJpwX15YxHV8BgU9OG5v9LrkkXcr96PBT/9epypfNJMhlWADuEziw== + +"@edge-runtime/node-utils@2.2.1": + version "2.2.1" + resolved "https://registry.npmjs.org/@edge-runtime/node-utils/-/node-utils-2.2.1.tgz" + integrity sha512-RUl/439BHKshkhSGFRlZ1kzy68wL4mn8VNKDSZr3p0tciyZ33Mjfpl+vofqnHqXRmDI6nLnZpfJvhY3D88o0pA== + dependencies: + "@edge-runtime/cookies" "3.4.1" + +"@edge-runtime/ponyfill@2.4.1": + version "2.4.1" + resolved "https://registry.npmjs.org/@edge-runtime/ponyfill/-/ponyfill-2.4.1.tgz" + integrity sha512-ZbR/EViY3gg2rmEAQTKPa6mXl4aR1/+cFcQe4r1segCjEbTAxT6PWu40odbu/KlZKSysEb2O/BWIC2lJgSJOMQ== + +"@edge-runtime/primitives@4.0.5": + version "4.0.5" + resolved "https://registry.npmjs.org/@edge-runtime/primitives/-/primitives-4.0.5.tgz" + integrity sha512-t7QiN5d/KpXgCvIfSt6Nm9Hj3WVdNgc5CpOD73jasY+9EvTI7Ngdj5cXvjcHrPcmYWJZMySPgeEeoL/1N/Llag== + +"@edge-runtime/vm@3.1.7": + version "3.1.7" + resolved "https://registry.npmjs.org/@edge-runtime/vm/-/vm-3.1.7.tgz" + integrity sha512-hUMFbDQ/nZN+1TLMi6iMO1QFz9RSV8yGG8S42WFPFma1d7VSNE0eMdJUmwjmtav22/iQkzHMmu6oTSfAvRGS8g== + dependencies: + "@edge-runtime/primitives" "4.0.5" + +"@fastify/busboy@^2.0.0": + version "2.1.0" + resolved "https://registry.npmjs.org/@fastify/busboy/-/busboy-2.1.0.tgz" + integrity sha512-+KpH+QxZU7O4675t3mnkQKcZZg56u+K/Ct2K+N2AZYNVK8kyeo/bI18tI8aPm3tvNNRyTWfj6s5tnGNlcbQRsA== + "@hapi/hoek@^9.0.0": version "9.3.0" resolved "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.3.0.tgz" @@ -1690,14 +1736,14 @@ "@jest/schemas@^29.6.3": version "29.6.3" - resolved "https://registry.yarnpkg.com/@jest/schemas/-/schemas-29.6.3.tgz#430b5ce8a4e0044a7e3819663305a7b3091c8e03" + resolved "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz" integrity sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA== dependencies: "@sinclair/typebox" "^0.27.8" "@jest/types@^29.6.3": version "29.6.3" - resolved "https://registry.yarnpkg.com/@jest/types/-/types-29.6.3.tgz#1131f8cf634e7e84c5e77bab12f052af585fba59" + resolved "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz" integrity sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw== dependencies: "@jest/schemas" "^29.6.3" @@ -1709,16 +1755,16 @@ "@jridgewell/gen-mapping@^0.3.0", "@jridgewell/gen-mapping@^0.3.2": version "0.3.3" - resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz#7e02e6eb5df901aaedb08514203b096614024098" + resolved "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz" integrity sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ== dependencies: "@jridgewell/set-array" "^1.0.1" "@jridgewell/sourcemap-codec" "^1.4.10" "@jridgewell/trace-mapping" "^0.3.9" -"@jridgewell/resolve-uri@^3.1.0": +"@jridgewell/resolve-uri@^3.0.3", "@jridgewell/resolve-uri@^3.1.0": version "3.1.1" - resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz#c08679063f279615a3326583ba3a90d1d82cc721" + resolved "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz" integrity sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA== "@jridgewell/set-array@^1.0.1": @@ -1728,7 +1774,7 @@ "@jridgewell/source-map@^0.3.3": version "0.3.5" - resolved "https://registry.yarnpkg.com/@jridgewell/source-map/-/source-map-0.3.5.tgz#a3bb4d5c6825aab0d281268f47f6ad5853431e91" + resolved "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.5.tgz" integrity sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ== dependencies: "@jridgewell/gen-mapping" "^0.3.0" @@ -1736,22 +1782,45 @@ "@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.14": version "1.4.15" - resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz#d7c6e6755c78567a951e04ab52ef0fd26de59f32" + resolved "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz" integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== "@jridgewell/trace-mapping@^0.3.17", "@jridgewell/trace-mapping@^0.3.9": version "0.3.20" - resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.20.tgz#72e45707cf240fa6b081d0366f8265b0cd10197f" + resolved "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.20.tgz" integrity sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q== dependencies: "@jridgewell/resolve-uri" "^3.1.0" "@jridgewell/sourcemap-codec" "^1.4.14" +"@jridgewell/trace-mapping@0.3.9": + version "0.3.9" + resolved "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz" + integrity sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ== + dependencies: + "@jridgewell/resolve-uri" "^3.0.3" + "@jridgewell/sourcemap-codec" "^1.4.10" + "@leichtgewicht/ip-codec@^2.0.1": version "2.0.4" resolved "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.4.tgz" integrity sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A== +"@mapbox/node-pre-gyp@^1.0.5": + version "1.0.11" + resolved "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.11.tgz" + integrity sha512-Yhlar6v9WQgUp/He7BdgzOz8lqMQ8sU+jkCq7Wx8Myc5YFJLbEe7lgui/V7G1qB1DJykHSGwreceSaD60Y0PUQ== + dependencies: + detect-libc "^2.0.0" + https-proxy-agent "^5.0.0" + make-dir "^3.1.0" + node-fetch "^2.6.7" + nopt "^5.0.0" + npmlog "^5.0.1" + rimraf "^3.0.2" + semver "^7.3.5" + tar "^6.1.11" + "@mdx-js/mdx@^1.6.22": version "1.6.22" resolved "https://registry.npmjs.org/@mdx-js/mdx/-/mdx-1.6.22.tgz" @@ -1795,7 +1864,7 @@ "@nodelib/fs.stat" "2.0.5" run-parallel "^1.1.9" -"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": +"@nodelib/fs.stat@^2.0.2", "@nodelib/fs.stat@2.0.5": version "2.0.5" resolved "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz" integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== @@ -1813,6 +1882,14 @@ resolved "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.21.tgz" integrity sha512-a5Sab1C4/icpTZVzZc5Ghpz88yQtGOyNqYXcZgOssB2uuAr+wF/MvN6bgtW32q7HHrvBki+BsZ0OuNv6EV3K9g== +"@rollup/pluginutils@^4.0.0": + version "4.2.1" + resolved "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-4.2.1.tgz" + integrity sha512-iKnFXr7NkdZAIHiIWE+BX5ULi/ucVFYWD6TbAV+rZctiRTY2PL6tsIKhoIOaoskiWAkgu+VsbXgUVDNLHf+InQ== + dependencies: + estree-walker "^2.0.1" + picomatch "^2.2.2" + "@sideway/address@^4.1.3": version "4.1.4" resolved "https://registry.npmjs.org/@sideway/address/-/address-4.1.4.tgz" @@ -1822,7 +1899,7 @@ "@sideway/formula@^3.0.1": version "3.0.1" - resolved "https://registry.yarnpkg.com/@sideway/formula/-/formula-3.0.1.tgz#80fcbcbaf7ce031e0ef2dd29b1bfc7c3f583611f" + resolved "https://registry.npmjs.org/@sideway/formula/-/formula-3.0.1.tgz" integrity sha512-/poHZJJVjx3L+zVD6g9KgHfYnb443oi7wLu/XKojDviHy6HOEOA6z1Trk5aR1dGcmPenJEgb2sK2I80LeS3MIg== "@sideway/pinpoint@^2.0.0": @@ -1832,9 +1909,14 @@ "@sinclair/typebox@^0.27.8": version "0.27.8" - resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.27.8.tgz#6667fac16c436b5434a387a34dedb013198f6e6e" + resolved "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz" integrity sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA== +"@sinclair/typebox@0.25.24": + version "0.25.24" + resolved "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.25.24.tgz" + integrity sha512-XJfwUVUKDHF5ugKwIcxEgc9k8b7HbznCp6eUfWgu710hMPNIO4aw4/zB5RogDQz8nd6gyCDpU9O/m6qYEWY6yQ== + "@sindresorhus/is@^0.14.0": version "0.14.0" resolved "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz" @@ -1851,47 +1933,47 @@ "@svgr/babel-plugin-add-jsx-attribute@^6.5.1": version "6.5.1" - resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-6.5.1.tgz#74a5d648bd0347bda99d82409d87b8ca80b9a1ba" + resolved "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-6.5.1.tgz" integrity sha512-9PYGcXrAxitycIjRmZB+Q0JaN07GZIWaTBIGQzfaZv+qr1n8X1XUEJ5rZ/vx6OVD9RRYlrNnXWExQXcmZeD/BQ== "@svgr/babel-plugin-remove-jsx-attribute@*": version "8.0.0" - resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-8.0.0.tgz#69177f7937233caca3a1afb051906698f2f59186" + resolved "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-8.0.0.tgz" integrity sha512-BcCkm/STipKvbCl6b7QFrMh/vx00vIP63k2eM66MfHJzPr6O2U0jYEViXkHJWqXqQYjdeA9cuCl5KWmlwjDvbA== "@svgr/babel-plugin-remove-jsx-empty-expression@*": version "8.0.0" - resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-8.0.0.tgz#c2c48104cfd7dcd557f373b70a56e9e3bdae1d44" + resolved "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-8.0.0.tgz" integrity sha512-5BcGCBfBxB5+XSDSWnhTThfI9jcO5f0Ai2V24gZpG+wXF14BzwxxdDb4g6trdOux0rhibGs385BeFMSmxtS3uA== "@svgr/babel-plugin-replace-jsx-attribute-value@^6.5.1": version "6.5.1" - resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-6.5.1.tgz#fb9d22ea26d2bc5e0a44b763d4c46d5d3f596c60" + resolved "https://registry.npmjs.org/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-6.5.1.tgz" integrity sha512-8DPaVVE3fd5JKuIC29dqyMB54sA6mfgki2H2+swh+zNJoynC8pMPzOkidqHOSc6Wj032fhl8Z0TVn1GiPpAiJg== "@svgr/babel-plugin-svg-dynamic-title@^6.5.1": version "6.5.1" - resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-6.5.1.tgz#01b2024a2b53ffaa5efceaa0bf3e1d5a4c520ce4" + resolved "https://registry.npmjs.org/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-6.5.1.tgz" integrity sha512-FwOEi0Il72iAzlkaHrlemVurgSQRDFbk0OC8dSvD5fSBPHltNh7JtLsxmZUhjYBZo2PpcU/RJvvi6Q0l7O7ogw== "@svgr/babel-plugin-svg-em-dimensions@^6.5.1": version "6.5.1" - resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-6.5.1.tgz#dd3fa9f5b24eb4f93bcf121c3d40ff5facecb217" + resolved "https://registry.npmjs.org/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-6.5.1.tgz" integrity sha512-gWGsiwjb4tw+ITOJ86ndY/DZZ6cuXMNE/SjcDRg+HLuCmwpcjOktwRF9WgAiycTqJD/QXqL2f8IzE2Rzh7aVXA== "@svgr/babel-plugin-transform-react-native-svg@^6.5.1": version "6.5.1" - resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-6.5.1.tgz#1d8e945a03df65b601551097d8f5e34351d3d305" + resolved "https://registry.npmjs.org/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-6.5.1.tgz" integrity sha512-2jT3nTayyYP7kI6aGutkyfJ7UMGtuguD72OjeGLwVNyfPRBD8zQthlvL+fAbAKk5n9ZNcvFkp/b1lZ7VsYqVJg== "@svgr/babel-plugin-transform-svg-component@^6.5.1": version "6.5.1" - resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-6.5.1.tgz#48620b9e590e25ff95a80f811544218d27f8a250" + resolved "https://registry.npmjs.org/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-6.5.1.tgz" integrity sha512-a1p6LF5Jt33O3rZoVRBqdxL350oge54iZWHNI6LJB5tQ7EelvD/Mb1mfBiZNAan0dt4i3VArkFRjA4iObuNykQ== "@svgr/babel-preset@^6.5.1": version "6.5.1" - resolved "https://registry.yarnpkg.com/@svgr/babel-preset/-/babel-preset-6.5.1.tgz#b90de7979c8843c5c580c7e2ec71f024b49eb828" + resolved "https://registry.npmjs.org/@svgr/babel-preset/-/babel-preset-6.5.1.tgz" integrity sha512-6127fvO/FF2oi5EzSQOAjo1LE3OtNVh11R+/8FXa+mHx1ptAaS4cknIjnUA7e6j6fwGGJ17NzaTJFUwOV2zwCw== dependencies: "@svgr/babel-plugin-add-jsx-attribute" "^6.5.1" @@ -1903,9 +1985,9 @@ "@svgr/babel-plugin-transform-react-native-svg" "^6.5.1" "@svgr/babel-plugin-transform-svg-component" "^6.5.1" -"@svgr/core@^6.5.1": +"@svgr/core@*", "@svgr/core@^6.0.0", "@svgr/core@^6.5.1": version "6.5.1" - resolved "https://registry.yarnpkg.com/@svgr/core/-/core-6.5.1.tgz#d3e8aa9dbe3fbd747f9ee4282c1c77a27410488a" + resolved "https://registry.npmjs.org/@svgr/core/-/core-6.5.1.tgz" integrity sha512-/xdLSWxK5QkqG524ONSjvg3V/FkNyCv538OIBdQqPNaAta3AsXj/Bd2FbvR87yMbXO2hFSWiAe/Q6IkVPDw+mw== dependencies: "@babel/core" "^7.19.6" @@ -1916,7 +1998,7 @@ "@svgr/hast-util-to-babel-ast@^6.5.1": version "6.5.1" - resolved "https://registry.yarnpkg.com/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-6.5.1.tgz#81800bd09b5bcdb968bf6ee7c863d2288fdb80d2" + resolved "https://registry.npmjs.org/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-6.5.1.tgz" integrity sha512-1hnUxxjd83EAxbL4a0JDJoD3Dao3hmjvyvyEV8PzWmLK3B9m9NPlW7GKjFyoWE8nM7HnXzPcmmSyOW8yOddSXw== dependencies: "@babel/types" "^7.20.0" @@ -1924,7 +2006,7 @@ "@svgr/plugin-jsx@^6.5.1": version "6.5.1" - resolved "https://registry.yarnpkg.com/@svgr/plugin-jsx/-/plugin-jsx-6.5.1.tgz#0e30d1878e771ca753c94e69581c7971542a7072" + resolved "https://registry.npmjs.org/@svgr/plugin-jsx/-/plugin-jsx-6.5.1.tgz" integrity sha512-+UdQxI3jgtSjCykNSlEMuy1jSRQlGC7pqBCPvkG/2dATdWo082zHTTK3uhnAju2/6XpE6B5mZ3z4Z8Ns01S8Gw== dependencies: "@babel/core" "^7.19.6" @@ -1934,7 +2016,7 @@ "@svgr/plugin-svgo@^6.5.1": version "6.5.1" - resolved "https://registry.yarnpkg.com/@svgr/plugin-svgo/-/plugin-svgo-6.5.1.tgz#0f91910e988fc0b842f88e0960c2862e022abe84" + resolved "https://registry.npmjs.org/@svgr/plugin-svgo/-/plugin-svgo-6.5.1.tgz" integrity sha512-omvZKf8ixP9z6GWgwbtmP9qQMPX4ODXi+wzbVZgomNFsUIlHA1sf4fThdwTWSsZGgvGAG6yE+b/F5gWUkcZ/iQ== dependencies: cosmiconfig "^7.0.1" @@ -1943,7 +2025,7 @@ "@svgr/webpack@^6.2.1": version "6.5.1" - resolved "https://registry.yarnpkg.com/@svgr/webpack/-/webpack-6.5.1.tgz#ecf027814fc1cb2decc29dc92f39c3cf691e40e8" + resolved "https://registry.npmjs.org/@svgr/webpack/-/webpack-6.5.1.tgz" integrity sha512-cQ/AsnBkXPkEK8cLbv4Dm7JGXq2XrumKnL1dRpJD9rIO2fTIlJI9a1uCciYG1F2aUsox/hJQyNGbt3soDxSRkA== dependencies: "@babel/core" "^7.19.6" @@ -1962,16 +2044,51 @@ dependencies: defer-to-connect "^1.0.1" +"@tootallnate/once@2.0.0": + version "2.0.0" + resolved "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz" + integrity sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A== + "@trysound/sax@0.2.0": version "0.2.0" resolved "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz" integrity sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA== +"@ts-morph/common@~0.11.0": + version "0.11.1" + resolved "https://registry.npmjs.org/@ts-morph/common/-/common-0.11.1.tgz" + integrity sha512-7hWZS0NRpEsNV8vWJzg7FEz6V8MaLNeJOmwmghqUXTpzk16V1LLZhdo+4QvE/+zv4cVci0OviuJFnqhEfoV3+g== + dependencies: + fast-glob "^3.2.7" + minimatch "^3.0.4" + mkdirp "^1.0.4" + path-browserify "^1.0.1" + "@tsconfig/docusaurus@^1.0.5": version "1.0.7" - resolved "https://registry.yarnpkg.com/@tsconfig/docusaurus/-/docusaurus-1.0.7.tgz#a3ee3c8109b3fec091e3d61a61834e563aeee3c3" + resolved "https://registry.npmjs.org/@tsconfig/docusaurus/-/docusaurus-1.0.7.tgz" integrity sha512-ffTXxGIP/IRMCjuzHd6M4/HdIrw1bMfC7Bv8hMkTadnePkpe0lG0oDSdbRpSDZb2rQMAgpbWiR10BvxvNYwYrg== +"@tsconfig/node10@^1.0.7": + version "1.0.9" + resolved "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz" + integrity sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA== + +"@tsconfig/node12@^1.0.7": + version "1.0.11" + resolved "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz" + integrity sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag== + +"@tsconfig/node14@^1.0.0": + version "1.0.3" + resolved "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz" + integrity sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow== + +"@tsconfig/node16@^1.0.2": + version "1.0.4" + resolved "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz" + integrity sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA== + "@types/body-parser@*": version "1.19.2" resolved "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz" @@ -1989,7 +2106,7 @@ "@types/connect-history-api-fallback@^1.3.5": version "1.5.3" - resolved "https://registry.yarnpkg.com/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.5.3.tgz#7793aa2160cef7db0ce5fe2b8aab621200f1a470" + resolved "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.5.3.tgz" integrity sha512-6mfQ6iNvhSKCZJoY6sIG3m0pKkdUcweVNOLuBBKvoWGzl2yRxOJcYOTRyLKt3nxXvBLJWa6QkW//tgbIwJehmA== dependencies: "@types/express-serve-static-core" "*" @@ -2012,7 +2129,7 @@ "@types/eslint@*": version "8.44.7" - resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-8.44.7.tgz#430b3cc96db70c81f405e6a08aebdb13869198f5" + resolved "https://registry.npmjs.org/@types/eslint/-/eslint-8.44.7.tgz" integrity sha512-f5ORu2hcBbKei97U73mf+l9t4zTGl74IqZ0GQk4oVea/VS8tQZYkUveSYojk+frraAVYId0V2WC9O4PTNru2FQ== dependencies: "@types/estree" "*" @@ -2020,12 +2137,12 @@ "@types/estree@*", "@types/estree@^1.0.0": version "1.0.5" - resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.5.tgz#a6ce3e556e00fd9895dd872dd172ad0d4bd687f4" + resolved "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz" integrity sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw== "@types/express-serve-static-core@*", "@types/express-serve-static-core@^4.17.33": version "4.17.41" - resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.17.41.tgz#5077defa630c2e8d28aa9ffc2c01c157c305bef6" + resolved "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.41.tgz" integrity sha512-OaJ7XLaelTgrvlZD8/aa0vvvxZdUmlCn6MtWeB7TkiKW70BQLc9XEPpDLPdbo52ZhXUCrznlWdCHWxJWtdyajA== dependencies: "@types/node" "*" @@ -2035,7 +2152,7 @@ "@types/express@*", "@types/express@^4.17.13": version "4.17.21" - resolved "https://registry.yarnpkg.com/@types/express/-/express-4.17.21.tgz#c26d4a151e60efe0084b23dc3369ebc631ed192d" + resolved "https://registry.npmjs.org/@types/express/-/express-4.17.21.tgz" integrity sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ== dependencies: "@types/body-parser" "*" @@ -2062,38 +2179,38 @@ "@types/http-errors@*": version "2.0.4" - resolved "https://registry.yarnpkg.com/@types/http-errors/-/http-errors-2.0.4.tgz#7eb47726c391b7345a6ec35ad7f4de469cf5ba4f" + resolved "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.4.tgz" integrity sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA== "@types/http-proxy@^1.17.8": version "1.17.14" - resolved "https://registry.yarnpkg.com/@types/http-proxy/-/http-proxy-1.17.14.tgz#57f8ccaa1c1c3780644f8a94f9c6b5000b5e2eec" + resolved "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.14.tgz" integrity sha512-SSrD0c1OQzlFX7pGu1eXxSEjemej64aaNPRhhVYUGqXh0BtldAAx37MG8btcumvpgKyZp1F5Gn3JkktdxiFv6w== dependencies: "@types/node" "*" "@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0": version "2.0.6" - resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz#7739c232a1fee9b4d3ce8985f314c0c6d33549d7" + resolved "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz" integrity sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w== "@types/istanbul-lib-report@*": version "3.0.3" - resolved "https://registry.yarnpkg.com/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz#53047614ae72e19fc0401d872de3ae2b4ce350bf" + resolved "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz" integrity sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA== dependencies: "@types/istanbul-lib-coverage" "*" "@types/istanbul-reports@^3.0.0": version "3.0.4" - resolved "https://registry.yarnpkg.com/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz#0f03e3d2f670fbdac586e34b433783070cc16f54" + resolved "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz" integrity sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ== dependencies: "@types/istanbul-lib-report" "*" -"@types/json-schema@*", "@types/json-schema@^7.0.4", "@types/json-schema@^7.0.5", "@types/json-schema@^7.0.8", "@types/json-schema@^7.0.9": +"@types/json-schema@*", "@types/json-schema@^7.0.4", "@types/json-schema@^7.0.5", "@types/json-schema@^7.0.6", "@types/json-schema@^7.0.8", "@types/json-schema@^7.0.9": version "7.0.15" - resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.15.tgz#596a1747233694d50f6ad8a7869fcb6f56cf5841" + resolved "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz" integrity sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA== "@types/mdast@^3.0.0": @@ -2110,19 +2227,19 @@ "@types/mime@^1": version "1.3.5" - resolved "https://registry.yarnpkg.com/@types/mime/-/mime-1.3.5.tgz#1ef302e01cf7d2b5a0fa526790c9123bf1d06690" + resolved "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz" integrity sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w== "@types/node-forge@^1.3.0": version "1.3.9" - resolved "https://registry.yarnpkg.com/@types/node-forge/-/node-forge-1.3.9.tgz#0fe4a7ba69c0b173f56e6de65d0eae2c1dd4bbfe" + resolved "https://registry.npmjs.org/@types/node-forge/-/node-forge-1.3.9.tgz" integrity sha512-meK88cx/sTalPSLSoCzkiUB4VPIFHmxtXm5FaaqRDqBX2i/Sy8bJ4odsan0b20RBjPh06dAQ+OTTdnyQyhJZyQ== dependencies: "@types/node" "*" "@types/node@*": version "20.9.0" - resolved "https://registry.yarnpkg.com/@types/node/-/node-20.9.0.tgz#bfcdc230583aeb891cf51e73cfdaacdd8deae298" + resolved "https://registry.npmjs.org/@types/node/-/node-20.9.0.tgz" integrity sha512-nekiGu2NDb1BcVofVcEKMIwzlx4NjHlcjhoxxKBNLtz15Y1z7MYf549DFvkHSId02Ax6kGwWntIBPC3l/JZcmw== dependencies: undici-types "~5.26.4" @@ -2132,6 +2249,11 @@ resolved "https://registry.npmjs.org/@types/node/-/node-17.0.45.tgz" integrity sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw== +"@types/node@14.18.33": + version "14.18.33" + resolved "https://registry.npmjs.org/@types/node/-/node-14.18.33.tgz" + integrity sha512-qelS/Ra6sacc4loe/3MSjXNL1dNQ/GjxNHVzuChwMfmk7HuycRLVQN2qNY3XahK+fZc5E2szqQSKUyAF0E+2bg== + "@types/parse-json@^4.0.0": version "4.0.0" resolved "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz" @@ -2159,7 +2281,7 @@ "@types/react-router-config@*", "@types/react-router-config@^5.0.6": version "5.0.10" - resolved "https://registry.yarnpkg.com/@types/react-router-config/-/react-router-config-5.0.10.tgz#1f7537b8d23ad6bb8e7609268fdd89b8b2de1eaf" + resolved "https://registry.npmjs.org/@types/react-router-config/-/react-router-config-5.0.10.tgz" integrity sha512-Wn6c/tXdEgi9adCMtDwx8Q2vGty6TsPTc/wCQQ9kAlye8UqFxj0vGFWWuhywNfkwqth+SOgJxQTLTZukrqDQmQ== dependencies: "@types/history" "^4.7.11" @@ -2177,15 +2299,15 @@ "@types/react-router@*", "@types/react-router@^5.1.0": version "5.1.20" - resolved "https://registry.yarnpkg.com/@types/react-router/-/react-router-5.1.20.tgz#88eccaa122a82405ef3efbcaaa5dcdd9f021387c" + resolved "https://registry.npmjs.org/@types/react-router/-/react-router-5.1.20.tgz" integrity sha512-jGjmu/ZqS7FjSH6owMcD5qpq19+1RS9DeVRqfl1FeBMxTDQAGwlMWOcs52NDoXaNKyG3d1cYQFMs9rCrb88o9Q== dependencies: "@types/history" "^4.7.11" "@types/react" "*" -"@types/react@*": +"@types/react@*", "@types/react@>= 16.8.0 < 19.0.0": version "18.2.37" - resolved "https://registry.yarnpkg.com/@types/react/-/react-18.2.37.tgz#0f03af69e463c0f19a356c2660dbca5d19c44cae" + resolved "https://registry.npmjs.org/@types/react/-/react-18.2.37.tgz" integrity sha512-RGAYMi2bhRgEXT3f4B92WTohopH6bIXw05FuGlmJEnv/omEn190+QYEIYxIAuIBdKgboYYdVved2p1AxZVQnaw== dependencies: "@types/prop-types" "*" @@ -2206,12 +2328,12 @@ "@types/scheduler@*": version "0.16.6" - resolved "https://registry.yarnpkg.com/@types/scheduler/-/scheduler-0.16.6.tgz#eb26db6780c513de59bee0b869ef289ad3068711" + resolved "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.6.tgz" integrity sha512-Vlktnchmkylvc9SnwwwozTv04L/e1NykF5vgoQ0XTmI8DD+wxfjQuHuvHS3p0r2jz2x2ghPs2h1FVeDirIteWA== "@types/send@*": version "0.17.4" - resolved "https://registry.yarnpkg.com/@types/send/-/send-0.17.4.tgz#6619cd24e7270793702e4e6a4b958a9010cfc57a" + resolved "https://registry.npmjs.org/@types/send/-/send-0.17.4.tgz" integrity sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA== dependencies: "@types/mime" "^1" @@ -2226,7 +2348,7 @@ "@types/serve-static@*", "@types/serve-static@^1.13.10": version "1.15.5" - resolved "https://registry.yarnpkg.com/@types/serve-static/-/serve-static-1.15.5.tgz#15e67500ec40789a1e8c9defc2d32a896f05b033" + resolved "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.5.tgz" integrity sha512-PDRk21MnK70hja/YF8AHfC7yIsiQHn1rcXx7ijCFBX/k+XQJhQT/gw3xekXKJvx+5SXaMMS8oqQy09Mzvz2TuQ== dependencies: "@types/http-errors" "*" @@ -2247,26 +2369,199 @@ "@types/ws@^8.5.5": version "8.5.9" - resolved "https://registry.yarnpkg.com/@types/ws/-/ws-8.5.9.tgz#384c489f99c83225a53f01ebc3eddf3b8e202a8c" + resolved "https://registry.npmjs.org/@types/ws/-/ws-8.5.9.tgz" integrity sha512-jbdrY0a8lxfdTp/+r7Z4CkycbOFN8WX+IOchLJr3juT/xzbJ8URyTVSJ/hvNdadTgM1mnedb47n+Y31GsFnQlg== dependencies: "@types/node" "*" "@types/yargs-parser@*": version "21.0.3" - resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-21.0.3.tgz#815e30b786d2e8f0dcd85fd5bcf5e1a04d008f15" + resolved "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz" integrity sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ== "@types/yargs@^17.0.8": version "17.0.31" - resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-17.0.31.tgz#8fd0089803fd55d8a285895a18b88cb71a99683c" + resolved "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.31.tgz" integrity sha512-bocYSx4DI8TmdlvxqGpVNXOgCNR1Jj0gNPhhAY+iz1rgKDAaYrAYdFYnhDV1IFuiuVc9HkOwyDcFxaTElF3/wg== dependencies: "@types/yargs-parser" "*" -"@webassemblyjs/ast@1.11.6", "@webassemblyjs/ast@^1.11.5": +"@vercel/build-utils@7.5.1": + version "7.5.1" + resolved "https://registry.npmjs.org/@vercel/build-utils/-/build-utils-7.5.1.tgz" + integrity sha512-RyTG951QZQgYn0JL5OoObsCppxHSQApZAqn82GCpAyuQPW7clqcjq7aY7KLD7esHbs0zdzL0KeDEBkGBKaTcTg== + +"@vercel/error-utils@2.0.2": + version "2.0.2" + resolved "https://registry.npmjs.org/@vercel/error-utils/-/error-utils-2.0.2.tgz" + integrity sha512-Sj0LFafGpYr6pfCqrQ82X6ukRl5qpmVrHM/191kNYFqkkB9YkjlMAj6QcEsvCG259x4QZ7Tya++0AB85NDPbKQ== + +"@vercel/fun@1.1.0": + version "1.1.0" + resolved "https://registry.npmjs.org/@vercel/fun/-/fun-1.1.0.tgz" + integrity sha512-SpuPAo+MlAYMtcMcC0plx7Tv4Mp7SQhJJj1iIENlOnABL24kxHpL09XLQMGzZIzIW7upR8c3edwgfpRtp+dhVw== + dependencies: + "@tootallnate/once" "2.0.0" + async-listen "1.2.0" + debug "4.1.1" + execa "3.2.0" + fs-extra "8.1.0" + generic-pool "3.4.2" + micro "9.3.5-canary.3" + ms "2.1.1" + node-fetch "2.6.7" + path-match "1.2.4" + promisepipe "3.0.0" + semver "7.3.5" + stat-mode "0.3.0" + stream-to-promise "2.2.0" + tar "4.4.18" + tree-kill "1.2.2" + uid-promise "1.0.0" + uuid "3.3.2" + xdg-app-paths "5.1.0" + yauzl-promise "2.1.3" + +"@vercel/gatsby-plugin-vercel-analytics@1.0.11": + version "1.0.11" + resolved "https://registry.npmjs.org/@vercel/gatsby-plugin-vercel-analytics/-/gatsby-plugin-vercel-analytics-1.0.11.tgz" + integrity sha512-iTEA0vY6RBPuEzkwUTVzSHDATo1aF6bdLLspI68mQ/BTbi5UQEGjpjyzdKOVcSYApDtFU6M6vypZ1t4vIEnHvw== + dependencies: + web-vitals "0.2.4" + +"@vercel/gatsby-plugin-vercel-builder@2.0.16": + version "2.0.16" + resolved "https://registry.npmjs.org/@vercel/gatsby-plugin-vercel-builder/-/gatsby-plugin-vercel-builder-2.0.16.tgz" + integrity sha512-szRvR8UiCyH8J4xqz3hwDa0XOE4fTxoPawYDBMNHrx91QFEHAtUBC3KcGhApGmVd7ik0WYP7lqokmv9ngygBlA== + dependencies: + "@sinclair/typebox" "0.25.24" + "@vercel/build-utils" "7.5.1" + "@vercel/routing-utils" "3.1.0" + esbuild "0.14.47" + etag "1.8.1" + fs-extra "11.1.0" + +"@vercel/go@3.0.5": + version "3.0.5" + resolved "https://registry.npmjs.org/@vercel/go/-/go-3.0.5.tgz" + integrity sha512-+kEDI+hop3e8BuKisaEozxfzT6GBbp0OMBcgi0tlD5ZTmhGmpwi3vgK5mBQlB+RBXj7qlqDLW/uV2F1Y03FLcQ== + +"@vercel/hydrogen@1.0.2": + version "1.0.2" + resolved "https://registry.npmjs.org/@vercel/hydrogen/-/hydrogen-1.0.2.tgz" + integrity sha512-/Q2MKk1GfOuZAnkE9jQexjtUQqanbY65R+xtJWd9yKIgwcfRI1hxiNH3uXyVM5AvLoY+fxxULkSuxDtUKpkJpQ== + dependencies: + "@vercel/static-config" "3.0.0" + ts-morph "12.0.0" + +"@vercel/next@4.1.0": + version "4.1.0" + resolved "https://registry.npmjs.org/@vercel/next/-/next-4.1.0.tgz" + integrity sha512-5RsyprRts6POFor2JWNNA8kYQ9R0A5a27VaBESFsPi9YIhytsx6cOdrxWusIF6SM+y+kLA0gvi1yA6uixaP8Cg== + dependencies: + "@vercel/nft" "0.26.2" + +"@vercel/nft@0.26.2": + version "0.26.2" + resolved "https://registry.npmjs.org/@vercel/nft/-/nft-0.26.2.tgz" + integrity sha512-bxe2iShmKZi7476xYamyKvhhKwQ6JPEtQ2FSq1AjMUH2buMd8LQMkdoHinTqZYc+1sMTh3G0ARdjzNvV1FEisA== + dependencies: + "@mapbox/node-pre-gyp" "^1.0.5" + "@rollup/pluginutils" "^4.0.0" + acorn "^8.6.0" + acorn-import-attributes "^1.9.2" + async-sema "^3.1.1" + bindings "^1.4.0" + estree-walker "2.0.2" + glob "^7.1.3" + graceful-fs "^4.2.9" + micromatch "^4.0.2" + node-gyp-build "^4.2.2" + resolve-from "^5.0.0" + +"@vercel/node@3.0.17": + version "3.0.17" + resolved "https://registry.npmjs.org/@vercel/node/-/node-3.0.17.tgz" + integrity sha512-HgIDxVAG/cEGLcSYdatGwk/zraN2aDP3ZQxy0I9eFsG8+rgC5eh3mFpNYEcBDkikpMr1jW/zpesf43s/A77/GQ== + dependencies: + "@edge-runtime/node-utils" "2.2.1" + "@edge-runtime/primitives" "4.0.5" + "@edge-runtime/vm" "3.1.7" + "@types/node" "14.18.33" + "@vercel/build-utils" "7.5.1" + "@vercel/error-utils" "2.0.2" + "@vercel/nft" "0.26.2" + "@vercel/static-config" "3.0.0" + async-listen "3.0.0" + edge-runtime "2.5.7" + esbuild "0.14.47" + etag "1.8.1" + node-fetch "2.6.9" + path-to-regexp "6.2.1" + ts-morph "12.0.0" + ts-node "10.9.1" + typescript "4.9.5" + undici "5.26.5" + +"@vercel/python@4.1.1": + version "4.1.1" + resolved "https://registry.npmjs.org/@vercel/python/-/python-4.1.1.tgz" + integrity sha512-EbAdKOZ0hPd5b59tLt7R3RQK1azNvuZTrCFRAVHNjqcIHNCmrSvjag5zBGn7Memkk8qWb3+CgBw9K/3LJKei0w== + +"@vercel/redwood@2.0.6": + version "2.0.6" + resolved "https://registry.npmjs.org/@vercel/redwood/-/redwood-2.0.6.tgz" + integrity sha512-bH8z/0peYlEdFGxyPWwOScTV75eb47H8IK9u0EZ3LtC7hKwiqEkQIRg2CtyH5FmILlGN9nRxEB5XWsboigHByw== + dependencies: + "@vercel/nft" "0.26.2" + "@vercel/routing-utils" "3.1.0" + semver "6.3.1" + +"@vercel/remix-builder@2.0.18": + version "2.0.18" + resolved "https://registry.npmjs.org/@vercel/remix-builder/-/remix-builder-2.0.18.tgz" + integrity sha512-dSi/FQ3jjEl6q9Hpzwkiikq7CwO309TS1bkcuORbsd55HloDeirvQurxoGOqWN+4O6Acuy568YI33A7LAz9/lw== + dependencies: + "@vercel/nft" "0.26.2" + "@vercel/static-config" "3.0.0" + ts-morph "12.0.0" + +"@vercel/routing-utils@3.1.0": + version "3.1.0" + resolved "https://registry.npmjs.org/@vercel/routing-utils/-/routing-utils-3.1.0.tgz" + integrity sha512-Ci5xTjVTJY/JLZXpCXpLehMft97i9fH34nu9PGav6DtwkVUF6TOPX86U0W0niQjMZ5n6/ZP0BwcJK2LOozKaGw== + dependencies: + path-to-regexp "6.1.0" + optionalDependencies: + ajv "^6.0.0" + +"@vercel/ruby@2.0.5": + version "2.0.5" + resolved "https://registry.npmjs.org/@vercel/ruby/-/ruby-2.0.5.tgz" + integrity sha512-Gfm8HDech41vf+EPleRzgoJUnDTJerKgckMm4KX0JT860gV9XBMSOWYH7eMWHmMza104+HRCWL7wT6OlpftF2Q== + +"@vercel/static-build@2.1.0": + version "2.1.0" + resolved "https://registry.npmjs.org/@vercel/static-build/-/static-build-2.1.0.tgz" + integrity sha512-mSP3UNckqr3aqTx8fAbUiM/5E4llgJeUWFf1/RgUUqt5T5QnxZ2n10HagHSZ/fHCx1bT+J8jdty8Aq7v+vJt2Q== + dependencies: + "@vercel/gatsby-plugin-vercel-analytics" "1.0.11" + "@vercel/gatsby-plugin-vercel-builder" "2.0.16" + "@vercel/static-config" "3.0.0" + ts-morph "12.0.0" + +"@vercel/static-config@3.0.0": + version "3.0.0" + resolved "https://registry.npmjs.org/@vercel/static-config/-/static-config-3.0.0.tgz" + integrity sha512-2qtvcBJ1bGY0dYGYh3iM7yGKkk971FujLEDXzuW5wcZsPr1GSEjO/w2iSr3qve6nDDtBImsGoDEnus5FI4+fIw== + dependencies: + ajv "8.6.3" + json-schema-to-ts "1.6.4" + ts-morph "12.0.0" + +"@webassemblyjs/ast@^1.11.5", "@webassemblyjs/ast@1.11.6": version "1.11.6" - resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.11.6.tgz#db046555d3c413f8966ca50a95176a0e2c642e24" + resolved "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.6.tgz" integrity sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q== dependencies: "@webassemblyjs/helper-numbers" "1.11.6" @@ -2274,22 +2569,22 @@ "@webassemblyjs/floating-point-hex-parser@1.11.6": version "1.11.6" - resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz#dacbcb95aff135c8260f77fa3b4c5fea600a6431" + resolved "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz" integrity sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw== "@webassemblyjs/helper-api-error@1.11.6": version "1.11.6" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz#6132f68c4acd59dcd141c44b18cbebbd9f2fa768" + resolved "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz" integrity sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q== "@webassemblyjs/helper-buffer@1.11.6": version "1.11.6" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.6.tgz#b66d73c43e296fd5e88006f18524feb0f2c7c093" + resolved "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.6.tgz" integrity sha512-z3nFzdcp1mb8nEOFFk8DrYLpHvhKC3grJD2ardfKOzmbmJvEf/tPIqCY+sNcwZIY8ZD7IkB2l7/pqhUhqm7hLA== "@webassemblyjs/helper-numbers@1.11.6": version "1.11.6" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz#cbce5e7e0c1bd32cf4905ae444ef64cea919f1b5" + resolved "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz" integrity sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g== dependencies: "@webassemblyjs/floating-point-hex-parser" "1.11.6" @@ -2298,12 +2593,12 @@ "@webassemblyjs/helper-wasm-bytecode@1.11.6": version "1.11.6" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz#bb2ebdb3b83aa26d9baad4c46d4315283acd51e9" + resolved "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz" integrity sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA== "@webassemblyjs/helper-wasm-section@1.11.6": version "1.11.6" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.6.tgz#ff97f3863c55ee7f580fd5c41a381e9def4aa577" + resolved "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.6.tgz" integrity sha512-LPpZbSOwTpEC2cgn4hTydySy1Ke+XEu+ETXuoyvuyezHO3Kjdu90KK95Sh9xTbmjrCsUwvWwCOQQNta37VrS9g== dependencies: "@webassemblyjs/ast" "1.11.6" @@ -2313,26 +2608,26 @@ "@webassemblyjs/ieee754@1.11.6": version "1.11.6" - resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz#bb665c91d0b14fffceb0e38298c329af043c6e3a" + resolved "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz" integrity sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg== dependencies: "@xtuc/ieee754" "^1.2.0" "@webassemblyjs/leb128@1.11.6": version "1.11.6" - resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.11.6.tgz#70e60e5e82f9ac81118bc25381a0b283893240d7" + resolved "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.6.tgz" integrity sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ== dependencies: "@xtuc/long" "4.2.2" "@webassemblyjs/utf8@1.11.6": version "1.11.6" - resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.11.6.tgz#90f8bc34c561595fe156603be7253cdbcd0fab5a" + resolved "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.6.tgz" integrity sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA== "@webassemblyjs/wasm-edit@^1.11.5": version "1.11.6" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.6.tgz#c72fa8220524c9b416249f3d94c2958dfe70ceab" + resolved "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.6.tgz" integrity sha512-Ybn2I6fnfIGuCR+Faaz7YcvtBKxvoLV3Lebn1tM4o/IAJzmi9AWYIPWpyBfU8cC+JxAO57bk4+zdsTjJR+VTOw== dependencies: "@webassemblyjs/ast" "1.11.6" @@ -2346,7 +2641,7 @@ "@webassemblyjs/wasm-gen@1.11.6": version "1.11.6" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.6.tgz#fb5283e0e8b4551cc4e9c3c0d7184a65faf7c268" + resolved "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.6.tgz" integrity sha512-3XOqkZP/y6B4F0PBAXvI1/bky7GryoogUtfwExeP/v7Nzwo1QLcq5oQmpKlftZLbT+ERUOAZVQjuNVak6UXjPA== dependencies: "@webassemblyjs/ast" "1.11.6" @@ -2357,7 +2652,7 @@ "@webassemblyjs/wasm-opt@1.11.6": version "1.11.6" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.6.tgz#d9a22d651248422ca498b09aa3232a81041487c2" + resolved "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.6.tgz" integrity sha512-cOrKuLRE7PCe6AsOVl7WasYf3wbSo4CeOk6PkrjS7g57MFfVUF9u6ysQBBODX0LdgSvQqRiGz3CXvIDKcPNy4g== dependencies: "@webassemblyjs/ast" "1.11.6" @@ -2365,9 +2660,9 @@ "@webassemblyjs/wasm-gen" "1.11.6" "@webassemblyjs/wasm-parser" "1.11.6" -"@webassemblyjs/wasm-parser@1.11.6", "@webassemblyjs/wasm-parser@^1.11.5": +"@webassemblyjs/wasm-parser@^1.11.5", "@webassemblyjs/wasm-parser@1.11.6": version "1.11.6" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.6.tgz#bb85378c527df824004812bbdb784eea539174a1" + resolved "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.6.tgz" integrity sha512-6ZwPeGzMJM3Dqp3hCsLgESxBGtT/OeCvCZ4TA1JUPYgmhAx38tTPR9JaKy0S5H3evQpO/h2uWs2j6Yc/fjkpTQ== dependencies: "@webassemblyjs/ast" "1.11.6" @@ -2379,7 +2674,7 @@ "@webassemblyjs/wast-printer@1.11.6": version "1.11.6" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.11.6.tgz#a7bf8dd7e362aeb1668ff43f35cb849f188eff20" + resolved "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.6.tgz" integrity sha512-JM7AhRcE+yW2GWYaKeHL5vt4xqee5N2WcezptmgyhNS+ScggqcT1OtXykhAb13Sn5Yas0j2uv9tHgrjwvzAP4A== dependencies: "@webassemblyjs/ast" "1.11.6" @@ -2395,6 +2690,11 @@ resolved "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz" integrity sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ== +abbrev@1: + version "1.1.1" + resolved "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz" + integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== + accepts@~1.3.4, accepts@~1.3.5, accepts@~1.3.8: version "1.3.8" resolved "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz" @@ -2405,24 +2705,36 @@ accepts@~1.3.4, accepts@~1.3.5, accepts@~1.3.8: acorn-import-assertions@^1.9.0: version "1.9.0" - resolved "https://registry.yarnpkg.com/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz#507276249d684797c84e0734ef84860334cfb1ac" + resolved "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz" integrity sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA== -acorn-walk@^8.0.0: +acorn-import-attributes@^1.9.2: + version "1.9.2" + resolved "https://registry.npmjs.org/acorn-import-attributes/-/acorn-import-attributes-1.9.2.tgz" + integrity sha512-O+nfJwNolEA771IYJaiLWK1UAwjNsQmZbTRqqwBYxCgVQTmpFEMvBw6LOIQV0Me339L5UMVYFyRohGnGlQDdIQ== + +acorn-walk@^8.0.0, acorn-walk@^8.1.1: version "8.2.0" resolved "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz" integrity sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA== -acorn@^8.0.4, acorn@^8.7.1, acorn@^8.8.2: +acorn@^8, acorn@^8.0.4, acorn@^8.4.1, acorn@^8.6.0, acorn@^8.7.1, acorn@^8.8.2: version "8.11.2" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.11.2.tgz#ca0d78b51895be5390a5903c5b3bdcdaf78ae40b" + resolved "https://registry.npmjs.org/acorn/-/acorn-8.11.2.tgz" integrity sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w== address@^1.0.1, address@^1.1.2: version "1.2.2" - resolved "https://registry.yarnpkg.com/address/-/address-1.2.2.tgz#2b5248dac5485a6390532c6a517fda2e3faac89e" + resolved "https://registry.npmjs.org/address/-/address-1.2.2.tgz" integrity sha512-4B/qKCfeE/ODUaAUpSwfzazo5x29WD4r3vXiWsB7I2mSDAihwEqKO+g8GELZUQSSAo5e1XTYh3ZVfLyxBc12nA== +agent-base@6: + version "6.0.2" + resolved "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz" + integrity sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ== + dependencies: + debug "4" + aggregate-error@^3.0.0: version "3.1.0" resolved "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz" @@ -2445,12 +2757,12 @@ ajv-keywords@^3.4.1, ajv-keywords@^3.5.2: ajv-keywords@^5.1.0: version "5.1.0" - resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-5.1.0.tgz#69d4d385a4733cdbeab44964a1170a88f87f0e16" + resolved "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz" integrity sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw== dependencies: fast-deep-equal "^3.1.3" -ajv@^6.12.2, ajv@^6.12.4, ajv@^6.12.5: +ajv@^6.0.0, ajv@^6.12.2, ajv@^6.12.4, ajv@^6.12.5, ajv@^6.9.1: version "6.12.6" resolved "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz" integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== @@ -2460,9 +2772,9 @@ ajv@^6.12.2, ajv@^6.12.4, ajv@^6.12.5: json-schema-traverse "^0.4.1" uri-js "^4.2.2" -ajv@^8.0.0, ajv@^8.9.0: +ajv@^8.0.0, ajv@^8.8.2, ajv@^8.9.0: version "8.12.0" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.12.0.tgz#d1a0527323e22f53562c567c00991577dfbe19d1" + resolved "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz" integrity sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA== dependencies: fast-deep-equal "^3.1.1" @@ -2470,6 +2782,16 @@ ajv@^8.0.0, ajv@^8.9.0: require-from-string "^2.0.2" uri-js "^4.2.2" +ajv@8.6.3: + version "8.6.3" + resolved "https://registry.npmjs.org/ajv/-/ajv-8.6.3.tgz" + integrity sha512-SMJOdDP6LqTkD0Uq8qLi+gMwSt0imXLSV080qFVwJCpH9U6Mb+SUGHAXM0KNbcBPguytWyvFxcHgMLe2D2XSpw== + dependencies: + fast-deep-equal "^3.1.1" + json-schema-traverse "^1.0.0" + require-from-string "^2.0.2" + uri-js "^4.2.2" + algoliasearch-helper@^3.10.0: version "3.15.0" resolved "https://registry.npmjs.org/algoliasearch-helper/-/algoliasearch-helper-3.15.0.tgz" @@ -2477,7 +2799,7 @@ algoliasearch-helper@^3.10.0: dependencies: "@algolia/events" "^4.0.1" -algoliasearch@^4.13.1, algoliasearch@^4.19.1: +algoliasearch@^4.13.1, algoliasearch@^4.19.1, "algoliasearch@>= 3.1 < 6", "algoliasearch@>= 4.9.1 < 6": version "4.20.0" resolved "https://registry.npmjs.org/algoliasearch/-/algoliasearch-4.20.0.tgz" integrity sha512-y+UHEjnOItoNy0bYO+WWmLWBlPwDjKHW6mNHrPi0NkuhpQOOEbrkwQH/wgKFDLh7qlKjzoKeiRtlpewDPDG23g== @@ -2535,27 +2857,50 @@ ansi-styles@^4.0.0, ansi-styles@^4.1.0: ansi-styles@^6.1.0: version "6.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-6.2.1.tgz#0e62320cf99c21afff3b3012192546aacbfb05c5" + resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz" integrity sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug== -any-promise@^1.0.0: +any-promise@^1.0.0, any-promise@^1.1.0, any-promise@~1.3.0: version "1.3.0" resolved "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz" integrity sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A== -anymatch@~3.1.2: +anymatch@~3.1.1, anymatch@~3.1.2: version "3.1.3" - resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" + resolved "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz" integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== dependencies: normalize-path "^3.0.0" picomatch "^2.0.4" +"aproba@^1.0.3 || ^2.0.0": + version "2.0.0" + resolved "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz" + integrity sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ== + +are-we-there-yet@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz" + integrity sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw== + dependencies: + delegates "^1.0.0" + readable-stream "^3.6.0" + +arg@^4.1.0: + version "4.1.3" + resolved "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz" + integrity sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA== + arg@^5.0.0, arg@^5.0.2: version "5.0.2" resolved "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz" integrity sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg== +arg@4.1.0: + version "4.1.0" + resolved "https://registry.npmjs.org/arg/-/arg-4.1.0.tgz" + integrity sha512-ZWc51jO3qegGkVh8Hwpv636EkbesNV5ZNQPCtRa+0qytRYPEs9IYT9qITY9buezqUH5uqyzlWLcufrzU2rffdg== + argparse@^1.0.7: version "1.0.10" resolved "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz" @@ -2568,16 +2913,16 @@ argparse@^2.0.1: resolved "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz" integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== -array-flatten@1.1.1: - version "1.1.1" - resolved "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz" - integrity sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg== - array-flatten@^2.1.2: version "2.1.2" resolved "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz" integrity sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ== +array-flatten@1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz" + integrity sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg== + array-union@^2.1.0: version "2.1.0" resolved "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz" @@ -2588,6 +2933,26 @@ asap@~2.0.3: resolved "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz" integrity sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA== +async-listen@1.2.0: + version "1.2.0" + resolved "https://registry.npmjs.org/async-listen/-/async-listen-1.2.0.tgz" + integrity sha512-CcEtRh/oc9Jc4uWeUwdpG/+Mb2YUHKmdaTf0gUr7Wa+bfp4xx70HOb3RuSTJMvqKNB1TkdTfjLdrcz2X4rkkZA== + +async-listen@3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/async-listen/-/async-listen-3.0.0.tgz" + integrity sha512-V+SsTpDqkrWTimiotsyl33ePSjA5/KrithwupuvJ6ztsqPvGv6ge4OredFhPffVXiLN/QUWvE0XcqJaYgt6fOg== + +async-listen@3.0.1: + version "3.0.1" + resolved "https://registry.npmjs.org/async-listen/-/async-listen-3.0.1.tgz" + integrity sha512-cWMaNwUJnf37C/S5TfCkk/15MwbPRwVYALA2jtjkbHjCmAPiDXyNJy2q3p1KAZzDLHAWyarUWSujUoHR4pEgrA== + +async-sema@^3.1.1: + version "3.1.1" + resolved "https://registry.npmjs.org/async-sema/-/async-sema-3.1.1.tgz" + integrity sha512-tLRNUXati5MFePdAk8dw7Qt7DpxPB60ofAgn8WRhW6a2rcimZnYBP9oxHiv0OHy+Wz7kPMG+t4LGdt31+4EmGg== + at-least-node@^1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz" @@ -2614,7 +2979,7 @@ axios@^0.25.0: babel-loader@^8.2.5: version "8.3.0" - resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-8.3.0.tgz#124936e841ba4fe8176786d6ff28add1f134d6a8" + resolved "https://registry.npmjs.org/babel-loader/-/babel-loader-8.3.0.tgz" integrity sha512-H8SvsMF+m9t15HNLMipppzkC+Y2Yq+v3SonZyU70RBL/h1gxPkH08Ot8pEE9Z4Kd+czyWJClmFS8qzIP9OZ04Q== dependencies: find-cache-dir "^3.3.1" @@ -2646,7 +3011,7 @@ babel-plugin-extract-import-names@1.6.22: babel-plugin-polyfill-corejs2@^0.4.6: version "0.4.6" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.6.tgz#b2df0251d8e99f229a8e60fc4efa9a68b41c8313" + resolved "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.6.tgz" integrity sha512-jhHiWVZIlnPbEUKSSNb9YoWcQGdlTLq7z1GHL4AjFxaoOUMuuEVJ+Y4pAaQUGOGk93YsVCKPbqbfw3m0SM6H8Q== dependencies: "@babel/compat-data" "^7.22.6" @@ -2655,7 +3020,7 @@ babel-plugin-polyfill-corejs2@^0.4.6: babel-plugin-polyfill-corejs3@^0.8.5: version "0.8.6" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.8.6.tgz#25c2d20002da91fe328ff89095c85a391d6856cf" + resolved "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.8.6.tgz" integrity sha512-leDIc4l4tUgU7str5BWLS2h8q2N4Nf6lGZP6UrNDxdtfF2g69eJ5L0H7S8A5Ln/arfFAfHor5InAdZuIOwZdgQ== dependencies: "@babel/helper-define-polyfill-provider" "^0.4.3" @@ -2663,7 +3028,7 @@ babel-plugin-polyfill-corejs3@^0.8.5: babel-plugin-polyfill-regenerator@^0.5.3: version "0.5.3" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.5.3.tgz#d4c49e4b44614607c13fb769bcd85c72bb26a4a5" + resolved "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.5.3.tgz" integrity sha512-8sHeDOmXC8csczMrYEOf0UTNa4yE2SxV5JGeT/LP1n0OYVDUUFPxG9vdk2AlDlIit4t+Kf0xCtpgXPBwnn/9pw== dependencies: "@babel/helper-define-polyfill-provider" "^0.4.3" @@ -2698,9 +3063,16 @@ binary-extensions@^2.0.0: resolved "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz" integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== +bindings@^1.4.0: + version "1.5.0" + resolved "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz" + integrity sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ== + dependencies: + file-uri-to-path "1.0.0" + body-parser@1.20.1: version "1.20.1" - resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.20.1.tgz#b1812a8912c195cd371a3ee5e66faa2338a5c668" + resolved "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz" integrity sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw== dependencies: bytes "3.1.2" @@ -2718,7 +3090,7 @@ body-parser@1.20.1: bonjour-service@^1.0.11: version "1.1.1" - resolved "https://registry.yarnpkg.com/bonjour-service/-/bonjour-service-1.1.1.tgz#960948fa0e0153f5d26743ab15baf8e33752c135" + resolved "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.1.1.tgz" integrity sha512-Z/5lQRMOG9k7W+FkeGTNjh7htqn/2LMnfOvBZ8pynNZCM9MwkQkI3zeI4oz09uWdcgmgHugVvBqxGg4VQJ5PCg== dependencies: array-flatten "^2.1.2" @@ -2774,16 +3146,21 @@ braces@^3.0.2, braces@~3.0.2: dependencies: fill-range "^7.0.1" -browserslist@^4.0.0, browserslist@^4.14.5, browserslist@^4.18.1, browserslist@^4.21.10, browserslist@^4.21.4, browserslist@^4.21.9, browserslist@^4.22.1: - version "4.22.1" - resolved "https://registry.npmjs.org/browserslist/-/browserslist-4.22.1.tgz" - integrity sha512-FEVc202+2iuClEhZhrWy6ZiAcRLvNMyYcxZ8raemul1DYVOVdFsbqckWLdsixQZCpJlwe77Z3UTalE7jsjnKfQ== +browserslist@^4.0.0, browserslist@^4.14.5, browserslist@^4.18.1, browserslist@^4.21.10, browserslist@^4.21.4, browserslist@^4.22.1, browserslist@^4.22.2, "browserslist@>= 4.21.0": + version "4.22.3" + resolved "https://registry.npmjs.org/browserslist/-/browserslist-4.22.3.tgz" + integrity sha512-UAp55yfwNv0klWNapjs/ktHoguxuQNGnOzxYmfnXIS+8AsRDZkSDxg7R1AX3GKzn078SBI5dzwzj/Yx0Or0e3A== dependencies: - caniuse-lite "^1.0.30001541" - electron-to-chromium "^1.4.535" - node-releases "^2.0.13" + caniuse-lite "^1.0.30001580" + electron-to-chromium "^1.4.648" + node-releases "^2.0.14" update-browserslist-db "^1.0.13" +buffer-crc32@~0.2.3: + version "0.2.13" + resolved "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz" + integrity sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ== + buffer-from@^1.0.0: version "1.1.2" resolved "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz" @@ -2794,6 +3171,11 @@ bytes@3.0.0: resolved "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz" integrity sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw== +bytes@3.1.0: + version "3.1.0" + resolved "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz" + integrity sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg== + bytes@3.1.2: version "3.1.2" resolved "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz" @@ -2833,7 +3215,7 @@ camel-case@^4.1.2: pascal-case "^3.1.2" tslib "^2.0.3" -camelcase-css@2.0.1, camelcase-css@^2.0.1: +camelcase-css@^2.0.1, camelcase-css@2.0.1: version "2.0.1" resolved "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz" integrity sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA== @@ -2853,10 +3235,10 @@ caniuse-api@^3.0.0: lodash.memoize "^4.1.2" lodash.uniq "^4.5.0" -caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001538, caniuse-lite@^1.0.30001541: - version "1.0.30001559" - resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001559.tgz" - integrity sha512-cPiMKZgqgkg5LY3/ntGeLFUpi6tzddBNS58A4tnTgQw1zON7u2sZMU7SzOeVH4tj20++9ggL+V6FDOFMTaFFYA== +caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001538, caniuse-lite@^1.0.30001580: + version "1.0.30001581" + resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001581.tgz" + integrity sha512-whlTkwhqV2tUmP3oYhtNfaWGYHDdS3JYFQBKXxcUR9qqPWsRhFHhoISO2Xnl/g0xyKzht9mI1LZpiNWfMzHixQ== ccount@^1.0.0: version "1.1.0" @@ -2865,7 +3247,7 @@ ccount@^1.0.0: chalk@^2.4.2: version "2.4.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" + resolved "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz" integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== dependencies: ansi-styles "^3.2.1" @@ -2935,6 +3317,31 @@ chokidar@^3.4.2, chokidar@^3.5.3: optionalDependencies: fsevents "~2.3.2" +chokidar@3.3.1: + version "3.3.1" + resolved "https://registry.npmjs.org/chokidar/-/chokidar-3.3.1.tgz" + integrity sha512-4QYCEWOcK3OJrxwvyyAOxFuhpvOVCYkr33LPfFNBjAD/w3sEzWsp2BUOkI4l9bHvWioAd0rc6NlHUOEaWkTeqg== + dependencies: + anymatch "~3.1.1" + braces "~3.0.2" + glob-parent "~5.1.0" + is-binary-path "~2.1.0" + is-glob "~4.0.1" + normalize-path "~3.0.0" + readdirp "~3.3.0" + optionalDependencies: + fsevents "~2.1.2" + +chownr@^1.1.4: + version "1.1.4" + resolved "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz" + integrity sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg== + +chownr@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz" + integrity sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ== + chrome-trace-event@^1.0.2: version "1.0.3" resolved "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz" @@ -2947,12 +3354,12 @@ ci-info@^2.0.0: ci-info@^3.2.0: version "3.9.0" - resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.9.0.tgz#4279a62028a7b1f262f3473fc9605f5e218c59b4" + resolved "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz" integrity sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ== clean-css@^5.2.2, clean-css@^5.3.0: version "5.3.2" - resolved "https://registry.yarnpkg.com/clean-css/-/clean-css-5.3.2.tgz#70ecc7d4d4114921f5d298349ff86a31a9975224" + resolved "https://registry.npmjs.org/clean-css/-/clean-css-5.3.2.tgz" integrity sha512-JVJbM+f3d3Q704rF4bqQ5UUyTtuJ0JRKNbTKVEeujCCBoMdkEi+V+e8oktO9qGQNSvHrFTM6JZRXrUvGR1czww== dependencies: source-map "~0.6.0" @@ -2974,7 +3381,7 @@ cli-boxes@^3.0.0: cli-table3@^0.6.2: version "0.6.3" - resolved "https://registry.yarnpkg.com/cli-table3/-/cli-table3-0.6.3.tgz#61ab765aac156b52f222954ffc607a6f01dbeeb2" + resolved "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.3.tgz" integrity sha512-w5Jac5SykAeZJKntOxJCrm63Eg5/4dhMWIcuTbo9rpE+brgaSZo0RuNJZeOyMgsUdhDeojvgyQLmjI+K50ZGyg== dependencies: string-width "^4.2.0" @@ -3002,6 +3409,11 @@ clsx@^1.2.1: resolved "https://registry.npmjs.org/clsx/-/clsx-1.2.1.tgz" integrity sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg== +code-block-writer@^10.1.1: + version "10.1.1" + resolved "https://registry.npmjs.org/code-block-writer/-/code-block-writer-10.1.1.tgz" + integrity sha512-67ueh2IRGst/51p0n6FvPrnRjAGHY5F8xdjkgrYE7DDzpJe6qA07RYQ9VcoUeo5ATOjSOiWpSL3SWBRRbempMw== + collapse-white-space@^1.0.2: version "1.0.6" resolved "https://registry.npmjs.org/collapse-white-space/-/collapse-white-space-1.0.6.tgz" @@ -3021,15 +3433,20 @@ color-convert@^2.0.1: dependencies: color-name "~1.1.4" +color-name@~1.1.4: + version "1.1.4" + resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz" + integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== + color-name@1.1.3: version "1.1.3" resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz" integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== -color-name@~1.1.4: - version "1.1.4" - resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz" - integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== +color-support@^1.1.2: + version "1.1.3" + resolved "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz" + integrity sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg== colord@^2.9.1: version "2.9.3" @@ -3038,12 +3455,12 @@ colord@^2.9.1: colorette@^2.0.10: version "2.0.20" - resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.20.tgz#9eb793e6833067f7235902fcd3b09917a000a95a" + resolved "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz" integrity sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w== combine-promises@^1.1.0: version "1.2.0" - resolved "https://registry.yarnpkg.com/combine-promises/-/combine-promises-1.2.0.tgz#5f2e68451862acf85761ded4d9e2af7769c2ca6a" + resolved "https://registry.npmjs.org/combine-promises/-/combine-promises-1.2.0.tgz" integrity sha512-VcQB1ziGD0NXrhKxiwyNbCDmRzs/OShMs2GqW2DlU2A/Sd0nQxE1oWDAE5O0ygSx5mgQOn9eIFh7yKPgFRVkPQ== comma-separated-tokens@^1.0.0: @@ -3128,6 +3545,11 @@ consola@^2.15.3: resolved "https://registry.npmjs.org/consola/-/consola-2.15.3.tgz" integrity sha512-9vAdYbHj6x2fLKC4+oPH0kFzY/orMZyG2Aj+kNylHxKGJ/Ed4dpNyAQYwJOdqO4zdM7XpVHmyejQDcQHrnuXbw== +console-control-strings@^1.0.0, console-control-strings@^1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz" + integrity sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ== + content-disposition@0.5.2: version "0.5.2" resolved "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz" @@ -3142,17 +3564,27 @@ content-disposition@0.5.4: content-type@~1.0.4: version "1.0.5" - resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.5.tgz#8b773162656d1d1086784c8f23a54ce6d73d7918" + resolved "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz" integrity sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA== +content-type@1.0.4: + version "1.0.4" + resolved "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz" + integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA== + +convert-hrtime@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/convert-hrtime/-/convert-hrtime-3.0.0.tgz" + integrity sha512-7V+KqSvMiHp8yWDuwfww06XleMWVVB9b9tURBx+G7UTADuo5hYPuowKloz4OzOqbPezxgo+fdQ1522WzPG4OeA== + convert-source-map@^1.7.0: version "1.9.0" - resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.9.0.tgz#7faae62353fb4213366d0ca98358d22e8368b05f" + resolved "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz" integrity sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A== convert-source-map@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-2.0.0.tgz#4b560f649fc4e918dd0ab75cf4961e8bc882d82a" + resolved "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz" integrity sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg== cookie-signature@1.0.6: @@ -3184,19 +3616,19 @@ copy-webpack-plugin@^11.0.0: core-js-compat@^3.31.0, core-js-compat@^3.33.1: version "3.33.2" - resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.33.2.tgz#3ea4563bfd015ad4e4b52442865b02c62aba5085" + resolved "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.33.2.tgz" integrity sha512-axfo+wxFVxnqf8RvxTzoAlzW4gRoacrHeoFlc9n0x50+7BEyZL/Rt3hicaED1/CEd7I6tPCPVUYcJwCMO5XUYw== dependencies: browserslist "^4.22.1" core-js-pure@^3.30.2: version "3.33.2" - resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.33.2.tgz#644830db2507ef84d068a70980ccd99c275f5fa6" + resolved "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.33.2.tgz" integrity sha512-a8zeCdyVk7uF2elKIGz67AjcXOxjRbwOLz8SbklEso1V+2DoW4OkAMZN9S9GBgvZIaqQi/OemFX4OiSoQEmg1Q== core-js@^3.23.3: version "3.33.2" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.33.2.tgz#312bbf6996a3a517c04c99b9909cdd27138d1ceb" + resolved "https://registry.npmjs.org/core-js/-/core-js-3.33.2.tgz" integrity sha512-XeBzWI6QL3nJQiHmdzbAOiMYqjrb7hwU7A39Qhvd/POSa/t9E1AeZyEZx3fNvp/vtM8zXwhoL0FsiS0hD0pruQ== core-util-is@~1.0.0: @@ -3217,7 +3649,7 @@ cosmiconfig@^6.0.0: cosmiconfig@^7.0.1: version "7.1.0" - resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-7.1.0.tgz#1443b9afa596b670082ea46cbd8f6a62b84635f6" + resolved "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz" integrity sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA== dependencies: "@types/parse-json" "^4.0.0" @@ -3228,7 +3660,7 @@ cosmiconfig@^7.0.1: cosmiconfig@^8.2.0: version "8.3.6" - resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-8.3.6.tgz#060a2b871d66dba6c8538ea1118ba1ac16f5fae3" + resolved "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.3.6.tgz" integrity sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA== dependencies: import-fresh "^3.3.0" @@ -3236,6 +3668,11 @@ cosmiconfig@^8.2.0: parse-json "^5.2.0" path-type "^4.0.0" +create-require@^1.1.0: + version "1.1.1" + resolved "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz" + integrity sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ== + cross-fetch@^3.1.5: version "3.1.8" resolved "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.8.tgz" @@ -3243,7 +3680,7 @@ cross-fetch@^3.1.5: dependencies: node-fetch "^2.6.12" -cross-spawn@^7.0.3: +cross-spawn@^7.0.0, cross-spawn@^7.0.3: version "7.0.3" resolved "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz" integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== @@ -3264,7 +3701,7 @@ css-declaration-sorter@^6.3.1: css-loader@^6.7.1: version "6.8.1" - resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-6.8.1.tgz#0f8f52699f60f5e679eab4ec0fcd68b8e8a50a88" + resolved "https://registry.npmjs.org/css-loader/-/css-loader-6.8.1.tgz" integrity sha512-xDAXtEVGlD0gJ07iclwWVkLoZOpEvAWaSyf6W18S2pOC//K8+qUDIx8IIT3D+HjnmkJPQeesOPv5aiUaJsCM2g== dependencies: icss-utils "^5.1.0" @@ -3278,7 +3715,7 @@ css-loader@^6.7.1: css-minimizer-webpack-plugin@^4.0.0: version "4.2.2" - resolved "https://registry.yarnpkg.com/css-minimizer-webpack-plugin/-/css-minimizer-webpack-plugin-4.2.2.tgz#79f6199eb5adf1ff7ba57f105e3752d15211eb35" + resolved "https://registry.npmjs.org/css-minimizer-webpack-plugin/-/css-minimizer-webpack-plugin-4.2.2.tgz" integrity sha512-s3Of/4jKfw1Hj9CxEO1E5oXhQAxlayuHO2y/ML+C6I9sQ7FdzfEV6QgMLN3vI+qFsjJGIAFLKtQK7t8BOXAIyA== dependencies: cssnano "^5.1.8" @@ -3382,7 +3819,7 @@ cssnano-utils@^3.1.0: cssnano@^5.1.12, cssnano@^5.1.8: version "5.1.15" - resolved "https://registry.yarnpkg.com/cssnano/-/cssnano-5.1.15.tgz#ded66b5480d5127fcb44dac12ea5a983755136bf" + resolved "https://registry.npmjs.org/cssnano/-/cssnano-5.1.15.tgz" integrity sha512-j+BKgDcLDQA+eDifLx0EO4XSA56b7uut3BQFH+wbSaSTuGLuiyTa/wbRYthUXX8LC9mLg+WWKe8h+qJuwTAbHw== dependencies: cssnano-preset-default "^5.2.14" @@ -3398,23 +3835,51 @@ csso@^4.2.0: csstype@^3.0.2: version "3.1.2" - resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.2.tgz#1d4bf9d572f11c14031f0436e1c10bc1f571f50b" + resolved "https://registry.npmjs.org/csstype/-/csstype-3.1.2.tgz" integrity sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ== -debug@2.6.9, debug@^2.6.0: +debug@^2.6.0, debug@2.6.9: version "2.6.9" resolved "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz" integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== dependencies: ms "2.0.0" -debug@4, debug@^4.1.0, debug@^4.1.1: +debug@^4.1.0: + version "4.3.4" + resolved "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz" + integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== + dependencies: + ms "2.1.2" + +debug@^4.1.1: + version "4.3.4" + resolved "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz" + integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== + dependencies: + ms "2.1.2" + +debug@^4.3.1: + version "4.3.4" + resolved "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz" + integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== + dependencies: + ms "2.1.2" + +debug@4: version "4.3.4" resolved "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz" integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== dependencies: ms "2.1.2" +debug@4.1.1: + version "4.1.1" + resolved "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz" + integrity sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw== + dependencies: + ms "^2.1.1" + decompress-response@^3.3.0: version "3.3.0" resolved "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz" @@ -3429,7 +3894,7 @@ deep-extend@^0.6.0: deepmerge@^4.2.2: version "4.3.1" - resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.3.1.tgz#44b5f2147cd3b00d4b56137685966f26fd25dd4a" + resolved "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz" integrity sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A== default-gateway@^6.0.3: @@ -3446,7 +3911,7 @@ defer-to-connect@^1.0.1: define-data-property@^1.0.1: version "1.1.1" - resolved "https://registry.yarnpkg.com/define-data-property/-/define-data-property-1.1.1.tgz#c35f7cd0ab09883480d12ac5cb213715587800b3" + resolved "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.1.tgz" integrity sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ== dependencies: get-intrinsic "^1.2.1" @@ -3460,7 +3925,7 @@ define-lazy-prop@^2.0.0: define-properties@^1.1.4: version "1.2.1" - resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.2.1.tgz#10781cc616eb951a80a034bafcaa7377f6af2b6c" + resolved "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz" integrity sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg== dependencies: define-data-property "^1.0.1" @@ -3481,16 +3946,21 @@ del@^6.1.1: rimraf "^3.0.2" slash "^3.0.0" -depd@2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz" - integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== +delegates@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz" + integrity sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ== depd@~1.1.2: version "1.1.2" resolved "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz" integrity sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ== +depd@2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz" + integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== + destroy@1.2.0: version "1.2.0" resolved "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz" @@ -3503,6 +3973,11 @@ detab@2.0.4: dependencies: repeat-string "^1.5.4" +detect-libc@^2.0.0: + version "2.0.2" + resolved "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.2.tgz" + integrity sha512-UX6sGumvvqSaXgdKGUsgZWqcUyIXZ/vZTrlRT/iobiKhGL0zL4d3osHj3uqllWJK+i+sixDS/3COVEOFbupFyw== + detect-node@^2.0.4: version "2.1.0" resolved "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz" @@ -3518,7 +3993,7 @@ detect-port-alt@^1.1.6: detect-port@^1.3.0: version "1.5.1" - resolved "https://registry.yarnpkg.com/detect-port/-/detect-port-1.5.1.tgz#451ca9b6eaf20451acb0799b8ab40dff7718727b" + resolved "https://registry.npmjs.org/detect-port/-/detect-port-1.5.1.tgz" integrity sha512-aBzdj76lueB6uUst5iAs7+0H/oOjqI5D16XUWxlWMIMROhcM0rfsNVk93zTngq1dDNpoXRr++Sus7ETAExppAQ== dependencies: address "^1.0.1" @@ -3529,6 +4004,11 @@ didyoumean@^1.2.2: resolved "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz" integrity sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw== +diff@^4.0.1: + version "4.0.2" + resolved "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz" + integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== + dir-glob@^3.0.1: version "3.0.1" resolved "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz" @@ -3548,7 +4028,7 @@ dns-equal@^1.0.0: dns-packet@^5.2.2: version "5.6.1" - resolved "https://registry.yarnpkg.com/dns-packet/-/dns-packet-5.6.1.tgz#ae888ad425a9d1478a0674256ab866de1012cf2f" + resolved "https://registry.npmjs.org/dns-packet/-/dns-packet-5.6.1.tgz" integrity sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw== dependencies: "@leichtgewicht/ip-codec" "^2.0.1" @@ -3613,7 +4093,16 @@ domhandler@^5.0.2, domhandler@^5.0.3: dependencies: domelementtype "^2.3.0" -domutils@^2.5.2, domutils@^2.8.0: +domutils@^2.5.2: + version "2.8.0" + resolved "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz" + integrity sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A== + dependencies: + dom-serializer "^1.0.1" + domelementtype "^2.2.0" + domhandler "^4.2.0" + +domutils@^2.8.0: version "2.8.0" resolved "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz" integrity sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A== @@ -3646,30 +4135,45 @@ dot-prop@^5.2.0: dependencies: is-obj "^2.0.0" -duplexer3@^0.1.4: - version "0.1.5" - resolved "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.5.tgz" - integrity sha512-1A8za6ws41LQgv9HrE/66jyC5yuSjQ3L/KOpFtoBilsAK2iA2wuS5rTt1OCzIvtS2V7nVmedsUU+DGRcjBmOYA== - duplexer@^0.1.2: version "0.1.2" resolved "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz" integrity sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg== +duplexer3@^0.1.4: + version "0.1.5" + resolved "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.5.tgz" + integrity sha512-1A8za6ws41LQgv9HrE/66jyC5yuSjQ3L/KOpFtoBilsAK2iA2wuS5rTt1OCzIvtS2V7nVmedsUU+DGRcjBmOYA== + eastasianwidth@^0.2.0: version "0.2.0" resolved "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz" integrity sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA== +edge-runtime@2.5.7: + version "2.5.7" + resolved "https://registry.npmjs.org/edge-runtime/-/edge-runtime-2.5.7.tgz" + integrity sha512-gA4qSVP0sNwJlkdQ2nahDPASlSl8twUd17o+JolPa1EtXpLTGzIpOETvodgJwXIxa+zaD8bnAXCdsWrx2PhlVQ== + dependencies: + "@edge-runtime/format" "2.2.0" + "@edge-runtime/ponyfill" "2.4.1" + "@edge-runtime/vm" "3.1.7" + async-listen "3.0.1" + mri "1.2.0" + picocolors "1.0.0" + pretty-ms "7.0.1" + signal-exit "4.0.2" + time-span "4.0.0" + ee-first@1.1.1: version "1.1.1" resolved "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz" integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow== -electron-to-chromium@^1.4.535: - version "1.4.572" - resolved "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.572.tgz" - integrity sha512-RlFobl4D3ieetbnR+2EpxdzFl9h0RAJkPK3pfiwMug2nhBin2ZCsGIAJWdpNniLz43sgXam/CgipOmvTA+rUiA== +electron-to-chromium@^1.4.648: + version "1.4.648" + resolved "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.648.tgz" + integrity sha512-EmFMarXeqJp9cUKu/QEciEApn0S/xRcpZWuAm32U7NgoZCimjsilKXHRO9saeEW55eHZagIDg6XTUOv32w9pjg== emoji-regex@^8.0.0: version "8.0.0" @@ -3703,9 +4207,16 @@ end-of-stream@^1.1.0: dependencies: once "^1.4.0" +end-of-stream@~1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.1.0.tgz" + integrity sha512-EoulkdKF/1xa92q25PbjuDcgJ9RDHYU2Rs3SCIvs2/dSQ3BpmxneNHmA/M7fe60M3PrV7nNGTTNbkK62l6vXiQ== + dependencies: + once "~1.3.0" + enhanced-resolve@^5.15.0: version "5.15.0" - resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.15.0.tgz#1af946c7d93603eb88e9896cee4904dc012e9c35" + resolved "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.15.0.tgz" integrity sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg== dependencies: graceful-fs "^4.2.4" @@ -3718,7 +4229,7 @@ entities@^2.0.0: entities@^4.2.0, entities@^4.4.0: version "4.5.0" - resolved "https://registry.yarnpkg.com/entities/-/entities-4.5.0.tgz#5d268ea5e7113ec74c4d033b79ea5a35a488fb48" + resolved "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz" integrity sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw== error-ex@^1.3.1: @@ -3730,9 +4241,40 @@ error-ex@^1.3.1: es-module-lexer@^1.2.1: version "1.3.1" - resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-1.3.1.tgz#c1b0dd5ada807a3b3155315911f364dc4e909db1" + resolved "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.3.1.tgz" integrity sha512-JUFAyicQV9mXc3YRxPnDlrfBKpqt6hUYzz9/boprUJHs4e4KVr3XwOF70doO6gwXUor6EWZJAyWAfKki84t20Q== +esbuild-darwin-arm64@0.14.47: + version "0.14.47" + resolved "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.14.47.tgz" + integrity sha512-seCmearlQyvdvM/noz1L9+qblC5vcBrhUaOoLEDDoLInF/VQ9IkobGiLlyTPYP5dW1YD4LXhtBgOyevoIHGGnw== + +esbuild@0.14.47: + version "0.14.47" + resolved "https://registry.npmjs.org/esbuild/-/esbuild-0.14.47.tgz" + integrity sha512-wI4ZiIfFxpkuxB8ju4MHrGwGLyp1+awEHAHVpx6w7a+1pmYIq8T9FGEVVwFo0iFierDoMj++Xq69GXWYn2EiwA== + optionalDependencies: + esbuild-android-64 "0.14.47" + esbuild-android-arm64 "0.14.47" + esbuild-darwin-64 "0.14.47" + esbuild-darwin-arm64 "0.14.47" + esbuild-freebsd-64 "0.14.47" + esbuild-freebsd-arm64 "0.14.47" + esbuild-linux-32 "0.14.47" + esbuild-linux-64 "0.14.47" + esbuild-linux-arm "0.14.47" + esbuild-linux-arm64 "0.14.47" + esbuild-linux-mips64le "0.14.47" + esbuild-linux-ppc64le "0.14.47" + esbuild-linux-riscv64 "0.14.47" + esbuild-linux-s390x "0.14.47" + esbuild-netbsd-64 "0.14.47" + esbuild-openbsd-64 "0.14.47" + esbuild-sunos-64 "0.14.47" + esbuild-windows-32 "0.14.47" + esbuild-windows-64 "0.14.47" + esbuild-windows-arm64 "0.14.47" + escalade@^3.1.1: version "3.1.1" resolved "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz" @@ -3788,6 +4330,11 @@ estraverse@^5.2.0: resolved "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz" integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== +estree-walker@^2.0.1, estree-walker@2.0.2: + version "2.0.2" + resolved "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz" + integrity sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w== + esutils@^2.0.2: version "2.0.3" resolved "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz" @@ -3798,7 +4345,7 @@ eta@^2.0.0: resolved "https://registry.npmjs.org/eta/-/eta-2.2.0.tgz" integrity sha512-UVQ72Rqjy/ZKQalzV5dCCJP80GrmPrMxh6NlNf+erV6ObL0ZFkhCstWRawS85z3smdr3d2wXPsZEY7rDPfGd2g== -etag@~1.8.1: +etag@~1.8.1, etag@1.8.1: version "1.8.1" resolved "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz" integrity sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg== @@ -3816,6 +4363,11 @@ eventemitter3@^4.0.0: resolved "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz" integrity sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw== +events-intercept@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/events-intercept/-/events-intercept-2.0.0.tgz" + integrity sha512-blk1va0zol9QOrdZt0rFXo5KMkNPVSp92Eju/Qz8THwKWKRKeE0T8Br/1aW6+Edkyq9xHYgYxn2QtOnUKPUp+Q== + events@^3.2.0: version "3.3.0" resolved "https://registry.npmjs.org/events/-/events-3.3.0.tgz" @@ -3836,9 +4388,25 @@ execa@^5.0.0: signal-exit "^3.0.3" strip-final-newline "^2.0.0" +execa@3.2.0: + version "3.2.0" + resolved "https://registry.npmjs.org/execa/-/execa-3.2.0.tgz" + integrity sha512-kJJfVbI/lZE1PZYDI5VPxp8zXPO9rtxOkhpZ0jMKha56AI9y2gGVC6bkukStQf0ka5Rh15BA5m7cCCH4jmHqkw== + dependencies: + cross-spawn "^7.0.0" + get-stream "^5.0.0" + human-signals "^1.1.1" + is-stream "^2.0.0" + merge-stream "^2.0.0" + npm-run-path "^4.0.0" + onetime "^5.1.0" + p-finally "^2.0.0" + signal-exit "^3.0.2" + strip-final-newline "^2.0.0" + express@^4.17.3: version "4.18.2" - resolved "https://registry.yarnpkg.com/express/-/express-4.18.2.tgz#3fabe08296e930c796c19e3c516979386ba9fd59" + resolved "https://registry.npmjs.org/express/-/express-4.18.2.tgz" integrity sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ== dependencies: accepts "~1.3.8" @@ -3890,7 +4458,7 @@ fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: resolved "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz" integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== -fast-glob@^3.2.11, fast-glob@^3.2.9, fast-glob@^3.3.0: +fast-glob@^3.2.11, fast-glob@^3.2.7, fast-glob@^3.2.9, fast-glob@^3.3.0: version "3.3.2" resolved "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz" integrity sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow== @@ -3915,7 +4483,7 @@ fast-url-parser@1.1.3: fastq@^1.6.0: version "1.15.0" - resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.15.0.tgz#d04d07c6a2a68fe4599fea8d2e103a937fae6b3a" + resolved "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz" integrity sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw== dependencies: reusify "^1.0.4" @@ -3952,6 +4520,13 @@ fbjs@^3.0.0, fbjs@^3.0.1: setimmediate "^1.0.5" ua-parser-js "^1.0.35" +fd-slicer@~1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz" + integrity sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g== + dependencies: + pend "~1.2.0" + feed@^4.2.2: version "4.2.2" resolved "https://registry.npmjs.org/feed/-/feed-4.2.2.tgz" @@ -3959,7 +4534,7 @@ feed@^4.2.2: dependencies: xml-js "^1.6.11" -file-loader@^6.2.0: +file-loader@*, file-loader@^6.2.0: version "6.2.0" resolved "https://registry.npmjs.org/file-loader/-/file-loader-6.2.0.tgz" integrity sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw== @@ -3967,6 +4542,11 @@ file-loader@^6.2.0: loader-utils "^2.0.0" schema-utils "^3.0.0" +file-uri-to-path@1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz" + integrity sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw== + filesize@^8.0.6: version "8.0.7" resolved "https://registry.npmjs.org/filesize/-/filesize-8.0.7.tgz" @@ -4026,7 +4606,7 @@ find-up@^5.0.0: flat@^5.0.2: version "5.0.2" - resolved "https://registry.yarnpkg.com/flat/-/flat-5.0.2.tgz#8ca6fe332069ffa9d324c327198c598259ceb241" + resolved "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz" integrity sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ== flux@^4.0.1: @@ -4044,7 +4624,7 @@ follow-redirects@^1.0.0, follow-redirects@^1.14.7: fork-ts-checker-webpack-plugin@^6.5.0: version "6.5.3" - resolved "https://registry.yarnpkg.com/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-6.5.3.tgz#eda2eff6e22476a2688d10661688c47f611b37f3" + resolved "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-6.5.3.tgz" integrity sha512-SbH/l9ikmMWycd5puHJKTkZJKddF4iRLyW3DeZ08HTI7NGyLS38MXd/KGgeWumQO7YNQbW2u/NtPT2YowbPaGQ== dependencies: "@babel/code-frame" "^7.8.3" @@ -4095,9 +4675,41 @@ fs-extra@^9.0.0: jsonfile "^6.0.1" universalify "^2.0.0" +fs-extra@11.1.0: + version "11.1.0" + resolved "https://registry.npmjs.org/fs-extra/-/fs-extra-11.1.0.tgz" + integrity sha512-0rcTq621PD5jM/e0a3EJoGC/1TC5ZBCERW82LQuwfGnCa1V8w7dpYH1yNu+SLb6E5dkeCBzKEyLGlFrnr+dUyw== + dependencies: + graceful-fs "^4.2.0" + jsonfile "^6.0.1" + universalify "^2.0.0" + +fs-extra@8.1.0: + version "8.1.0" + resolved "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz" + integrity sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g== + dependencies: + graceful-fs "^4.2.0" + jsonfile "^4.0.0" + universalify "^0.1.0" + +fs-minipass@^1.2.7: + version "1.2.7" + resolved "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.7.tgz" + integrity sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA== + dependencies: + minipass "^2.6.0" + +fs-minipass@^2.0.0: + version "2.1.0" + resolved "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz" + integrity sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg== + dependencies: + minipass "^3.0.0" + fs-monkey@^1.0.4: version "1.0.5" - resolved "https://registry.yarnpkg.com/fs-monkey/-/fs-monkey-1.0.5.tgz#fe450175f0db0d7ea758102e1d84096acb925788" + resolved "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.5.tgz" integrity sha512-8uMbBjrhzW76TYgEV27Y5E//W2f/lTFmx78P2w19FZSxarhI/798APGQyuGCwmkNxgwGRhrLfvWyLBvNtuOmew== fs.realpath@^1.0.0: @@ -4105,9 +4717,14 @@ fs.realpath@^1.0.0: resolved "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz" integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== +fsevents@~2.1.2: + version "2.1.3" + resolved "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz" + integrity sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ== + fsevents@~2.3.2: version "2.3.3" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" + resolved "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz" integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== function-bind@^1.1.1, function-bind@^1.1.2: @@ -4115,6 +4732,26 @@ function-bind@^1.1.1, function-bind@^1.1.2: resolved "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz" integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== +gauge@^3.0.0: + version "3.0.2" + resolved "https://registry.npmjs.org/gauge/-/gauge-3.0.2.tgz" + integrity sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q== + dependencies: + aproba "^1.0.3 || ^2.0.0" + color-support "^1.1.2" + console-control-strings "^1.0.0" + has-unicode "^2.0.1" + object-assign "^4.1.1" + signal-exit "^3.0.0" + string-width "^4.2.3" + strip-ansi "^6.0.1" + wide-align "^1.1.2" + +generic-pool@3.4.2: + version "3.4.2" + resolved "https://registry.npmjs.org/generic-pool/-/generic-pool-3.4.2.tgz" + integrity sha512-H7cUpwCQSiJmAHM4c/aFu6fUfrhWXW1ncyh8ftxEPMu6AiYkHw9K8br720TGPZJbk5eOH2bynjZD1yPvdDAmag== + gensync@^1.0.0-beta.1, gensync@^1.0.0-beta.2: version "1.0.0-beta.2" resolved "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz" @@ -4122,7 +4759,7 @@ gensync@^1.0.0-beta.1, gensync@^1.0.0-beta.2: get-intrinsic@^1.0.2, get-intrinsic@^1.1.1, get-intrinsic@^1.1.3, get-intrinsic@^1.2.1: version "1.2.2" - resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.2.tgz#281b7622971123e1ef4b3c90fd7539306da93f3b" + resolved "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.2.tgz" integrity sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA== dependencies: function-bind "^1.1.2" @@ -4142,6 +4779,13 @@ get-stream@^4.1.0: dependencies: pump "^3.0.0" +get-stream@^5.0.0: + version "5.2.0" + resolved "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz" + integrity sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA== + dependencies: + pump "^3.0.0" + get-stream@^5.1.0: version "5.2.0" resolved "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz" @@ -4156,17 +4800,24 @@ get-stream@^6.0.0: github-slugger@^1.4.0: version "1.5.0" - resolved "https://registry.yarnpkg.com/github-slugger/-/github-slugger-1.5.0.tgz#17891bbc73232051474d68bd867a34625c955f7d" + resolved "https://registry.npmjs.org/github-slugger/-/github-slugger-1.5.0.tgz" integrity sha512-wIh+gKBI9Nshz2o46B0B3f5k/W+WI9ZAv6y5Dn5WJ5SK1t0TnDimB4WE5rmTD05ZAIn8HALCZVmCsvj0w0v0lw== -glob-parent@^5.1.2, glob-parent@~5.1.2: +glob-parent@^5.1.2, 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" integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== dependencies: is-glob "^4.0.1" -glob-parent@^6.0.1, glob-parent@^6.0.2: +glob-parent@^6.0.1: + version "6.0.2" + resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz" + integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== + dependencies: + is-glob "^4.0.3" + +glob-parent@^6.0.2: version "6.0.2" resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz" integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== @@ -4178,33 +4829,33 @@ glob-to-regexp@^0.4.1: resolved "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz" integrity sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw== -glob@7.1.6: - version "7.1.6" - resolved "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz" - integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== +glob@^7.0.0, glob@^7.1.3, glob@^7.1.6: + version "7.2.3" + resolved "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz" + integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== dependencies: fs.realpath "^1.0.0" inflight "^1.0.4" inherits "2" - minimatch "^3.0.4" + minimatch "^3.1.1" once "^1.3.0" path-is-absolute "^1.0.0" -glob@^7.0.0, glob@^7.1.3, glob@^7.1.6: - version "7.2.3" - resolved "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz" - integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== +glob@7.1.6: + version "7.1.6" + resolved "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz" + integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== dependencies: fs.realpath "^1.0.0" inflight "^1.0.4" inherits "2" - minimatch "^3.1.1" + minimatch "^3.0.4" once "^1.3.0" path-is-absolute "^1.0.0" global-dirs@^3.0.0: version "3.0.1" - resolved "https://registry.yarnpkg.com/global-dirs/-/global-dirs-3.0.1.tgz#0c488971f066baceda21447aecb1a8b911d22485" + resolved "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.1.tgz" integrity sha512-NBcGGFbBA9s1VzD41QXDG+3++t9Mn5t1FpLdhESY6oKY4gYTFpX4wO3sqGUa0Srjtbfj3szX0RnemmrVRUdULA== dependencies: ini "2.0.0" @@ -4244,7 +4895,7 @@ globby@^11.0.1, globby@^11.0.4, globby@^11.1.0: globby@^13.1.1: version "13.2.2" - resolved "https://registry.yarnpkg.com/globby/-/globby-13.2.2.tgz#63b90b1bf68619c2135475cbd4e71e66aa090592" + resolved "https://registry.npmjs.org/globby/-/globby-13.2.2.tgz" integrity sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w== dependencies: dir-glob "^3.0.1" @@ -4255,7 +4906,7 @@ globby@^13.1.1: gopd@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.0.1.tgz#29ff76de69dac7489b7c0918a5788e56477c332c" + resolved "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz" integrity sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA== dependencies: get-intrinsic "^1.1.3" @@ -4279,7 +4930,7 @@ got@^9.6.0: graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.4, graceful-fs@^4.2.6, graceful-fs@^4.2.9: version "4.2.11" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" + resolved "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz" integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== gray-matter@^4.0.3: @@ -4323,7 +4974,7 @@ has-property-descriptors@^1.0.0: has-proto@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/has-proto/-/has-proto-1.0.1.tgz#1885c1305538958aff469fef37937c22795408e0" + resolved "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz" integrity sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg== has-symbols@^1.0.3: @@ -4331,6 +4982,11 @@ has-symbols@^1.0.3: resolved "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz" integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== +has-unicode@^2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz" + integrity sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ== + has-yarn@^2.1.0: version "2.1.0" resolved "https://registry.npmjs.org/has-yarn/-/has-yarn-2.1.0.tgz" @@ -4418,7 +5074,7 @@ he@^1.2.0: heroicons@^2.1.1: version "2.1.1" - resolved "https://registry.yarnpkg.com/heroicons/-/heroicons-2.1.1.tgz#b574c2d87bc504bf7f4fefacc20960c5672b0202" + resolved "https://registry.npmjs.org/heroicons/-/heroicons-2.1.1.tgz" integrity sha512-54kHbrxsTyAJJU7z07XN1OrVBX8ogN/tbclP8Doxk0X4IQmR6LEhLzJBkFK9Yc814NoXG6ZJBh9Bi/qvauzjfA== history@^4.9.0: @@ -4452,7 +5108,7 @@ hpack.js@^2.1.6: html-entities@^2.3.2: version "2.4.0" - resolved "https://registry.yarnpkg.com/html-entities/-/html-entities-2.4.0.tgz#edd0cee70402584c8c76cc2c0556db09d1f45061" + resolved "https://registry.npmjs.org/html-entities/-/html-entities-2.4.0.tgz" integrity sha512-igBTJcNNNhvZFRtm8uA6xMY6xYleeDwn3PeBCkDz7tHttv4F2hsDI2aPgNERWzvRcNYHNT3ymRaQzllmXj4YsQ== html-minifier-terser@^6.0.2, html-minifier-terser@^6.1.0: @@ -4470,7 +5126,7 @@ html-minifier-terser@^6.0.2, html-minifier-terser@^6.1.0: html-tags@^3.2.0: version "3.3.1" - resolved "https://registry.yarnpkg.com/html-tags/-/html-tags-3.3.1.tgz#a04026a18c882e4bba8a01a3d39cfe465d40b5ce" + resolved "https://registry.npmjs.org/html-tags/-/html-tags-3.3.1.tgz" integrity sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ== html-void-elements@^1.0.0: @@ -4480,7 +5136,7 @@ html-void-elements@^1.0.0: html-webpack-plugin@^5.5.0: version "5.5.3" - resolved "https://registry.yarnpkg.com/html-webpack-plugin/-/html-webpack-plugin-5.5.3.tgz#72270f4a78e222b5825b296e5e3e1328ad525a3e" + resolved "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-5.5.3.tgz" integrity sha512-6YrDKTuqaP/TquFH7h4srYWsZx+x6k6+FbsTm0ziCwGHDP78Unr1r9F/H4+sGmMbX08GQcJ+K64x55b+7VM/jg== dependencies: "@types/html-minifier-terser" "^6.0.0" @@ -4511,7 +5167,7 @@ htmlparser2@^8.0.1: http-cache-semantics@^4.0.0: version "4.1.1" - resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz#abe02fcb2985460bf0323be664436ec3476a6d5a" + resolved "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz" integrity sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ== http-deceiver@^1.2.7: @@ -4519,16 +5175,13 @@ http-deceiver@^1.2.7: resolved "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz" integrity sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw== -http-errors@2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz" - integrity sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ== +http-errors@~1.4.0: + version "1.4.0" + resolved "https://registry.npmjs.org/http-errors/-/http-errors-1.4.0.tgz" + integrity sha512-oLjPqve1tuOl5aRhv8GK5eHpqP1C9fb+Ol+XTLjKfLltE44zdDbEdjPSbU7Ch5rSNsVFqZn97SrMmZLdu1/YMw== dependencies: - depd "2.0.0" - inherits "2.0.4" - setprototypeof "1.2.0" - statuses "2.0.1" - toidentifier "1.0.1" + inherits "2.0.1" + statuses ">= 1.2.1 < 2" http-errors@~1.6.2: version "1.6.3" @@ -4540,6 +5193,28 @@ http-errors@~1.6.2: setprototypeof "1.1.0" statuses ">= 1.4.0 < 2" +http-errors@1.7.3: + version "1.7.3" + resolved "https://registry.npmjs.org/http-errors/-/http-errors-1.7.3.tgz" + integrity sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw== + dependencies: + depd "~1.1.2" + inherits "2.0.4" + setprototypeof "1.1.1" + statuses ">= 1.5.0 < 2" + toidentifier "1.0.0" + +http-errors@2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz" + integrity sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ== + dependencies: + depd "2.0.0" + inherits "2.0.4" + setprototypeof "1.2.0" + statuses "2.0.1" + toidentifier "1.0.1" + http-parser-js@>=0.5.1: version "0.5.8" resolved "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.8.tgz" @@ -4565,6 +5240,19 @@ http-proxy@^1.18.1: follow-redirects "^1.0.0" requires-port "^1.0.0" +https-proxy-agent@^5.0.0: + version "5.0.1" + resolved "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz" + integrity sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA== + dependencies: + agent-base "6" + debug "4" + +human-signals@^1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz" + integrity sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw== + human-signals@^2.1.0: version "2.1.0" resolved "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz" @@ -4584,7 +5272,7 @@ icss-utils@^5.0.0, icss-utils@^5.1.0: ignore@^5.2.0, ignore@^5.2.4: version "5.2.4" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.4.tgz#a291c0c6178ff1b960befe47fcdec301674a6324" + resolved "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz" integrity sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ== image-size@^1.0.1: @@ -4596,7 +5284,7 @@ image-size@^1.0.1: immer@^9.0.7: version "9.0.21" - resolved "https://registry.yarnpkg.com/immer/-/immer-9.0.21.tgz#1e025ea31a40f24fb064f1fef23e931496330176" + resolved "https://registry.npmjs.org/immer/-/immer-9.0.21.tgz" integrity sha512-bc4NBHqOqSfRW7POMkHd51LvClaeMXpm8dx0e8oE2GORbq5aRK7Bxl4FyzVLdGtLmvLKL7BTDBG5ACQm4HWjTA== import-fresh@^3.1.0, import-fresh@^3.2.1, import-fresh@^3.3.0: @@ -4635,26 +5323,31 @@ inflight@^1.0.4: once "^1.3.0" wrappy "1" -inherits@2, inherits@2.0.4, inherits@^2.0.0, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.3: +inherits@^2.0.0, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.3, inherits@2, inherits@2.0.4: version "2.0.4" resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== +inherits@2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz" + integrity sha512-8nWq2nLTAwd02jTqJExUYFSD/fKq6VH9Y/oG2accc/kdI0V98Bag8d5a4gi3XHz73rDWa2PvTtvcWYquKqSENA== + inherits@2.0.3: version "2.0.3" resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz" integrity sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw== -ini@2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz" - integrity sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA== - ini@^1.3.5, ini@~1.3.0: version "1.3.8" resolved "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz" integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== +ini@2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz" + integrity sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA== + inline-style-parser@0.1.1: version "0.1.1" resolved "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.1.1.tgz" @@ -4672,17 +5365,17 @@ invariant@^2.2.4: dependencies: loose-envify "^1.0.0" +ipaddr.js@^2.0.1: + version "2.1.0" + resolved "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.1.0.tgz" + integrity sha512-LlbxQ7xKzfBusov6UMi4MFpEg0m+mAm9xyNGEduwXMEDuf4WfzB/RZwMVYEd7IKGvh4IUkEXYxtAVu9T3OelJQ== + ipaddr.js@1.9.1: version "1.9.1" resolved "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz" integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== -ipaddr.js@^2.0.1: - version "2.1.0" - resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-2.1.0.tgz#2119bc447ff8c257753b196fc5f1ce08a4cdf39f" - integrity sha512-LlbxQ7xKzfBusov6UMi4MFpEg0m+mAm9xyNGEduwXMEDuf4WfzB/RZwMVYEd7IKGvh4IUkEXYxtAVu9T3OelJQ== - -is-alphabetical@1.0.4, is-alphabetical@^1.0.0: +is-alphabetical@^1.0.0, is-alphabetical@1.0.4: version "1.0.4" resolved "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-1.0.4.tgz" integrity sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg== @@ -4820,7 +5513,7 @@ is-plain-object@^2.0.4: is-plain-object@^5.0.0: version "5.0.0" - resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-5.0.0.tgz#4427f50ab3429e9025ea7d52e9043a9ef4159344" + resolved "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz" integrity sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q== is-regexp@^1.0.0: @@ -4865,16 +5558,16 @@ is-yarn-global@^0.3.0: resolved "https://registry.npmjs.org/is-yarn-global/-/is-yarn-global-0.3.0.tgz" integrity sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw== -isarray@0.0.1: - version "0.0.1" - resolved "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz" - integrity sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ== - isarray@~1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz" integrity sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ== +isarray@0.0.1: + version "0.0.1" + resolved "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz" + integrity sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ== + isexe@^2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz" @@ -4887,7 +5580,7 @@ isobject@^3.0.1: jest-util@^29.7.0: version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-29.7.0.tgz#23c2b62bfb22be82b44de98055802ff3710fc0bc" + resolved "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz" integrity sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA== dependencies: "@jest/types" "^29.6.3" @@ -4908,7 +5601,7 @@ jest-worker@^27.4.5: jest-worker@^29.1.2: version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-29.7.0.tgz#acad073acbbaeb7262bd5389e1bcf43e10058d4a" + resolved "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz" integrity sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw== dependencies: "@types/node" "*" @@ -4918,12 +5611,12 @@ jest-worker@^29.1.2: jiti@^1.18.2, jiti@^1.19.1: version "1.21.0" - resolved "https://registry.yarnpkg.com/jiti/-/jiti-1.21.0.tgz#7c97f8fe045724e136a397f7340475244156105d" + resolved "https://registry.npmjs.org/jiti/-/jiti-1.21.0.tgz" integrity sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q== joi@^17.6.0: version "17.11.0" - resolved "https://registry.yarnpkg.com/joi/-/joi-17.11.0.tgz#aa9da753578ec7720e6f0ca2c7046996ed04fc1a" + resolved "https://registry.npmjs.org/joi/-/joi-17.11.0.tgz" integrity sha512-NgB+lZLNoqISVy1rZocE9PZI36bL/77ie924Ri43yEvi9GUUMPeyVIr8KdFTMUlby1p0PBYMk9spIxEUQYqrJQ== dependencies: "@hapi/hoek" "^9.0.0" @@ -4972,6 +5665,14 @@ json-parse-even-better-errors@^2.3.0, json-parse-even-better-errors@^2.3.1: resolved "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz" integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== +json-schema-to-ts@1.6.4: + version "1.6.4" + resolved "https://registry.npmjs.org/json-schema-to-ts/-/json-schema-to-ts-1.6.4.tgz" + integrity sha512-pR4yQ9DHz6itqswtHCm26mw45FSNfQ9rEQjosaZErhn5J3J2sIViQiz8rDaezjKAhFGpmsoczYVBgGHzFw/stA== + dependencies: + "@types/json-schema" "^7.0.6" + ts-toolbelt "^6.15.5" + 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" @@ -4984,9 +5685,16 @@ json-schema-traverse@^1.0.0: json5@^2.1.2, json5@^2.2.3: version "2.2.3" - resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283" + resolved "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz" integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== +jsonfile@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz" + integrity sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg== + optionalDependencies: + graceful-fs "^4.1.6" + jsonfile@^6.0.1: version "6.1.0" resolved "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz" @@ -5022,7 +5730,7 @@ latest-version@^5.1.0: launch-editor@^2.6.0: version "2.6.1" - resolved "https://registry.yarnpkg.com/launch-editor/-/launch-editor-2.6.1.tgz#f259c9ef95cbc9425620bbbd14b468fcdb4ffe3c" + resolved "https://registry.npmjs.org/launch-editor/-/launch-editor-2.6.1.tgz" integrity sha512-eB/uXmFVpY4zezmGp5XtU21kwo7GBbKB+EQ+UZeWtGb9yAM5xt/Evk+lYH3eRNAtId+ej4u7TYPFZ07w4s7rRw== dependencies: picocolors "^1.0.0" @@ -5050,7 +5758,7 @@ loader-runner@^4.2.0: loader-utils@^2.0.0: version "2.0.4" - resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-2.0.4.tgz#8b5cb38b5c34a9a018ee1fc0e6a066d1dfcc528c" + resolved "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz" integrity sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw== dependencies: big.js "^5.2.2" @@ -5059,7 +5767,7 @@ loader-utils@^2.0.0: loader-utils@^3.2.0: version "3.2.1" - resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-3.2.1.tgz#4fb104b599daafd82ef3e1a41fb9265f87e1f576" + resolved "https://registry.npmjs.org/loader-utils/-/loader-utils-3.2.1.tgz" integrity sha512-ZvFw1KWS3GVyYBYb7qkmRM/WwL2TQQBxgCK62rlvm4WpVQ23Nb4tYjApUlfjrEGvOs7KHEsmyUn75OHZrJMWPw== locate-path@^3.0.0: @@ -5096,12 +5804,12 @@ lodash.debounce@^4.0.8: lodash.escape@^4.0.1: version "4.0.1" - resolved "https://registry.yarnpkg.com/lodash.escape/-/lodash.escape-4.0.1.tgz#c9044690c21e04294beaa517712fded1fa88de98" + resolved "https://registry.npmjs.org/lodash.escape/-/lodash.escape-4.0.1.tgz" integrity sha512-nXEOnb/jK9g0DYMr1/Xvq6l5xMD7GDG55+GSYIYmS0G4tBk/hURD4JR9WCavs04t33WmJx9kCyp9vJ+mr4BOUw== lodash.flatten@^4.4.0: version "4.4.0" - resolved "https://registry.yarnpkg.com/lodash.flatten/-/lodash.flatten-4.4.0.tgz#f31c22225a9632d2bbf8e4addbef240aa765a61f" + resolved "https://registry.npmjs.org/lodash.flatten/-/lodash.flatten-4.4.0.tgz" integrity sha512-C5N2Z3DgnnKr0LOpv/hKCgKdb7ZZwafIrsesve6lmzvZIRZRGaZ/l6Q8+2W7NaT+ZwO3fFlSCzCzrDCFdJfZ4g== lodash.flow@^3.3.0: @@ -5111,7 +5819,7 @@ lodash.flow@^3.3.0: lodash.invokemap@^4.6.0: version "4.6.0" - resolved "https://registry.yarnpkg.com/lodash.invokemap/-/lodash.invokemap-4.6.0.tgz#1748cda5d8b0ef8369c4eb3ec54c21feba1f2d62" + resolved "https://registry.npmjs.org/lodash.invokemap/-/lodash.invokemap-4.6.0.tgz" integrity sha512-CfkycNtMqgUlfjfdh2BhKO/ZXrP8ePOX5lEU/g0R3ItJcnuxWDwokMGKx1hWcfOikmyOVx6X9IwWnDGlgKl61w== lodash.memoize@^4.1.2: @@ -5121,17 +5829,17 @@ lodash.memoize@^4.1.2: lodash.pullall@^4.2.0: version "4.2.0" - resolved "https://registry.yarnpkg.com/lodash.pullall/-/lodash.pullall-4.2.0.tgz#9d98b8518b7c965b0fae4099bd9fb7df8bbf38ba" + resolved "https://registry.npmjs.org/lodash.pullall/-/lodash.pullall-4.2.0.tgz" integrity sha512-VhqxBKH0ZxPpLhiu68YD1KnHmbhQJQctcipvmFnqIBDYzcIHzf3Zpu0tpeOKtR4x76p9yohc506eGdOjTmyIBg== -lodash.uniq@4.5.0, lodash.uniq@^4.5.0: +lodash.uniq@^4.5.0, lodash.uniq@4.5.0: version "4.5.0" resolved "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz" integrity sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ== lodash.uniqby@^4.7.0: version "4.7.0" - resolved "https://registry.yarnpkg.com/lodash.uniqby/-/lodash.uniqby-4.7.0.tgz#d99c07a669e9e6d24e1362dfe266c67616af1302" + resolved "https://registry.npmjs.org/lodash.uniqby/-/lodash.uniqby-4.7.0.tgz" integrity sha512-e/zcLx6CSbmaEgFHCA7BnoQKyCtKMxnuWrJygbwPs/AIn+IMKl66L8/s+wBUn5LRw2pZx3bUHibiV1b6aTWIww== lodash@^4.17.19, lodash@^4.17.20, lodash@^4.17.21: @@ -5165,7 +5873,7 @@ lowercase-keys@^2.0.0: lru-cache@^5.1.1: version "5.1.1" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" + resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz" integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== dependencies: yallist "^3.0.2" @@ -5184,6 +5892,11 @@ make-dir@^3.0.0, make-dir@^3.0.2, make-dir@^3.1.0: dependencies: semver "^6.0.0" +make-error@^1.1.1: + version "1.3.6" + resolved "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz" + integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== + markdown-escapes@^1.0.0: version "1.0.4" resolved "https://registry.npmjs.org/markdown-escapes/-/markdown-escapes-1.0.4.tgz" @@ -5239,7 +5952,7 @@ media-typer@0.3.0: memfs@^3.1.2, memfs@^3.4.3: version "3.6.0" - resolved "https://registry.yarnpkg.com/memfs/-/memfs-3.6.0.tgz#d7a2110f86f79dd950a8b6df6d57bc984aa185f6" + resolved "https://registry.npmjs.org/memfs/-/memfs-3.6.0.tgz" integrity sha512-EGowvkkgbMcIChjMTMkESFDbZeSh8xZ7kNSF0hAiAN4Jh6jgHCRS0Ga/+C8y6Au+oqpezRHCfPsmJ2+DwAgiwQ== dependencies: fs-monkey "^1.0.4" @@ -5264,6 +5977,15 @@ methods@~1.1.2: resolved "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz" integrity sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w== +micro@9.3.5-canary.3: + version "9.3.5-canary.3" + resolved "https://registry.npmjs.org/micro/-/micro-9.3.5-canary.3.tgz" + integrity sha512-viYIo9PefV+w9dvoIBh1gI44Mvx1BOk67B4BpC2QK77qdY0xZF0Q+vWLt/BII6cLkIc8rLmSIcJaB/OrXXKe1g== + dependencies: + arg "4.1.0" + content-type "1.0.4" + raw-body "2.4.1" + micromatch@^4.0.2, micromatch@^4.0.4, micromatch@^4.0.5: version "4.0.5" resolved "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz" @@ -5272,7 +5994,7 @@ micromatch@^4.0.2, micromatch@^4.0.4, micromatch@^4.0.5: braces "^3.0.2" picomatch "^2.3.1" -mime-db@1.52.0, "mime-db@>= 1.43.0 < 2": +"mime-db@>= 1.43.0 < 2", mime-db@1.52.0: version "1.52.0" resolved "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz" integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== @@ -5282,19 +6004,26 @@ mime-db@~1.33.0: resolved "https://registry.npmjs.org/mime-db/-/mime-db-1.33.0.tgz" integrity sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ== -mime-types@2.1.18, mime-types@~2.1.17: +mime-types@^2.1.27, mime-types@^2.1.31, mime-types@~2.1.24, mime-types@~2.1.34: + version "2.1.35" + resolved "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz" + integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== + dependencies: + mime-db "1.52.0" + +mime-types@~2.1.17: version "2.1.18" resolved "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz" integrity sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ== dependencies: mime-db "~1.33.0" -mime-types@^2.1.27, mime-types@^2.1.31, mime-types@~2.1.24, mime-types@~2.1.34: - version "2.1.35" - resolved "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz" - integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== +mime-types@2.1.18: + version "2.1.18" + resolved "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz" + integrity sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ== dependencies: - mime-db "1.52.0" + mime-db "~1.33.0" mime@1.6.0: version "1.6.0" @@ -5313,7 +6042,7 @@ mimic-response@^1.0.0, mimic-response@^1.0.1: mini-css-extract-plugin@^2.6.1: version "2.7.6" - resolved "https://registry.yarnpkg.com/mini-css-extract-plugin/-/mini-css-extract-plugin-2.7.6.tgz#282a3d38863fddcd2e0c220aaed5b90bc156564d" + resolved "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.7.6.tgz" integrity sha512-Qk7HcgaPkGG6eD77mLvZS1nmxlao3j+9PkrT9Uc7HAE1id3F41+DdBRYRYkbyfNRGzm8/YWtzhw7nVPmwhqTQw== dependencies: schema-utils "^4.0.0" @@ -5323,23 +6052,85 @@ minimalistic-assert@^1.0.0: resolved "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz" integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== -minimatch@3.1.2, minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.1: +minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.1, minimatch@3.1.2: version "3.1.2" resolved "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz" integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== dependencies: brace-expansion "^1.1.7" -minimist@^1.2.0, minimist@^1.2.5: +minimist@^1.2.0, minimist@^1.2.5, minimist@^1.2.6: version "1.2.8" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" + resolved "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz" integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== +minipass@^2.6.0, minipass@^2.9.0: + version "2.9.0" + resolved "https://registry.npmjs.org/minipass/-/minipass-2.9.0.tgz" + integrity sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg== + dependencies: + safe-buffer "^5.1.2" + yallist "^3.0.0" + +minipass@^3.0.0: + version "3.3.6" + resolved "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz" + integrity sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw== + dependencies: + yallist "^4.0.0" + +minipass@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz" + integrity sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ== + +minizlib@^1.3.3: + version "1.3.3" + resolved "https://registry.npmjs.org/minizlib/-/minizlib-1.3.3.tgz" + integrity sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q== + dependencies: + minipass "^2.9.0" + +minizlib@^2.1.1: + version "2.1.2" + resolved "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz" + integrity sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg== + dependencies: + minipass "^3.0.0" + yallist "^4.0.0" + +mkdirp@^0.5.5: + version "0.5.6" + resolved "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz" + integrity sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw== + dependencies: + minimist "^1.2.6" + +mkdirp@^1.0.3: + version "1.0.4" + resolved "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz" + integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== + +mkdirp@^1.0.4: + version "1.0.4" + resolved "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz" + integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== + +mri@1.2.0: + version "1.2.0" + resolved "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz" + integrity sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA== + mrmime@^1.0.0: version "1.0.1" resolved "https://registry.npmjs.org/mrmime/-/mrmime-1.0.1.tgz" integrity sha512-hzzEagAgDyoU1Q6yg5uI+AorQgdvMCur3FcKf7NhMKWsaYg+RnbTyHRa/9IlLF9rf455MOCtcqqrQQ83pPP7Uw== +ms@^2.1.1, ms@2.1.1: + version "2.1.1" + resolved "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz" + integrity sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg== + ms@2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz" @@ -5402,22 +6193,48 @@ node-emoji@^1.10.0: dependencies: lodash "^4.17.21" -node-fetch@^2.6.12: +node-fetch@^2.6.12, node-fetch@^2.6.7: version "2.7.0" resolved "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz" integrity sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A== dependencies: whatwg-url "^5.0.0" +node-fetch@2.6.7: + version "2.6.7" + resolved "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz" + integrity sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ== + dependencies: + whatwg-url "^5.0.0" + +node-fetch@2.6.9: + version "2.6.9" + resolved "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.9.tgz" + integrity sha512-DJm/CJkZkRjKKj4Zi4BsKVZh3ValV5IR5s7LVZnW+6YMh0W1BfNA8XSs6DLMGYlId5F3KnA70uu2qepcR08Qqg== + dependencies: + whatwg-url "^5.0.0" + node-forge@^1: version "1.3.1" resolved "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz" integrity sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA== -node-releases@^2.0.13: - version "2.0.13" - resolved "https://registry.npmjs.org/node-releases/-/node-releases-2.0.13.tgz" - integrity sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ== +node-gyp-build@^4.2.2: + version "4.8.0" + resolved "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.8.0.tgz" + integrity sha512-u6fs2AEUljNho3EYTJNBfImO5QTo/J/1Etd+NVdCj7qWKUSN/bSLkZwhDv7I+w/MSC6qJ4cknepkAYykDdK8og== + +node-releases@^2.0.14: + version "2.0.14" + resolved "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz" + integrity sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw== + +nopt@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz" + integrity sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ== + dependencies: + abbrev "1" normalize-path@^3.0.0, normalize-path@~3.0.0: version "3.0.0" @@ -5439,13 +6256,23 @@ normalize-url@^6.0.1: resolved "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz" integrity sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A== -npm-run-path@^4.0.1: +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" integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== dependencies: path-key "^3.0.0" +npmlog@^5.0.1: + version "5.0.1" + resolved "https://registry.npmjs.org/npmlog/-/npmlog-5.0.1.tgz" + integrity sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw== + dependencies: + are-we-there-yet "^2.0.0" + console-control-strings "^1.1.0" + gauge "^3.0.0" + set-blocking "^2.0.0" + nprogress@^0.2.0: version "0.2.0" resolved "https://registry.npmjs.org/nprogress/-/nprogress-0.2.0.tgz" @@ -5512,7 +6339,14 @@ once@^1.3.0, once@^1.3.1, once@^1.4.0: dependencies: wrappy "1" -onetime@^5.1.2: +once@~1.3.0: + version "1.3.3" + resolved "https://registry.npmjs.org/once/-/once-1.3.3.tgz" + integrity sha512-6vaNInhu+CHxtONf3zw3vq4SP2DOQhjBvIa3rNcG0+P7eKWlYH6Peu7rHizSloRU2EwMz6GraLieis9Ac9+p1w== + dependencies: + wrappy "1" + +onetime@^5.1.0, onetime@^5.1.2: version "5.1.2" resolved "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz" integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== @@ -5521,7 +6355,7 @@ onetime@^5.1.2: open@^8.0.9, open@^8.4.0: version "8.4.2" - resolved "https://registry.yarnpkg.com/open/-/open-8.4.2.tgz#5b5ffe2a8f793dcd2aad73e550cb87b59cb084f9" + resolved "https://registry.npmjs.org/open/-/open-8.4.2.tgz" integrity sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ== dependencies: define-lazy-prop "^2.0.0" @@ -5533,11 +6367,21 @@ opener@^1.5.2: resolved "https://registry.npmjs.org/opener/-/opener-1.5.2.tgz" integrity sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A== +os-paths@^4.0.1: + version "4.4.0" + resolved "https://registry.npmjs.org/os-paths/-/os-paths-4.4.0.tgz" + integrity sha512-wrAwOeXp1RRMFfQY8Sy7VaGVmPocaLwSFOYCGKSyo8qmJ+/yaafCl5BCA1IQZWqFSRBrKDYFeR9d/VyQzfH/jg== + p-cancelable@^1.0.0: version "1.1.0" resolved "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz" integrity sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw== +p-finally@^2.0.0: + version "2.0.1" + resolved "https://registry.npmjs.org/p-finally/-/p-finally-2.0.1.tgz" + integrity sha512-vpm09aKwq6H9phqRQzecoDpD8TmVyGw70qmWlyq5onxY7tqyTTFVvxMykxQSQKILBSFlbXpypIw2T1Ml7+DDtw== + 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" @@ -5640,6 +6484,11 @@ parse-json@^5.0.0, parse-json@^5.2.0: json-parse-even-better-errors "^2.3.0" lines-and-columns "^1.1.6" +parse-ms@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/parse-ms/-/parse-ms-2.1.0.tgz" + integrity sha512-kHt7kzLoS9VBZfUsiKjv43mr91ea+U05EyKkEtqp7vNbHxmaVuEqN7XxeEVnGrMtYOAxGrDElSi96K7EgO1zCA== + parse-numeric-range@^1.3.0: version "1.3.0" resolved "https://registry.npmjs.org/parse-numeric-range/-/parse-numeric-range-1.3.0.tgz" @@ -5678,6 +6527,11 @@ pascal-case@^3.1.2: no-case "^3.0.4" tslib "^2.0.3" +path-browserify@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz" + integrity sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g== + path-exists@^3.0.0: version "3.0.0" resolved "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz" @@ -5703,11 +6557,33 @@ path-key@^3.0.0, path-key@^3.1.0: resolved "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz" integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== +path-match@1.2.4: + version "1.2.4" + resolved "https://registry.npmjs.org/path-match/-/path-match-1.2.4.tgz" + integrity sha512-UWlehEdqu36jmh4h5CWJ7tARp1OEVKGHKm6+dg9qMq5RKUTV5WJrGgaZ3dN2m7WFAXDbjlHzvJvL/IUpy84Ktw== + dependencies: + http-errors "~1.4.0" + path-to-regexp "^1.0.0" + path-parse@^1.0.7: version "1.0.7" resolved "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz" integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== +path-to-regexp@^1.0.0: + version "1.8.0" + resolved "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz" + integrity sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA== + dependencies: + isarray "0.0.1" + +path-to-regexp@^1.7.0: + version "1.8.0" + resolved "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz" + integrity sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA== + dependencies: + isarray "0.0.1" + path-to-regexp@0.1.7: version "0.1.7" resolved "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz" @@ -5718,12 +6594,15 @@ path-to-regexp@2.2.1: resolved "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-2.2.1.tgz" integrity sha512-gu9bD6Ta5bwGrrU8muHzVOBFFREpp2iRkVfhBJahwJ6p6Xw20SjT0MxLnwkjOibQmGSYhiUnf2FLe7k+jcFmGQ== -path-to-regexp@^1.7.0: - version "1.8.0" - resolved "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz" - integrity sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA== - dependencies: - isarray "0.0.1" +path-to-regexp@6.1.0: + version "6.1.0" + resolved "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.1.0.tgz" + integrity sha512-h9DqehX3zZZDCEm+xbfU0ZmwCGFCAAraPJWMXJ4+v32NjZJilVg3k1TcKsRgIb8IQ/izZSaydDc1OhJCZvs2Dw== + +path-to-regexp@6.2.1: + version "6.2.1" + resolved "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.2.1.tgz" + integrity sha512-JLyh7xT1kizaEvcaXOQwOc2/Yhw6KZOvPf1S8401UyLk86CU79LN3vl7ztXGm/pZ+YjoyAJ4rxmHwbkBXJX+yw== path-type@^4.0.0: version "4.0.0" @@ -5738,12 +6617,17 @@ path@^0.12.7: process "^0.11.1" util "^0.10.3" -picocolors@^1.0.0: +pend@~1.2.0: + version "1.2.0" + resolved "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz" + integrity sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg== + +picocolors@^1.0.0, picocolors@1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz" integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== -picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.3, picomatch@^2.3.1: +picomatch@^2.0.4, picomatch@^2.0.7, picomatch@^2.2.1, picomatch@^2.2.2, picomatch@^2.2.3, picomatch@^2.3.1: version "2.3.1" resolved "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz" integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== @@ -5851,7 +6735,7 @@ postcss-load-config@^4.0.1: postcss-loader@^7.0.0: version "7.3.3" - resolved "https://registry.yarnpkg.com/postcss-loader/-/postcss-loader-7.3.3.tgz#6da03e71a918ef49df1bb4be4c80401df8e249dd" + resolved "https://registry.npmjs.org/postcss-loader/-/postcss-loader-7.3.3.tgz" integrity sha512-YgO/yhtevGO/vJePCQmTxiaEwER94LABZN0ZMT4A0vsak9TpO+RvKRs7EmJ8peIlB9xfXCsS7M8LjqncsUZ5HA== dependencies: cosmiconfig "^8.2.0" @@ -5923,7 +6807,7 @@ postcss-modules-extract-imports@^3.0.0: postcss-modules-local-by-default@^4.0.3: version "4.0.3" - resolved "https://registry.yarnpkg.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.3.tgz#b08eb4f083050708998ba2c6061b50c2870ca524" + resolved "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.3.tgz" integrity sha512-2/u2zraspoACtrbFRnTijMiQtb4GW4BvatjaG/bCjYQo8kLTdevCUlwuBHx2sCnSyrI3x3qj4ZK1j5LQBgzmwA== dependencies: icss-utils "^5.0.0" @@ -6084,7 +6968,7 @@ postcss-zindex@^5.1.0: resolved "https://registry.npmjs.org/postcss-zindex/-/postcss-zindex-5.1.0.tgz" integrity sha512-fgFMf0OtVSBR1va1JNHYgMxYk73yhn/qb4uQDq1DLGYolz8gHCyr/sesEuGUaYs58E3ZJRcpoGuPVoB7Meiq9A== -postcss@^8.3.11, postcss@^8.4.14, postcss@^8.4.17, postcss@^8.4.21, postcss@^8.4.23, postcss@^8.4.31: +"postcss@^7.0.0 || ^8.0.1", postcss@^8.0.0, postcss@^8.0.9, postcss@^8.1.0, postcss@^8.2.14, postcss@^8.2.15, postcss@^8.2.2, postcss@^8.3.11, postcss@^8.4.14, postcss@^8.4.16, postcss@^8.4.17, postcss@^8.4.21, postcss@^8.4.23, postcss@^8.4.31, postcss@>=8.0.9: version "8.4.31" resolved "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz" integrity sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ== @@ -6106,6 +6990,13 @@ pretty-error@^4.0.0: lodash "^4.17.20" renderkid "^3.0.0" +pretty-ms@7.0.1: + version "7.0.1" + resolved "https://registry.npmjs.org/pretty-ms/-/pretty-ms-7.0.1.tgz" + integrity sha512-973driJZvxiGOQ5ONsFhOF/DtzPMOMtgC11kCpUrPGMTgqp2q/1gwzCquocrN33is0VZ5GFHXZYMM9l6h67v2Q== + dependencies: + parse-ms "^2.1.0" + pretty-time@^1.1.0: version "1.1.0" resolved "https://registry.npmjs.org/pretty-time/-/pretty-time-1.1.0.tgz" @@ -6138,6 +7029,11 @@ promise@^7.1.1: dependencies: asap "~2.0.3" +promisepipe@3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/promisepipe/-/promisepipe-3.0.0.tgz" + integrity sha512-V6TbZDJ/ZswevgkDNpGt/YqNCiZP9ASfgU+p83uJE6NrGtvSGoOcHLiDCqkMs2+yg7F5qHdLV8d0aS8O26G/KA== + prompts@^2.4.2: version "2.4.2" resolved "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz" @@ -6185,7 +7081,7 @@ punycode@^1.3.2: punycode@^2.1.0: version "2.3.1" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.1.tgz#027422e2faec0b25e1549c3e1bd8309b9133b6e5" + resolved "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz" integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg== pupa@^2.1.1: @@ -6202,7 +7098,7 @@ pure-color@^1.2.0: qs@6.11.0: version "6.11.0" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.11.0.tgz#fd0d963446f7a65e1367e01abd85429453f0c37a" + resolved "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz" integrity sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q== dependencies: side-channel "^1.0.4" @@ -6226,15 +7122,25 @@ randombytes@^2.1.0: dependencies: safe-buffer "^5.1.0" +range-parser@^1.2.1, range-parser@~1.2.1: + version "1.2.1" + resolved "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz" + integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== + range-parser@1.2.0: version "1.2.0" resolved "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz" integrity sha512-kA5WQoNVo4t9lNx2kQNFCxKeBl5IbbSNBl1M/tLkw9WCn+hxNBAW5Qh8gdhs63CJnhjJ2zQWFoqPJP2sK1AV5A== -range-parser@^1.2.1, range-parser@~1.2.1: - version "1.2.1" - resolved "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz" - integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== +raw-body@2.4.1: + version "2.4.1" + resolved "https://registry.npmjs.org/raw-body/-/raw-body-2.4.1.tgz" + integrity sha512-9WmIKF6mkvA0SLmA2Knm9+qj89e+j1zqgyn8aXGd7+nAduPoqgI9lO57SAZNn/Byzo5P7JhXTyg9PzaJbH73bA== + dependencies: + bytes "3.1.0" + http-errors "1.7.3" + iconv-lite "0.4.24" + unpipe "1.0.0" raw-body@2.5.1: version "2.5.1" @@ -6246,7 +7152,7 @@ raw-body@2.5.1: iconv-lite "0.4.24" unpipe "1.0.0" -rc@1.2.8, rc@^1.2.8: +rc@^1.2.8, rc@1.2.8: version "1.2.8" resolved "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz" integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw== @@ -6296,7 +7202,7 @@ react-dev-utils@^12.0.1: strip-ansi "^6.0.1" text-table "^0.2.0" -react-dom@^17.0.2: +react-dom@*, "react-dom@^16.6.0 || ^17.0.0 || ^18.0.0", "react-dom@^16.8.4 || ^17.0.0", "react-dom@^17.0.0 || ^16.3.0 || ^15.5.4", react-dom@^17.0.2, "react-dom@>= 16.8.0 < 19.0.0": version "17.0.2" resolved "https://registry.npmjs.org/react-dom/-/react-dom-17.0.2.tgz" integrity sha512-s4h96KtLDUQlsENhMn1ar8t2bEa+q/YAtj8pPPdIjPDGBDIVNsrD9aXNWqspUe6AzKCIG0C1HZZLqLV7qpOBGA== @@ -6312,7 +7218,7 @@ react-error-overlay@^6.0.11: react-fast-compare@^3.2.0: version "3.2.2" - resolved "https://registry.yarnpkg.com/react-fast-compare/-/react-fast-compare-3.2.2.tgz#929a97a532304ce9fee4bcae44234f1ce2c21d49" + resolved "https://registry.npmjs.org/react-fast-compare/-/react-fast-compare-3.2.2.tgz" integrity sha512-nsO+KSNgo1SbJqJEYRE9ERzo7YtYbou/OqjSQKxV7jcKox7+usiUVZOAC+XnDOABXggQTno0Y1CpVnuWEc1boQ== react-helmet-async@*, react-helmet-async@^1.3.0: @@ -6353,6 +7259,14 @@ react-loadable-ssr-addon-v5-slorber@^1.0.1: dependencies: "@babel/runtime" "^7.10.3" +react-loadable@*, "react-loadable@npm:@docusaurus/react-loadable@5.5.2": + version "5.5.2" + resolved "https://registry.npmjs.org/@docusaurus/react-loadable/-/react-loadable-5.5.2.tgz" + integrity sha512-A3dYjdBGuy0IGT+wyLIGIKLRE+sAk1iNk0f1HjNDysO7u8lhL4N3VEm+FAubmJbAztn94F7MxBTPmnixbiyFdQ== + dependencies: + "@types/react" "*" + prop-types "^15.6.2" + react-router-config@^5.1.1: version "5.1.1" resolved "https://registry.npmjs.org/react-router-config/-/react-router-config-5.1.1.tgz" @@ -6362,7 +7276,7 @@ react-router-config@^5.1.1: react-router-dom@^5.3.3: version "5.3.4" - resolved "https://registry.yarnpkg.com/react-router-dom/-/react-router-dom-5.3.4.tgz#2ed62ffd88cae6db134445f4a0c0ae8b91d2e5e6" + resolved "https://registry.npmjs.org/react-router-dom/-/react-router-dom-5.3.4.tgz" integrity sha512-m4EqFMHv/Ih4kpcBCONHbkT68KoAeHN4p3lAGoNryfHi0dMy0kCzEZakiKRsvg5wHZ/JLrLW8o8KomWiz/qbYQ== dependencies: "@babel/runtime" "^7.12.13" @@ -6373,9 +7287,9 @@ react-router-dom@^5.3.3: tiny-invariant "^1.0.2" tiny-warning "^1.0.0" -react-router@5.3.4, react-router@^5.3.3: +react-router@^5.3.3, react-router@>=5, react-router@5.3.4: version "5.3.4" - resolved "https://registry.yarnpkg.com/react-router/-/react-router-5.3.4.tgz#8ca252d70fcc37841e31473c7a151cf777887bb5" + resolved "https://registry.npmjs.org/react-router/-/react-router-5.3.4.tgz" integrity sha512-Ys9K+ppnJah3QuaRiLxk+jDWOR1MekYQrlytiXxC1RyfbdsZkS5pvKAzCCr031xHixZwpnsYNT5xysdFHQaYsA== dependencies: "@babel/runtime" "^7.12.13" @@ -6397,7 +7311,7 @@ react-textarea-autosize@^8.3.2: use-composed-ref "^1.3.0" use-latest "^1.2.1" -react@^17.0.2: +react@*, "react@^15.0.2 || ^16.0.0 || ^17.0.0", "react@^16.13.1 || ^17.0.0", "react@^16.6.0 || ^17.0.0 || ^18.0.0", "react@^16.8.0 || ^17.0.0 || ^18.0.0", "react@^16.8.4 || ^17.0.0", "react@^17.0.0 || ^16.3.0 || ^15.5.4", react@^17.0.2, "react@>= 16.8.0 < 19.0.0", react@>=0.14.9, react@>=15, react@17.0.2: version "17.0.2" resolved "https://registry.npmjs.org/react/-/react-17.0.2.tgz" integrity sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA== @@ -6414,7 +7328,7 @@ read-cache@^1.0.0: readable-stream@^2.0.1: version "2.3.8" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.8.tgz#91125e8042bba1b9887f49345f6277027ce8be9b" + resolved "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz" integrity sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA== dependencies: core-util-is "~1.0.0" @@ -6425,15 +7339,22 @@ readable-stream@^2.0.1: string_decoder "~1.1.1" util-deprecate "~1.0.1" -readable-stream@^3.0.6: +readable-stream@^3.0.6, readable-stream@^3.6.0: version "3.6.2" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967" + resolved "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz" integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== dependencies: inherits "^2.0.3" string_decoder "^1.1.1" util-deprecate "^1.0.1" +readdirp@~3.3.0: + version "3.3.0" + resolved "https://registry.npmjs.org/readdirp/-/readdirp-3.3.0.tgz" + integrity sha512-zz0pAkSPOXXm1viEwygWIPSPkcBYjW1xU5j/JBh5t9bGCJwa6f9+BJa6VaB2g+b55yVrmXzqkyLf4xaWYM0IkQ== + dependencies: + picomatch "^2.0.7" + readdirp@~3.6.0: version "3.6.0" resolved "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz" @@ -6455,14 +7376,14 @@ rechoir@^0.6.2: recursive-readdir@^2.2.2: version "2.2.3" - resolved "https://registry.yarnpkg.com/recursive-readdir/-/recursive-readdir-2.2.3.tgz#e726f328c0d69153bcabd5c322d3195252379372" + resolved "https://registry.npmjs.org/recursive-readdir/-/recursive-readdir-2.2.3.tgz" integrity sha512-8HrF5ZsXk5FAH9dgsx3BlUer73nIhuj+9OrQwEbLTPOBzGkL1lsFCR01am+v+0m2Cmbs1nP12hLDl5FA7EszKA== dependencies: minimatch "^3.0.5" regenerate-unicode-properties@^10.1.0: version "10.1.1" - resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.1.tgz#6b0e05489d9076b04c436f318d9b067bba459480" + resolved "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.1.tgz" integrity sha512-X007RyZLsCJVVrjgEFVpLUTZwyOZk3oiL75ZcuYjlIWd6rNJtOjkBwQc5AsRrpbKVkxN6sklw/k/9m2jJYOf8Q== dependencies: regenerate "^1.4.2" @@ -6479,14 +7400,14 @@ regenerator-runtime@^0.14.0: regenerator-transform@^0.15.2: version "0.15.2" - resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.15.2.tgz#5bbae58b522098ebdf09bca2f83838929001c7a4" + resolved "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.2.tgz" integrity sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg== dependencies: "@babel/runtime" "^7.8.4" regexpu-core@^5.3.1: version "5.3.2" - resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-5.3.2.tgz#11a2b06884f3527aec3e93dbbf4a3b958a95546b" + resolved "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.3.2.tgz" integrity sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ== dependencies: "@babel/regjsgen" "^0.8.0" @@ -6512,7 +7433,7 @@ registry-url@^5.0.0: regjsparser@^0.9.1: version "0.9.1" - resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.9.1.tgz#272d05aa10c7c1f67095b1ff0addae8442fc5709" + resolved "https://registry.npmjs.org/regjsparser/-/regjsparser-0.9.1.tgz" integrity sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ== dependencies: jsesc "~0.5.0" @@ -6615,6 +7536,11 @@ resolve-from@^4.0.0: resolved "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz" integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== +resolve-from@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz" + integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== + resolve-pathname@^3.0.0: version "3.0.0" resolved "https://registry.npmjs.org/resolve-pathname/-/resolve-pathname-3.0.0.tgz" @@ -6677,17 +7603,27 @@ run-parallel@^1.1.9: rxjs@^7.5.4: version "7.8.1" - resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-7.8.1.tgz#6f6f3d99ea8044291efd92e7c7fcf562c4057543" + resolved "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz" integrity sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg== dependencies: tslib "^2.1.0" -safe-buffer@5.1.2, safe-buffer@>=5.1.0, safe-buffer@^5.1.0, safe-buffer@~5.1.0, safe-buffer@~5.1.1: +safe-buffer@^5.1.0, safe-buffer@^5.1.2, safe-buffer@>=5.1.0, safe-buffer@~5.1.0, safe-buffer@~5.1.1, safe-buffer@5.1.2: version "5.1.2" resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz" integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== -safe-buffer@5.2.1, safe-buffer@~5.2.0: +safe-buffer@^5.2.1: + version "5.2.1" + resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz" + integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== + +safe-buffer@~5.2.0: + version "5.2.1" + resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz" + integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== + +safe-buffer@5.2.1: version "5.2.1" resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz" integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== @@ -6710,15 +7646,6 @@ scheduler@^0.20.2: loose-envify "^1.1.0" object-assign "^4.1.1" -schema-utils@2.7.0: - version "2.7.0" - resolved "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.0.tgz" - integrity sha512-0ilKFI6QQF5nxDZLFn2dMjvc4hjg/Wkg7rHd3jK6/A4a1Hl9VFdQWvgB1UMGoU94pad1P/8N7fMcEnLnSiju8A== - dependencies: - "@types/json-schema" "^7.0.4" - ajv "^6.12.2" - ajv-keywords "^3.4.1" - schema-utils@^2.6.5: version "2.7.1" resolved "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz" @@ -6728,9 +7655,27 @@ schema-utils@^2.6.5: ajv "^6.12.4" ajv-keywords "^3.5.2" -schema-utils@^3.0.0, schema-utils@^3.1.1, schema-utils@^3.2.0: +schema-utils@^3.0.0: version "3.3.0" - resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-3.3.0.tgz#f50a88877c3c01652a15b622ae9e9795df7a60fe" + resolved "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz" + integrity sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg== + dependencies: + "@types/json-schema" "^7.0.8" + ajv "^6.12.5" + ajv-keywords "^3.5.2" + +schema-utils@^3.1.1: + version "3.3.0" + resolved "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz" + integrity sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg== + dependencies: + "@types/json-schema" "^7.0.8" + ajv "^6.12.5" + ajv-keywords "^3.5.2" + +schema-utils@^3.2.0: + version "3.3.0" + resolved "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz" integrity sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg== dependencies: "@types/json-schema" "^7.0.8" @@ -6739,7 +7684,7 @@ schema-utils@^3.0.0, schema-utils@^3.1.1, schema-utils@^3.2.0: schema-utils@^4.0.0: version "4.2.0" - resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-4.2.0.tgz#70d7c93e153a273a805801882ebd3bff20d89c8b" + resolved "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz" integrity sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw== dependencies: "@types/json-schema" "^7.0.9" @@ -6747,6 +7692,20 @@ schema-utils@^4.0.0: ajv-formats "^2.1.1" ajv-keywords "^5.1.0" +schema-utils@2.7.0: + version "2.7.0" + resolved "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.0.tgz" + integrity sha512-0ilKFI6QQF5nxDZLFn2dMjvc4hjg/Wkg7rHd3jK6/A4a1Hl9VFdQWvgB1UMGoU94pad1P/8N7fMcEnLnSiju8A== + dependencies: + "@types/json-schema" "^7.0.4" + ajv "^6.12.2" + ajv-keywords "^3.4.1" + +"search-insights@>= 1 < 3": + version "2.13.0" + resolved "https://registry.npmjs.org/search-insights/-/search-insights-2.13.0.tgz" + integrity sha512-Orrsjf9trHHxFRuo9/rzm0KIWmgzE8RMlZMzuhZOJ01Rnz3D0YBAe+V6473t6/H6c7irs6Lt48brULAiRWb3Vw== + section-matter@^1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/section-matter/-/section-matter-1.0.0.tgz" @@ -6762,7 +7721,7 @@ select-hose@^2.0.0: selfsigned@^2.1.1: version "2.4.1" - resolved "https://registry.yarnpkg.com/selfsigned/-/selfsigned-2.4.1.tgz#560d90565442a3ed35b674034cec4e95dceb4ae0" + resolved "https://registry.npmjs.org/selfsigned/-/selfsigned-2.4.1.tgz" integrity sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q== dependencies: "@types/node-forge" "^1.3.0" @@ -6780,18 +7739,53 @@ semver@^5.4.1: resolved "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz" integrity sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g== -semver@^6.0.0, semver@^6.2.0, semver@^6.3.0, semver@^6.3.1: +semver@^6.0.0, semver@^6.2.0, semver@^6.3.0, semver@^6.3.1, semver@6.3.1: version "6.3.1" - resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" + resolved "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz" integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== -semver@^7.3.2, semver@^7.3.4, semver@^7.3.7, semver@^7.3.8: +semver@^7.3.2: + version "7.5.4" + resolved "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz" + integrity sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA== + dependencies: + lru-cache "^6.0.0" + +semver@^7.3.4: + version "7.5.4" + resolved "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz" + integrity sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA== + dependencies: + lru-cache "^6.0.0" + +semver@^7.3.5: version "7.5.4" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.4.tgz#483986ec4ed38e1c6c48c34894a9182dbff68a6e" + resolved "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz" integrity sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA== dependencies: lru-cache "^6.0.0" +semver@^7.3.7: + version "7.5.4" + resolved "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz" + integrity sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA== + dependencies: + lru-cache "^6.0.0" + +semver@^7.3.8: + version "7.5.4" + resolved "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz" + integrity sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA== + dependencies: + lru-cache "^6.0.0" + +semver@7.3.5: + version "7.3.5" + resolved "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz" + integrity sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ== + dependencies: + lru-cache "^6.0.0" + send@0.18.0: version "0.18.0" resolved "https://registry.npmjs.org/send/-/send-0.18.0.tgz" @@ -6813,14 +7807,14 @@ send@0.18.0: serialize-javascript@^6.0.0, serialize-javascript@^6.0.1: version "6.0.1" - resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-6.0.1.tgz#b206efb27c3da0b0ab6b52f48d170b7996458e5c" + resolved "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.1.tgz" integrity sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w== dependencies: randombytes "^2.1.0" serve-handler@^6.1.3: version "6.1.5" - resolved "https://registry.yarnpkg.com/serve-handler/-/serve-handler-6.1.5.tgz#a4a0964f5c55c7e37a02a633232b6f0d6f068375" + resolved "https://registry.npmjs.org/serve-handler/-/serve-handler-6.1.5.tgz" integrity sha512-ijPFle6Hwe8zfmBxJdE+5fta53fdIY0lHISJvuikXB3VYFafRjMRpOffSPvCYsbKyBA7pvy9oYr/BT1O3EArlg== dependencies: bytes "3.0.0" @@ -6855,6 +7849,11 @@ serve-static@1.15.0: parseurl "~1.3.3" send "0.18.0" +set-blocking@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz" + integrity sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw== + setimmediate@^1.0.5: version "1.0.5" resolved "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz" @@ -6865,6 +7864,11 @@ setprototypeof@1.1.0: resolved "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz" integrity sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ== +setprototypeof@1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz" + integrity sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw== + setprototypeof@1.2.0: version "1.2.0" resolved "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz" @@ -6896,7 +7900,7 @@ shebang-regex@^3.0.0: shell-quote@^1.7.3, shell-quote@^1.8.1: version "1.8.1" - resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.8.1.tgz#6dbf4db75515ad5bac63b4f1894c3a154c766680" + resolved "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.1.tgz" integrity sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA== shelljs@^0.8.5: @@ -6917,14 +7921,19 @@ side-channel@^1.0.4: get-intrinsic "^1.0.2" object-inspect "^1.9.0" -signal-exit@^3.0.2, signal-exit@^3.0.3: +signal-exit@^3.0.0, signal-exit@^3.0.2, signal-exit@^3.0.3: version "3.0.7" resolved "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz" integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== +signal-exit@4.0.2: + version "4.0.2" + resolved "https://registry.npmjs.org/signal-exit/-/signal-exit-4.0.2.tgz" + integrity sha512-MY2/qGx4enyjprQnFaZsHib3Yadh3IXyV2C321GY0pjGfVBu4un0uDJkwgdxqO+Rdx8JMT8IfJIRwbYVz3Ob3Q== + sirv@^2.0.3: version "2.0.3" - resolved "https://registry.yarnpkg.com/sirv/-/sirv-2.0.3.tgz#ca5868b87205a74bef62a469ed0296abceccd446" + resolved "https://registry.npmjs.org/sirv/-/sirv-2.0.3.tgz" integrity sha512-O9jm9BsID1P+0HOi81VpXPoDxYP374pkOLzACAoyUQ/3OUVndNpsz6wMnY2z+yOxzbllCKZrM+9QrWsv4THnyA== dependencies: "@polka/url" "^1.0.0-next.20" @@ -7031,43 +8040,56 @@ stable@^0.1.8: resolved "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz" integrity sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w== +stat-mode@0.3.0: + version "0.3.0" + resolved "https://registry.npmjs.org/stat-mode/-/stat-mode-0.3.0.tgz" + integrity sha512-QjMLR0A3WwFY2aZdV0okfFEJB5TRjkggXZjxP3A1RsWsNHNu3YPv8btmtc6iCFZ0Rul3FE93OYogvhOUClU+ng== + state-toggle@^1.0.0: version "1.0.3" resolved "https://registry.npmjs.org/state-toggle/-/state-toggle-1.0.3.tgz" integrity sha512-d/5Z4/2iiCnHw6Xzghyhb+GcmF89bxwgXG60wjIiZaxnymbyOmI8Hk4VqHXiVVp6u2ysaskFfXg3ekCj4WNftQ== -statuses@2.0.1: - version "2.0.1" - resolved "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz" - integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== +"statuses@>= 1.2.1 < 2": + version "1.5.0" + resolved "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz" + integrity sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA== "statuses@>= 1.4.0 < 2": version "1.5.0" resolved "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz" integrity sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA== +"statuses@>= 1.5.0 < 2": + version "1.5.0" + resolved "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz" + integrity sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA== + +statuses@2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz" + integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== + std-env@^3.0.1: version "3.4.3" - resolved "https://registry.yarnpkg.com/std-env/-/std-env-3.4.3.tgz#326f11db518db751c83fd58574f449b7c3060910" + resolved "https://registry.npmjs.org/std-env/-/std-env-3.4.3.tgz" integrity sha512-f9aPhy8fYBuMN+sNfakZV18U39PbalgjXG3lLB9WkaYTxijru61wb57V9wxxNthXM5Sd88ETBWi29qLAsHO52Q== -string-width@^4.0.0, string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.2: - version "4.2.3" - resolved "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz" - integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== +stream-to-array@~2.3.0: + version "2.3.0" + resolved "https://registry.npmjs.org/stream-to-array/-/stream-to-array-2.3.0.tgz" + integrity sha512-UsZtOYEn4tWU2RGLOXr/o/xjRBftZRlG3dEWoaHr8j4GuypJ3isitGbVyjQKAuMu+xbiop8q224TjiZWc4XTZA== dependencies: - emoji-regex "^8.0.0" - is-fullwidth-code-point "^3.0.0" - strip-ansi "^6.0.1" + any-promise "^1.1.0" -string-width@^5.0.1: - version "5.1.2" - resolved "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz" - integrity sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA== +stream-to-promise@2.2.0: + version "2.2.0" + resolved "https://registry.npmjs.org/stream-to-promise/-/stream-to-promise-2.2.0.tgz" + integrity sha512-HAGUASw8NT0k8JvIVutB2Y/9iBk7gpgEyAudXwNJmZERdMITGdajOa4VJfD/kNiA3TppQpTP4J+CtcHwdzKBAw== dependencies: - eastasianwidth "^0.2.0" - emoji-regex "^9.2.2" - strip-ansi "^7.0.1" + any-promise "~1.3.0" + end-of-stream "~1.1.0" + stream-to-array "~2.3.0" string_decoder@^1.1.1: version "1.3.0" @@ -7083,6 +8105,24 @@ string_decoder@~1.1.1: dependencies: safe-buffer "~5.1.0" +"string-width@^1.0.2 || 2 || 3 || 4", string-width@^4.0.0, string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.2, string-width@^4.2.3: + version "4.2.3" + resolved "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" + +string-width@^5.0.1: + version "5.1.2" + resolved "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz" + integrity sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA== + dependencies: + eastasianwidth "^0.2.0" + emoji-regex "^9.2.2" + strip-ansi "^7.0.1" + stringify-object@^3.3.0: version "3.3.0" resolved "https://registry.npmjs.org/stringify-object/-/stringify-object-3.3.0.tgz" @@ -7101,7 +8141,7 @@ strip-ansi@^6.0.0, strip-ansi@^6.0.1: strip-ansi@^7.0.1: version "7.1.0" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.1.0.tgz#d5b6568ca689d8561370b0707685d22434faff45" + resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz" integrity sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ== dependencies: ansi-regex "^6.0.1" @@ -7126,7 +8166,7 @@ strip-json-comments@~2.0.1: resolved "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz" integrity sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ== -style-to-object@0.3.0, style-to-object@^0.3.0: +style-to-object@^0.3.0, style-to-object@0.3.0: version "0.3.0" resolved "https://registry.npmjs.org/style-to-object/-/style-to-object-0.3.0.tgz" integrity sha512-CzFnRRXhzWIdItT3OmF8SQfWyahHhjq3HwcMNCNLn+N7klOOqPjMeG/4JSu77D7ypZdGvSzvkrbyeTMizz2VrA== @@ -7236,9 +8276,34 @@ tapable@^2.0.0, tapable@^2.1.1, tapable@^2.2.0: resolved "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz" integrity sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ== +tar@^6.1.11: + version "6.2.0" + resolved "https://registry.npmjs.org/tar/-/tar-6.2.0.tgz" + integrity sha512-/Wo7DcT0u5HUV486xg675HtjNd3BXZ6xDbzsCUZPt5iw8bTQ63bP0Raut3mvro9u+CUyq7YQd8Cx55fsZXxqLQ== + dependencies: + chownr "^2.0.0" + fs-minipass "^2.0.0" + minipass "^5.0.0" + minizlib "^2.1.1" + mkdirp "^1.0.3" + yallist "^4.0.0" + +tar@4.4.18: + version "4.4.18" + resolved "https://registry.npmjs.org/tar/-/tar-4.4.18.tgz" + integrity sha512-ZuOtqqmkV9RE1+4odd+MhBpibmCxNP6PJhH/h2OqNuotTX7/XHPZQJv2pKvWMplFH9SIZZhitehh6vBH6LO8Pg== + dependencies: + chownr "^1.1.4" + fs-minipass "^1.2.7" + minipass "^2.9.0" + minizlib "^1.3.3" + mkdirp "^0.5.5" + safe-buffer "^5.2.1" + yallist "^3.1.1" + terser-webpack-plugin@^5.3.3, terser-webpack-plugin@^5.3.7: version "5.3.9" - resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-5.3.9.tgz#832536999c51b46d468067f9e37662a3b96adfe1" + resolved "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.9.tgz" integrity sha512-ZuXsqE07EcggTWQjXUj+Aot/OMcD0bMKGgF63f7UxYcu5/AJF53aIpK1YoP5xR9l6s/Hy2b+t1AM0bLNPRuhwA== dependencies: "@jridgewell/trace-mapping" "^0.3.17" @@ -7249,7 +8314,7 @@ terser-webpack-plugin@^5.3.3, terser-webpack-plugin@^5.3.7: terser@^5.10.0, terser@^5.16.8: version "5.24.0" - resolved "https://registry.yarnpkg.com/terser/-/terser-5.24.0.tgz#4ae50302977bca4831ccc7b4fef63a3c04228364" + resolved "https://registry.npmjs.org/terser/-/terser-5.24.0.tgz" integrity sha512-ZpGR4Hy3+wBEzVEnHvstMvqpD/nABNelQn/z2r0fjVWGQsN3bpOLzQlqDxmb4CDZnXq5lpjnQ+mHQLAOpfM5iw== dependencies: "@jridgewell/source-map" "^0.3.3" @@ -7281,9 +8346,16 @@ thunky@^1.0.2: resolved "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz" integrity sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA== +time-span@4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/time-span/-/time-span-4.0.0.tgz" + integrity sha512-MyqZCTGLDZ77u4k+jqg4UlrzPTPZ49NDlaekU6uuFaJLzPIN1woaRXCbGeqOfxwc3Y37ZROGAJ614Rdv7Olt+g== + dependencies: + convert-hrtime "^3.0.0" + tiny-invariant@^1.0.2: version "1.3.1" - resolved "https://registry.yarnpkg.com/tiny-invariant/-/tiny-invariant-1.3.1.tgz#8560808c916ef02ecfd55e66090df23a4b7aa642" + resolved "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.1.tgz" integrity sha512-AD5ih2NlSssTCwsMznbvwMZpJ1cbhkGd2uueNxzv2jDlEeZdU04JQfRnggJQ8DrcVBGjAsCKwFBbDlVNtEMlzw== tiny-warning@^1.0.0: @@ -7308,6 +8380,11 @@ to-regex-range@^5.0.1: dependencies: is-number "^7.0.0" +toidentifier@1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz" + integrity sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw== + toidentifier@1.0.1: version "1.0.1" resolved "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz" @@ -7315,7 +8392,7 @@ toidentifier@1.0.1: totalist@^3.0.0: version "3.0.1" - resolved "https://registry.yarnpkg.com/totalist/-/totalist-3.0.1.tgz#ba3a3d600c915b1a97872348f79c127475f6acf8" + resolved "https://registry.npmjs.org/totalist/-/totalist-3.0.1.tgz" integrity sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ== tr46@~0.0.3: @@ -7323,6 +8400,11 @@ tr46@~0.0.3: resolved "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz" integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== +tree-kill@1.2.2: + version "1.2.2" + resolved "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz" + integrity sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A== + trim-trailing-lines@^1.0.0: version "1.1.4" resolved "https://registry.npmjs.org/trim-trailing-lines/-/trim-trailing-lines-1.1.4.tgz" @@ -7343,9 +8425,41 @@ ts-interface-checker@^0.1.9: resolved "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz" integrity sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA== +ts-morph@12.0.0: + version "12.0.0" + resolved "https://registry.npmjs.org/ts-morph/-/ts-morph-12.0.0.tgz" + integrity sha512-VHC8XgU2fFW7yO1f/b3mxKDje1vmyzFXHWzOYmKEkCEwcLjDtbdLgBQviqj4ZwP4MJkQtRo6Ha2I29lq/B+VxA== + dependencies: + "@ts-morph/common" "~0.11.0" + code-block-writer "^10.1.1" + +ts-node@>=9.0.0, ts-node@10.9.1: + version "10.9.1" + resolved "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz" + integrity sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw== + dependencies: + "@cspotcode/source-map-support" "^0.8.0" + "@tsconfig/node10" "^1.0.7" + "@tsconfig/node12" "^1.0.7" + "@tsconfig/node14" "^1.0.0" + "@tsconfig/node16" "^1.0.2" + acorn "^8.4.1" + acorn-walk "^8.1.1" + arg "^4.1.0" + create-require "^1.1.0" + diff "^4.0.1" + make-error "^1.1.1" + v8-compile-cache-lib "^3.0.1" + yn "3.1.1" + +ts-toolbelt@^6.15.5: + version "6.15.5" + resolved "https://registry.npmjs.org/ts-toolbelt/-/ts-toolbelt-6.15.5.tgz" + integrity sha512-FZIXf1ksVyLcfr7M317jbB67XFJhOO1YqdTcuGaq9q5jLUoTikukZ+98TPjKiP2jC5CgmYdWWYs0s2nLSU0/1A== + tslib@^2.0.3, tslib@^2.1.0, tslib@^2.4.0: version "2.6.2" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.2.tgz#703ac29425e7b37cd6fd456e92404d46d1f3e4ae" + resolved "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz" integrity sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q== type-fest@^0.20.2: @@ -7355,7 +8469,7 @@ type-fest@^0.20.2: type-fest@^2.5.0: version "2.19.0" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-2.19.0.tgz#88068015bb33036a598b952e55e9311a60fd3a9b" + resolved "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz" integrity sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA== type-is@~1.6.18: @@ -7373,9 +8487,9 @@ typedarray-to-buffer@^3.1.5: dependencies: is-typedarray "^1.0.0" -typescript@^4.7.4: +typescript@^4.7.4, "typescript@>= 2.7", typescript@>=2.7, typescript@>=4.9.5, typescript@4.9.5: version "4.9.5" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.9.5.tgz#095979f9bcc0d09da324d58d03ce8f8374cbe65a" + resolved "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz" integrity sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g== ua-parser-js@^1.0.35: @@ -7383,11 +8497,23 @@ ua-parser-js@^1.0.35: resolved "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-1.0.37.tgz" integrity sha512-bhTyI94tZofjo+Dn8SN6Zv8nBDvyXTymAdM3LDI/0IboIUwTu1rEhW7v2TfiVsoYWgkQ4kOVqnI8APUFbIQIFQ== +uid-promise@1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/uid-promise/-/uid-promise-1.0.0.tgz" + integrity sha512-R8375j0qwXyIu/7R0tjdF06/sElHqbmdmWC9M2qQHpEVbvE4I5+38KJI7LUUmQMp7NVq4tKHiBMkT0NFM453Ig== + undici-types@~5.26.4: version "5.26.5" - resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-5.26.5.tgz#bcd539893d00b56e964fd2657a4866b221a65617" + resolved "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz" integrity sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA== +undici@5.26.5: + version "5.26.5" + resolved "https://registry.npmjs.org/undici/-/undici-5.26.5.tgz" + integrity sha512-cSb4bPFd5qgR7qr2jYAi0hlX9n5YKK2ONKkLFkxl+v/9BvC0sOpZjBHDBSXc5lWAf5ty9oZdRXytBIHzgUcerw== + dependencies: + "@fastify/busboy" "^2.0.0" + unherit@^1.0.4: version "1.1.3" resolved "https://registry.npmjs.org/unherit/-/unherit-1.1.3.tgz" @@ -7411,18 +8537,18 @@ unicode-match-property-ecmascript@^2.0.0: unicode-match-property-value-ecmascript@^2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz#cb5fffdcd16a05124f5a4b0bf7c3770208acbbe0" + resolved "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz" integrity sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA== unicode-property-aliases-ecmascript@^2.0.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz#43d41e3be698bd493ef911077c9b131f827e8ccd" + resolved "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz" integrity sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w== -unified@9.2.0: - version "9.2.0" - resolved "https://registry.npmjs.org/unified/-/unified-9.2.0.tgz" - integrity sha512-vx2Z0vY+a3YoTj8+pttM3tiJHCwY5UFbYdiWrwBEbHmK8pvsPj2rtAX2BFfgXen8T39CJWblWRDT4L5WGXtDdg== +unified@^9.2.2: + version "9.2.2" + resolved "https://registry.npmjs.org/unified/-/unified-9.2.2.tgz" + integrity sha512-Sg7j110mtefBD+qunSLO1lqOEKdrwBFBrR6Qd8f4uwkhWNlbkaqwHse6e7QvD3AP/MNoJdEDLaf8OxYyoWgorQ== dependencies: bail "^1.0.0" extend "^3.0.0" @@ -7431,10 +8557,10 @@ unified@9.2.0: trough "^1.0.0" vfile "^4.0.0" -unified@^9.2.2: - version "9.2.2" - resolved "https://registry.npmjs.org/unified/-/unified-9.2.2.tgz" - integrity sha512-Sg7j110mtefBD+qunSLO1lqOEKdrwBFBrR6Qd8f4uwkhWNlbkaqwHse6e7QvD3AP/MNoJdEDLaf8OxYyoWgorQ== +unified@9.2.0: + version "9.2.0" + resolved "https://registry.npmjs.org/unified/-/unified-9.2.0.tgz" + integrity sha512-vx2Z0vY+a3YoTj8+pttM3tiJHCwY5UFbYdiWrwBEbHmK8pvsPj2rtAX2BFfgXen8T39CJWblWRDT4L5WGXtDdg== dependencies: bail "^1.0.0" extend "^3.0.0" @@ -7450,7 +8576,7 @@ unique-string@^2.0.0: dependencies: crypto-random-string "^2.0.0" -unist-builder@2.0.3, unist-builder@^2.0.0: +unist-builder@^2.0.0, unist-builder@2.0.3: version "2.0.3" resolved "https://registry.npmjs.org/unist-builder/-/unist-builder-2.0.3.tgz" integrity sha512-f98yt5pnlMWlzP539tPc4grGMsFaQQlP/vM396b00jngsiINumNmsY8rkXjfoi1c6QaM8nQ3vaGDuoKWbe/1Uw== @@ -7499,7 +8625,7 @@ unist-util-visit-parents@^3.0.0: "@types/unist" "^2.0.0" unist-util-is "^4.0.0" -unist-util-visit@2.0.3, unist-util-visit@^2.0.0, unist-util-visit@^2.0.3: +unist-util-visit@^2.0.0, unist-util-visit@^2.0.3, unist-util-visit@2.0.3: version "2.0.3" resolved "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-2.0.3.tgz" integrity sha512-iJ4/RczbJMkD0712mGktuGpm/U4By4FfDonL7N/9tATGIF4imikjOuagyMY53tnZq3NP6BcmlrHhEKAfGWjh7Q== @@ -7508,12 +8634,17 @@ unist-util-visit@2.0.3, unist-util-visit@^2.0.0, unist-util-visit@^2.0.3: unist-util-is "^4.0.0" unist-util-visit-parents "^3.0.0" +universalify@^0.1.0: + version "0.1.2" + resolved "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz" + integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== + universalify@^2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz" integrity sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ== -unpipe@1.0.0, unpipe@~1.0.0: +unpipe@~1.0.0, unpipe@1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz" integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ== @@ -7623,6 +8754,16 @@ uuid@^8.3.2: resolved "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz" integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== +uuid@3.3.2: + version "3.3.2" + resolved "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz" + integrity sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA== + +v8-compile-cache-lib@^3.0.1: + version "3.0.1" + resolved "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz" + integrity sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg== + value-equal@^1.0.1: version "1.0.1" resolved "https://registry.npmjs.org/value-equal/-/value-equal-1.0.1.tgz" @@ -7633,6 +8774,24 @@ vary@~1.1.2: resolved "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz" integrity sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg== +vercel@^33.4.0: + version "33.4.0" + resolved "https://registry.npmjs.org/vercel/-/vercel-33.4.0.tgz" + integrity sha512-uB8XcTvARBsJtXCbhm/+F3qtV/FQXYYxx6jyUMfMU8izmOmWUlcSOmARbctL4vZ3Izj4ku+P4S25aDQFNmhGYQ== + dependencies: + "@vercel/build-utils" "7.5.1" + "@vercel/fun" "1.1.0" + "@vercel/go" "3.0.5" + "@vercel/hydrogen" "1.0.2" + "@vercel/next" "4.1.0" + "@vercel/node" "3.0.17" + "@vercel/python" "4.1.1" + "@vercel/redwood" "2.0.6" + "@vercel/remix-builder" "2.0.18" + "@vercel/ruby" "2.0.5" + "@vercel/static-build" "2.1.0" + chokidar "3.3.1" + vfile-location@^3.0.0, vfile-location@^3.2.0: version "3.2.0" resolved "https://registry.npmjs.org/vfile-location/-/vfile-location-3.2.0.tgz" @@ -7687,6 +8846,11 @@ web-namespaces@^1.0.0: resolved "https://registry.npmjs.org/web-namespaces/-/web-namespaces-1.1.4.tgz" integrity sha512-wYxSGajtmoP4WxfejAPIr4l0fVh+jeMXZb08wNc0tMg6xsfZXj3cECqIK0G7ZAqUq0PP8WlMDtaOGVBTAWztNw== +web-vitals@0.2.4: + version "0.2.4" + resolved "https://registry.npmjs.org/web-vitals/-/web-vitals-0.2.4.tgz" + integrity sha512-6BjspCO9VriYy12z356nL6JBS0GYeEcA457YyRzD+dD6XYCQ75NKhcOHUMHentOE7OcVCIXXDvOm0jKFfQG2Gg== + webidl-conversions@^3.0.0: version "3.0.1" resolved "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz" @@ -7694,7 +8858,7 @@ webidl-conversions@^3.0.0: webpack-bundle-analyzer@^4.5.0: version "4.9.1" - resolved "https://registry.yarnpkg.com/webpack-bundle-analyzer/-/webpack-bundle-analyzer-4.9.1.tgz#d00bbf3f17500c10985084f22f1a2bf45cb2f09d" + resolved "https://registry.npmjs.org/webpack-bundle-analyzer/-/webpack-bundle-analyzer-4.9.1.tgz" integrity sha512-jnd6EoYrf9yMxCyYDPj8eutJvtjQNp8PHmni/e/ulydHBWhT5J3menXt3HEkScsu9YqMAcG4CfFjs3rj5pVU1w== dependencies: "@discoveryjs/json-ext" "0.5.7" @@ -7728,7 +8892,7 @@ webpack-dev-middleware@^5.3.1: webpack-dev-server@^4.9.3: version "4.15.1" - resolved "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-4.15.1.tgz#8944b29c12760b3a45bdaa70799b17cb91b03df7" + resolved "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.15.1.tgz" integrity sha512-5hbAst3h3C3L8w6W4P96L5vaV0PxSmJhxZvWKYIdgxOQm8pNZ5dEOmmSLBVpP85ReeyRt6AS1QJNyo/oFFPeVA== dependencies: "@types/bonjour" "^3.5.9" @@ -7764,7 +8928,7 @@ webpack-dev-server@^4.9.3: webpack-merge@^5.8.0: version "5.10.0" - resolved "https://registry.yarnpkg.com/webpack-merge/-/webpack-merge-5.10.0.tgz#a3ad5d773241e9c682803abf628d4cd62b8a4177" + resolved "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.10.0.tgz" integrity sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA== dependencies: clone-deep "^4.0.1" @@ -7776,9 +8940,9 @@ webpack-sources@^3.2.2, webpack-sources@^3.2.3: resolved "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz" integrity sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w== -webpack@^5.73.0: +"webpack@^4.0.0 || ^5.0.0", "webpack@^4.37.0 || ^5.0.0", webpack@^5.0.0, webpack@^5.1.0, webpack@^5.20.0, webpack@^5.73.0, "webpack@>= 4", webpack@>=2, "webpack@>=4.41.1 || 5.x", "webpack@3 || 4 || 5": version "5.89.0" - resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.89.0.tgz#56b8bf9a34356e93a6625770006490bf3a7f32dc" + resolved "https://registry.npmjs.org/webpack/-/webpack-5.89.0.tgz" integrity sha512-qyfIC10pOr70V+jkmud8tMfajraGCZMBWJtrmuBymQKCrLTRejBI8STDp1MCyZu/QTdZSeacCQYpYNQVOzX5kw== dependencies: "@types/eslint-scope" "^3.7.3" @@ -7816,7 +8980,7 @@ webpackbar@^5.0.2: pretty-time "^1.1.0" std-env "^3.0.1" -websocket-driver@>=0.5.1, websocket-driver@^0.7.4: +websocket-driver@^0.7.4, websocket-driver@>=0.5.1: version "0.7.4" resolved "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz" integrity sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg== @@ -7852,6 +9016,13 @@ which@^2.0.1: dependencies: isexe "^2.0.0" +wide-align@^1.1.2: + version "1.1.5" + resolved "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz" + integrity sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg== + dependencies: + string-width "^1.0.2 || 2 || 3 || 4" + widest-line@^3.1.0: version "3.1.0" resolved "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz" @@ -7868,7 +9039,7 @@ widest-line@^4.0.1: wildcard@^2.0.0: version "2.0.1" - resolved "https://registry.yarnpkg.com/wildcard/-/wildcard-2.0.1.tgz#5ab10d02487198954836b6349f74fff961e10f67" + resolved "https://registry.npmjs.org/wildcard/-/wildcard-2.0.1.tgz" integrity sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ== wrap-ansi@^7.0.0: @@ -7882,7 +9053,7 @@ wrap-ansi@^7.0.0: wrap-ansi@^8.0.1: version "8.1.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz#56dc22368ee570face1b49819975d9b9a5ead214" + resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz" integrity sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ== dependencies: ansi-styles "^6.1.0" @@ -7911,14 +9082,28 @@ ws@^7.3.1: ws@^8.13.0: version "8.14.2" - resolved "https://registry.yarnpkg.com/ws/-/ws-8.14.2.tgz#6c249a806eb2db7a20d26d51e7709eab7b2e6c7f" + resolved "https://registry.npmjs.org/ws/-/ws-8.14.2.tgz" integrity sha512-wEBG1ftX4jcglPxgFCMJmZ2PLtSbJ2Peg6TmpJFTbe9GZYOQCDPdMYu/Tm0/bGZkw8paZnJY45J4K2PZrLYq8g== +xdg-app-paths@5.1.0: + version "5.1.0" + resolved "https://registry.npmjs.org/xdg-app-paths/-/xdg-app-paths-5.1.0.tgz" + integrity sha512-RAQ3WkPf4KTU1A8RtFx3gWywzVKe00tfOPFfl2NDGqbIFENQO4kqAJp7mhQjNj/33W5x5hiWWUdyfPq/5SU3QA== + dependencies: + xdg-portable "^7.0.0" + xdg-basedir@^4.0.0: version "4.0.0" resolved "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-4.0.0.tgz" integrity sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q== +xdg-portable@^7.0.0: + version "7.3.0" + resolved "https://registry.npmjs.org/xdg-portable/-/xdg-portable-7.3.0.tgz" + integrity sha512-sqMMuL1rc0FmMBOzCpd0yuy9trqF2yTTVe+E9ogwCSWQCdDEtQUwrZPT6AxqtsFGRNxycgncbP/xmOOSPw5ZUw== + dependencies: + os-paths "^4.0.1" + xml-js@^1.6.11: version "1.6.11" resolved "https://registry.npmjs.org/xml-js/-/xml-js-1.6.11.tgz" @@ -7931,9 +9116,9 @@ xtend@^4.0.0, xtend@^4.0.1: resolved "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz" integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== -yallist@^3.0.2: +yallist@^3.0.0, yallist@^3.0.2, yallist@^3.1.1: version "3.1.1" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" + resolved "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz" integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== yallist@^4.0.0: @@ -7951,6 +9136,34 @@ yaml@^2.1.1: resolved "https://registry.npmjs.org/yaml/-/yaml-2.3.4.tgz" integrity sha512-8aAvwVUSHpfEqTQ4w/KMlf3HcRdt50E5ODIQJBw1fQ5RL34xabzxtUlzTXVqc4rkZsPbvrXKWnABCD7kWSmocA== +yauzl-clone@^1.0.4: + version "1.0.4" + resolved "https://registry.npmjs.org/yauzl-clone/-/yauzl-clone-1.0.4.tgz" + integrity sha512-igM2RRCf3k8TvZoxR2oguuw4z1xasOnA31joCqHIyLkeWrvAc2Jgay5ISQ2ZplinkoGaJ6orCz56Ey456c5ESA== + dependencies: + events-intercept "^2.0.0" + +yauzl-promise@2.1.3: + version "2.1.3" + resolved "https://registry.npmjs.org/yauzl-promise/-/yauzl-promise-2.1.3.tgz" + integrity sha512-A1pf6fzh6eYkK0L4Qp7g9jzJSDrM6nN0bOn5T0IbY4Yo3w+YkWlHFkJP7mzknMXjqusHFHlKsK2N+4OLsK2MRA== + dependencies: + yauzl "^2.9.1" + yauzl-clone "^1.0.4" + +yauzl@^2.9.1: + version "2.10.0" + resolved "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz" + integrity sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g== + dependencies: + buffer-crc32 "~0.2.3" + fd-slicer "~1.1.0" + +yn@3.1.1: + version "3.1.1" + resolved "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz" + integrity sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q== + yocto-queue@^0.1.0: version "0.1.0" resolved "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz" From a6abf5d88377ded9d48e689ed81c6511a9825740 Mon Sep 17 00:00:00 2001 From: bglynn Date: Tue, 30 Jan 2024 08:44:03 -0800 Subject: [PATCH 06/18] "/Examples" -> "/tutorials" --- docs/features/aws-iam/index.mdx | 4 +-- .../tutorials}/_category_.json | 2 +- .../{Examples => tutorials}/aws-iam-eks.mdx | 0 docs/features/{Istio => istio}/Reference.mdx | 0 .../features/{Istio => istio}/_category_.json | 0 docs/features/{Istio => istio}/index.mdx | 0 .../tutorials}/_category_.json | 2 +- .../k8s-istio-authorization-policies.mdx | 0 .../tutorials}/k8s-istio-watcher.mdx | 0 docs/features/{Kafka => kafka}/Reference.mdx | 0 .../features/{Kafka => kafka}/_category_.json | 0 docs/features/{Kafka => kafka}/index.mdx | 10 +++--- .../tutorials}/_category_.json | 2 +- .../tutorials}/k8s-kafka-mapping.mdx | 0 .../k8s-kafka-mtls-cert-manager.mdx | 0 .../tutorials}/k8s-kafka-mtls.mdx | 0 .../Reference/Network-Policies-Deep-Dive.mdx | 0 .../Reference/README.mdx | 0 .../_category_.json | 0 .../{Networking => networking}/index.mdx | 15 ++++++--- .../tutorials}/_category_.json | 2 +- .../tutorials}/aws-eks-cni-mini.mdx | 0 .../tutorials}/k8s-network-mapper.mdx | 0 .../tutorials}/k8s-network-policies.mdx | 0 .../protect-1-service-network-policies.mdx | 0 .../postgresql/Examples/_category_.json | 5 --- docs/features/postgresql/index.mdx | 2 +- .../postgresql/tutorials/_category_.json | 5 +++ .../{Examples => tutorials}/postgres.mdx | 0 docs/getting-started/README.mdx | 17 +++++----- docs/overview/README.mdx | 4 --- docs/overview/index.mdx | 31 +++++++++++++++++++ docs/overview/installation/README.mdx | 2 +- .../configuration/intents-operator/README.mdx | 2 +- docusaurus.config.js | 20 ++++++------ 35 files changed, 79 insertions(+), 46 deletions(-) rename docs/features/{Istio/Examples => aws-iam/tutorials}/_category_.json (63%) rename docs/features/aws-iam/{Examples => tutorials}/aws-iam-eks.mdx (100%) rename docs/features/{Istio => istio}/Reference.mdx (100%) rename docs/features/{Istio => istio}/_category_.json (100%) rename docs/features/{Istio => istio}/index.mdx (100%) rename docs/features/{Kafka/Examples => istio/tutorials}/_category_.json (63%) rename docs/features/{Istio/Examples => istio/tutorials}/k8s-istio-authorization-policies.mdx (100%) rename docs/features/{Istio/Examples => istio/tutorials}/k8s-istio-watcher.mdx (100%) rename docs/features/{Kafka => kafka}/Reference.mdx (100%) rename docs/features/{Kafka => kafka}/_category_.json (100%) rename docs/features/{Kafka => kafka}/index.mdx (88%) rename docs/features/{aws-iam/Examples => kafka/tutorials}/_category_.json (63%) rename docs/features/{Kafka/Examples => kafka/tutorials}/k8s-kafka-mapping.mdx (100%) rename docs/features/{Kafka/Examples => kafka/tutorials}/k8s-kafka-mtls-cert-manager.mdx (100%) rename docs/features/{Kafka/Examples => kafka/tutorials}/k8s-kafka-mtls.mdx (100%) rename docs/features/{Networking => networking}/Reference/Network-Policies-Deep-Dive.mdx (100%) rename docs/features/{Networking => networking}/Reference/README.mdx (100%) rename docs/features/{Networking => networking}/_category_.json (100%) rename docs/features/{Networking => networking}/index.mdx (84%) rename docs/features/{Networking/Examples => networking/tutorials}/_category_.json (63%) rename docs/features/{Networking/Examples => networking/tutorials}/aws-eks-cni-mini.mdx (100%) rename docs/features/{Networking/Examples => networking/tutorials}/k8s-network-mapper.mdx (100%) rename docs/features/{Networking/Examples => networking/tutorials}/k8s-network-policies.mdx (100%) rename docs/features/{Networking/Examples => networking/tutorials}/protect-1-service-network-policies.mdx (100%) delete mode 100644 docs/features/postgresql/Examples/_category_.json create mode 100644 docs/features/postgresql/tutorials/_category_.json rename docs/features/postgresql/{Examples => tutorials}/postgres.mdx (100%) delete mode 100644 docs/overview/README.mdx create mode 100644 docs/overview/index.mdx diff --git a/docs/features/aws-iam/index.mdx b/docs/features/aws-iam/index.mdx index b701f699b..aa44f0a4c 100644 --- a/docs/features/aws-iam/index.mdx +++ b/docs/features/aws-iam/index.mdx @@ -1,6 +1,6 @@ --- sidebar_position: 1 -title: AWS IAM +title: AWS IAM | Overview hide_table_of_contents: true hide_title: true --- @@ -15,7 +15,7 @@ In many workloads, EKS clusters must access external cloud resources such as dat ### How does it work -To follow along with a full example, take a look at [Automate AWS IAM for EKS](/features/aws-iam/Examples/aws-iam-eks) +To follow along with a full example, take a look at [Automate AWS IAM for EKS](/features/aws-iam/tutorials/aws-iam-eks) 1. First, the EKS cluster must have [Otterize installed](/overview/installation). 2. We must label the pod with `credentials-operator.otterize.com/create-aws-role: "true"` diff --git a/docs/features/Istio/Examples/_category_.json b/docs/features/aws-iam/tutorials/_category_.json similarity index 63% rename from docs/features/Istio/Examples/_category_.json rename to docs/features/aws-iam/tutorials/_category_.json index bbac434cd..bdfe77bf2 100644 --- a/docs/features/Istio/Examples/_category_.json +++ b/docs/features/aws-iam/tutorials/_category_.json @@ -1,5 +1,5 @@ { - "label": "Examples", + "label": "Tutorials", "position": 2, "collapsed": false } diff --git a/docs/features/aws-iam/Examples/aws-iam-eks.mdx b/docs/features/aws-iam/tutorials/aws-iam-eks.mdx similarity index 100% rename from docs/features/aws-iam/Examples/aws-iam-eks.mdx rename to docs/features/aws-iam/tutorials/aws-iam-eks.mdx diff --git a/docs/features/Istio/Reference.mdx b/docs/features/istio/Reference.mdx similarity index 100% rename from docs/features/Istio/Reference.mdx rename to docs/features/istio/Reference.mdx diff --git a/docs/features/Istio/_category_.json b/docs/features/istio/_category_.json similarity index 100% rename from docs/features/Istio/_category_.json rename to docs/features/istio/_category_.json diff --git a/docs/features/Istio/index.mdx b/docs/features/istio/index.mdx similarity index 100% rename from docs/features/Istio/index.mdx rename to docs/features/istio/index.mdx diff --git a/docs/features/Kafka/Examples/_category_.json b/docs/features/istio/tutorials/_category_.json similarity index 63% rename from docs/features/Kafka/Examples/_category_.json rename to docs/features/istio/tutorials/_category_.json index bbac434cd..bdfe77bf2 100644 --- a/docs/features/Kafka/Examples/_category_.json +++ b/docs/features/istio/tutorials/_category_.json @@ -1,5 +1,5 @@ { - "label": "Examples", + "label": "Tutorials", "position": 2, "collapsed": false } diff --git a/docs/features/Istio/Examples/k8s-istio-authorization-policies.mdx b/docs/features/istio/tutorials/k8s-istio-authorization-policies.mdx similarity index 100% rename from docs/features/Istio/Examples/k8s-istio-authorization-policies.mdx rename to docs/features/istio/tutorials/k8s-istio-authorization-policies.mdx diff --git a/docs/features/Istio/Examples/k8s-istio-watcher.mdx b/docs/features/istio/tutorials/k8s-istio-watcher.mdx similarity index 100% rename from docs/features/Istio/Examples/k8s-istio-watcher.mdx rename to docs/features/istio/tutorials/k8s-istio-watcher.mdx diff --git a/docs/features/Kafka/Reference.mdx b/docs/features/kafka/Reference.mdx similarity index 100% rename from docs/features/Kafka/Reference.mdx rename to docs/features/kafka/Reference.mdx diff --git a/docs/features/Kafka/_category_.json b/docs/features/kafka/_category_.json similarity index 100% rename from docs/features/Kafka/_category_.json rename to docs/features/kafka/_category_.json diff --git a/docs/features/Kafka/index.mdx b/docs/features/kafka/index.mdx similarity index 88% rename from docs/features/Kafka/index.mdx rename to docs/features/kafka/index.mdx index 233c9b134..46a1caf45 100644 --- a/docs/features/Kafka/index.mdx +++ b/docs/features/kafka/index.mdx @@ -1,6 +1,6 @@ --- sidebar_position: 1 -title: Kafka +title: Kafka | Overview hide_table_of_contents: true hide_title: true --- @@ -11,17 +11,17 @@ export const kafka_tutorials = [ { title: 'Kafka topic-level access mapping', description: 'View Kafka network connections', - url: '/features/Kafka/Examples/k8s-kafka-mapping' + url: '/features/Kafka/tutorials/k8s-kafka-mapping' }, { title: 'Kafka access automation using Otterize Cloud mTLS', description: 'Manage access to Kafka topics with Otterize Cloud mTLS', - url: '/features/Kafka/Examples/k8s-kafka-mtls' + url: '/features/Kafka/tutorials/k8s-kafka-mtls' }, { title: 'Kafka access automation using cert-manager mTLS', description: 'Manage access to Kafka topics with a cert-manager', - url: '/features/Kafka/Examples/k8s-kafka-mtls-cert-manager' + url: '/features/Kafka/tutorials/k8s-kafka-mtls-cert-manager' } ]; @@ -63,7 +63,7 @@ spec: ``` -3. Once that is complete, the Kafka broker and it's clients require mTLS credentials, which they can receive from Otterize or through a [cert-manager](/features/Kafka/Examples/k8s-kafka-mtls-cert-manager). This requires a annotation to inform Otterize to generate the credentials and volume mount to store them. To orchestrate this, see the example deployment below: +3. Once that is complete, the Kafka broker and it's clients require mTLS credentials, which they can receive from Otterize or through a [cert-manager](/features/Kafka/tutorials/k8s-kafka-mtls-cert-manager). This requires a annotation to inform Otterize to generate the credentials and volume mount to store them. To orchestrate this, see the example deployment below: ```yaml spec: diff --git a/docs/features/aws-iam/Examples/_category_.json b/docs/features/kafka/tutorials/_category_.json similarity index 63% rename from docs/features/aws-iam/Examples/_category_.json rename to docs/features/kafka/tutorials/_category_.json index bbac434cd..bdfe77bf2 100644 --- a/docs/features/aws-iam/Examples/_category_.json +++ b/docs/features/kafka/tutorials/_category_.json @@ -1,5 +1,5 @@ { - "label": "Examples", + "label": "Tutorials", "position": 2, "collapsed": false } diff --git a/docs/features/Kafka/Examples/k8s-kafka-mapping.mdx b/docs/features/kafka/tutorials/k8s-kafka-mapping.mdx similarity index 100% rename from docs/features/Kafka/Examples/k8s-kafka-mapping.mdx rename to docs/features/kafka/tutorials/k8s-kafka-mapping.mdx diff --git a/docs/features/Kafka/Examples/k8s-kafka-mtls-cert-manager.mdx b/docs/features/kafka/tutorials/k8s-kafka-mtls-cert-manager.mdx similarity index 100% rename from docs/features/Kafka/Examples/k8s-kafka-mtls-cert-manager.mdx rename to docs/features/kafka/tutorials/k8s-kafka-mtls-cert-manager.mdx diff --git a/docs/features/Kafka/Examples/k8s-kafka-mtls.mdx b/docs/features/kafka/tutorials/k8s-kafka-mtls.mdx similarity index 100% rename from docs/features/Kafka/Examples/k8s-kafka-mtls.mdx rename to docs/features/kafka/tutorials/k8s-kafka-mtls.mdx diff --git a/docs/features/Networking/Reference/Network-Policies-Deep-Dive.mdx b/docs/features/networking/Reference/Network-Policies-Deep-Dive.mdx similarity index 100% rename from docs/features/Networking/Reference/Network-Policies-Deep-Dive.mdx rename to docs/features/networking/Reference/Network-Policies-Deep-Dive.mdx diff --git a/docs/features/Networking/Reference/README.mdx b/docs/features/networking/Reference/README.mdx similarity index 100% rename from docs/features/Networking/Reference/README.mdx rename to docs/features/networking/Reference/README.mdx diff --git a/docs/features/Networking/_category_.json b/docs/features/networking/_category_.json similarity index 100% rename from docs/features/Networking/_category_.json rename to docs/features/networking/_category_.json diff --git a/docs/features/Networking/index.mdx b/docs/features/networking/index.mdx similarity index 84% rename from docs/features/Networking/index.mdx rename to docs/features/networking/index.mdx index 7dcc80a9b..21522b9b9 100644 --- a/docs/features/Networking/index.mdx +++ b/docs/features/networking/index.mdx @@ -1,25 +1,30 @@ --- sidebar_position: 1 -title: Networking +title: Networking | Overview hide_title: true --- import DocsLinkCard from "@site/src/components/LinkCard"; export const network_access_tutorials = [ { + title: 'Visualizing a Kubernetes Network', + description: 'Map network traffic in a cluster and view the connections', + url: '/features/Networking/tutorials/k8s-network-mapper' + }, +{ title: 'Create and manage network policies', description: 'Create Kubernetes network policies using IBAC', - url: '/features/Networking/Examples/k8s-network-policies' + url: '/features/Networking/tutorials/k8s-network-policies' }, { title: 'Protecting a service with network policies', description: 'An example on how to secure a single service', - url: '/features/Networking/Examples/protect-1-service-network-policies' + url: '/features/Networking/tutorials/protect-1-service-network-policies' }, { title: 'AWS EKS network policies with the VPC CNI', description: 'Leverage AWS VPC CNI to apply network policies in EKS', - url: '/features/Networking/Examples/aws-eks-cni-mini' + url: '/features/Networking/tutorials/aws-eks-cni-mini' } ]; @@ -32,7 +37,7 @@ You can use Otterize to understand, visualize, and manage access for Kubernetes After installation, Otterize collects network traffic data in memory, creating a graph of relationships between pod-to-pod and pod-to-public internet traffic. Once the graph is in place, the data can be exported or viewed in various ways. Otterize Cloud users can see and interact with the graph structures within the Otterize application. OSS users can use the CLI tool to export the data into JSON, list the relationship, or generate IBAC policies reflecting the existing traffic. -To learn more about Visualizing, check out [Visualizing a Kubernetes Network](/features/Networking/Examples/k8s-network-mapper) +To learn more about Visualizing, check out [Visualizing a Kubernetes Network](/features/Networking/tutorials/k8s-network-mapper) ### Access Control diff --git a/docs/features/Networking/Examples/_category_.json b/docs/features/networking/tutorials/_category_.json similarity index 63% rename from docs/features/Networking/Examples/_category_.json rename to docs/features/networking/tutorials/_category_.json index bbac434cd..bdfe77bf2 100644 --- a/docs/features/Networking/Examples/_category_.json +++ b/docs/features/networking/tutorials/_category_.json @@ -1,5 +1,5 @@ { - "label": "Examples", + "label": "Tutorials", "position": 2, "collapsed": false } diff --git a/docs/features/Networking/Examples/aws-eks-cni-mini.mdx b/docs/features/networking/tutorials/aws-eks-cni-mini.mdx similarity index 100% rename from docs/features/Networking/Examples/aws-eks-cni-mini.mdx rename to docs/features/networking/tutorials/aws-eks-cni-mini.mdx diff --git a/docs/features/Networking/Examples/k8s-network-mapper.mdx b/docs/features/networking/tutorials/k8s-network-mapper.mdx similarity index 100% rename from docs/features/Networking/Examples/k8s-network-mapper.mdx rename to docs/features/networking/tutorials/k8s-network-mapper.mdx diff --git a/docs/features/Networking/Examples/k8s-network-policies.mdx b/docs/features/networking/tutorials/k8s-network-policies.mdx similarity index 100% rename from docs/features/Networking/Examples/k8s-network-policies.mdx rename to docs/features/networking/tutorials/k8s-network-policies.mdx diff --git a/docs/features/Networking/Examples/protect-1-service-network-policies.mdx b/docs/features/networking/tutorials/protect-1-service-network-policies.mdx similarity index 100% rename from docs/features/Networking/Examples/protect-1-service-network-policies.mdx rename to docs/features/networking/tutorials/protect-1-service-network-policies.mdx diff --git a/docs/features/postgresql/Examples/_category_.json b/docs/features/postgresql/Examples/_category_.json deleted file mode 100644 index bbac434cd..000000000 --- a/docs/features/postgresql/Examples/_category_.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "label": "Examples", - "position": 2, - "collapsed": false -} diff --git a/docs/features/postgresql/index.mdx b/docs/features/postgresql/index.mdx index fe872752f..76ff7b306 100644 --- a/docs/features/postgresql/index.mdx +++ b/docs/features/postgresql/index.mdx @@ -1,6 +1,6 @@ --- sidebar_position: 1 -title: PostgreSQL +title: PostgreSQL | Overview hide_title: true --- diff --git a/docs/features/postgresql/tutorials/_category_.json b/docs/features/postgresql/tutorials/_category_.json new file mode 100644 index 000000000..bdfe77bf2 --- /dev/null +++ b/docs/features/postgresql/tutorials/_category_.json @@ -0,0 +1,5 @@ +{ + "label": "Tutorials", + "position": 2, + "collapsed": false +} diff --git a/docs/features/postgresql/Examples/postgres.mdx b/docs/features/postgresql/tutorials/postgres.mdx similarity index 100% rename from docs/features/postgresql/Examples/postgres.mdx rename to docs/features/postgresql/tutorials/postgres.mdx diff --git a/docs/getting-started/README.mdx b/docs/getting-started/README.mdx index 5436707d2..39db62b50 100644 --- a/docs/getting-started/README.mdx +++ b/docs/getting-started/README.mdx @@ -9,6 +9,7 @@ export const introduction = [ { title: 'What is Otterize', description: 'Learn how Otterize helps visualize and manages your authorization', + url: `/overview/intro` }, { title: 'Intent-Based Access Control', @@ -49,22 +50,22 @@ export const tutorials_access = [ { title: 'Create and manage network policies', description: 'Create Kubernetes network policies using IBAC', - url: '/features/Networking/Examples/k8s-network-policies' + url: '/features/networking/tutorials/k8s-network-policies' }, { title: 'Network policies on AWS EKS', description: 'Jump start network policies using AWS EKS and VPC CNI', - url: '/features/Networking/Examples/aws-eks-cni-mini' + url: '/features/networking/tutorials/aws-eks-cni-mini' }, { title: 'Create and manage Istio authorization policies', description: 'Using Istio and IBAC to secure your K8s cluster', - url: '/features/Istio/Examples/k8s-istio-authorization-policies' + url: '/features/istio/tutorials/k8s-istio-authorization-policies' }, { title: 'Configure secure access for Kafka using Otterize Cloud mTLS', description: 'Declaring and applying intents to easily secure access to Kafka', - url: '/features/Kafka/Examples/k8s-kafka-mtls-cert-manager' + url: '/features/kafka/tutorials/k8s-kafka-mtls-cert-manager' } ]; @@ -72,23 +73,23 @@ export const tutorials_visualization = [ { title: 'Network mapping a Kubernetes cluster', description: 'Map pod-to-pod traffic within your K8s cluster', - url: '/features/Networking/Examples/k8s-network-mapper' + url: '/features/networking/tutorials/k8s-network-mapper' }, { title: 'Istio HTTP-level access mapping', description: 'The network mapper allows you to map pod-to-pod Istio traffic', - url: '/features/Istio/Examples/k8s-istio-watcher' + url: '/features/istio/tutorials/k8s-istio-watcher' }, { title: 'Kafka topic-level access mapping', description: 'View topic-level access to Kafka servers within your Kubernetes cluster', - url: 'features/Kafka/Examples/k8s-kafka-mapping' + url: 'features/kafka/tutorials/k8s-kafka-mapping' } ]; export const editions = [ { - title: 'Community Edition', + title: 'Open Source', description: 'Our open source edition focuses on a single Kubernetes cluster. ', url: '/overview/otterize-oss' }, diff --git a/docs/overview/README.mdx b/docs/overview/README.mdx deleted file mode 100644 index 7e4dcc2d8..000000000 --- a/docs/overview/README.mdx +++ /dev/null @@ -1,4 +0,0 @@ ---- -sidebar_position: 1 -title: Overview ---- \ No newline at end of file diff --git a/docs/overview/index.mdx b/docs/overview/index.mdx new file mode 100644 index 000000000..00f5204dc --- /dev/null +++ b/docs/overview/index.mdx @@ -0,0 +1,31 @@ +--- +sidebar_position: 1 +title: Intro +hide_title: true +--- + +# Overview + +Otterize is a declarative and zero-trust approach to access management that empowers you to streamline workload IAM while ensuring maximum security. + +## How does Otterize work? + +Otterize integrates into your Kubernetes clusters using a Helm chart that deploys some core [open-source components](https://github.com/otterize/), including the network mapper, intents-operator, and credential-operator. These components work in tandem to identify and secure access. Learn more about these components below. + +### Network mapper + +The network mapper is a zero-config open-source tool that provides insights into your network traffic without modifying your code or adding additional layers. Once Otterize is installed, the network monitor will automatically inspect pod traffic, including tariff from pod-to-pod, pod-to-public internet egress, Istio Envoy sidecar, pod-to-Kafka topics, and more to follow. This data is then collected in an in-memory database for various uses, including exporting and viewing. + +For more information, visit the [network mapper repository](https://github.com/otterize/network-mapper#about) + +### Credential operator + +Once Otterize is installed into a cluster, it [resolves a service name](https://github.com/otterize/credentials-operator#service-name-resolution-and-automatic-pod-labeling) for each pod and registers it with either Otterize Cloud or a SPIRE server. Once registered, pods can use the credential operator to generate various secrets/credentials for mTLS or credential-based access to services like PostgreSQL, Kafka, or other connections. + +For more information, visit the [credential operator repository](https://github.com/otterize/credentials-operator#about) + +### Intents operator + +The Otterize intents operator is a tool to network and service access policy creation straightforward. The intents operator uses a declarative policy syntax called Intent-Based Access Control (IBAC) to connect services. IBAC policies allow you to specify a caller and the type of access they should be provided. The intents operator then generates and applies the appropriate service-specific policy (IAM, ACL, NetworkPolicy, etc) to enable that defined access. + +For more information, visit the [intents operator repository](https://github.com/otterize/intents-operator#about) diff --git a/docs/overview/installation/README.mdx b/docs/overview/installation/README.mdx index 503ea7a3b..8c41a55dc 100644 --- a/docs/overview/installation/README.mdx +++ b/docs/overview/installation/README.mdx @@ -1,5 +1,5 @@ --- -sidebar_position: 1 +sidebar_position: 2 title: Installation --- import Tabs from '@theme/Tabs'; diff --git a/docs/reference/configuration/intents-operator/README.mdx b/docs/reference/configuration/intents-operator/README.mdx index 61e64358a..69279eac3 100644 --- a/docs/reference/configuration/intents-operator/README.mdx +++ b/docs/reference/configuration/intents-operator/README.mdx @@ -78,7 +78,7 @@ it is attempting to read, so the end result is that the topic ACLs determine act ### PostgreSQL users & access The intents operator automatically creates, and updates credentials in PostgreSQL databases according to the declared intents. It works together with the Otterize credentials operator to easily enable secure access to PostgreSQL from client pods, all in your Kubernetes cluster. -Try the [Just-in-time PostgreSQL users & access](/features/postgresql/Examples/postgresql) tutorial to learn more. +Try the [Just-in-time PostgreSQL users & access](/features/postgresql/tutorials/postgresql) tutorial to learn more. ### Istio AuthorizationPolicy The intents operator automatically creates, updates and deletes Istio authorization policies, automatically looks up service accounts for client pods and labels server pods, to reflect precisely the client-to-server calls declared in client intents files. diff --git a/docusaurus.config.js b/docusaurus.config.js index b99c0badf..700a12307 100644 --- a/docusaurus.config.js +++ b/docusaurus.config.js @@ -150,7 +150,7 @@ const config = { }, { from: ['/reference/access-controls/network-policies'], - to: '/features/Networking/Reference/Network-Policies-Deep-Dive' + to: '/features/networking/Reference/Network-Policies-Deep-Dive' }, { from: ['/shadow-vs-active-enforcement'], @@ -184,39 +184,39 @@ const config = { }, { from: ['/guides/protect-1-service-network-policies'], - to: '/features/Networking/Examples/protect-1-service-network-policies' + to: '/features/networking/tutorials/protect-1-service-network-policies' }, { from: ['/quick-tutorials/k8s-kafka-mtls', '/quickstart/access-control/k8s-kafka-mtls'], - to: '/features/Kafka/Examples/k8s-kafka-mtls', + to: '/features/kafka/tutorials/k8s-kafka-mtls', }, { from: ['/quick-tutorials/aws-eks-cni-mini','/quickstart/access-control/aws-eks-cni-mini'], - to: '/features/Networking/Examples/aws-eks-cni-mini', + to: '/features/networking/tutorials/aws-eks-cni-mini', }, { from: ['/quick-tutorials/k8s-kafka-mtls-cert-manager', '/quickstart/access-control/k8s-kafka-mtls-cert-manager'], - to: '/features/Kafka/Examples/k8s-kafka-mtls-cert-manager', + to: '/features/kafka/tutorials/k8s-kafka-mtls-cert-manager', }, { from: ['/quick-tutorials/k8s-istio-watcher', '/quickstart/visualization/k8s-istio-watcher'], - to: '/features/Istio/Examples/k8s-istio-watcher', + to: '/features/istio/tutorials/k8s-istio-watcher', }, { from: ['/quick-visual-tutorials/visual-ibac-istio-authorization-policies','/quickstart/access-control/k8s-istio-authorization-policies', '/quickstart/k8s-istio-authorization-policies'], - to: '/features/Istio/Examples/k8s-istio-authorization-policies', + to: '/features/istio/tutorials/k8s-istio-authorization-policies', }, { from: ['/quick-visual-tutorials/visual-ibac-kafka-k8s'], - to: '/features/Kafka/Examples/k8s-kafka-mapping', + to: '/features/kafka/tutorials/k8s-kafka-mapping', }, { from: ['/quick-visual-tutorials/visual-ibac-network-policies', '/quick-tutorials/k8s-network-policies', '/quickstart/access-control/k8s-network-policies'], - to: '/features/Networking/Examples/k8s-network-policies', + to: '/features/networking/tutorials/k8s-network-policies', }, { from: ['/quick-visual-tutorials/visual-k8s-cluster-mapping', '/quickstart/visualization/k8s-network-mapper', '/quick-tutorials/k8s-network-mapper'], - to: '/features/Networking/Examples/k8s-network-mapper', + to: '/features/networking/tutorials/k8s-network-mapper', }, // Redirect from multiple old paths to the new path // { From ed435f9d00d9b961e741ec030e0b8df3a2e6391e Mon Sep 17 00:00:00 2001 From: bglynn Date: Tue, 30 Jan 2024 13:34:45 -0800 Subject: [PATCH 07/18] * Added a smaller more value-add IBAC page. * Updates to tutorials * Removed Otterize Cloud / Object model and added items to the terminology instead * Removed logos with names --- docs/features/README.mdx | 2 +- docs/features/aws-iam/index.mdx | 4 +- .../aws-iam/{Reference.mdx => reference.mdx} | 6 +- .../aws-iam/tutorials/aws-iam-eks.mdx | 6 +- docs/features/istio/_category_.json | 2 +- .../istio/{Reference.mdx => reference.mdx} | 6 +- .../k8s-istio-authorization-policies.mdx | 49 ++---- .../istio/tutorials/k8s-istio-watcher.mdx | 71 ++------ docs/features/kafka/_category_.json | 2 +- .../kafka/{Reference.mdx => reference.mdx} | 26 ++- .../kafka/tutorials/k8s-kafka-mapping.mdx | 62 +------ .../tutorials/k8s-kafka-mtls-cert-manager.mdx | 77 +++----- .../kafka/tutorials/k8s-kafka-mtls.mdx | 50 ++---- docs/features/networking/index.mdx | 4 +- .../Network-Policies-Deep-Dive.mdx | 0 .../{Reference => reference}/README.mdx | 19 +- .../networking/tutorials/aws-eks-cni-mini.mdx | 45 +---- .../tutorials/k8s-network-mapper.mdx | 75 ++------ .../tutorials/k8s-network-policies.mdx | 47 +---- .../protect-1-service-network-policies.mdx | 165 ++++++++---------- docs/features/postgresql/_category_.json | 2 +- .../{Reference.mdx => reference.mdx} | 2 +- docs/getting-started/README.mdx | 12 +- docs/getting-started/_category_.json | 2 +- docs/overview/intent-based-access-control.mdx | 95 +++------- docs/overview/otterize-cloud/object-model.mdx | 44 ----- docs/overview/otterize-oss/README.mdx | 14 -- docs/reference/terminology/README.mdx | 12 ++ docusaurus.config.js | 4 +- src/components/LinkCard/index.js | 2 +- static/img/icons/Postgresql-no-word-mark.svg | 22 +++ static/img/icons/istio-no-word-mark.svg | 1 + static/img/icons/kafka-no-word-mark.svg | 16 ++ 33 files changed, 308 insertions(+), 638 deletions(-) rename docs/features/aws-iam/{Reference.mdx => reference.mdx} (94%) rename docs/features/istio/{Reference.mdx => reference.mdx} (89%) rename docs/features/kafka/{Reference.mdx => reference.mdx} (74%) rename docs/features/networking/{Reference => reference}/Network-Policies-Deep-Dive.mdx (100%) rename docs/features/networking/{Reference => reference}/README.mdx (93%) rename docs/features/postgresql/{Reference.mdx => reference.mdx} (95%) delete mode 100644 docs/overview/otterize-cloud/object-model.mdx create mode 100644 static/img/icons/Postgresql-no-word-mark.svg create mode 100644 static/img/icons/istio-no-word-mark.svg create mode 100644 static/img/icons/kafka-no-word-mark.svg diff --git a/docs/features/README.mdx b/docs/features/README.mdx index 28c41d948..e017bc711 100644 --- a/docs/features/README.mdx +++ b/docs/features/README.mdx @@ -17,7 +17,7 @@ export default function FeatureCards() { console.log(JSON.stringify(features)); return (
-

Features

+

Features

Otterize makes it easy to create and visualize authorization for your Kubernetes clusters across a variety of diff --git a/docs/features/aws-iam/index.mdx b/docs/features/aws-iam/index.mdx index aa44f0a4c..7d4bd288f 100644 --- a/docs/features/aws-iam/index.mdx +++ b/docs/features/aws-iam/index.mdx @@ -20,7 +20,7 @@ To follow along with a full example, take a look at [Automate AWS IAM for EKS](/ 1. First, the EKS cluster must have [Otterize installed](/overview/installation). 2. We must label the pod with `credentials-operator.otterize.com/create-aws-role: "true"` 3. Once that is complete, Otterize’s credential operator will create a role and an `AssumeRolePolicy` bound to ServiceAccount. -4. At this point, the role does not have the ability to perform any actions. We will need to create a ClientIntents YAML for the access the service requires and apply it to our cluster. Below is an example of a ClientIntents file for accessing an S3 bucket. View the [reference](/features/aws-iam/Reference) to learn more about the AWS IAM Client Intent syntax. +4. At this point, the role does not have the ability to perform any actions. We will need to create a ClientIntents YAML for the access the service requires and apply it to our cluster. Below is an example of a ClientIntents file for accessing an S3 bucket. View the [reference](/features/aws-iam/reference) to learn more about the AWS IAM Client Intent syntax. 5. Once the intent is applied, a new policy will be attached to the service’s role with the appropriate access. ```yaml @@ -39,7 +39,7 @@ spec: - "s3:GetObject" ``` -### Coming Soon +### Coming soon Building least-privilege access can be difficult. Many actions have dependent actions, or services can require a lot of access to perform their functions. To help reduce this burden, Otterize will provide automated ClientIntents based on the actions your service actually requires by detecting the calls being made and converting them into the necessary YAML syntax. diff --git a/docs/features/aws-iam/Reference.mdx b/docs/features/aws-iam/reference.mdx similarity index 94% rename from docs/features/aws-iam/Reference.mdx rename to docs/features/aws-iam/reference.mdx index 6ad10583d..04ead9d00 100644 --- a/docs/features/aws-iam/Reference.mdx +++ b/docs/features/aws-iam/reference.mdx @@ -3,7 +3,7 @@ sidebar_position: 3 title: Reference --- -### ClientIntents Example (YAML) +### ClientIntents example (YAML) ```yaml apiVersion: k8s.otterize.com/v1alpha3 @@ -36,10 +36,12 @@ spec: | `credentials-operator.otterize.com/create-aws-role` | By setting to **true** the credential operator will create an unique AWS Role for the associated pod | `false` | -### Helm Chart Options +### Helm Chart options | Key | Description | Default | |------------------------------------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|----------| | `global.aws.enabled` | Enable or disable AWS integration | `false` | | `global.aws.eksClusterNameOverride` | EKS cluster name (overrides auto-detection) | `(none)` | | `aws.roleARN` | ARN of the AWS role the operator will use to access AWS. By defeault, Otterize will create a unique role for each service an annotate the service with the role's ARN. | `(none)` | + +View the [helm chart reference](/reference/configuration/otterize-chart) for all other options \ No newline at end of file diff --git a/docs/features/aws-iam/tutorials/aws-iam-eks.mdx b/docs/features/aws-iam/tutorials/aws-iam-eks.mdx index 94b8fd774..3c7565501 100644 --- a/docs/features/aws-iam/tutorials/aws-iam-eks.mdx +++ b/docs/features/aws-iam/tutorials/aws-iam-eks.mdx @@ -21,7 +21,7 @@ In this tutorial, we will: ## Prerequisites Already have Otterize deployed with the IAM integration configured on your cluster? [Skip to the tutorial.](#tutorial) -#### 1. Create an AWS EKS cluster +### 1. Create an AWS EKS cluster Before you start, you'll need an AWS EKS cluster. Any cluster will do; there are no special requirements or setup.

@@ -86,7 +86,7 @@ Don't forget to configure your kubeconfig for your cluster. If using the example aws eks update-kubeconfig --region us-west-2 --name otterize-iam-eks-tutorial ``` -#### 2. Deploy Otterize for AWS IAM +### 2. Deploy Otterize for AWS IAM To deploy Otterize, head over to [Otterize Cloud](https://app.otterize.com) and: 1. Create a Kubernetes cluster on the [Clusters page](https://app.otterize.com/clusters), and follow the instructions. *Make sure to enable enforcement mode for this tutorial.* If you already have a Kubernetes cluster connected, skip this step. @@ -324,7 +324,7 @@ aws s3 ls $BUCKET_NAME 2023-11-17 20:42:55 19 testfile.3.txt ``` -## What's next? +### What's next? Try out some of the other quick tutorials to learn about how to use ClientIntents to manage network policies, Istio policies, PostgreSQL access, and more. You can use a single ClientIntents resource to specify all the access required for a pod. diff --git a/docs/features/istio/_category_.json b/docs/features/istio/_category_.json index 1768d992d..5807d8821 100644 --- a/docs/features/istio/_category_.json +++ b/docs/features/istio/_category_.json @@ -3,6 +3,6 @@ "position": 4, "collapsed": true, "customProps": { - "image": "/img/icons/istio.png" + "image": "/img/icons/istio-no-word-mark.svg" } } diff --git a/docs/features/istio/Reference.mdx b/docs/features/istio/reference.mdx similarity index 89% rename from docs/features/istio/Reference.mdx rename to docs/features/istio/reference.mdx index 4adb25e10..69131cd88 100644 --- a/docs/features/istio/Reference.mdx +++ b/docs/features/istio/reference.mdx @@ -3,7 +3,7 @@ sidebar_position: 3 title: Reference --- -### Client Intents (YAML) +### ClientIntents example (YAML) ```yaml apiVersion: k8s.otterize.com/v1alpha3 @@ -23,7 +23,7 @@ spec: ``` -### Helm Chart Options +### Helm Chart options | Key | Description | Default | |---------------------------------|-----------------------------------------|--------------------------------| @@ -34,3 +34,5 @@ spec: | `istiowatcher.pullPolicy` | Istio watcher pull policy. | `(none)` | | `istiowatcher.pullSecrets` | Istio watcher pull secrets. | `(none)` | | `istiowatcher.resources` | Resources override. | `(none)` | + +View the [helm chart reference](/reference/configuration/otterize-chart) for all other options \ No newline at end of file diff --git a/docs/features/istio/tutorials/k8s-istio-authorization-policies.mdx b/docs/features/istio/tutorials/k8s-istio-authorization-policies.mdx index 4f26a65ef..a265c6520 100644 --- a/docs/features/istio/tutorials/k8s-istio-authorization-policies.mdx +++ b/docs/features/istio/tutorials/k8s-istio-authorization-policies.mdx @@ -24,44 +24,13 @@ In this tutorial, we will: ## Prerequisites -
-Prepare a Kubernetes cluster - -Before you start, you'll need a Kubernetes cluster. Having a cluster with a [CNI](https://kubernetes.io/docs/concepts/extend-kubernetes/compute-storage-net/network-plugins/) that supports [NetworkPolicies](https://kubernetes.io/docs/concepts/services-networking/network-policies/) isn't required for this tutorial, but is recommended so that your cluster works with other tutorials. - -{@include: ../../../_common/cluster-setup.md} - -
- -You can now install (or reinstall) Otterize in your cluster, and optionally connect to Otterize Cloud. Connecting to Cloud lets you: +Already have Otterize deployed with Istio configured on your cluster? Skip to the [tutorial](#tutorial). -1. See what's happening visually in your browser, through the "access graph"; +### 1. Deploy Otterize +To deploy Otterize, head over to [Otterize Cloud](https://app.otterize.com) and create a Kubernetes cluster on the [Clusters page](https://app.otterize.com/clusters), and follow the instructions. If you already have a Kubernetes cluster connected, skip this step. -So either forego browser visualization and: - -
-Install Otterize in your cluster, without Otterize Cloud - -{@include: ../../../_common/install-otterize-istio-enabled.md} - -
-Or choose to include browser visualization and: - -
-Install Otterize in your cluster, with Otterize Cloud - -#### Create an Otterize Cloud account - -{@include: ../../../_common/create-account.md} - -#### Install Otterize OSS, connected to Otterize Cloud - -{@include: ../../../_common/install-otterize-from-cloud-with-istio-enforcement.md} - -
- -## Install and configure Istio +### 2. Install and configure Istio
Install Istio in the cluster via Helm @@ -91,7 +60,9 @@ e.g. in the access graph, but we can also use that information to automatically enforce them with Istio authorization policies. ::: -## Deploy the two clients and the server +## Tutorial + +### Deploy the two clients and the server Deploy a simple example consisting of `client` and `other-client` calling `nginx` over HTTP: @@ -99,7 +70,7 @@ Deploy a simple example consisting of `client` and `other-client` calling `nginx kubectl apply -n otterize-tutorial-istio -f ${ABSOLUTE_URL}/code-examples/istio-authorization-policies/all.yaml ``` -## Apply intents +### Apply intents We will now declare that the **client** intends to call the **server** at a particular HTTP path using a specific HTTP method. @@ -250,7 +221,7 @@ It's now clear what happened: Otterize did its job of both protecting the server _and_ allowing intended access. ::: -## What did we accomplish? +### What did we accomplish? - Controlling access through Istio authorization policies no longer means touching authorization policies at all. @@ -284,7 +255,7 @@ all the appropriate configuration was managed automatically behind the scenes. Try to create an intents file yourself for **client-other**, and apply it to allow this other client to call the server. ::: -## What's next +### What's next - Get started with the [Otterize network mapper for Istio](/quickstart/visualization/k8s-istio-watcher) to help you bootstrap intents files with HTTP resources for use in [intent-based access control (IBAC)](/intent-based-access-control). diff --git a/docs/features/istio/tutorials/k8s-istio-watcher.mdx b/docs/features/istio/tutorials/k8s-istio-watcher.mdx index 422daa522..d72e8495e 100644 --- a/docs/features/istio/tutorials/k8s-istio-watcher.mdx +++ b/docs/features/istio/tutorials/k8s-istio-watcher.mdx @@ -18,68 +18,19 @@ In this tutorial, we will: ## Prerequisites -
-Prepare a Kubernetes cluster - -Before you start, you'll need a Kubernetes cluster. Having a cluster with a [CNI](https://kubernetes.io/docs/concepts/extend-kubernetes/compute-storage-net/network-plugins/) that supports [NetworkPolicies](https://kubernetes.io/docs/concepts/services-networking/network-policies/) isn't required for this tutorial, but is recommended so that your cluster works with other tutorials. - -{@include: ../../../_common/cluster-setup.md} - -
+Already have Otterize deployed with Istio configured on your cluster? Skip to the [tutorial](#tutorial). -You can now install Otterize in your cluster, and optionally connect to Otterize Cloud. Connecting to Cloud lets you: +### 1. Deploy Otterize +To deploy Otterize, head over to [Otterize Cloud](https://app.otterize.com) and create a Kubernetes cluster on the [Clusters page](https://app.otterize.com/clusters), and follow the instructions. If you already have a Kubernetes cluster connected, skip this step. -1. See what's happening visually in your browser, through the "access graph"; -So either forego browser visualization and: - -
-Install the Otterize network mapper in your cluster with the Istio watcher component enabled, and without Otterize Cloud - -{@include: ../../../_common/install-otterize-istio-watcher.md} - -
- -Or choose to include browser visualization and: - -
-Install Otterize in your cluster, with Otterize Cloud - -#### Create an Otterize Cloud account - -{@include: ../../../_common/create-account.md} - -#### Install Otterize OSS, connected to Otterize Cloud - -{@include: ../../../_common/install-otterize-from-cloud-with-enforcement-with-istiowatcher.md} - -
- -Finally, you'll need to install the Otterize CLI (if you haven't already) to interact with the network mapper: - -
-Install the Otterize CLI - -{@include: ../../../_common/install-otterize-cli.md} - -
- -## Install and configure Istio +### 2. Install and configure Istio
Install Istio in the cluster via Helm {@include: ../../../_common/install-istio.md} -
-
-Create a namespace for our demo application and label it for Istio injection - -```shell -kubectl create namespace otterize-tutorial-istio-mapping -kubectl label namespace otterize-tutorial-istio-mapping istio-injection=enabled -``` -
Add HTTP methods and request paths to Istio exported metrics @@ -103,16 +54,20 @@ e.g. in the access graph, but we can also use that information to automatically enforce them with Istio authorization policies. ::: -## Deploy demo to simulate traffic +## Tutorial + +### Deploy demo to simulate traffic -Let's add services and traffic to the cluster and see how the network mapper builds the map. +Let's create a namespace with istio enabled, and add services and traffic to the cluster and see how the network mapper builds the map. Deploy the following simple example — `client`, `client2` and `nginx`, communicating over HTTP: ```shell +kubectl create namespace otterize-tutorial-istio-mapping +kubectl label namespace otterize-tutorial-istio-mapping istio-injection=enabled kubectl apply -n otterize-tutorial-istio-mapping -f ${ABSOLUTE_URL}/code-examples/network-mapper/istio.yaml ``` -## Map the cluster +### Map the cluster The Istio watcher component of the network mapper starts querying Envoy sidecars for HTTP connections and builds an in-memory network map as soon as it's installed. The Otterize CLI allows you to interact with the network mapper to @@ -144,7 +99,7 @@ The access graph reveals several types of information and insights, such as: 3. Filtering the map to include recently-seen traffic, since some date in the past. That way you can eliminate calls that are no longer relevant, without having to reset the network mapper and start building a new map. 4. Showing more specifics about access, if the intents operator is also connected: understand which services are protected or would be protected, and which client calls are being blocked or would be blocked. We'll see more of that in the Istio AuthorizationPolicy tutorial. -## What's next +### What's next The network mapper is a great way to bootstrap IBAC. It generates client intents files that reflect the current topology of your services; those can then be used by each client team to grant them easy @@ -157,7 +112,7 @@ Where to go next? - If you haven't already, see the [automate network policies tutorial](/quickstart/access-control/k8s-network-policies). - Or go to the next tutorial to [automate secure access for Kafka](/quickstart/access-control/k8s-kafka-mtls). -### Teardown +## Teardown To remove Istio and the deployed examples run: diff --git a/docs/features/kafka/_category_.json b/docs/features/kafka/_category_.json index 671f785b5..f48b40857 100644 --- a/docs/features/kafka/_category_.json +++ b/docs/features/kafka/_category_.json @@ -3,7 +3,7 @@ "position": 3, "collapsed": true, "customProps": { - "image": "/img/icons/kafka.png", + "image": "/img/icons/kafka-no-word-mark.svg", "cloud-only": "true" } } diff --git a/docs/features/kafka/Reference.mdx b/docs/features/kafka/reference.mdx similarity index 74% rename from docs/features/kafka/Reference.mdx rename to docs/features/kafka/reference.mdx index 8bbbbdb09..42fce1a56 100644 --- a/docs/features/kafka/Reference.mdx +++ b/docs/features/kafka/reference.mdx @@ -3,7 +3,7 @@ sidebar_position: 3 title: Reference --- -### KafkaServerConfig (YAML) +### KafkaServerConfig example (YAML) ```yaml apiVersion: k8s.otterize.com/v1alpha3 @@ -13,11 +13,12 @@ metadata: namespace: kafka spec: service: - name: kafka #name of the Kafka service broker + # name of the Kafka service broker + name: kafka addr: kafka.kafka:9092 ``` -### ClientIntents (YAML) +### ClientIntents example (YAML) ```yaml apiVersion: k8s.otterize.com/v1alpha3 @@ -27,18 +28,23 @@ metadata: namespace: otterize-tutorial-kafka-mtls spec: service: - name: client # The service requiring access to a topic + # The service requiring access to a topic + name: client calls: - - name: kafka.kafka # name of the Kafka service broker + # name of the Kafka service broker + - name: kafka.kafka type: kafka kafkaTopics: - - name: mytopic # Topic name - operations: [ produce,describe,consume ] # ACL Operations like alter, delete, all, etc - - name: transactions # Multiple topics can be added + # Topic name + - name: mytopic + # ACL Operations including alter, delete, all, etc + operations: [ produce,describe,consume ] + # Multiple topics can be added + - name: transactions operations: [ produce,describe,consume ] ``` -### Helm Chart Options +### Helm Chart options | Key | Description | Default | |---------------------------------|-------------------------------------------------------------|--------------------------------| @@ -50,3 +56,5 @@ spec: | `kafkawatcher.pullSecrets` | Kafka watcher pull secrets. | `(none)` | | `kafkawatcher.resources` | Resources override. | `(none)` | | `kafkawatcher.kafkaServers` | Kafka servers to watch, specified as `pod.namespace` items. | `(none)` | + +View the [helm chart reference](/reference/configuration/otterize-chart) for all other options \ No newline at end of file diff --git a/docs/features/kafka/tutorials/k8s-kafka-mapping.mdx b/docs/features/kafka/tutorials/k8s-kafka-mapping.mdx index 56ad8433f..0276ff82e 100644 --- a/docs/features/kafka/tutorials/k8s-kafka-mapping.mdx +++ b/docs/features/kafka/tutorials/k8s-kafka-mapping.mdx @@ -19,58 +19,12 @@ We will **not** be doing any access control in this demo, just purely mapping cl ## Prerequisites -
-Prepare a Kubernetes cluster - -Before you start, you'll need a Kubernetes cluster. Having a cluster with a [CNI](https://kubernetes.io/docs/concepts/extend-kubernetes/compute-storage-net/network-plugins/) that supports [NetworkPolicies](https://kubernetes.io/docs/concepts/services-networking/network-policies/) isn't required for this tutorial, but is recommended so that your cluster works with other tutorials. - -{@include: ../../../_common/cluster-setup.md} - -
- -You can now install Otterize in your cluster, and optionally connect to Otterize Cloud. Connecting to Cloud lets you -see what's happening visually in your browser, through the "access graph". - -So either forego browser visualization and: - -
-Install Otterize in your cluster with the Kafka watcher component enabled, without Otterize Cloud - -``` -helm repo add otterize https://helm.otterize.com -helm repo update -helm install otterize otterize/network-mapper -n otterize-system --create-namespace \ ---set kafkawatcher.enable=true \ ---set kafkawatcher.kafkaServers={"kafka-0.kafka"} -``` - -
+Already have Otterize & a Kafka broker deployed on your cluster? Skip to the [tutorial](#tutorial). -Or choose to include browser visualization and: +### 1. Deploy Otterize +To deploy Otterize, head over to [Otterize Cloud](https://app.otterize.com) and create a Kubernetes cluster on the [Clusters page](https://app.otterize.com/clusters), and follow the instructions. If you already have a Kubernetes cluster connected, skip this step. -
-Install Otterize in your cluster, with Otterize Cloud - -#### Create an Otterize Cloud account - -{@include: ../../../_common/create-account.md} - -#### Install Otterize OSS, connected to Otterize Cloud - -{@include: ../../../_common/install-otterize-from-cloud-with-shadow-mode-and-kafka-watcher.md} - -
- -Finally, you'll need to install the Otterize CLI (if you haven't already) to interact with the network mapper: - -
-Install the Otterize CLI - -{@include: ../../../_common/install-otterize-cli.md} - -
- -## Install Kafka +### 2. Install Kafka We will deploy a Kafka broker using Bitnami's [Helm chart](https://github.com/bitnami/charts/tree/master/bitnami/kafka). In the chart we will configure Kafka to: @@ -96,7 +50,9 @@ helm install --create-namespace -n kafka \ -f ${ABSOLUTE_URL}/code-examples/kafka-mapping/helm/values.yaml kafka bitnami/kafka --version 21.4.4 ``` -## Deploy demo to simulate traffic +## Tutorial + +### Deploy demo to simulate traffic Let's add a few services that will access our Kafka server, and see how the network mapper builds the access map: @@ -142,7 +98,7 @@ Only the arrows between the clients and the Kafka are green, because we've selec Clicking on a specific arrow between a client and the broker reveals which topic and operations are being accessed. -## What did we accomplish? +### What did we accomplish? Enabling the Kafka watcher component of the network mapper shows which clients connect to running Kafka servers, the topics they access, and the operations they undertake on those topics. @@ -152,7 +108,7 @@ You can consume this information in various ways: - [Via the CLI](/reference/cli): from the network mapper directly or the cloud. - [Via the API](https://app.otterize.com/api/rest/v1beta). -## What's next +### What's next - Try our [secure access for Kafka](/quickstart/access-control/k8s-kafka-mtls) tutorial diff --git a/docs/features/kafka/tutorials/k8s-kafka-mtls-cert-manager.mdx b/docs/features/kafka/tutorials/k8s-kafka-mtls-cert-manager.mdx index 8bd74c7dd..1a4d1b13f 100644 --- a/docs/features/kafka/tutorials/k8s-kafka-mtls-cert-manager.mdx +++ b/docs/features/kafka/tutorials/k8s-kafka-mtls-cert-manager.mdx @@ -22,20 +22,9 @@ In this tutorial, we will: ## Prerequisites -### Prepare a Kubernetes cluster +### 1.Install cert-manager and configure a CA issuer -
-Expand for cluster setup instructions - -Before you start, you'll need a Kubernetes cluster. - -{@include: ../../../_common/cluster-setup.md} - -
- -### Install cert-manager and configure a CA issuer - -#### Install cert-manager +##### Install cert-manager Use the following command or [follow cert-manager's installation guide for different setups](https://cert-manager.io/docs/installation/): @@ -43,7 +32,7 @@ Use the following command or [follow cert-manager's installation guide for diffe kubectl apply -f https://github.com/cert-manager/cert-manager/releases/download/v1.13.0/cert-manager.yaml ``` -#### Set up a CA (Certificate Authority) `ClusterIssuer` +##### Set up a CA (Certificate Authority) `ClusterIssuer` :::caution This tutorial uses the built-in and easy-to-setup `CA` Issuer type so that the tutorial is easy to run, but you should not use this issuer as-is in production. Instead, consider using one of the other issuers, such as a Venafi or Vault issuer. [Read more about CA issuers in the cert-manager documentation](https://cert-manager.io/docs/configuration/ca/). @@ -61,50 +50,26 @@ kubectl apply -f ${ABSOLUTE_URL}/code-examples/kafka-mtls-cert-manager/clusteris You may have to wait for `cert-manager` to start successfully before you are able to deploy the `ClusterIssuer`. -### Install Otterize - -You can now install Otterize in your cluster, and connect to Otterize Cloud. Connecting to Cloud lets you: - -1. See what's happening visually in your browser, through the "access graph"; -2. Generate certificates using the Otterize Cloud hosted service. If you prefer to generate certificates in-cluster, you can [follow the tutorial for cert-manager](/quickstart/access-control/k8s-kafka-mtls-cert-manager). - - - - - -{@include: ../../../_common/install-otterize-from-cloud-with-shadow-mode-and-kafka-watcher-and-cert-manager.md} - -#### Configure the access graph in Otterize Cloud to only show Kafka authorization status +### 2. Install Otterize -You want to make sure that under **Istio Policies** _Use in access graph_ is turned off and that under **Network Policies** _Use in access graph_ is also turned off. +Already have Otterize & a Kafka broker deployed on your cluster? Skip to the [tutorial](#tutorial). -Keep _Use in access graph_ **on** under **Kafka ACLs** so that the access graph only shows the authorization status for Kafka ACLs. +#### Deploy Otterize +To deploy Otterize, head over to [Otterize Cloud](https://app.otterize.com) and create a Kubernetes cluster on the [Clusters page](https://app.otterize.com/clusters), and follow the instructions. If you already have a Kubernetes cluster connected, skip this step. -![Make sure access graph is configured correctly](/img/quick-tutorials/k8s-kafka-mtls-cert-mgr//cloud-settings.png) - - - - -To install without connecting to Otterize Cloud and no access graph, run the following command: - -```shell -helm repo add otterize https://helm.otterize.com -helm repo update - -helm upgrade --install otterize otterize/otterize-kubernetes -n otterize-system --create-namespace \ ---set intentsOperator.operator.mode=defaultShadow \ ---set global.deployment.credentialsOperator=true \ ---set global.certificateProvider=cert-manager \ ---set credentialsOperator.certManager.issuerName=ca-issuer \ +##### Note: +* Under mTLS and Kafka support choose **cert-manager**. +* Copy the Helm command and add the following flags: +```bash --set intentsOperator.operator.enableNetworkPolicyCreation=false \ --set networkMapper.kafkawatcher.enable=true \ --set networkMapper.kafkawatcher.kafkaServers={"kafka-0.kafka"} ``` - - +Note that enforcement is disabled, we will enable it later. The configuration tab should look like this: + -## Install Kafka +### 3. Install Kafka We will deploy a Kafka broker using Bitnami's [Helm chart](https://github.com/bitnami/charts/tree/master/bitnami/kafka). In the chart we will configure Kafka to: @@ -135,7 +100,7 @@ helm install --create-namespace -n kafka \ You can watch for all pods to be `Ready` using `kubectl get pods -n kafka -w`. -## Configure Otterize to manage Kafka access +### 4. Configure Otterize to manage Kafka access In our simple example, we'll call the Kafka broker service simply "kafka". Let's tell Otterize how to connect to the Kafka broker by applying an Otterize `KafkaServerConfig`, naming it `kafka`. The name will be the name we later use to declare `ClientIntents`. @@ -148,7 +113,9 @@ kubectl apply -f ${ABSOLUTE_URL}/code-examples/kafka-mtls-cert-manager/kafkaserv {@include: ../../../../static/code-examples/kafka-mtls-cert-manager/kafkaserverconfig.yaml} ``` -## Deploy clients +## Tutorial + +### Deploy Clients Our simple example consists of two client pods: @@ -337,7 +304,7 @@ You can now browse to your account at [https://app.otterize.com](https://app.ott The access graph shows, through its green and orange lines linking the services, that no clients are currently blocked because we haven't enabled any sort of enforcement yet. The orange lines indicate that, since we have not declared any intents for these clients, they _would_ be blocked if we were to turn enforcement on. -## Apply intents +### Apply intents :::tip @@ -373,7 +340,7 @@ We can see what happened: 2. Calls from **[client-other]** are not declared (orange line). 3. Looking at the Kafka service, we can see that **[client]** has specific access configured (via Kafka ACLs) to perform `all` operations on the `mytopic` topic. -## Turn on protection +### Turn on protection At this point, we haven't actually protected our Kafka broker. From everything we've done so far, we can see, however, that if we were to turn on protection, the `client-other` would lose access to the broker. @@ -408,7 +375,7 @@ And if you look back at your access graph, you'll see that the Kafka broker is n ![Clients blocked](/img/quick-tutorials/k8s-kafka-mtls-cert-mgr//clients-blocked.png) -## What did we accomplish? +### What did we accomplish? - Controlling Kafka access no longer means touching ACLs, issuing and managing and distributing certs, establishing trust, etc. @@ -454,7 +421,7 @@ This was achieved by using the built-in Kafka ACL mechanism, which the intents o
-## What's next +### What's next - [Learn more about credentials-operator works with cert-manager](/reference/configuration/credentials-operator#cert-manager). - [Enable the credentials-operator `CertificateRequest` auto-approver](/reference/configuration/credentials-operator/helm-chart#cert-manager-parameters) for production deployments of cert-manager where the default auto-approver is disabled. diff --git a/docs/features/kafka/tutorials/k8s-kafka-mtls.mdx b/docs/features/kafka/tutorials/k8s-kafka-mtls.mdx index f06e2d51d..61e86ff89 100644 --- a/docs/features/kafka/tutorials/k8s-kafka-mtls.mdx +++ b/docs/features/kafka/tutorials/k8s-kafka-mtls.mdx @@ -21,36 +21,23 @@ In this tutorial, we will: ## Prerequisites -### Prepare a Kubernetes cluster +Already have Otterize & a Kafka broker deployed on your cluster? Skip to the [tutorial](#tutorial). -
-Expand for cluster setup instructions - -Before you start, you'll need a Kubernetes cluster. - -{@include: ../../../_common/cluster-setup.md} - -
- -### Install Otterize - -You can now install Otterize in your cluster, and connect to Otterize Cloud. Connecting to Cloud lets you: +### 1. Deploy Otterize +To deploy Otterize, head over to [Otterize Cloud](https://app.otterize.com) and create a Kubernetes cluster on the [Clusters page](https://app.otterize.com/clusters), and follow the instructions. If you already have a Kubernetes cluster connected, skip this step. -1. See what's happening visually in your browser, through the "access graph". -2. Generate certificates using the Otterize Cloud hosted service. If you prefer to generate certificates in-cluster, you can [follow the tutorial for cert-manager](/quickstart/access-control/k8s-kafka-mtls-cert-manager). - -#### Install Otterize OSS, connected to Otterize Cloud -{@include: ../../../_common/install-otterize-from-cloud-with-shadow-mode-and-kafka-watcher.md} - -#### Configure the access graph in Otterize Cloud to only show Kafka authorization status - -You want to make sure that under **Istio Policies** _Use in access graph_ is turned off and that under **Network Policies** _Use in access graph_ is also turned off. - -Keep _Use in access graph_ **on** under **Kafka ACLs** so that the access graph only shows the authorization status for Kafka ACLs. +##### Note: +* Under mTLS and Kafka support choose **Otterize Cloud**. +* Copy the Helm command and add the following flags: +```bash +--set intentsOperator.operator.enableNetworkPolicyCreation=false \ +--set networkMapper.kafkawatcher.enable=true \ +--set networkMapper.kafkawatcher.kafkaServers={"kafka-0.kafka"} +``` -![Make sure access graph is configured correctly](/img/quick-tutorials/k8s-kafka-mtls//cloud-settings.png) +Note that enforcement is disabled, we will enable it later. The configuration tab should look like this: -## Install Kafka +### 2. Install Kafka We will deploy a Kafka broker using Bitnami's [Helm chart](https://github.com/bitnami/charts/tree/master/bitnami/kafka). In the chart we will configure Kafka to: @@ -81,7 +68,7 @@ helm install --create-namespace -n kafka \ You can watch for all pods to be `Ready` using `kubectl get pods -n kafka -w`. -## Configure Otterize to manage Kafka access +### 3. Configure Otterize to manage Kafka access In our simple example, we'll call the Kafka broker service simply "kafka". Let's tell Otterize how to connect to the Kafka broker by applying an Otterize `KafkaServerConfig`, naming it `kafka`. The name will be the name we later use to declare `ClientIntents`. @@ -93,8 +80,9 @@ kubectl apply -f ${ABSOLUTE_URL}/code-examples/kafka-mtls/kafkaserverconfig.yaml ```yaml {@include: ../../../../static/code-examples/kafka-mtls/kafkaserverconfig.yaml} ``` +## Tutorial -## Deploy clients +### Deploy clients Our simple example consists of two client pods: @@ -248,7 +236,7 @@ You can now browse to your account at [https://app.otterize.com](https://app.ott The access graph shows, through its green and orange lines linking the services, that no clients are currently blocked because we haven't enabled any sort of enforcement yet. The orange lines indicate that, since we have not declared any intents for these clients, they _would_ be blocked if we were to turn enforcement on. -## Apply intents +### Apply intents :::tip @@ -286,7 +274,7 @@ We can see what happened: Also, the access graph shows information about the mTLS certificates (credentials) distributed to the various services, as long as [Cloud-managed credentials](/security#cryptographic-credentials) are being used. -## Turn on protection +### Turn on protection At this point, we haven't actually protected our Kafka broker. From everything we've done so far, we can see, however, that if we were to turn on protection, the `client-other` would lose access to the broker. @@ -321,7 +309,7 @@ And if you look back at your access graph, you'll see that the Kafka broker is n ![Clients blocked](/img/quick-tutorials/k8s-kafka-mtls/clients-blocked.png) -## What did we accomplish? +### What did we accomplish? - Controlling Kafka access no longer means touching ACLs, issuing and managing and distributing certs, establishing trust, etc. diff --git a/docs/features/networking/index.mdx b/docs/features/networking/index.mdx index 21522b9b9..9d76470ba 100644 --- a/docs/features/networking/index.mdx +++ b/docs/features/networking/index.mdx @@ -33,14 +33,14 @@ export const network_access_tutorials = [ ### About You can use Otterize to understand, visualize, and manage access for Kubernetes networks. Upon installation, Otterize inspects network traffic and builds an in-memory network map of connections. The network map can then be exported or viewed in various ways to understand the connections within your networks. With IBAC-based policies, Otterize becomes a control plane for your K8s networks. Mapped network traffic can autogenerate declarative intent-based access policies to create least privileged pod-to-pod access easily. -### Visualizing +### Mapping & visualizing After installation, Otterize collects network traffic data in memory, creating a graph of relationships between pod-to-pod and pod-to-public internet traffic. Once the graph is in place, the data can be exported or viewed in various ways. Otterize Cloud users can see and interact with the graph structures within the Otterize application. OSS users can use the CLI tool to export the data into JSON, list the relationship, or generate IBAC policies reflecting the existing traffic. To learn more about Visualizing, check out [Visualizing a Kubernetes Network](/features/Networking/tutorials/k8s-network-mapper) -### Access Control +### Access control By default, Kubernetes pods allow all egress and ingress traffic. Kubernetes [NetworkPolicies](/reference/terminology#network-policies) provide `policyTypes` to restrict egress or ingress traffic, providing a more secure and compliant environment. Utilizing the in-memory tariff map, Otterize can automatically generate IBAC policies to reflect the current traffic flow within a cluster. Once the IBAC policies are submitted, Otterize will generate and apply the corresponding NetworkPolicies to your namespaces. diff --git a/docs/features/networking/Reference/Network-Policies-Deep-Dive.mdx b/docs/features/networking/reference/Network-Policies-Deep-Dive.mdx similarity index 100% rename from docs/features/networking/Reference/Network-Policies-Deep-Dive.mdx rename to docs/features/networking/reference/Network-Policies-Deep-Dive.mdx diff --git a/docs/features/networking/Reference/README.mdx b/docs/features/networking/reference/README.mdx similarity index 93% rename from docs/features/networking/Reference/README.mdx rename to docs/features/networking/reference/README.mdx index 4c7ae3fd0..3b239324d 100644 --- a/docs/features/networking/Reference/README.mdx +++ b/docs/features/networking/reference/README.mdx @@ -4,7 +4,7 @@ title: Reference hide_table_of_contents: true --- -### Client Intents (YAML) +### ClientIntents example (YAML) ```yaml apiVersion: k8s.otterize.com/v1alpha3 @@ -14,13 +14,22 @@ metadata: namespace: otterize-example spec: service: - name: client #The name of the service initiating the connection + # The name of the service initiating the connection + name: client calls: - - name: server #The name of the service recieving the connection. Multiple names can be provided + # The name of the service receiving the connection. Multiple names can be provided + - name: server + # multiple services can be added + - name: orderservice + # Optional granular rules can be added like the HTTPResources options below. + type: http + HTTPResources: + - path: /orders/* + methods: [ get, post ] ``` -### Helm Chart Options +### Helm Chart options | Key | Description | Default | |-----------------------------------------|---------------------------------------------------------------------------------------------------------------------------------------|---------| @@ -28,6 +37,8 @@ spec: | `operator.autoCreateNetworkPoliciesForExternalTraffic` | (deprecated, use `allowExternalTraffic` instead) Automatically allow external traffic, if a new ClientIntents resource would result in blocking external (internet) traffic and there is an Ingress/Service resource indicating external traffic is expected. | `true` | | `operator.autoCreateNetworkPoliciesForExternalTrafficDisableIntentsRequirement` | (deprecated, use `allowExternalTraffic` instead) **experimental** - If `autoCreateNetworkPoliciesForExternalTraffic` is enabled, do not require ClientIntents resources - simply create network policies based off of the existence of an Ingress/Service resource. | `false` | +View the [helm chart reference](/reference/configuration/otterize-chart) for all other options + ### Network mapper parameters All configurable parameters of the network mapper can be configured under the alias `networkMapper`. Further information about network mapper parameters can be found [in the network mapper's chart](https://github.com/otterize/helm-charts/tree/main/network-mapper). diff --git a/docs/features/networking/tutorials/aws-eks-cni-mini.mdx b/docs/features/networking/tutorials/aws-eks-cni-mini.mdx index 9e6ea6e55..5743fb857 100644 --- a/docs/features/networking/tutorials/aws-eks-cni-mini.mdx +++ b/docs/features/networking/tutorials/aws-eks-cni-mini.mdx @@ -17,7 +17,9 @@ This tutorial will walk you through deploying an AWS EKS cluster with the AWS VP - The [AWS CLI](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-install.html). - The [kubectl](https://kubernetes.io/docs/tasks/tools/install-kubectl/) command-line tool. -## Step one: Create an AWS EKS cluster with the AWS VPC CNI plugin +## Tutorial + +### Step one: Create an AWS EKS cluster with the AWS VPC CNI plugin Before you start, you'll need an AWS Kubernetes cluster. Having a cluster with a [CNI](https://kubernetes.io/docs/concepts/extend-kubernetes/compute-storage-net/network-plugins/) that supports [NetworkPolicies](https://kubernetes.io/docs/concepts/services-networking/network-policies/) is required for this tutorial. @@ -75,44 +77,11 @@ eksctl create cluster -f cluster-config.yaml Once your AWS EKS has finished deploying the control pane and node group, the next step is deploying Otterize as well as a couple of clients and a server to see how they are affected by network policies. -## Step two: Install the Otterize agents +### Step two: Install the Otterize agents ### Install Otterize on your cluster -You can now install Otterize in your cluster, and optionally connect to Otterize Cloud. Connecting to Cloud lets you see what's happening visually in your browser, through the "access graph". - -So either forego browser visualization and: - -
-Install Otterize in your cluster, without Otterize Cloud - -{@include: ../../../_common/install-otterize.md} - -
- -Or choose to include browser visualization and: - -
-Install Otterize in your cluster, with Otterize Cloud - -#### Create an Otterize Cloud account - -{@include: ../../../_common/create-account.md} - -#### Install Otterize OSS, connected to Otterize Cloud - -{@include: ../../../_common/install-otterize-from-cloud.md} - -
- -Finally, you'll need to install the Otterize CLI (if you haven't already) to interact with the network mapper: - -
-Install the Otterize CLI - -{@include: ../../../_common/install-otterize-cli.md} - -
+To deploy Otterize, head over to [Otterize Cloud](https://app.otterize.com) and create a Kubernetes cluster on the [Clusters page](https://app.otterize.com/clusters), and follow the instructions. ### Deploy a server and two clients @@ -126,7 +95,7 @@ Once you have that installed and running your Otterize access graph should look ![Access Graph](/img/quick-tutorials/aws-eks-mini/access-graph.png) -## Step three: Create an intent +### Step three: Create an intent Now that you have Otterize installed, the next step is to create an intent which will enable access to the server from the client. If you enable protection on the server without declaring an intent, the client will be blocked. @@ -185,7 +154,7 @@ And you should see your access graph showing the service as protected: ![Protected Service](/img/quick-tutorials/aws-eks-mini/protected.png) -## What's next +### What's next Have a look at the [guide on how to deploy protection to a larger, more complex application one step at a time](/guides/protect-1-service-network-policies). diff --git a/docs/features/networking/tutorials/k8s-network-mapper.mdx b/docs/features/networking/tutorials/k8s-network-mapper.mdx index 7c3db3339..b462db79e 100644 --- a/docs/features/networking/tutorials/k8s-network-mapper.mdx +++ b/docs/features/networking/tutorials/k8s-network-mapper.mdx @@ -8,7 +8,7 @@ import Tabs from "@theme/Tabs"; import TabItem from "@theme/TabItem"; import styles from "/src/css/styles.module.css"; -The network mapper allows you to map network traffic for your K8s cluster. Once mapped you can export it as an image, json, list, or view it within Otterize Cloud. +The network mapper allows you to map pod-to-pod traffic within your K8s cluster. In this tutorial, we will: @@ -17,54 +17,14 @@ In this tutorial, we will: ## Prerequisites -
-Prepare a Kubernetes cluster +### Install Otterize on your cluster +To deploy Otterize, head over to [Otterize Cloud](https://app.otterize.com) and create a Kubernetes cluster on the [Clusters page](https://app.otterize.com/clusters), and follow the instructions. -Before you start, you'll need a Kubernetes cluster. Having a cluster with a [CNI](https://kubernetes.io/docs/concepts/extend-kubernetes/compute-storage-net/network-plugins/) that supports [NetworkPolicies](https://kubernetes.io/docs/concepts/services-networking/network-policies/) isn't required for this tutorial, but is recommended so that your cluster works with other tutorials. +We will also need the [Otterize CLI](/overview/installation#install-the-otterize-cli). -{@include: ../../../_common/cluster-setup.md} +## Tutorial -
- -You can now install Otterize in your cluster (if it's not already installed), and optionally connect to Otterize Cloud. Connecting to Cloud lets you: - -1. See what's happening visually in your browser, through the "access graph"; -2. View pod public internet egress traffic. - -So either forego browser visualization and: - -
-Install Otterize in your cluster, without Otterize Cloud - -{@include: ../../../_common/install-otterize.md} - -
- -Or choose to include browser visualization and: - -
-Install Otterize in your cluster, with Otterize Cloud - -#### Create an Otterize Cloud account - -{@include: ../../../_common/create-account.md} - -#### Install Otterize OSS, connected to Otterize Cloud - -{@include: ../../../_common/install-otterize-from-cloud-with-enforcement.md} - -
- -Finally, you'll need to install the Otterize CLI (if you haven't already) to interact with the network mapper: - -
-Install the Otterize CLI - -{@include: ../../../_common/install-otterize-cli.md} - -
- -## Deploy demo to simulate traffic +### Deploy demo to simulate traffic Let's add services and traffic to the cluster and see how the network mapper builds the map. Deploy the following simple example — `client`, `client2` and `server`, communicating over HTTP: @@ -73,16 +33,7 @@ Deploy the following simple example — `client`, `client2` and `server`, co kubectl apply -n otterize-tutorial-mapper -f ${ABSOLUTE_URL}/code-examples/network-mapper/all.yaml ``` -
-Expand to see the deployment YAML - -```yaml -{@include: ../../../static/code-examples/network-mapper/all.yaml} -``` - -
- -## Map the cluster +### Map the cluster The network mapper starts to sniff traffic and build an in-memory network map as soon as it's installed. The Otterize CLI allows you to interact with the network mapper to grab a snapshot of current mapped traffic, @@ -103,17 +54,17 @@ If you've attached Otterize OSS to Otterize Cloud, you can now also see the [acc The access graph reveals several types of information and insights, such as: 1. Seeing the network map for different clusters, seeing the subset of the map for a given namespace, or even — according to how you've mapped namespaces to environments — seeing the subset of the map for a specific environment. -2. Viewing the public internet egress traffic for each pod, including the DNS name and the IPs associated with each outbound request. -3. Filtering the map to include recently-seen traffic, since some date in the past. That way you can eliminate calls that are no longer relevant, without having to reset the network mapper and start building a new map. -4. If the intents operator is also connected, the access graph now reveals more specifics about access: understand which services are protected or would be protected, and which client calls are being blocked or would be blocked. We'll see more of that in the next couple of tutorials. +2. Filtering the map to include recently-seen traffic, since some date in the past. That way you can eliminate calls that are no longer relevant, without having to reset the network mapper and start building a new map. +3. If the intents operator is also connected, the access graph now reveals more specifics about access: understand which services are protected or would be protected, and which client calls are being blocked or would be blocked. We'll see more of that in the next couple of tutorials + +Note, for example, that the `client` → `server` arrow is yellow. Clicking on it shows: -Note, for example, that the `client` → `server` arrow is yellow. Clicking on it shows the automatically generated intents for both the client pod to the server pod and the egress of the client to the public internet. If we take a closer look, the ClientIntent YAML specifies that the `client` can call the `server` on the internal network, and it can reach the IP Address `142.250.189.174`. We can see from the comment that this IP belongs to google.com. Client to server edge info -## What's next +### What's next The network mapper is a great way to bootstrap IBAC. It generates client intents files that reflect the current topology of your services; those can then be used by each client team to grant them easy @@ -125,7 +76,7 @@ Where to go next? - If you haven't already, see the [automate network policies tutorial](/quickstart/access-control/k8s-network-policies). - Or go to the next tutorial to [automate secure access for Kafka](/quickstart/access-control/k8s-kafka-mtls). -### Teardown +## Teardown To remove the deployed examples run: diff --git a/docs/features/networking/tutorials/k8s-network-policies.mdx b/docs/features/networking/tutorials/k8s-network-policies.mdx index 3686dc23f..714d508a9 100644 --- a/docs/features/networking/tutorials/k8s-network-policies.mdx +++ b/docs/features/networking/tutorials/k8s-network-policies.mdx @@ -23,45 +23,14 @@ In this tutorial, we will: ## Prerequisites -
-Prepare a Kubernetes cluster that supports network policies - -Before you start, you'll need a Kubernetes cluster with a [CNI](https://kubernetes.io/docs/concepts/extend-kubernetes/compute-storage-net/network-plugins/) that supports [NetworkPolicies](https://kubernetes.io/docs/concepts/services-networking/network-policies/). - -{@include: ../../../_common/cluster-setup.md} - -
- -You can now install (or reinstall) Otterize in your cluster, and optionally connect to Otterize Cloud. Connecting to Cloud lets you: - -1. See what's happening visually in your browser, through the "access graph"; -2. Avoid using SPIRE (which can be installed with Otterize) for issuing certificates, as Otterize Cloud provides a certificate service. - -So either forego browser visualization and: - -
-Install Otterize in your cluster, without Otterize Cloud +### Install Otterize on your cluster +To deploy Otterize, head over to [Otterize Cloud](https://app.otterize.com) and create a Kubernetes cluster on the [Clusters page](https://app.otterize.com/clusters), and follow the instructions. -{@include: ../../../_common/install-otterize.md} +We will also need the [Otterize CLI](/overview/installation#install-the-otterize-cli). -
- -Or choose to include browser visualization and: - -
-Install Otterize in your cluster, with Otterize Cloud - -#### Create an Otterize Cloud account - -{@include: ../../../_common/create-account.md} - -#### Install Otterize OSS, connected to Otterize Cloud - -{@include: ../../../_common/install-otterize-from-cloud-with-enforcement.md} - -
+## Tutorial -## Deploy the server and the two clients +### Deploy the server and the two clients Our simple example consists of three pods: an HTTP server and two clients that call it. @@ -176,7 +145,7 @@ If you've attached Otterize OSS to Otterize Cloud, you can now browse to your ac ![Access graph](/img/quick-tutorials/network-policies/base.png) -## Apply intents +### Apply intents We will now declare that the **client** intends to call the **server**. @@ -269,7 +238,7 @@ It's now clear what happened: Otterize did its job of both protecting the server _and_ allowing intended access. ::: -## What did we accomplish? +### What did we accomplish? - Controlling access through network policies no longer means touching network policies at all. @@ -304,7 +273,7 @@ Further information about network policies and Otterize can be found Try to create an intents file yourself for **client-other**, and apply it to allow this other client to call the server. ::: -## What's next +### What's next - Get started with the [Otterize network mapper](/quickstart/visualization/k8s-network-mapper) to help you bootstrap intents files for use in [intent-based access control (IBAC)](/intent-based-access-control). diff --git a/docs/features/networking/tutorials/protect-1-service-network-policies.mdx b/docs/features/networking/tutorials/protect-1-service-network-policies.mdx index d43d3b445..ab317035b 100644 --- a/docs/features/networking/tutorials/protect-1-service-network-policies.mdx +++ b/docs/features/networking/tutorials/protect-1-service-network-policies.mdx @@ -26,16 +26,13 @@ Note: all the capabilities of IBAC are within Otterize OSS, while the access gra ## Prerequisites -
-Prepare a cluster +### Install Otterize on your cluster +To deploy Otterize, head over to [Otterize Cloud](https://app.otterize.com) and create a Kubernetes cluster on the [Clusters page](https://app.otterize.com/clusters), and follow the instructions. -Before you start, you'll need a Kubernetes cluster. +We will also need the [Otterize CLI](/overview/installation#install-the-otterize-cli). -{@include: ../../../_common/cluster-setup.md} -
- -
-Deploy the demo set of services +## Tutorial +### Deploy the demo set of services To deploy these into your cluster: ```bash @@ -43,88 +40,64 @@ kubectl create namespace otterize-ecom-demo kubectl apply -n otterize-ecom-demo -f ${ABSOLUTE_URL}/code-examples/shadow-mode/ecom-demo.yaml ```
-Optional: check that the demo was deployed. - -To see all the pods in the demo: -```bash -kubectl get pods -n otterize-ecom-demo -``` -The pods should all be ready and running: -```bash -NAME READY STATUS RESTARTS AGE -adservice-65494cbb9d-5lrv6 1/1 Running 0 115s -cartservice-6d84fc45bb-hdtwn 1/1 Running 0 115s -checkoutservice-5599486df-dvj9n 1/1 Running 3 (79s ago) 115s -currencyservice-6d64686d74-lxb7x 1/1 Running 0 115s -emailservice-7c6cbfbbd7-xjxlt 1/1 Running 0 115s -frontend-f9448d7d4-6dmnr 1/1 Running 0 115s -kafka-0 1/1 Running 2 (83s ago) 115s -loadgenerator-7f6987f59-bchgm 1/1 Running 0 114s -orderservice-7ffdbf6df-wzzfd 1/1 Running 0 115s -otterize-ecom-demo-zookeeper-0 1/1 Running 0 115s -paymentservice-86855d78db-zjjfn 1/1 Running 0 115s -productcatalogservice-5944c7f666-2rjc6 1/1 Running 0 115s -recommendationservice-6c8d848498-zm2rm 1/1 Running 0 114s -redis-cart-6b79c5b497-xpms2 1/1 Running 0 115s -shippingservice-85694cb9bd-v54xp 1/1 Running 0 114s -``` - -You can now browse the web app of this demo, if you wish: - - - - -To get the externally-accessible URL where your demo front end is available, run: -```bash -kubectl get service -n otterize-ecom-demo frontend-external | awk '{print $4}' -``` -The result should be similar to (if running on AWS EKS): -``` -a11843075fd254f8099a986467098647-1889474685.us-east-1.elb.amazonaws.com -``` -Go ahead and browse to the URL above to "shop" and get a feel for the demo's behavior. -(The URL might take some time to populate across DNS servers. Note that we are accessing an HTTP and not an HTTPS website.) - - - -To get the externally-accessible URL where your demo front end is available, run: -``` -kubectl port-forward -n otterize-ecom-demo service/frontend-external 8080:80 & -``` -The demo is now accessible at: -``` -http://localhost:8080 -``` -Go ahead and browse to the URL above to "shop" and get a feel for the demo's behavior. - - -
- -
- -
-Create an Otterize Cloud account - -{@include: ../../../_common/create-account.md} - + Optional: check that the demo was deployed. + + To see all the pods in the demo: + ```bash + kubectl get pods -n otterize-ecom-demo + ``` + The pods should all be ready and running: + ```bash + NAME READY STATUS RESTARTS AGE + adservice-65494cbb9d-5lrv6 1/1 Running 0 115s + cartservice-6d84fc45bb-hdtwn 1/1 Running 0 115s + checkoutservice-5599486df-dvj9n 1/1 Running 3 (79s ago) 115s + currencyservice-6d64686d74-lxb7x 1/1 Running 0 115s + emailservice-7c6cbfbbd7-xjxlt 1/1 Running 0 115s + frontend-f9448d7d4-6dmnr 1/1 Running 0 115s + kafka-0 1/1 Running 2 (83s ago) 115s + loadgenerator-7f6987f59-bchgm 1/1 Running 0 114s + orderservice-7ffdbf6df-wzzfd 1/1 Running 0 115s + otterize-ecom-demo-zookeeper-0 1/1 Running 0 115s + paymentservice-86855d78db-zjjfn 1/1 Running 0 115s + productcatalogservice-5944c7f666-2rjc6 1/1 Running 0 115s + recommendationservice-6c8d848498-zm2rm 1/1 Running 0 114s + redis-cart-6b79c5b497-xpms2 1/1 Running 0 115s + shippingservice-85694cb9bd-v54xp 1/1 Running 0 114s + ``` + + You can now browse the web app of this demo, if you wish: + + + + + To get the externally-accessible URL where your demo front end is available, run: + ```bash + kubectl get service -n otterize-ecom-demo frontend-external | awk '{print $4}' + ``` + The result should be similar to (if running on AWS EKS): + ``` + a11843075fd254f8099a986467098647-1889474685.us-east-1.elb.amazonaws.com + ``` + Go ahead and browse to the URL above to "shop" and get a feel for the demo's behavior. + (The URL might take some time to populate across DNS servers. Note that we are accessing an HTTP and not an HTTPS website.) + + + + To get the externally-accessible URL where your demo front end is available, run: + ``` + kubectl port-forward -n otterize-ecom-demo service/frontend-external 8080:80 & + ``` + The demo is now accessible at: + ``` + http://localhost:8080 + ``` + Go ahead and browse to the URL above to "shop" and get a feel for the demo's behavior. + +
-
-Install Otterize OSS - -{@include: ../../../_common/install-otterize-from-cloud.md} - -
- -
-Install the Otterize CLI - -{@include: ../../../_common/install-otterize-cli.md} - -
- - -## Seeing the access graph +### Seeing the access graph In the Otterize Cloud UI, your [cluster](https://app.otterize.com/clusters) should now show all 3 Otterize OSS operators — the network mapper, intents operator, and credentials operator — as connected, with a green status. @@ -159,7 +132,7 @@ Otterize can configure several access control mechanisms, such as Istio authoriz Access graph - access controls panel -## Choose one service to protect +### Choose one service to protect Now let's prepare to protect just one service, but remain in shadow mode: no actual network policies, yet. We'll verify no intended access would be blocked before turning on the network policy protection. @@ -199,7 +172,7 @@ We see that:
-## Declare client intents +### Declare client intents The graph visually tells us we'll need to declare all 3 of those clients' intents: 1. `frontend` → `productcatalogservice`. @@ -297,7 +270,7 @@ And you can verify the `productcatalogservice` would not block *any* of its disc The server is still yellow because it's unprotected — let's fix that. -## Protect the `productcatalogservice` +### Protect the `productcatalogservice` Now that we've verified no intended clients would be blocked, we can safely protect the server. @@ -325,22 +298,22 @@ Sure enough, the `productcatalogservice` is -## Ready for production +### Ready for production -### Will load balancers, ingress, and other external traffic be affected? +#### Will load balancers, ingress, and other external traffic be affected? The intents operator automatically detects resources of kind `Service` (with type `LoadBalancer` or `NodePort`), or of kind `Ingress`, and creates network policies to allow external traffic to relevant pods. You do not need to configure anything to get this to work. [Learn more here.](/reference/configuration/intents-operator#handling-external-traffic) -### Will admission webhook controllers, e.g. policy validators like Kyverno, be affected? +#### Will admission webhook controllers, e.g. policy validators like Kyverno, be affected? Since you are not placing a global default-deny policy that would affect controllers in your cluster, only default-deny network policies on individual pods, Otterize will not affect calls to admission webhook controllers and they will continue functioning as before. -### Working with Otterize in CI/CD +#### Working with Otterize in CI/CD We recommend placing the `ClientIntents` and `ProtectedService` resource YAMLs alongside the services that own them, in their respective Git repositories: - The `ProtectedService` YAMLs alongside the servers they are protecting, e.g. in the Helm chart belonging to the server. - `ClientIntents` YAMLs, whether they were generated from the network mapper or created and maintained by the client developer teams, alongside each client, e.g. in the Helm chart belonging to the client. -## In summary +### In summary So what have we learned? You can gradually roll out IBAC and drive towards zero trust, service by service, in a safe, predictable, and quick way, by following 4 simple steps: diff --git a/docs/features/postgresql/_category_.json b/docs/features/postgresql/_category_.json index 02b31b4a4..94a4efd26 100644 --- a/docs/features/postgresql/_category_.json +++ b/docs/features/postgresql/_category_.json @@ -3,6 +3,6 @@ "position": 5, "collapsed": true, "customProps": { - "image": "/img/icons/postgresql.png" + "image": "/img/icons/postgresql-no-word-mark.svg" } } diff --git a/docs/features/postgresql/Reference.mdx b/docs/features/postgresql/reference.mdx similarity index 95% rename from docs/features/postgresql/Reference.mdx rename to docs/features/postgresql/reference.mdx index 56e95b209..61f63b245 100644 --- a/docs/features/postgresql/Reference.mdx +++ b/docs/features/postgresql/reference.mdx @@ -3,7 +3,7 @@ sidebar_position: 3 title: Reference --- -### ClientIntents Example (YAML) +### ClientIntents example (YAML) ```yaml apiVersion: k8s.otterize.com/v1alpha3 diff --git a/docs/getting-started/README.mdx b/docs/getting-started/README.mdx index 39db62b50..ea1b7ea11 100644 --- a/docs/getting-started/README.mdx +++ b/docs/getting-started/README.mdx @@ -20,7 +20,7 @@ export const introduction = [ export const features = [ { - title: 'Network Policies', + title: 'Network mapping & access control', icon: '/img/icons/networking.png', url: '/features/networking/' }, @@ -31,17 +31,17 @@ export const features = [ }, { title: 'Kafka', - icon: '/img/icons/kafka.png', + icon: '/img/icons/kafka-no-word-mark.svg', url: '/features/kafka/' }, { title: 'PostgreSQL', - icon: '/img/icons/postgresql.png', + icon: '/img/icons/postgresql-no-word-mark.svg', url: '/features/postgresql/' }, { title: 'Istio', - icon: '/img/icons/istio.png', + icon: '/img/icons/istio-no-word-mark.svg', url: '/features/istio/' }, ]; @@ -122,11 +122,11 @@ Otterize makes it easy to create and visualize authorization for your Kubernetes ### Tutorials -#### Learn more about access control +#### How to manage access control -#### See how to visualize access +#### How to visualize access diff --git a/docs/getting-started/_category_.json b/docs/getting-started/_category_.json index 594203d97..012adff4f 100644 --- a/docs/getting-started/_category_.json +++ b/docs/getting-started/_category_.json @@ -1,4 +1,4 @@ { "collapsed": true, - "label": "Getting Started" + "label": "Getting started" } \ No newline at end of file diff --git a/docs/overview/intent-based-access-control.mdx b/docs/overview/intent-based-access-control.mdx index ade9e2477..2bbdf41fc 100644 --- a/docs/overview/intent-based-access-control.mdx +++ b/docs/overview/intent-based-access-control.mdx @@ -3,85 +3,40 @@ sidebar_position: 2 title: Intent-Based Access Control (IBAC) --- -Intent-based access control is, not surprisingly, centered around declaring intents — specifically, declaring **client** intents - to call servers. +## Why intent based access? -The mechanism to declare client intents is with **client intents files**, or just "intents files" for short. -This is a natural approach for agile, cloud-native organizations and initiatives: +We developers are working hard to make the world’s services functional, reliable, performant, and of course secure, all while maximizing velocity. In practice, achieving successful zero-trust security requires enabling stringent access policies on the service we are developing and within the other technologies and services we utilize. -- Intents files are **declarative**; -- Specifically, intents files declare **what** needs to happen (service A needs to access service B to do operation C) -without specifying, or needing to know, **how** to accomplish this; -- Intents files align with **rapid, distributed development** because they only require the knowledge that -client developers already have &mdash no need for the target server developers or admins to keep track of who needs to access them; -- The declarative approach thrives in **cloud-native infrastructures** where there are existing APIs to configure access control automatically. +Services may need network access, database access, cloud resource access, and more to achieve the desired functionality. In a zero-trust environment, access must be granted by the data teams, cloud teams, and other teams managing dependent services. This results in a large degree of friction and a lack of a cohesive picture of the access rights needed for each service to function properly. -## Intents within intents files +We believe that each service should define the access it needs to function. This intent-based access control (IBAC) should be easily understood, easily reviewed, and capable of being statically analyzed. -An intent is a declaration by a specific client to call a specific server, optionally specifying more granular - information about the call (e.g. the resource path and method for HTTP, the topic name and operation for Kafka). - In other words, an intent is a tuple of client, server, and optional granular call information. - If any of those changes, that's logically a different intent, though the intents file format allows some - shorthand ways of aggregating intents that only differ by HTTP method or Kafka operation. See the example below. +## Enter client intents - An client's intents file specifies *all* the intents of that client, in one YAML file. Why is that important? - Because as the client's needs change, the intents file should change with it, and any intents no longer needed - should be removed from the file. When this updated file is applied, the corresponding access is also removed, - i.e. the network policies or the Kafka ACLs that were previously in place due to those intents are now gone. - In this way, access controls always reflect all of, and only, the latest intended access. +A client intents file is simply a list of calls to servers a client intends to make. Coupled with a mechanism for resolving service names, the list of client intents can be translated to different authorization mechanisms, such as network policies, cloud IAM, databases, etc. -## Intents file formats +In other words, developers declare what their service intends to access, and that can then be converted to a network policy and the associated set of pod labels. -Client intents files are independent of the infrastructure on which IBAC is deployed — indeed, they abstract away -any tie-ins with infrastructures and implementations of access control. - -As an example, let's look at the core of a client intents file for a service called `checkoutservice`. -It declares that it will call the `emailservice`, the `orderservice`, and the `ecomm-events` Kafka service. -It also provides more granular information for some of the calls: +Here’s an example of a client intents file (as a Kubernetes custom resource YAML) for a service named **client** that has network access to another service named **auth-server** and has access to **production-db’s** **metrics** database: ```yaml -{@include: ../../static/resources/example-intents.yaml} -``` - -You can actually create and use such "plain" or "vanilla" intents files without any other metadata. Currently, Otterize only supports processing client intents via the Otterize OSS intents operator for Kubernetes, so you'll need to run the plain intents files through the Otterize CLI (`otterize intents convert`) to convert them into Kubernetes custom resource YAML files. - -Within the context of a Kubernetes cluster, it's very natural to format intents files from the beginning as -Kubernetes custom resources. These files are applied (`kubectl apply`) to the Kubernetes API, which validates - them against a `ClientIntents` custom resource definition (CRD) and then hands them over to the Otterize intents - operator, as expected of a Kubernetes ecosystem extension. - The two formats are trivially related: the "plain" intents file contents are simply embedded in the `spec` - section of the custom resource format. - -Here is the same client intents file, now formatted as a Kubernetes custom resource YAML, -so it can be applied directly via `kubectl apply`: -```yaml -{@include: ../../static/resources/example-intents-resource-highlighted.yaml} +apiVersion: k8s.otterize.com/v1alpha2 +kind: ClientIntents +metadata: + name: client-intents + +spec: + service: + name: client + calls: + - name: auth-server + - name: production-db + type: database + databaseResources: + - databaseName: metrics ``` -## Intents file specification - -The core of a client intents file has 2 root-level fields (keys, in YAML): -- `service` (required): describes the client service that intends to make the calls in this file. - - `name` (required): specifies the name of the client service. - -- `calls` (required): describes the (server) services which the client intends to call.
- Its value is a list of key-value pairs, each describing a server service to be called. (The combination of client service, server service, and optionally any more granular information about the call forms an intent.)
- Each item in the list has the following fields: - - `name` (required): specifies the name of the server service.
- The name can include the namespace of the server service, if different from the client service, separated by a dot ("."): `server-name.server-namespace`. - - `type` (optional, case-insensitive): specifies the type of call to be made to the server.
- If present, the values can currently be `http` or `kafka`.
- The Otterize intents operator will manage network policies for all intents, regardless of type (including if no type is specified); it will *also* manage Kafka ACLs if the `type` is `kafka`; and in the future it will *also* manage HTTP access controls if the `type` is `http`. - - - `kafkaTopics` (optional; only allowed if `type` is `kafka`): Specifies the list of Kafka topics to be called.
- Each item in the list has the following fields: - - `name` (required): specifies the name of the topic. - - `operations` (required): specifies the list of intended operations on that topic.
- Allowed values are: `consume`, `produce`, `create`, `alter`, `delete`, `describe`, `cluster_action`, `describe_configs`, `alter_configs`, `idempotent_write`, and `all`. - - - `HTTPResources` (optional; only allowed if `type` is `http`): Specifies the list of HTTP resources to be called.
- Each item in the list has the following fields: - - `path` (required): specifies the HTTP path of the resource. - - `methods` (required): specifies the list of intended operations on that topic.
- Allowed values are: `get`, `post`, `put`, `patch`, `delete`, `options`, `trace`, and `connect`. +## How do intents work? +When intents are created for a client, the intents operator automatically creates, updates, and deletes the corresponding policies and automatically labels client and server pods to reflect precisely the client-to-server calls declared in client intents files. For instance, for a NetworkPolicy, a single policy is created per server, and pod labels are dynamically updated for clients when their intents are updated +Service names are resolved by recursively getting the owner of a pod until the original owner is found, usually a Deployment, StatefulSet, or other such resource. The name of that resource is used unless the pod has a service-name annotation, in which case the value of that annotation is used instead. diff --git a/docs/overview/otterize-cloud/object-model.mdx b/docs/overview/otterize-cloud/object-model.mdx deleted file mode 100644 index f9dad7fab..000000000 --- a/docs/overview/otterize-cloud/object-model.mdx +++ /dev/null @@ -1,44 +0,0 @@ ---- -sidebar_position: 1 -title: Object model ---- -In Otterize Cloud, as across all of the Otterize product, the central object is the **intent**. Intent-based access control (IBAC) bases the authorization model of a server on the set of calls its clients declare they intend to make, granting them access to make declared calls, while blocking undeclared calls. - -## Intents - -An **intent** is a declaration that service A (the client service) intends to call service B (the server service), often with more granular information about the type of call (e.g. "HTTP" or "Kafka") and other details of the call (e.g. which HTTP resources and methods, or which Kafka topics and operations). - -The intent is expressed within a file, specifically a Kubernetes custom resource YAML declaration, that is then created in a specific Kubernetes cluster and namespace via `kubectl apply`. All the intents from a given client should appear in a single client intents YAML file, which then represents the overall intents of that service to be a client of other services. - -The declared intents applied in this way to a cluster are processed by the **Otterize intents operator** running in the cluster, which -- if configured to enforce intents -- manages Kubernetes network policies and Kafka ACLs according to those intents. When the intents operator is integrated with Otterize Cloud, it also reports those intents to the Cloud, to build an overall model of service-to-service access called the **access graph**. - -The declared intents form the basis of IBAC. But to controllably and confidently roll out IBAC to a working cluster, it's important to compare the declared access to the actual access (or attempted access) happening in the cluster. To that end, the **Otterize network mapper** detects attempted access automatically, and generates **discovered intents**: these reflect the intentions of services to call one another based on discovering the actual call attempts themselves. In other words, discovered intents form a network map of services actually calling each other, while declared intents reflect explicit declarations of services to call each other. When the network mapper is integrated with Otterize Cloud, the access graph in the Cloud will includes both discovered and declared intents, and will yield many more insights. - -Currently, Otterize only supports intents within a cluster (i.e. client and service are within the same cluster), not across clusters. - -## Services - -While declared and discovered intents are the edges of the access graph, **services** are its nodes. A service may be a client of other services, a server to other services, or both. (Note the difference between a "Kubernetes service" which is a specific construct used to make a pod callable by other pods, and an Otterize service that's the more general concept, in the sense of a microservice or a workload.) - -In Otterize Cloud, services are _inferred_ from the intents reported to the Cloud by the intents operator and the network mapper: whenever an intent is reported, it carries the information about the client and server of that intent. The intents operator adds more information when the service is identified as a Kafka service (the **Kafka server config**), and the credentials operator, when integrated, adds yet more information about any **certificates** issued to that service. - -A service name is unique within a namespace in a cluster, but not in general unique across the cluster or across clusters. - -{@include: _environments_and_namespaces.mdx} -## Clusters - -When a Kubernetes cluster is connected to Otterize Cloud, it is represented in the Cloud by a **cluster** object. You'll name it when you add it in the UI or through the API/CLI, or when you create the integration directly (in the UI or API/CLI). - -The Otterize operators -- intents operator, network mapper, and/or credentials operator -- running in your cluster will inform the Cloud about the intents, services, and credentials within this cluster, and will also convey their configuration (e.g. shadow or enforcement mode) within this cluster. Thus the cluster object in Otterize Cloud contains a lot of useful information about your Kubernetes cluster -- information used to deliver insights when you view your cluster in through the lens of the access graph. - -Note that, while a cluster and its namespaces and services could be in a single environment, and an environment could contain multiple clusters, many other combinations are possible. For example, a cluster could contain namespaces in multiple environments. Or, environments may contain some namespaces in one cluster and other namespaces in another cluster. Use whatever mappings make sense for your situation. - -Cluster names must be unique within an organization. - -## Integrations - -Otterize Cloud currently supports two types of integrations: **Kubernetes integrations** and **generic integrations**. In the future, many other types of integrations will be added, allowing Otterize Cloud to work seamlessly with all your infrastructures and systems. - -A Kubernetes integration is used to connect a Kubernetes cluster with Otterize Cloud via any or all of the Otterize operators: the intents operator, the network mapper, and the credentials operator. When a Kubernetes-type integration is created, it is always linked to an Otterize Cloud cluster object. It contains the credentials needed by the operators running in the Kubernetes cluster to communicate with the Cloud on behalf of that cluster, i.e., it ties together the physical Kubernetes cluster with its representation in Otterize Cloud. The integration also determines the environment to which namespaces in that clusters will be associated by default. The name of a Kubernetes integration is derived from the name of the cluster; since cluster names are unique per organization, so are Kubernetes-type integration names. - -A generic integration is used to connect generically an external system to Otterize Cloud. It provides that system credentials to access the Otterize API/CLI, in a way that doesn't involve any specific Otterize user. That makes it ideal for building automations on top of the Otterize API. For example, new clusters provisioned for the development team could be automatically connected to Otterize Cloud, or a CI/CD system could automatically look in the access graph for services that would be blocked or intents that were not declared and applied and fail the build. The name of the integration should reflect the way it will be used. The names of generic-type integrations must be unique within an organization. diff --git a/docs/overview/otterize-oss/README.mdx b/docs/overview/otterize-oss/README.mdx index 5436c09dd..9397ada18 100644 --- a/docs/overview/otterize-oss/README.mdx +++ b/docs/overview/otterize-oss/README.mdx @@ -30,17 +30,3 @@ To get started with Otterize OSS, see the tutorials for [network policies](/quic Components in Otterize OSS collect usage information — counts of events like `INTENTS_APPLIED`, `NETWORK_POLICY_CREATED`, `KAFKA_ACL_DELETED`, etc. — and can report those back to the Otterize team. This is entirely optional and does not affect the functionality of Otterize OSS, but it does help the team at Otterize understand what the community finds useful and hence how to improve it. (Of course, direct feedback through the [Otterize Community Slack](https://joinslack.otterize.com/) is very much appreciated too.) For more information, including what is sent and how to turn it off or on, see [the usage telemetry documentation](/otterize-oss/usage-telemetry). -## Roadmap - -The near-term roadmap for Otterize OSS currently includes: -- [[Done](https://github.com/otterize/otterize-cli/releases/tag/v0.1.17)] Adding **network map visualization** capabilities to the Otterize CLI, so you can get network map images from the network mapper. - -- [[Done](https://github.com/otterize/network-mapper/releases/tag/v0.1.16)] Adding a **Kafka watcher** to supply more detailed information to the network mapper about calls to any Kafka server: which clients are performing which operations against which topics. This complements the current map built up in the network mapper, which only records which clients called which servers, without any more granular information about those calls. With this new capability, users can bootstrap client intents that contain granular Kafka access intent information, and Otterize Cloud can display topic-level shadow mode information and insights also for Kafka servers and their clients. - -- [[Done](https://github.com/otterize/intents-operator/releases/tag/v0.1.20)] Adding support for Istio service mesh access controls. This includes: - - Pod-to-pod access controls (akin to the current network policies support). - - Granular HTTP-level (path and method) access controls (akin to the current Kafka topic-level access control support). - - [Adding HTTP-level (path and method) intent information to the network mapper](https://github.com/otterize/network-mapper/releases/tag/v0.1.16), and to the information optionally sent to Otterize Cloud to support [shadow mode](/shadow-vs-active-enforcement) in the access graph. - - - diff --git a/docs/reference/terminology/README.mdx b/docs/reference/terminology/README.mdx index 41a1b82a9..1178da535 100644 --- a/docs/reference/terminology/README.mdx +++ b/docs/reference/terminology/README.mdx @@ -17,6 +17,9 @@ The [Otterize CLI](/reference/cli) is a command-line utility used to control and ### Intent (or client intent) Otterize intents are a way to declare that one service intends to call another service. Otterize uses them to apply authorization rules to enable the calls to go through, and block any unintended calls. An *intent* refers to a client declaring a particular call to a server; *all* a given client's intents to the servers it intends to call are collected in a single *client intents file*. [Learn more about intents](/reference/intents-and-intents-files). +### Integrations +Otterize Cloud supports two types of integrations: Kubernetes integrations and generic integrations. Kubernetes integrations connect a Kubernetes cluster to Otterize Cloud, allowing communication with the Otterize operators. Generic integrations connect external systems to Otterize Cloud, providing API/CLI access credentials. These integrations are named based on their usage and must have unique names within an organization. + ## Identity ### PKI @@ -57,3 +60,12 @@ A Kubernetes custom resource refers to a resource that is not present in the bas ### CNI (Container Network Interface) CNI is a CNCF project that provides libraries for implementing plugins for configuring network interfaces in Linux containers, and is used by Kubernetes to provide pods running in a cluster with network connectivity. Examples of CNI plugins are Calico, Cilium, the AWS VPC CNI plugin. [Read more about Kubernetes CNI plugins here](https://kubernetes.io/docs/concepts/extend-kubernetes/compute-storage-net/network-plugins/). + +### Services +Services represent the nodes in the access graph. They can be client services, server services, or both, and they are associated with specific namespaces within a Kubernetes cluster. Otterize Cloud infers services from reported intents and provides additional information for Kafka services and certificates. Service names must be unique within a namespace, but not necessarily across the entire cluster or multiple clusters. + +### Namespaces and Environments +Namespaces are used to group related services within a Kubernetes cluster and can be mapped to different environments (e.g., dev, staging, production). Intents can be cross-namespace and cross-environment, and Otterize Cloud associates namespaces with their respective environments. Environment names must be unique within an organization. + +### Clusters +A Kubernetes cluster connected to Otterize Cloud is represented by a cluster object in the cloud. This object contains information about the cluster's intents, services, credentials, and configuration. Multiple clusters and namespaces can belong to a single environment, or environments can span multiple clusters, depending on the organization's needs. Cluster names must be unique within an organization. \ No newline at end of file diff --git a/docusaurus.config.js b/docusaurus.config.js index 700a12307..2228bf7d1 100644 --- a/docusaurus.config.js +++ b/docusaurus.config.js @@ -150,7 +150,7 @@ const config = { }, { from: ['/reference/access-controls/network-policies'], - to: '/features/networking/Reference/Network-Policies-Deep-Dive' + to: '/features/networking/reference/Network-Policies-Deep-Dive' }, { from: ['/shadow-vs-active-enforcement'], @@ -180,7 +180,7 @@ const config = { }, { from: ['/otterize-cloud/object-model'], - to: '/overview/otterize-cloud/object-model' + to: '/reference/terminology' }, { from: ['/guides/protect-1-service-network-policies'], diff --git a/src/components/LinkCard/index.js b/src/components/LinkCard/index.js index 414c2df27..d4b6be9ab 100644 --- a/src/components/LinkCard/index.js +++ b/src/components/LinkCard/index.js @@ -16,7 +16,7 @@ export default function DocsLinkCard({items, colSize}) { > {item.icon &&
- +
}
diff --git a/static/img/icons/Postgresql-no-word-mark.svg b/static/img/icons/Postgresql-no-word-mark.svg new file mode 100644 index 000000000..d98e3659c --- /dev/null +++ b/static/img/icons/Postgresql-no-word-mark.svg @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/static/img/icons/istio-no-word-mark.svg b/static/img/icons/istio-no-word-mark.svg new file mode 100644 index 000000000..e3e82f9b1 --- /dev/null +++ b/static/img/icons/istio-no-word-mark.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/icons/kafka-no-word-mark.svg b/static/img/icons/kafka-no-word-mark.svg new file mode 100644 index 000000000..e373aefc3 --- /dev/null +++ b/static/img/icons/kafka-no-word-mark.svg @@ -0,0 +1,16 @@ + + + + + + image/svg+xml + + + + + + + + + + From e7ccbc8e7dc658e66cde2aec6d8f82819a17ea45 Mon Sep 17 00:00:00 2001 From: bglynn Date: Tue, 30 Jan 2024 13:38:07 -0800 Subject: [PATCH 08/18] link updates. --- docs/features/networking/tutorials/aws-eks-cni-mini.mdx | 2 +- docs/reference/cli/README.mdx | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/features/networking/tutorials/aws-eks-cni-mini.mdx b/docs/features/networking/tutorials/aws-eks-cni-mini.mdx index 5743fb857..56177fe59 100644 --- a/docs/features/networking/tutorials/aws-eks-cni-mini.mdx +++ b/docs/features/networking/tutorials/aws-eks-cni-mini.mdx @@ -13,7 +13,7 @@ This tutorial will walk you through deploying an AWS EKS cluster with the AWS VP ## Prerequisites - An EKS cluster with the AWS VPC CNI add-on installed and with the new built-in network policy support enabled. See [Installing the AWS VPC CNI add-on](https://docs.aws.amazon.com/eks/latest/userguide/pod-networking.html) for more information, or follow the instructions below. -- The [Otterize CLI](/installation#install-the-otterize-cli). +- The [Otterize CLI](/overview/installation#install-the-otterize-cli). - The [AWS CLI](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-install.html). - The [kubectl](https://kubernetes.io/docs/tasks/tools/install-kubectl/) command-line tool. diff --git a/docs/reference/cli/README.mdx b/docs/reference/cli/README.mdx index 79fe6fe0f..3c648230f 100644 --- a/docs/reference/cli/README.mdx +++ b/docs/reference/cli/README.mdx @@ -4,14 +4,14 @@ title: CLI --- The Otterize command line interface (CLI) offers the following capabilities: -- [Interact with](#network-mapper) the [Otterize network mapper](/quickstart/visualization/k8s-network-mapper) running in a Kubernetes cluster. +- [Interact with](#network-mapper) the [Otterize network mapper](/features/networking/tutorials/k8s-network-mapper) running in a Kubernetes cluster. - [Transform](#otterize-intents-convert--f-path) [intents files](/reference/intents-and-intents-files/#intents-file-formats) from plain YAML format to Kubernetes custom resource YAML format. - Interact with the Otterize Cloud, through its REST API. This CLI is open-source software. To see its source or build it yourself, see [https://github.com/otterize/otterize-cli](https://github.com/otterize/otterize-cli). -The CLI is available as an installable binary as documented in this [guide](/installation#install-the-otterize-cli). +The CLI is available as an installable binary as documented in this [guide](/overview/installation#install-the-otterize-cli). The following are the commands offered by the Otterize CLI. @@ -38,7 +38,7 @@ To **disable** sending usage information: If the `telemetry` flag is omitted or set to `true`, telemetry will be enabled: usage information will be reported. -For more information see the [Usage telemetry Documentation](/otterize-oss/usage-telemetry) +For more information see the [Usage telemetry Documentation](/overview/otterize-oss/usage-telemetry) ## Global options From 856b0369424e514210542940385ff63deab766eb Mon Sep 17 00:00:00 2001 From: bglynn Date: Tue, 30 Jan 2024 16:15:15 -0800 Subject: [PATCH 09/18] more git issue fixes safari image issue caps matter in vercel? --- .../configuration/intents-operator/README.mdx | 2 +- docusaurus.config.js | 12 +++--------- src/components/LinkCard/index.js | 2 +- 3 files changed, 5 insertions(+), 11 deletions(-) diff --git a/docs/reference/configuration/intents-operator/README.mdx b/docs/reference/configuration/intents-operator/README.mdx index 69279eac3..c980d1fba 100644 --- a/docs/reference/configuration/intents-operator/README.mdx +++ b/docs/reference/configuration/intents-operator/README.mdx @@ -78,7 +78,7 @@ it is attempting to read, so the end result is that the topic ACLs determine act ### PostgreSQL users & access The intents operator automatically creates, and updates credentials in PostgreSQL databases according to the declared intents. It works together with the Otterize credentials operator to easily enable secure access to PostgreSQL from client pods, all in your Kubernetes cluster. -Try the [Just-in-time PostgreSQL users & access](/features/postgresql/tutorials/postgresql) tutorial to learn more. +Try the [Just-in-time PostgreSQL users & access](/features/postgresql/tutorials/postgres) tutorial to learn more. ### Istio AuthorizationPolicy The intents operator automatically creates, updates and deletes Istio authorization policies, automatically looks up service accounts for client pods and labels server pods, to reflect precisely the client-to-server calls declared in client intents files. diff --git a/docusaurus.config.js b/docusaurus.config.js index 2228bf7d1..81a744b3f 100644 --- a/docusaurus.config.js +++ b/docusaurus.config.js @@ -159,16 +159,10 @@ const config = { { from: ['/otterize-cloud'], to: '/overview/otterize-cloud' - from: '/quick-tutorials', - to: '/', - }, - { - from: '/quick-tutorials/k8s-mtls', - to: '/quickstart/access-control/k8s-kafka-mtls-cert-manager', }, { - from: '/getting-started/oss-installation', - to: '/installation', + from: '/quick-tutorials', + to: '/', }, { from: ['/otterize-oss/usage-telemetry'], @@ -195,7 +189,7 @@ const config = { to: '/features/networking/tutorials/aws-eks-cni-mini', }, { - from: ['/quick-tutorials/k8s-kafka-mtls-cert-manager', '/quickstart/access-control/k8s-kafka-mtls-cert-manager'], + from: ['/quick-tutorials/k8s-kafka-mtls-cert-manager', '/quickstart/access-control/k8s-kafka-mtls-cert-manager', '/quick-tutorials/k8s-mtls'], to: '/features/kafka/tutorials/k8s-kafka-mtls-cert-manager', }, { diff --git a/src/components/LinkCard/index.js b/src/components/LinkCard/index.js index d4b6be9ab..76a11f4b9 100644 --- a/src/components/LinkCard/index.js +++ b/src/components/LinkCard/index.js @@ -16,7 +16,7 @@ export default function DocsLinkCard({items, colSize}) { > {item.icon &&
- +
}
From f8e2bae3f87dd47e6650ad35f1669fe69dabc731 Mon Sep 17 00:00:00 2001 From: bglynn Date: Wed, 31 Jan 2024 16:58:10 -0800 Subject: [PATCH 10/18] Another merge issue. --- docs/features/networking/_category_.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/features/networking/_category_.json b/docs/features/networking/_category_.json index d8135a87a..8c9fb3844 100644 --- a/docs/features/networking/_category_.json +++ b/docs/features/networking/_category_.json @@ -1,5 +1,5 @@ { - "label": "Networking", + "label": "Network Policies", "position": 1, "collapsed": true, "customProps": { From 63ce824c66cf67560c974c88a205c355228072a1 Mon Sep 17 00:00:00 2001 From: Ori Shoshan Date: Sun, 4 Feb 2024 19:57:22 +0100 Subject: [PATCH 11/18] first pass --- .../k8s-istio-authorization-policies.mdx | 2 +- .../_category_.json | 2 +- .../index.mdx | 5 +- .../reference/Network-Policies-Deep-Dive.mdx | 0 .../reference/README.mdx | 0 .../tutorials/_category_.json | 0 .../tutorials/aws-eks-cni-mini.mdx | 0 .../tutorials/k8s-network-mapper.mdx | 0 .../tutorials/k8s-network-policies.mdx | 0 .../protect-1-service-network-policies.mdx | 0 docs/getting-started/README.mdx | 115 +-- docs/overview/index.mdx | 35 +- .../credentials-operator/README.mdx | 27 +- yarn.lock | 929 +++++++++--------- 14 files changed, 509 insertions(+), 606 deletions(-) rename docs/features/{networking => network-mapping-network-policies}/_category_.json (68%) rename docs/features/{networking => network-mapping-network-policies}/index.mdx (98%) rename docs/features/{networking => network-mapping-network-policies}/reference/Network-Policies-Deep-Dive.mdx (100%) rename docs/features/{networking => network-mapping-network-policies}/reference/README.mdx (100%) rename docs/features/{networking => network-mapping-network-policies}/tutorials/_category_.json (100%) rename docs/features/{networking => network-mapping-network-policies}/tutorials/aws-eks-cni-mini.mdx (100%) rename docs/features/{networking => network-mapping-network-policies}/tutorials/k8s-network-mapper.mdx (100%) rename docs/features/{networking => network-mapping-network-policies}/tutorials/k8s-network-policies.mdx (100%) rename docs/features/{networking => network-mapping-network-policies}/tutorials/protect-1-service-network-policies.mdx (100%) diff --git a/docs/features/istio/tutorials/k8s-istio-authorization-policies.mdx b/docs/features/istio/tutorials/k8s-istio-authorization-policies.mdx index a265c6520..46205e0ef 100644 --- a/docs/features/istio/tutorials/k8s-istio-authorization-policies.mdx +++ b/docs/features/istio/tutorials/k8s-istio-authorization-policies.mdx @@ -166,7 +166,7 @@ kubectl apply -f ${ABSOLUTE_URL}/code-examples/istio-authorization-policies/inte ``` :::tip -Client intents are the cornerstone of [intent-based access control (IBAC)](/intent-based-access-control). +Client intents are the cornerstone of [intent-based access control (IBAC)](/overview/intent-based-access-control). ::: 2. You should quickly see in the **[other-client]** terminal that it times out when calling the server, as expected since it didn't declare its intents: diff --git a/docs/features/networking/_category_.json b/docs/features/network-mapping-network-policies/_category_.json similarity index 68% rename from docs/features/networking/_category_.json rename to docs/features/network-mapping-network-policies/_category_.json index 8c9fb3844..c0f24a86c 100644 --- a/docs/features/networking/_category_.json +++ b/docs/features/network-mapping-network-policies/_category_.json @@ -1,5 +1,5 @@ { - "label": "Network Policies", + "label": "Network mapping & network policies", "position": 1, "collapsed": true, "customProps": { diff --git a/docs/features/networking/index.mdx b/docs/features/network-mapping-network-policies/index.mdx similarity index 98% rename from docs/features/networking/index.mdx rename to docs/features/network-mapping-network-policies/index.mdx index 9d76470ba..55297923d 100644 --- a/docs/features/networking/index.mdx +++ b/docs/features/network-mapping-network-policies/index.mdx @@ -1,7 +1,6 @@ --- sidebar_position: 1 -title: Networking | Overview -hide_title: true +title: Network mapping & network policies --- import DocsLinkCard from "@site/src/components/LinkCard"; @@ -28,8 +27,6 @@ export const network_access_tutorials = [ } ]; -# Networking - ### About You can use Otterize to understand, visualize, and manage access for Kubernetes networks. Upon installation, Otterize inspects network traffic and builds an in-memory network map of connections. The network map can then be exported or viewed in various ways to understand the connections within your networks. With IBAC-based policies, Otterize becomes a control plane for your K8s networks. Mapped network traffic can autogenerate declarative intent-based access policies to create least privileged pod-to-pod access easily. diff --git a/docs/features/networking/reference/Network-Policies-Deep-Dive.mdx b/docs/features/network-mapping-network-policies/reference/Network-Policies-Deep-Dive.mdx similarity index 100% rename from docs/features/networking/reference/Network-Policies-Deep-Dive.mdx rename to docs/features/network-mapping-network-policies/reference/Network-Policies-Deep-Dive.mdx diff --git a/docs/features/networking/reference/README.mdx b/docs/features/network-mapping-network-policies/reference/README.mdx similarity index 100% rename from docs/features/networking/reference/README.mdx rename to docs/features/network-mapping-network-policies/reference/README.mdx diff --git a/docs/features/networking/tutorials/_category_.json b/docs/features/network-mapping-network-policies/tutorials/_category_.json similarity index 100% rename from docs/features/networking/tutorials/_category_.json rename to docs/features/network-mapping-network-policies/tutorials/_category_.json diff --git a/docs/features/networking/tutorials/aws-eks-cni-mini.mdx b/docs/features/network-mapping-network-policies/tutorials/aws-eks-cni-mini.mdx similarity index 100% rename from docs/features/networking/tutorials/aws-eks-cni-mini.mdx rename to docs/features/network-mapping-network-policies/tutorials/aws-eks-cni-mini.mdx diff --git a/docs/features/networking/tutorials/k8s-network-mapper.mdx b/docs/features/network-mapping-network-policies/tutorials/k8s-network-mapper.mdx similarity index 100% rename from docs/features/networking/tutorials/k8s-network-mapper.mdx rename to docs/features/network-mapping-network-policies/tutorials/k8s-network-mapper.mdx diff --git a/docs/features/networking/tutorials/k8s-network-policies.mdx b/docs/features/network-mapping-network-policies/tutorials/k8s-network-policies.mdx similarity index 100% rename from docs/features/networking/tutorials/k8s-network-policies.mdx rename to docs/features/network-mapping-network-policies/tutorials/k8s-network-policies.mdx diff --git a/docs/features/networking/tutorials/protect-1-service-network-policies.mdx b/docs/features/network-mapping-network-policies/tutorials/protect-1-service-network-policies.mdx similarity index 100% rename from docs/features/networking/tutorials/protect-1-service-network-policies.mdx rename to docs/features/network-mapping-network-policies/tutorials/protect-1-service-network-policies.mdx diff --git a/docs/getting-started/README.mdx b/docs/getting-started/README.mdx index ea1b7ea11..6d01004b3 100644 --- a/docs/getting-started/README.mdx +++ b/docs/getting-started/README.mdx @@ -8,21 +8,21 @@ hide_title: true export const introduction = [ { title: 'What is Otterize', - description: 'Learn how Otterize helps visualize and manages your authorization', - url: `/overview/intro` + description: 'Learn about how Otterize works and the function of the different Kubernetes operators', + url: `/overview` }, { title: 'Intent-Based Access Control', - description: 'Dive into declarative access.', + description: 'Learn how to use IBAC, with YAML examples.', url: '/overview/intent-based-access-control' }, ]; export const features = [ { - title: 'Network mapping & access control', + title: 'Network mapping & network policies', icon: '/img/icons/networking.png', - url: '/features/networking/' + url: '/features/network-mapping-network-policies/' }, { title: 'AWS IAM', @@ -87,115 +87,38 @@ export const tutorials_visualization = [ } ]; -export const editions = [ - { - title: 'Open Source', - description: 'Our open source edition focuses on a single Kubernetes cluster. ', - url: '/overview/otterize-oss' - }, - { - title: 'Cloud', - description: 'Visualize all your clusters, automate policies, and more', - url: '/overview/otterize-cloud' - } -]; - - import DocsLinkCard from "@site/src/components/LinkCard"; -Otterize is a platform that allows you to visualize, and build secure access for Kubernetes workloads. -Secure access is managed through declarative intent-based access control ([IBAC](/intent-based-access-control)) providing an easy understood and centralized approach to auth. +Otterize is a platform for automating workload IAM (access control) for workloads on Kubernetes. +Each workload declares what it needs in order to function, and a Kubernetes operator figures out the policies that need to be created. This concept is called [Intent-Based Access Control (IBAC)](/overview/intent-based-access-control). + +For each kind of supported IAM mechanism (such as Kubernetes Network Policies, AWS IAM policies), Otterize can automatically learn the required ClientIntents. -The platform is composed of **Otterize OSS**, which is tailored for a single Kubernetes cluster, and **Otterize Cloud**, which adds visibility and operationalization across Kubernetes clusters and non-Kubernetes infrastructures. +Otterize is composed of [three open-source and standalone components (the intents operator, credentials operator and network mapper)](/overview) you deploy on your cluster, as part of a single Helm chart, which handle enforcement, and Otterize Cloud, which supplements them with additional features. +Learn about how Otterize works by reading below, or jump into one of the tutorials below to see how it works hand-on. ### Introduction -### Features +### Features & tutorials -Otterize makes it easy to create and visualize authorization for your Kubernetes clusters across a variety of services. Explore each below. +Otterize makes it easy to automate and visualize workload IAM for your Kubernetes clusters across a variety of platforms. Explore each to learn how it works, and see its quickstart tutorials. ### Tutorials -#### How to manage access control +#### Automating workload IAM +:::danger +TODO +Add icons to the tutorials, same as the icons we have above. +::: -#### How to visualize access +#### Visualizing network traffic and data access - -### Editions - - - - -[//]: # () -[//]: # (## Let's go! 🚀) - -[//]: # (Dive right in with simple demos to manage access control:) - -[//]: # (* [Create and manage network policies](/quickstart/access-control/k8s-network-policies).) - -[//]: # (* [Network policies on AWS EKS with the VPC CNI](/quickstart/access-control/aws-eks-cni-mini).) - -[//]: # (* [Create and manage Istio authorization policies](/quickstart/access-control/k8s-istio-authorization-policies).) - -[//]: # (* [Configure secure access for Kafka using Otterize Cloud mTLS](/quickstart/access-control/k8s-kafka-mtls), or [using cert-manager mTLS](/quickstart/access-control/k8s-kafka-mtls-cert-manager).) - -[//]: # () -[//]: # (Or visualize communication in your cluster:) - -[//]: # (* [Network mapping a Kubernetes cluster](/quickstart/visualization/k8s-network-mapper).) - -[//]: # (* [Istio HTTP-level access mapping](/quickstart/visualization/k8s-istio-watcher).) - -[//]: # (* [Kafka topic-level access mapping](/quickstart/visualization/k8s-network-mapper).) - -[//]: # () -[//]: # (## Components) - -[//]: # () -[//]: # (### Otterize OSS) - -[//]: # (The Otterize OSS components are standalone open-source projects that implement intent-based access control (IBAC) for a single Kubernetes cluster. This same set of components is used to integrate with Otterize Cloud.) - -[//]: # (- The [Otterize intents operator](/reference/configuration/intents-operator) translates ClientIntents resources to access controls: currently, network policies for pod-to-pod access, and ACLs for in-cluster Kafka client access. [See it in GitHub](https://github.com/otterize/intents-operator)) - -[//]: # (- The [Otterize credentials operator](/reference/configuration/credentials-operator) integrates with SPIFFE/SPIRE to handle pod identities and manage certificates. [See it in GitHub](https://github.com/otterize/credentials-operator)) - -[//]: # (- The [Otterize network mapper](/reference/configuration/network-mapper) sniffs pod-to-pod traffic and builds a network map, which is useful on its own and may also be exported as client intents files for bootstrapping IBAC. [See it in GitHub](https://github.com/otterize/network-mapper)) - -[//]: # () -[//]: # () -[//]: # (### Otterize CLI) - -[//]: # () -[//]: # (The [Otterize CLI](/reference/cli) is used to control the network mapper or output its data, convert non-Kubernetes client) - -[//]: # (intents files (if needed) to Kubernetes custom resource YAMLs, interface with the Otterize Cloud.) - -[//]: # () -[//]: # (## Open source and Cloud) - -[//]: # () -[//]: # (### Otterize OSS) - -[//]: # () -[//]: # (Otterize OSS is a standalone open-source implementation of intent-based access control (IBAC) for a single Kubernetes cluster. As well as being open source, Otterize OSS is completely free, licensed under the Apache 2.0 license and does not require Otterize Cloud.) - -[//]: # () -[//]: # (### Otterize Cloud) - -[//]: # () -[//]: # (Otterize Cloud adds unified visibility and operationalization,) - -[//]: # (and spans multiple Kubernetes clusters as well as (coming soon) non-Kubernetes infrastructures.) - -[//]: # () -[//]: # (Read more in our [product page](https://otterize.com/product).) \ No newline at end of file diff --git a/docs/overview/index.mdx b/docs/overview/index.mdx index 00f5204dc..d495cf554 100644 --- a/docs/overview/index.mdx +++ b/docs/overview/index.mdx @@ -10,22 +10,45 @@ Otterize is a declarative and zero-trust approach to access management that empo ## How does Otterize work? -Otterize integrates into your Kubernetes clusters using a Helm chart that deploys some core [open-source components](https://github.com/otterize/), including the network mapper, intents-operator, and credential-operator. These components work in tandem to identify and secure access. Learn more about these components below. +Otterize is deployed to Kubernetes using a Helm chart that deploys the core open-source components: the [network mapper](https://github.com/otterize/network-mapper), [intents-operator](https://github.com/otterize/intents-operator), and [credentials-operator](https://github.com/otterize/credentials-operator). These components each have a stand-alone function (mapping access, provisioning policies and provisioning credentials, respectively), but together they can automate workload IAM. ### Network mapper -The network mapper is a zero-config open-source tool that provides insights into your network traffic without modifying your code or adding additional layers. Once Otterize is installed, the network monitor will automatically inspect pod traffic, including tariff from pod-to-pod, pod-to-public internet egress, Istio Envoy sidecar, pod-to-Kafka topics, and more to follow. This data is then collected in an in-memory database for various uses, including exporting and viewing. +The network mapper is a zero-config open-source tool that provides insights into your workload traffic without modifying your code or adding additional layers. Once Otterize is installed, the network monitor will automatically inspect pod traffic metadata to create a map of accesses, including: +* Pod-to-pod traffic +* Internet egress traffic +* Pod-to-pod traffic including the URL and HTTP method, when an Istio sidecar is available +* Kafka topics +* PostgreSQL databases and tables +* AWS resources -For more information, visit the [network mapper repository](https://github.com/otterize/network-mapper#about) +Out of the box, only pod-to-pod, Internet egress traffic and Istio traffic is collected. To enable the rest, see the tutorials. -### Credential operator +This information can then be viewed as a graph, exported textually, or used to automatically generate ClientIntents, a resource used with the intents operator. -Once Otterize is installed into a cluster, it [resolves a service name](https://github.com/otterize/credentials-operator#service-name-resolution-and-automatic-pod-labeling) for each pod and registers it with either Otterize Cloud or a SPIRE server. Once registered, pods can use the credential operator to generate various secrets/credentials for mTLS or credential-based access to services like PostgreSQL, Kafka, or other connections. +:::danger +TODO +Let's keep people in the docs if they're here, don't send them away to the repo. The repo should be standalone for some basic explanations, then refer to the docs. +::: +For more information, visit the [network mapper reference page](/reference/configuration/network-mapper). +### Credentials operator + +The credentials operator handles the provisioning just-in-time credentials for workloads to authenticate. It can issue mTLS credentials or database username + passwords as Kubernetes Secrets, or create AWS IAM roles. To learn about each of these, check the respective tutorials. + +:::danger +TODO +Let's keep people in the docs if they're here, don't send them away to the repo. The repo should be standalone for some basic explanations, then refer to the docs. (see network mapper) +::: For more information, visit the [credential operator repository](https://github.com/otterize/credentials-operator#about) ### Intents operator -The Otterize intents operator is a tool to network and service access policy creation straightforward. The intents operator uses a declarative policy syntax called Intent-Based Access Control (IBAC) to connect services. IBAC policies allow you to specify a caller and the type of access they should be provided. The intents operator then generates and applies the appropriate service-specific policy (IAM, ACL, NetworkPolicy, etc) to enable that defined access. +The intents operator handles the provisioning of just-in-time policies based on the declared ClientIntents of workloads within a cluster. It can manage network policies, Istio authorization policies, AWS IAM policies, PostgreSQL GRANTs, and Kafka ACLs. To learn about each of these, visit the respective tutorial. +The intents operator does not implement its own policies, but instead configures your existing infrastructure's policies to allow the access required by each workload. This means that it does not ever see your data. +:::danger +TODO +Let's keep people in the docs if they're here, don't send them away to the repo. The repo should be standalone for some basic explanations, then refer to the docs. (see network mapper) +::: For more information, visit the [intents operator repository](https://github.com/otterize/intents-operator#about) diff --git a/docs/reference/configuration/credentials-operator/README.mdx b/docs/reference/configuration/credentials-operator/README.mdx index 8efd28c35..2c0a1f329 100644 --- a/docs/reference/configuration/credentials-operator/README.mdx +++ b/docs/reference/configuration/credentials-operator/README.mdx @@ -3,7 +3,7 @@ sidebar_position: 3 title: Credentials operator --- -The Otterize credentials operator automatically resolves pods to dev-friendly service names and provisions credentials (certificates) for the services from cert-manager, Otterize Cloud or SPIRE as Kubernetes Secrets. +The credentials operator provisions just-in-time credentials for workloads running on Kubernetes. These credentials come in the form of Kubernetes Secrets (mTLS certificates, database username + passwords), or AWS IAM roles. ## Deploying the credentials operator To deploy the operator, [use the Helm chart](/reference/configuration/credentials-operator/helm-chart). @@ -11,34 +11,41 @@ To deploy the operator, [use the Helm chart](/reference/configuration/credential To deploy with Otterize Cloud as the certificate provider, we recommend you [follow the instructions in Otterize Cloud](https://app.otterize.com/). To deploy with cert-manager as the certificate provider, you must also [configure the Issuer name and whether it should look for a ClusterIssuer or an Issuer (namespace-scoped)](/reference/configuration/credentials-operator/helm-chart#cert-manager-parameters). -## Acquiring mTLS credentials using the credentials operator -The credentials operator is controlled using annotations placed on pods. To have it provision credentials and place them in Secrets, you must specify `credentials-operator.otterize.com/tls-secret-name`. +## Provisioning AWS IAM roles using the credentials operator +The credentials operator is controlled using annotations placed on pods. To have it provision an AWS IAM role, you must specify the pod annotation `credentials-operator.otterize.com/create-aws-role`, with the value being `true`. Once you do so, the credentials operator will provision an AWS IAM role, and automatically bind it with the Kubernetes ServiceAccount of the pod by setting the EKS role ARN annotation on the ServiceAccount and the appropriate Trust Relationship on the AWS IAM role. -## How does the credentials operator provision credentials? +## Provisioning mTLS certificates using the credentials operator +The credentials operator is controlled using annotations placed on pods. To have it provision certificates and place them in Secrets, you must specify the pod annotation `credentials-operator.otterize.com/tls-secret-name`, with the value being the name of the secret. Once you do so, the credentials operator will provision a certificate for the pod, using Otterize Cloud, cert-manager or SPIRE, depending how you've deployed it. + +## Provisioning database username + password using the credentials operator +The credentials operator is controlled using annotations placed on pods. To have it provision database username + password and place them in Secrets, you must specify the pod annotation `credentials-operator.otterize.com/user-password-secret-name`, with the value being the name of the secret. Once you do so, the credentials operator will provision a username and password for the pod. + + +### How does the credentials operator provision certificates? The credentials operator performs two steps in order to issue certificates. -### Step 1: SPIRE entry registration +#### Step 1: SPIRE entry registration This step only happens if the operator is configured to use SPIRE for certificate generation. Once the operator [resolves the service name](#service-name-resolution-and-automatic-pod-labeling) for a pod, it labels the pod so that SPIRE can find it, and registers an entry with the SPIRE server for that label. -### Step 2: Certificate generation +#### Step 2: Certificate generation The operator consults the annotation `credentials-operator.otterize.com/tls-secret-name`. If that annotation exists, the operator creates a secret named after the value of the label. That secret contains X.509 credentials within, provided by cert-manager, Otterize Cloud or SPIRE, depending on how the credentials operator is configured. -#### cert-manager +##### cert-manager The operator creates a cert-manager [`Certificate`](https://cert-manager.io/docs/usage/certificate/) resource, which will create a Kubernetes Secret with the name specified by the value of the annotation `credentials-operator.otterize.com/tls-secret-name`. The common name and DNS names in the certificate are values that represent the identity of the service, as resolved by the [service identity resolution algorithm](#3-service-name-resolution-and-automatic-pod-labeling), i.e. `servicename.namespace`. The operator will use a [`ClusterIssuer`](https://cert-manager.io/docs/concepts/issuer/) or an [`Issuer`](https://cert-manager.io/docs/concepts/issuer/) to create the Certificate resource, which it expects to find in the same namespace as the `Pod` with the annotation. The `Issuer` is configured at deploy time, using the [Helm chart](/reference/configuration/credentials-operator/helm-chart). In the event that the default approver controller in `cert-manager` is [disabled](https://cert-manager.io/docs/concepts/certificaterequest/#approver-controller), the credentials operator can auto-approve its own [`CertificateRequests`](https://cert-manager.io/docs/concepts/certificaterequest/). Enable this capability by [configuring the Helm chart `autoApprove` flag](/reference/configuration/credentials-operator/helm-chart#cert-manager-parameters). -#### Otterize Cloud +##### Otterize Cloud The operator requests certificates from Otterize Cloud, which internally manages them in Hashicorp Vault. The certificates are then placed within a Kubernetes Secret named with the value of the annotation `credentials-operator.otterize.com/tls-secret-name`. -#### SPIRE +##### SPIRE Once the operator has registered the pod with SPIRE, which happens automatically for a pod that has the `credentials-operator.otterize.com/tls-secret-name` annotation upon pod startup. The credentials operator then acquires the SVID and certificates for the CA chain and places them within a Kubernetes Secret. The SVID and DNS names in the certificate is the identity of the service, as resolved by the [service identity resolution algorithm](#3-service-name-resolution-and-automatic-pod-labeling), i.e. `servicename.namespace`. ## SPIRE workload registrar -When using SPIRE, the operator registers every pod with the SPIRE server (even those without annotations). +When deployed with a SPIRE server, the operator registers every pod with the SPIRE server (even those without annotations). Alongside the credentials operator, you could use SPIRE agents and the SPIRE SDK to work with the same SPIRE server. To learn more, check out the documentation for [SPIRE](https://spiffe.io/docs/latest/spire-about/spire-concepts/). Note that to use the credentials operator, you do not need to work directly with SPIRE or SPIRE agents, and can do everything completely using annotations and Kubernetes Secrets. diff --git a/yarn.lock b/yarn.lock index dd4fda918..9bb583314 100644 --- a/yarn.lock +++ b/yarn.lock @@ -84,7 +84,7 @@ "@algolia/requester-common" "4.20.0" "@algolia/transporter" "4.20.0" -"@algolia/client-search@>= 4.9.1 < 6", "@algolia/client-search@4.20.0": +"@algolia/client-search@4.20.0": version "4.20.0" resolved "https://registry.npmjs.org/@algolia/client-search/-/client-search-4.20.0.tgz" integrity sha512-zgwqnMvhWLdpzKTpd3sGmMlr4c+iS7eyyLGiaO51zDZWGMkpgoNVmltkzdBwxOVXz0RsFMznIxB9zuarUv4TZg== @@ -164,28 +164,7 @@ resolved "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.23.5.tgz" integrity sha512-uU27kfDRlhfKl+w1U6vp16IuvSLtjAxdArVXPa9BvLkrr7CYIsxH5adpHObeAGY/41+syctUWOZ140a2Rvkgjw== -"@babel/core@^7.0.0", "@babel/core@^7.0.0-0", "@babel/core@^7.0.0-0 || ^8.0.0-0 <8.0.0", "@babel/core@^7.12.0", "@babel/core@^7.13.0", "@babel/core@^7.18.6", "@babel/core@^7.19.6", "@babel/core@^7.4.0 || ^8.0.0-0 <8.0.0": - version "7.23.9" - resolved "https://registry.npmjs.org/@babel/core/-/core-7.23.9.tgz" - integrity sha512-5q0175NOjddqpvvzU+kDiSOAk4PfdO6FvwCWoQ6RO7rTzEe8vlo+4HVfcnAREhD4npMs0e9uZypjTwzZPCf/cw== - dependencies: - "@ampproject/remapping" "^2.2.0" - "@babel/code-frame" "^7.23.5" - "@babel/generator" "^7.23.6" - "@babel/helper-compilation-targets" "^7.23.6" - "@babel/helper-module-transforms" "^7.23.3" - "@babel/helpers" "^7.23.9" - "@babel/parser" "^7.23.9" - "@babel/template" "^7.23.9" - "@babel/traverse" "^7.23.9" - "@babel/types" "^7.23.9" - convert-source-map "^2.0.0" - debug "^4.1.0" - gensync "^1.0.0-beta.2" - json5 "^2.2.3" - semver "^6.3.1" - -"@babel/core@^7.11.6", "@babel/core@7.12.9": +"@babel/core@7.12.9": version "7.12.9" resolved "https://registry.npmjs.org/@babel/core/-/core-7.12.9.tgz" integrity sha512-gTXYh3M5wb7FRXQy+FErKFAv90BnlOuNn1QkCK2lREoPAjrQCO49+HVSrFoe5uakFAF5eenS75KbO2vQiLrTMQ== @@ -207,6 +186,27 @@ semver "^5.4.1" source-map "^0.5.0" +"@babel/core@^7.18.6", "@babel/core@^7.19.6": + version "7.23.9" + resolved "https://registry.npmjs.org/@babel/core/-/core-7.23.9.tgz" + integrity sha512-5q0175NOjddqpvvzU+kDiSOAk4PfdO6FvwCWoQ6RO7rTzEe8vlo+4HVfcnAREhD4npMs0e9uZypjTwzZPCf/cw== + dependencies: + "@ampproject/remapping" "^2.2.0" + "@babel/code-frame" "^7.23.5" + "@babel/generator" "^7.23.6" + "@babel/helper-compilation-targets" "^7.23.6" + "@babel/helper-module-transforms" "^7.23.3" + "@babel/helpers" "^7.23.9" + "@babel/parser" "^7.23.9" + "@babel/template" "^7.23.9" + "@babel/traverse" "^7.23.9" + "@babel/types" "^7.23.9" + convert-source-map "^2.0.0" + debug "^4.1.0" + gensync "^1.0.0-beta.2" + json5 "^2.2.3" + semver "^6.3.1" + "@babel/generator@^7.12.5", "@babel/generator@^7.18.7", "@babel/generator@^7.23.6": version "7.23.6" resolved "https://registry.npmjs.org/@babel/generator/-/generator-7.23.6.tgz" @@ -329,16 +329,16 @@ dependencies: "@babel/types" "^7.22.5" -"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.22.5", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": - version "7.22.5" - resolved "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz" - integrity sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg== - "@babel/helper-plugin-utils@7.10.4": version "7.10.4" resolved "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz" integrity sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg== +"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.22.5", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz" + integrity sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg== + "@babel/helper-remap-async-to-generator@^7.22.20", "@babel/helper-remap-async-to-generator@^7.22.5": version "7.22.20" resolved "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.20.tgz" @@ -518,13 +518,6 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-jsx@^7.22.5": - version "7.22.5" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.22.5.tgz" - integrity sha512-gvyP4hZrgrs/wWMaocvxZ44Hw0b3W8Pe+cMxc8V1ULQ07oh8VNbIRaoD1LRZVTvD+0nieDKjfgKg89sD7rrKrg== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/plugin-syntax-jsx@7.12.1": version "7.12.1" resolved "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.12.1.tgz" @@ -532,6 +525,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.10.4" +"@babel/plugin-syntax-jsx@^7.22.5": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.22.5.tgz" + integrity sha512-gvyP4hZrgrs/wWMaocvxZ44Hw0b3W8Pe+cMxc8V1ULQ07oh8VNbIRaoD1LRZVTvD+0nieDKjfgKg89sD7rrKrg== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-logical-assignment-operators@^7.10.4": version "7.10.4" resolved "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz" @@ -553,7 +553,7 @@ dependencies: "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-syntax-object-rest-spread@^7.8.0", "@babel/plugin-syntax-object-rest-spread@^7.8.3", "@babel/plugin-syntax-object-rest-spread@7.8.3": +"@babel/plugin-syntax-object-rest-spread@7.8.3", "@babel/plugin-syntax-object-rest-spread@^7.8.0", "@babel/plugin-syntax-object-rest-spread@^7.8.3": version "7.8.3" resolved "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz" integrity sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA== @@ -1257,7 +1257,7 @@ "@docsearch/css" "3.5.2" algoliasearch "^4.19.1" -"@docusaurus/core@^2.0.0-beta.5", "@docusaurus/core@^2.4.3", "@docusaurus/core@2.4.3": +"@docusaurus/core@2.4.3", "@docusaurus/core@^2.0.0-beta.5", "@docusaurus/core@^2.4.3": version "2.4.3" resolved "https://registry.npmjs.org/@docusaurus/core/-/core-2.4.3.tgz" integrity sha512-dWH5P7cgeNSIg9ufReX6gaCl/TmrGKD38Orbwuz05WPhAQtFXHd5B8Qym1TiXfvUNvwoYKkAJOJuGe8ou0Z7PA== @@ -1375,7 +1375,7 @@ url-loader "^4.1.1" webpack "^5.73.0" -"@docusaurus/module-type-aliases@^2.4.3", "@docusaurus/module-type-aliases@2.4.3": +"@docusaurus/module-type-aliases@2.4.3", "@docusaurus/module-type-aliases@^2.4.3": version "2.4.3" resolved "https://registry.npmjs.org/@docusaurus/module-type-aliases/-/module-type-aliases-2.4.3.tgz" integrity sha512-cwkBkt1UCiduuvEAo7XZY01dJfRn7UR/75mBgOdb1hKknhrabJZ8YH+7savd/y9kLExPyrhe0QwdS9GuzsRRIA== @@ -1484,7 +1484,7 @@ "@docusaurus/utils-validation" "2.4.3" tslib "^2.4.0" -"@docusaurus/plugin-google-gtag@^2.4.3", "@docusaurus/plugin-google-gtag@2.4.3": +"@docusaurus/plugin-google-gtag@2.4.3", "@docusaurus/plugin-google-gtag@^2.4.3": version "2.4.3" resolved "https://registry.npmjs.org/@docusaurus/plugin-google-gtag/-/plugin-google-gtag-2.4.3.tgz" integrity sha512-5FMg0rT7sDy4i9AGsvJC71MQrqQZwgLNdDetLEGDHLfSHLvJhQbTCUGbGXknUgWXQJckcV/AILYeJy+HhxeIFA== @@ -1538,7 +1538,7 @@ "@docusaurus/theme-search-algolia" "2.4.3" "@docusaurus/types" "2.4.3" -"@docusaurus/react-loadable@5.5.2": +"@docusaurus/react-loadable@5.5.2", "react-loadable@npm:@docusaurus/react-loadable@5.5.2": version "5.5.2" resolved "https://registry.npmjs.org/@docusaurus/react-loadable/-/react-loadable-5.5.2.tgz" integrity sha512-A3dYjdBGuy0IGT+wyLIGIKLRE+sAk1iNk0f1HjNDysO7u8lhL4N3VEm+FAubmJbAztn94F7MxBTPmnixbiyFdQ== @@ -1599,7 +1599,7 @@ use-sync-external-store "^1.2.0" utility-types "^3.10.0" -"@docusaurus/theme-search-algolia@^2.4.3", "@docusaurus/theme-search-algolia@2.4.3": +"@docusaurus/theme-search-algolia@2.4.3", "@docusaurus/theme-search-algolia@^2.4.3": version "2.4.3" resolved "https://registry.npmjs.org/@docusaurus/theme-search-algolia/-/theme-search-algolia-2.4.3.tgz" integrity sha512-jziq4f6YVUB5hZOB85ELATwnxBz/RmSLD3ksGQOLDPKVzat4pmI8tddNWtriPpxR04BNT+ZfpPUMFkNFetSW1Q== @@ -1629,7 +1629,7 @@ fs-extra "^10.1.0" tslib "^2.4.0" -"@docusaurus/types@*", "@docusaurus/types@^2.0.0-beta.5", "@docusaurus/types@2.4.3": +"@docusaurus/types@2.4.3", "@docusaurus/types@^2.0.0-beta.5": version "2.4.3" resolved "https://registry.npmjs.org/@docusaurus/types/-/types-2.4.3.tgz" integrity sha512-W6zNLGQqfrp/EoPD0bhb9n7OobP+RHpmvVzpA+Z/IuU3Q63njJM24hmT0GYboovWcDtFmnIJC9wcyx4RVPQscw== @@ -1661,7 +1661,7 @@ js-yaml "^4.1.0" tslib "^2.4.0" -"@docusaurus/utils@^2.0.0-beta.5", "@docusaurus/utils@2.4.3": +"@docusaurus/utils@2.4.3", "@docusaurus/utils@^2.0.0-beta.5": version "2.4.3" resolved "https://registry.npmjs.org/@docusaurus/utils/-/utils-2.4.3.tgz" integrity sha512-fKcXsjrD86Smxv8Pt0TBFqYieZZCPh4cbf9oszUq/AMhZn3ujwpKaVYZACPX8mmjtYx0JOgNx52CREBfiGQB4A== @@ -1785,14 +1785,6 @@ resolved "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz" integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== -"@jridgewell/trace-mapping@^0.3.17", "@jridgewell/trace-mapping@^0.3.9": - version "0.3.20" - resolved "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.20.tgz" - integrity sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q== - dependencies: - "@jridgewell/resolve-uri" "^3.1.0" - "@jridgewell/sourcemap-codec" "^1.4.14" - "@jridgewell/trace-mapping@0.3.9": version "0.3.9" resolved "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz" @@ -1801,6 +1793,14 @@ "@jridgewell/resolve-uri" "^3.0.3" "@jridgewell/sourcemap-codec" "^1.4.10" +"@jridgewell/trace-mapping@^0.3.17", "@jridgewell/trace-mapping@^0.3.9": + version "0.3.20" + resolved "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.20.tgz" + integrity sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q== + dependencies: + "@jridgewell/resolve-uri" "^3.1.0" + "@jridgewell/sourcemap-codec" "^1.4.14" + "@leichtgewicht/ip-codec@^2.0.1": version "2.0.4" resolved "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.4.tgz" @@ -1864,7 +1864,7 @@ "@nodelib/fs.stat" "2.0.5" run-parallel "^1.1.9" -"@nodelib/fs.stat@^2.0.2", "@nodelib/fs.stat@2.0.5": +"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": version "2.0.5" resolved "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz" integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== @@ -1907,16 +1907,16 @@ resolved "https://registry.npmjs.org/@sideway/pinpoint/-/pinpoint-2.0.0.tgz" integrity sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ== -"@sinclair/typebox@^0.27.8": - version "0.27.8" - resolved "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz" - integrity sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA== - "@sinclair/typebox@0.25.24": version "0.25.24" resolved "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.25.24.tgz" integrity sha512-XJfwUVUKDHF5ugKwIcxEgc9k8b7HbznCp6eUfWgu710hMPNIO4aw4/zB5RogDQz8nd6gyCDpU9O/m6qYEWY6yQ== +"@sinclair/typebox@^0.27.8": + version "0.27.8" + resolved "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz" + integrity sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA== + "@sindresorhus/is@^0.14.0": version "0.14.0" resolved "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz" @@ -1985,7 +1985,7 @@ "@svgr/babel-plugin-transform-react-native-svg" "^6.5.1" "@svgr/babel-plugin-transform-svg-component" "^6.5.1" -"@svgr/core@*", "@svgr/core@^6.0.0", "@svgr/core@^6.5.1": +"@svgr/core@^6.5.1": version "6.5.1" resolved "https://registry.npmjs.org/@svgr/core/-/core-6.5.1.tgz" integrity sha512-/xdLSWxK5QkqG524ONSjvg3V/FkNyCv538OIBdQqPNaAta3AsXj/Bd2FbvR87yMbXO2hFSWiAe/Q6IkVPDw+mw== @@ -2244,16 +2244,16 @@ dependencies: undici-types "~5.26.4" -"@types/node@^17.0.5": - version "17.0.45" - resolved "https://registry.npmjs.org/@types/node/-/node-17.0.45.tgz" - integrity sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw== - "@types/node@14.18.33": version "14.18.33" resolved "https://registry.npmjs.org/@types/node/-/node-14.18.33.tgz" integrity sha512-qelS/Ra6sacc4loe/3MSjXNL1dNQ/GjxNHVzuChwMfmk7HuycRLVQN2qNY3XahK+fZc5E2szqQSKUyAF0E+2bg== +"@types/node@^17.0.5": + version "17.0.45" + resolved "https://registry.npmjs.org/@types/node/-/node-17.0.45.tgz" + integrity sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw== + "@types/parse-json@^4.0.0": version "4.0.0" resolved "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz" @@ -2305,7 +2305,7 @@ "@types/history" "^4.7.11" "@types/react" "*" -"@types/react@*", "@types/react@>= 16.8.0 < 19.0.0": +"@types/react@*": version "18.2.37" resolved "https://registry.npmjs.org/@types/react/-/react-18.2.37.tgz" integrity sha512-RGAYMi2bhRgEXT3f4B92WTohopH6bIXw05FuGlmJEnv/omEn190+QYEIYxIAuIBdKgboYYdVved2p1AxZVQnaw== @@ -2559,7 +2559,7 @@ json-schema-to-ts "1.6.4" ts-morph "12.0.0" -"@webassemblyjs/ast@^1.11.5", "@webassemblyjs/ast@1.11.6": +"@webassemblyjs/ast@1.11.6", "@webassemblyjs/ast@^1.11.5": version "1.11.6" resolved "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.6.tgz" integrity sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q== @@ -2660,7 +2660,7 @@ "@webassemblyjs/wasm-gen" "1.11.6" "@webassemblyjs/wasm-parser" "1.11.6" -"@webassemblyjs/wasm-parser@^1.11.5", "@webassemblyjs/wasm-parser@1.11.6": +"@webassemblyjs/wasm-parser@1.11.6", "@webassemblyjs/wasm-parser@^1.11.5": version "1.11.6" resolved "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.6.tgz" integrity sha512-6ZwPeGzMJM3Dqp3hCsLgESxBGtT/OeCvCZ4TA1JUPYgmhAx38tTPR9JaKy0S5H3evQpO/h2uWs2j6Yc/fjkpTQ== @@ -2718,7 +2718,7 @@ acorn-walk@^8.0.0, acorn-walk@^8.1.1: resolved "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz" integrity sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA== -acorn@^8, acorn@^8.0.4, acorn@^8.4.1, acorn@^8.6.0, acorn@^8.7.1, acorn@^8.8.2: +acorn@^8.0.4, acorn@^8.4.1, acorn@^8.6.0, acorn@^8.7.1, acorn@^8.8.2: version "8.11.2" resolved "https://registry.npmjs.org/acorn/-/acorn-8.11.2.tgz" integrity sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w== @@ -2762,7 +2762,17 @@ ajv-keywords@^5.1.0: dependencies: fast-deep-equal "^3.1.3" -ajv@^6.0.0, ajv@^6.12.2, ajv@^6.12.4, ajv@^6.12.5, ajv@^6.9.1: +ajv@8.6.3: + version "8.6.3" + resolved "https://registry.npmjs.org/ajv/-/ajv-8.6.3.tgz" + integrity sha512-SMJOdDP6LqTkD0Uq8qLi+gMwSt0imXLSV080qFVwJCpH9U6Mb+SUGHAXM0KNbcBPguytWyvFxcHgMLe2D2XSpw== + dependencies: + fast-deep-equal "^3.1.1" + json-schema-traverse "^1.0.0" + require-from-string "^2.0.2" + uri-js "^4.2.2" + +ajv@^6.0.0, ajv@^6.12.2, ajv@^6.12.4, ajv@^6.12.5: version "6.12.6" resolved "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz" integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== @@ -2772,7 +2782,7 @@ ajv@^6.0.0, ajv@^6.12.2, ajv@^6.12.4, ajv@^6.12.5, ajv@^6.9.1: json-schema-traverse "^0.4.1" uri-js "^4.2.2" -ajv@^8.0.0, ajv@^8.8.2, ajv@^8.9.0: +ajv@^8.0.0, ajv@^8.9.0: version "8.12.0" resolved "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz" integrity sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA== @@ -2782,16 +2792,6 @@ ajv@^8.0.0, ajv@^8.8.2, ajv@^8.9.0: require-from-string "^2.0.2" uri-js "^4.2.2" -ajv@8.6.3: - version "8.6.3" - resolved "https://registry.npmjs.org/ajv/-/ajv-8.6.3.tgz" - integrity sha512-SMJOdDP6LqTkD0Uq8qLi+gMwSt0imXLSV080qFVwJCpH9U6Mb+SUGHAXM0KNbcBPguytWyvFxcHgMLe2D2XSpw== - dependencies: - fast-deep-equal "^3.1.1" - json-schema-traverse "^1.0.0" - require-from-string "^2.0.2" - uri-js "^4.2.2" - algoliasearch-helper@^3.10.0: version "3.15.0" resolved "https://registry.npmjs.org/algoliasearch-helper/-/algoliasearch-helper-3.15.0.tgz" @@ -2799,7 +2799,7 @@ algoliasearch-helper@^3.10.0: dependencies: "@algolia/events" "^4.0.1" -algoliasearch@^4.13.1, algoliasearch@^4.19.1, "algoliasearch@>= 3.1 < 6", "algoliasearch@>= 4.9.1 < 6": +algoliasearch@^4.13.1, algoliasearch@^4.19.1: version "4.20.0" resolved "https://registry.npmjs.org/algoliasearch/-/algoliasearch-4.20.0.tgz" integrity sha512-y+UHEjnOItoNy0bYO+WWmLWBlPwDjKHW6mNHrPi0NkuhpQOOEbrkwQH/wgKFDLh7qlKjzoKeiRtlpewDPDG23g== @@ -2886,6 +2886,11 @@ are-we-there-yet@^2.0.0: delegates "^1.0.0" readable-stream "^3.6.0" +arg@4.1.0: + version "4.1.0" + resolved "https://registry.npmjs.org/arg/-/arg-4.1.0.tgz" + integrity sha512-ZWc51jO3qegGkVh8Hwpv636EkbesNV5ZNQPCtRa+0qytRYPEs9IYT9qITY9buezqUH5uqyzlWLcufrzU2rffdg== + arg@^4.1.0: version "4.1.3" resolved "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz" @@ -2896,11 +2901,6 @@ arg@^5.0.0, arg@^5.0.2: resolved "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz" integrity sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg== -arg@4.1.0: - version "4.1.0" - resolved "https://registry.npmjs.org/arg/-/arg-4.1.0.tgz" - integrity sha512-ZWc51jO3qegGkVh8Hwpv636EkbesNV5ZNQPCtRa+0qytRYPEs9IYT9qITY9buezqUH5uqyzlWLcufrzU2rffdg== - argparse@^1.0.7: version "1.0.10" resolved "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz" @@ -2913,16 +2913,16 @@ argparse@^2.0.1: resolved "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz" integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== -array-flatten@^2.1.2: - version "2.1.2" - resolved "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz" - integrity sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ== - array-flatten@1.1.1: version "1.1.1" resolved "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz" integrity sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg== +array-flatten@^2.1.2: + version "2.1.2" + resolved "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz" + integrity sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ== + array-union@^2.1.0: version "2.1.0" resolved "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz" @@ -3146,7 +3146,7 @@ braces@^3.0.2, braces@~3.0.2: dependencies: fill-range "^7.0.1" -browserslist@^4.0.0, browserslist@^4.14.5, browserslist@^4.18.1, browserslist@^4.21.10, browserslist@^4.21.4, browserslist@^4.22.1, browserslist@^4.22.2, "browserslist@>= 4.21.0": +browserslist@^4.0.0, browserslist@^4.14.5, browserslist@^4.18.1, browserslist@^4.21.10, browserslist@^4.21.4, browserslist@^4.22.1, browserslist@^4.22.2: version "4.22.3" resolved "https://registry.npmjs.org/browserslist/-/browserslist-4.22.3.tgz" integrity sha512-UAp55yfwNv0klWNapjs/ktHoguxuQNGnOzxYmfnXIS+8AsRDZkSDxg7R1AX3GKzn078SBI5dzwzj/Yx0Or0e3A== @@ -3215,7 +3215,7 @@ camel-case@^4.1.2: pascal-case "^3.1.2" tslib "^2.0.3" -camelcase-css@^2.0.1, camelcase-css@2.0.1: +camelcase-css@2.0.1, camelcase-css@^2.0.1: version "2.0.1" resolved "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz" integrity sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA== @@ -3302,21 +3302,6 @@ cheerio@^1.0.0-rc.12: parse5 "^7.0.0" parse5-htmlparser2-tree-adapter "^7.0.0" -chokidar@^3.4.2, chokidar@^3.5.3: - version "3.5.3" - resolved "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz" - integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw== - dependencies: - anymatch "~3.1.2" - braces "~3.0.2" - glob-parent "~5.1.2" - is-binary-path "~2.1.0" - is-glob "~4.0.1" - normalize-path "~3.0.0" - readdirp "~3.6.0" - optionalDependencies: - fsevents "~2.3.2" - chokidar@3.3.1: version "3.3.1" resolved "https://registry.npmjs.org/chokidar/-/chokidar-3.3.1.tgz" @@ -3332,6 +3317,21 @@ chokidar@3.3.1: optionalDependencies: fsevents "~2.1.2" +chokidar@^3.4.2, chokidar@^3.5.3: + version "3.5.3" + resolved "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz" + integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw== + dependencies: + anymatch "~3.1.2" + braces "~3.0.2" + glob-parent "~5.1.2" + is-binary-path "~2.1.0" + is-glob "~4.0.1" + normalize-path "~3.0.0" + readdirp "~3.6.0" + optionalDependencies: + fsevents "~2.3.2" + chownr@^1.1.4: version "1.1.4" resolved "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz" @@ -3433,16 +3433,16 @@ color-convert@^2.0.1: dependencies: color-name "~1.1.4" -color-name@~1.1.4: - version "1.1.4" - resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz" - integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== - color-name@1.1.3: version "1.1.3" resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz" integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== +color-name@~1.1.4: + version "1.1.4" + resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz" + integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== + color-support@^1.1.2: version "1.1.3" resolved "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz" @@ -3562,16 +3562,16 @@ content-disposition@0.5.4: dependencies: safe-buffer "5.2.1" -content-type@~1.0.4: - version "1.0.5" - resolved "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz" - integrity sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA== - content-type@1.0.4: version "1.0.4" resolved "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz" integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA== +content-type@~1.0.4: + version "1.0.5" + resolved "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz" + integrity sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA== + convert-hrtime@^3.0.0: version "3.0.0" resolved "https://registry.npmjs.org/convert-hrtime/-/convert-hrtime-3.0.0.tgz" @@ -3838,35 +3838,14 @@ csstype@^3.0.2: resolved "https://registry.npmjs.org/csstype/-/csstype-3.1.2.tgz" integrity sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ== -debug@^2.6.0, debug@2.6.9: +debug@2.6.9, debug@^2.6.0: version "2.6.9" resolved "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz" integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== dependencies: ms "2.0.0" -debug@^4.1.0: - version "4.3.4" - resolved "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz" - integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== - dependencies: - ms "2.1.2" - -debug@^4.1.1: - version "4.3.4" - resolved "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz" - integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== - dependencies: - ms "2.1.2" - -debug@^4.3.1: - version "4.3.4" - resolved "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz" - integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== - dependencies: - ms "2.1.2" - -debug@4: +debug@4, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1: version "4.3.4" resolved "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz" integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== @@ -3951,16 +3930,16 @@ delegates@^1.0.0: resolved "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz" integrity sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ== -depd@~1.1.2: - version "1.1.2" - resolved "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz" - integrity sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ== - depd@2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz" integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== +depd@~1.1.2: + version "1.1.2" + resolved "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz" + integrity sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ== + destroy@1.2.0: version "1.2.0" resolved "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz" @@ -4093,16 +4072,7 @@ domhandler@^5.0.2, domhandler@^5.0.3: dependencies: domelementtype "^2.3.0" -domutils@^2.5.2: - version "2.8.0" - resolved "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz" - integrity sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A== - dependencies: - dom-serializer "^1.0.1" - domelementtype "^2.2.0" - domhandler "^4.2.0" - -domutils@^2.8.0: +domutils@^2.5.2, domutils@^2.8.0: version "2.8.0" resolved "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz" integrity sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A== @@ -4135,16 +4105,16 @@ dot-prop@^5.2.0: dependencies: is-obj "^2.0.0" -duplexer@^0.1.2: - version "0.1.2" - resolved "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz" - integrity sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg== - duplexer3@^0.1.4: version "0.1.5" resolved "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.5.tgz" integrity sha512-1A8za6ws41LQgv9HrE/66jyC5yuSjQ3L/KOpFtoBilsAK2iA2wuS5rTt1OCzIvtS2V7nVmedsUU+DGRcjBmOYA== +duplexer@^0.1.2: + version "0.1.2" + resolved "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz" + integrity sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg== + eastasianwidth@^0.2.0: version "0.2.0" resolved "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz" @@ -4244,26 +4214,121 @@ es-module-lexer@^1.2.1: resolved "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.3.1.tgz" integrity sha512-JUFAyicQV9mXc3YRxPnDlrfBKpqt6hUYzz9/boprUJHs4e4KVr3XwOF70doO6gwXUor6EWZJAyWAfKki84t20Q== +esbuild-android-64@0.14.47: + version "0.14.47" + resolved "https://registry.yarnpkg.com/esbuild-android-64/-/esbuild-android-64-0.14.47.tgz#ef95b42c67bcf4268c869153fa3ad1466c4cea6b" + integrity sha512-R13Bd9+tqLVFndncMHssZrPWe6/0Kpv2/dt4aA69soX4PRxlzsVpCvoJeFE8sOEoeVEiBkI0myjlkDodXlHa0g== + +esbuild-android-arm64@0.14.47: + version "0.14.47" + resolved "https://registry.yarnpkg.com/esbuild-android-arm64/-/esbuild-android-arm64-0.14.47.tgz#4ebd7ce9fb250b4695faa3ee46fd3b0754ecd9e6" + integrity sha512-OkwOjj7ts4lBp/TL6hdd8HftIzOy/pdtbrNA4+0oVWgGG64HrdVzAF5gxtJufAPOsEjkyh1oIYvKAUinKKQRSQ== + +esbuild-darwin-64@0.14.47: + version "0.14.47" + resolved "https://registry.yarnpkg.com/esbuild-darwin-64/-/esbuild-darwin-64-0.14.47.tgz#e0da6c244f497192f951807f003f6a423ed23188" + integrity sha512-R6oaW0y5/u6Eccti/TS6c/2c1xYTb1izwK3gajJwi4vIfNs1s8B1dQzI1UiC9T61YovOQVuePDcfqHLT3mUZJA== + esbuild-darwin-arm64@0.14.47: version "0.14.47" resolved "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.14.47.tgz" integrity sha512-seCmearlQyvdvM/noz1L9+qblC5vcBrhUaOoLEDDoLInF/VQ9IkobGiLlyTPYP5dW1YD4LXhtBgOyevoIHGGnw== -esbuild@0.14.47: +esbuild-freebsd-64@0.14.47: version "0.14.47" - resolved "https://registry.npmjs.org/esbuild/-/esbuild-0.14.47.tgz" - integrity sha512-wI4ZiIfFxpkuxB8ju4MHrGwGLyp1+awEHAHVpx6w7a+1pmYIq8T9FGEVVwFo0iFierDoMj++Xq69GXWYn2EiwA== - optionalDependencies: - esbuild-android-64 "0.14.47" - esbuild-android-arm64 "0.14.47" - esbuild-darwin-64 "0.14.47" - esbuild-darwin-arm64 "0.14.47" - esbuild-freebsd-64 "0.14.47" - esbuild-freebsd-arm64 "0.14.47" - esbuild-linux-32 "0.14.47" - esbuild-linux-64 "0.14.47" - esbuild-linux-arm "0.14.47" - esbuild-linux-arm64 "0.14.47" + resolved "https://registry.yarnpkg.com/esbuild-freebsd-64/-/esbuild-freebsd-64-0.14.47.tgz#8da6a14c095b29c01fc8087a16cb7906debc2d67" + integrity sha512-ZH8K2Q8/Ux5kXXvQMDsJcxvkIwut69KVrYQhza/ptkW50DC089bCVrJZZ3sKzIoOx+YPTrmsZvqeZERjyYrlvQ== + +esbuild-freebsd-arm64@0.14.47: + version "0.14.47" + resolved "https://registry.yarnpkg.com/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.14.47.tgz#ad31f9c92817ff8f33fd253af7ab5122dc1b83f6" + integrity sha512-ZJMQAJQsIOhn3XTm7MPQfCzEu5b9STNC+s90zMWe2afy9EwnHV7Ov7ohEMv2lyWlc2pjqLW8QJnz2r0KZmeAEQ== + +esbuild-linux-32@0.14.47: + version "0.14.47" + resolved "https://registry.yarnpkg.com/esbuild-linux-32/-/esbuild-linux-32-0.14.47.tgz#de085e4db2e692ea30c71208ccc23fdcf5196c58" + integrity sha512-FxZOCKoEDPRYvq300lsWCTv1kcHgiiZfNrPtEhFAiqD7QZaXrad8LxyJ8fXGcWzIFzRiYZVtB3ttvITBvAFhKw== + +esbuild-linux-64@0.14.47: + version "0.14.47" + resolved "https://registry.yarnpkg.com/esbuild-linux-64/-/esbuild-linux-64-0.14.47.tgz#2a9321bbccb01f01b04cebfcfccbabeba3658ba1" + integrity sha512-nFNOk9vWVfvWYF9YNYksZptgQAdstnDCMtR6m42l5Wfugbzu11VpMCY9XrD4yFxvPo9zmzcoUL/88y0lfJZJJw== + +esbuild-linux-arm64@0.14.47: + version "0.14.47" + resolved "https://registry.yarnpkg.com/esbuild-linux-arm64/-/esbuild-linux-arm64-0.14.47.tgz#b9da7b6fc4b0ca7a13363a0c5b7bb927e4bc535a" + integrity sha512-ywfme6HVrhWcevzmsufjd4iT3PxTfCX9HOdxA7Hd+/ZM23Y9nXeb+vG6AyA6jgq/JovkcqRHcL9XwRNpWG6XRw== + +esbuild-linux-arm@0.14.47: + version "0.14.47" + resolved "https://registry.yarnpkg.com/esbuild-linux-arm/-/esbuild-linux-arm-0.14.47.tgz#56fec2a09b9561c337059d4af53625142aded853" + integrity sha512-ZGE1Bqg/gPRXrBpgpvH81tQHpiaGxa8c9Rx/XOylkIl2ypLuOcawXEAo8ls+5DFCcRGt/o3sV+PzpAFZobOsmA== + +esbuild-linux-mips64le@0.14.47: + version "0.14.47" + resolved "https://registry.yarnpkg.com/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.14.47.tgz#9db21561f8f22ed79ef2aedb7bbef082b46cf823" + integrity sha512-mg3D8YndZ1LvUiEdDYR3OsmeyAew4MA/dvaEJxvyygahWmpv1SlEEnhEZlhPokjsUMfRagzsEF/d/2XF+kTQGg== + +esbuild-linux-ppc64le@0.14.47: + version "0.14.47" + resolved "https://registry.yarnpkg.com/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.14.47.tgz#dc3a3da321222b11e96e50efafec9d2de408198b" + integrity sha512-WER+f3+szmnZiWoK6AsrTKGoJoErG2LlauSmk73LEZFQ/iWC+KhhDsOkn1xBUpzXWsxN9THmQFltLoaFEH8F8w== + +esbuild-linux-riscv64@0.14.47: + version "0.14.47" + resolved "https://registry.yarnpkg.com/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.14.47.tgz#9bd6dcd3dca6c0357084ecd06e1d2d4bf105335f" + integrity sha512-1fI6bP3A3rvI9BsaaXbMoaOjLE3lVkJtLxsgLHqlBhLlBVY7UqffWBvkrX/9zfPhhVMd9ZRFiaqXnB1T7BsL2g== + +esbuild-linux-s390x@0.14.47: + version "0.14.47" + resolved "https://registry.yarnpkg.com/esbuild-linux-s390x/-/esbuild-linux-s390x-0.14.47.tgz#a458af939b52f2cd32fc561410d441a51f69d41f" + integrity sha512-eZrWzy0xFAhki1CWRGnhsHVz7IlSKX6yT2tj2Eg8lhAwlRE5E96Hsb0M1mPSE1dHGpt1QVwwVivXIAacF/G6mw== + +esbuild-netbsd-64@0.14.47: + version "0.14.47" + resolved "https://registry.yarnpkg.com/esbuild-netbsd-64/-/esbuild-netbsd-64-0.14.47.tgz#6388e785d7e7e4420cb01348d7483ab511b16aa8" + integrity sha512-Qjdjr+KQQVH5Q2Q1r6HBYswFTToPpss3gqCiSw2Fpq/ua8+eXSQyAMG+UvULPqXceOwpnPo4smyZyHdlkcPppQ== + +esbuild-openbsd-64@0.14.47: + version "0.14.47" + resolved "https://registry.yarnpkg.com/esbuild-openbsd-64/-/esbuild-openbsd-64-0.14.47.tgz#309af806db561aa886c445344d1aacab850dbdc5" + integrity sha512-QpgN8ofL7B9z8g5zZqJE+eFvD1LehRlxr25PBkjyyasakm4599iroUpaj96rdqRlO2ShuyqwJdr+oNqWwTUmQw== + +esbuild-sunos-64@0.14.47: + version "0.14.47" + resolved "https://registry.yarnpkg.com/esbuild-sunos-64/-/esbuild-sunos-64-0.14.47.tgz#3f19612dcdb89ba6c65283a7ff6e16f8afbf8aaa" + integrity sha512-uOeSgLUwukLioAJOiGYm3kNl+1wJjgJA8R671GYgcPgCx7QR73zfvYqXFFcIO93/nBdIbt5hd8RItqbbf3HtAQ== + +esbuild-windows-32@0.14.47: + version "0.14.47" + resolved "https://registry.yarnpkg.com/esbuild-windows-32/-/esbuild-windows-32-0.14.47.tgz#a92d279c8458d5dc319abcfeb30aa49e8f2e6f7f" + integrity sha512-H0fWsLTp2WBfKLBgwYT4OTfFly4Im/8B5f3ojDv1Kx//kiubVY0IQunP2Koc/fr/0wI7hj3IiBDbSrmKlrNgLQ== + +esbuild-windows-64@0.14.47: + version "0.14.47" + resolved "https://registry.yarnpkg.com/esbuild-windows-64/-/esbuild-windows-64-0.14.47.tgz#2564c3fcf0c23d701edb71af8c52d3be4cec5f8a" + integrity sha512-/Pk5jIEH34T68r8PweKRi77W49KwanZ8X6lr3vDAtOlH5EumPE4pBHqkCUdELanvsT14yMXLQ/C/8XPi1pAtkQ== + +esbuild-windows-arm64@0.14.47: + version "0.14.47" + resolved "https://registry.yarnpkg.com/esbuild-windows-arm64/-/esbuild-windows-arm64-0.14.47.tgz#86d9db1a22d83360f726ac5fba41c2f625db6878" + integrity sha512-HFSW2lnp62fl86/qPQlqw6asIwCnEsEoNIL1h2uVMgakddf+vUuMcCbtUY1i8sst7KkgHrVKCJQB33YhhOweCQ== + +esbuild@0.14.47: + version "0.14.47" + resolved "https://registry.npmjs.org/esbuild/-/esbuild-0.14.47.tgz" + integrity sha512-wI4ZiIfFxpkuxB8ju4MHrGwGLyp1+awEHAHVpx6w7a+1pmYIq8T9FGEVVwFo0iFierDoMj++Xq69GXWYn2EiwA== + optionalDependencies: + esbuild-android-64 "0.14.47" + esbuild-android-arm64 "0.14.47" + esbuild-darwin-64 "0.14.47" + esbuild-darwin-arm64 "0.14.47" + esbuild-freebsd-64 "0.14.47" + esbuild-freebsd-arm64 "0.14.47" + esbuild-linux-32 "0.14.47" + esbuild-linux-64 "0.14.47" + esbuild-linux-arm "0.14.47" + esbuild-linux-arm64 "0.14.47" esbuild-linux-mips64le "0.14.47" esbuild-linux-ppc64le "0.14.47" esbuild-linux-riscv64 "0.14.47" @@ -4330,7 +4395,7 @@ estraverse@^5.2.0: resolved "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz" integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== -estree-walker@^2.0.1, estree-walker@2.0.2: +estree-walker@2.0.2, estree-walker@^2.0.1: version "2.0.2" resolved "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz" integrity sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w== @@ -4345,7 +4410,7 @@ eta@^2.0.0: resolved "https://registry.npmjs.org/eta/-/eta-2.2.0.tgz" integrity sha512-UVQ72Rqjy/ZKQalzV5dCCJP80GrmPrMxh6NlNf+erV6ObL0ZFkhCstWRawS85z3smdr3d2wXPsZEY7rDPfGd2g== -etag@~1.8.1, etag@1.8.1: +etag@1.8.1, etag@~1.8.1: version "1.8.1" resolved "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz" integrity sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg== @@ -4373,21 +4438,6 @@ events@^3.2.0: resolved "https://registry.npmjs.org/events/-/events-3.3.0.tgz" integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== -execa@^5.0.0: - version "5.1.1" - resolved "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz" - integrity sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg== - dependencies: - cross-spawn "^7.0.3" - get-stream "^6.0.0" - human-signals "^2.1.0" - is-stream "^2.0.0" - merge-stream "^2.0.0" - npm-run-path "^4.0.1" - onetime "^5.1.2" - signal-exit "^3.0.3" - strip-final-newline "^2.0.0" - execa@3.2.0: version "3.2.0" resolved "https://registry.npmjs.org/execa/-/execa-3.2.0.tgz" @@ -4404,6 +4454,21 @@ execa@3.2.0: signal-exit "^3.0.2" strip-final-newline "^2.0.0" +execa@^5.0.0: + version "5.1.1" + resolved "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz" + integrity sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg== + dependencies: + cross-spawn "^7.0.3" + get-stream "^6.0.0" + human-signals "^2.1.0" + is-stream "^2.0.0" + merge-stream "^2.0.0" + npm-run-path "^4.0.1" + onetime "^5.1.2" + signal-exit "^3.0.3" + strip-final-newline "^2.0.0" + express@^4.17.3: version "4.18.2" resolved "https://registry.npmjs.org/express/-/express-4.18.2.tgz" @@ -4534,7 +4599,7 @@ feed@^4.2.2: dependencies: xml-js "^1.6.11" -file-loader@*, file-loader@^6.2.0: +file-loader@^6.2.0: version "6.2.0" resolved "https://registry.npmjs.org/file-loader/-/file-loader-6.2.0.tgz" integrity sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw== @@ -4656,6 +4721,24 @@ fresh@0.5.2: resolved "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz" integrity sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q== +fs-extra@11.1.0: + version "11.1.0" + resolved "https://registry.npmjs.org/fs-extra/-/fs-extra-11.1.0.tgz" + integrity sha512-0rcTq621PD5jM/e0a3EJoGC/1TC5ZBCERW82LQuwfGnCa1V8w7dpYH1yNu+SLb6E5dkeCBzKEyLGlFrnr+dUyw== + dependencies: + graceful-fs "^4.2.0" + jsonfile "^6.0.1" + universalify "^2.0.0" + +fs-extra@8.1.0: + version "8.1.0" + resolved "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz" + integrity sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g== + dependencies: + graceful-fs "^4.2.0" + jsonfile "^4.0.0" + universalify "^0.1.0" + fs-extra@^10.0.0, fs-extra@^10.1.0: version "10.1.0" resolved "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz" @@ -4675,24 +4758,6 @@ fs-extra@^9.0.0: jsonfile "^6.0.1" universalify "^2.0.0" -fs-extra@11.1.0: - version "11.1.0" - resolved "https://registry.npmjs.org/fs-extra/-/fs-extra-11.1.0.tgz" - integrity sha512-0rcTq621PD5jM/e0a3EJoGC/1TC5ZBCERW82LQuwfGnCa1V8w7dpYH1yNu+SLb6E5dkeCBzKEyLGlFrnr+dUyw== - dependencies: - graceful-fs "^4.2.0" - jsonfile "^6.0.1" - universalify "^2.0.0" - -fs-extra@8.1.0: - version "8.1.0" - resolved "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz" - integrity sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g== - dependencies: - graceful-fs "^4.2.0" - jsonfile "^4.0.0" - universalify "^0.1.0" - fs-minipass@^1.2.7: version "1.2.7" resolved "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.7.tgz" @@ -4779,14 +4844,7 @@ get-stream@^4.1.0: dependencies: pump "^3.0.0" -get-stream@^5.0.0: - version "5.2.0" - resolved "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz" - integrity sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA== - dependencies: - pump "^3.0.0" - -get-stream@^5.1.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" integrity sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA== @@ -4810,14 +4868,7 @@ glob-parent@^5.1.2, glob-parent@~5.1.0, glob-parent@~5.1.2: dependencies: is-glob "^4.0.1" -glob-parent@^6.0.1: - version "6.0.2" - resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz" - integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== - dependencies: - is-glob "^4.0.3" - -glob-parent@^6.0.2: +glob-parent@^6.0.1, glob-parent@^6.0.2: version "6.0.2" resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz" integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== @@ -4829,27 +4880,27 @@ glob-to-regexp@^0.4.1: resolved "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz" integrity sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw== -glob@^7.0.0, glob@^7.1.3, glob@^7.1.6: - version "7.2.3" - resolved "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz" - integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== +glob@7.1.6: + version "7.1.6" + resolved "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz" + integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== dependencies: fs.realpath "^1.0.0" inflight "^1.0.4" inherits "2" - minimatch "^3.1.1" + minimatch "^3.0.4" once "^1.3.0" path-is-absolute "^1.0.0" -glob@7.1.6: - version "7.1.6" - resolved "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz" - integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== +glob@^7.0.0, glob@^7.1.3, glob@^7.1.6: + version "7.2.3" + resolved "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz" + integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== dependencies: fs.realpath "^1.0.0" inflight "^1.0.4" inherits "2" - minimatch "^3.0.4" + minimatch "^3.1.1" once "^1.3.0" path-is-absolute "^1.0.0" @@ -5175,24 +5226,6 @@ http-deceiver@^1.2.7: resolved "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz" integrity sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw== -http-errors@~1.4.0: - version "1.4.0" - resolved "https://registry.npmjs.org/http-errors/-/http-errors-1.4.0.tgz" - integrity sha512-oLjPqve1tuOl5aRhv8GK5eHpqP1C9fb+Ol+XTLjKfLltE44zdDbEdjPSbU7Ch5rSNsVFqZn97SrMmZLdu1/YMw== - dependencies: - inherits "2.0.1" - statuses ">= 1.2.1 < 2" - -http-errors@~1.6.2: - version "1.6.3" - resolved "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz" - integrity sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A== - dependencies: - depd "~1.1.2" - inherits "2.0.3" - setprototypeof "1.1.0" - statuses ">= 1.4.0 < 2" - http-errors@1.7.3: version "1.7.3" resolved "https://registry.npmjs.org/http-errors/-/http-errors-1.7.3.tgz" @@ -5215,6 +5248,24 @@ http-errors@2.0.0: statuses "2.0.1" toidentifier "1.0.1" +http-errors@~1.4.0: + version "1.4.0" + resolved "https://registry.npmjs.org/http-errors/-/http-errors-1.4.0.tgz" + integrity sha512-oLjPqve1tuOl5aRhv8GK5eHpqP1C9fb+Ol+XTLjKfLltE44zdDbEdjPSbU7Ch5rSNsVFqZn97SrMmZLdu1/YMw== + dependencies: + inherits "2.0.1" + statuses ">= 1.2.1 < 2" + +http-errors@~1.6.2: + version "1.6.3" + resolved "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz" + integrity sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A== + dependencies: + depd "~1.1.2" + inherits "2.0.3" + setprototypeof "1.1.0" + statuses ">= 1.4.0 < 2" + http-parser-js@>=0.5.1: version "0.5.8" resolved "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.8.tgz" @@ -5323,7 +5374,7 @@ inflight@^1.0.4: once "^1.3.0" wrappy "1" -inherits@^2.0.0, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.3, inherits@2, inherits@2.0.4: +inherits@2, inherits@2.0.4, inherits@^2.0.0, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.3: version "2.0.4" resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== @@ -5338,16 +5389,16 @@ inherits@2.0.3: resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz" integrity sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw== -ini@^1.3.5, ini@~1.3.0: - version "1.3.8" - resolved "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz" - integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== - ini@2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz" integrity sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA== +ini@^1.3.5, ini@~1.3.0: + version "1.3.8" + resolved "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz" + integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== + inline-style-parser@0.1.1: version "0.1.1" resolved "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.1.1.tgz" @@ -5365,17 +5416,17 @@ invariant@^2.2.4: dependencies: loose-envify "^1.0.0" -ipaddr.js@^2.0.1: - version "2.1.0" - resolved "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.1.0.tgz" - integrity sha512-LlbxQ7xKzfBusov6UMi4MFpEg0m+mAm9xyNGEduwXMEDuf4WfzB/RZwMVYEd7IKGvh4IUkEXYxtAVu9T3OelJQ== - ipaddr.js@1.9.1: version "1.9.1" resolved "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz" integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== -is-alphabetical@^1.0.0, is-alphabetical@1.0.4: +ipaddr.js@^2.0.1: + version "2.1.0" + resolved "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.1.0.tgz" + integrity sha512-LlbxQ7xKzfBusov6UMi4MFpEg0m+mAm9xyNGEduwXMEDuf4WfzB/RZwMVYEd7IKGvh4IUkEXYxtAVu9T3OelJQ== + +is-alphabetical@1.0.4, is-alphabetical@^1.0.0: version "1.0.4" resolved "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-1.0.4.tgz" integrity sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg== @@ -5558,16 +5609,16 @@ is-yarn-global@^0.3.0: resolved "https://registry.npmjs.org/is-yarn-global/-/is-yarn-global-0.3.0.tgz" integrity sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw== -isarray@~1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz" - integrity sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ== - isarray@0.0.1: version "0.0.1" resolved "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz" integrity sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ== +isarray@~1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz" + integrity sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ== + isexe@^2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz" @@ -5832,7 +5883,7 @@ lodash.pullall@^4.2.0: resolved "https://registry.npmjs.org/lodash.pullall/-/lodash.pullall-4.2.0.tgz" integrity sha512-VhqxBKH0ZxPpLhiu68YD1KnHmbhQJQctcipvmFnqIBDYzcIHzf3Zpu0tpeOKtR4x76p9yohc506eGdOjTmyIBg== -lodash.uniq@^4.5.0, lodash.uniq@4.5.0: +lodash.uniq@4.5.0, lodash.uniq@^4.5.0: version "4.5.0" resolved "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz" integrity sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ== @@ -5994,7 +6045,7 @@ micromatch@^4.0.2, micromatch@^4.0.4, micromatch@^4.0.5: braces "^3.0.2" picomatch "^2.3.1" -"mime-db@>= 1.43.0 < 2", mime-db@1.52.0: +mime-db@1.52.0, "mime-db@>= 1.43.0 < 2": version "1.52.0" resolved "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz" integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== @@ -6004,26 +6055,19 @@ mime-db@~1.33.0: resolved "https://registry.npmjs.org/mime-db/-/mime-db-1.33.0.tgz" integrity sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ== -mime-types@^2.1.27, mime-types@^2.1.31, mime-types@~2.1.24, mime-types@~2.1.34: - version "2.1.35" - resolved "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz" - integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== - dependencies: - mime-db "1.52.0" - -mime-types@~2.1.17: +mime-types@2.1.18, mime-types@~2.1.17: version "2.1.18" resolved "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz" integrity sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ== dependencies: mime-db "~1.33.0" -mime-types@2.1.18: - version "2.1.18" - resolved "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz" - integrity sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ== +mime-types@^2.1.27, mime-types@^2.1.31, mime-types@~2.1.24, mime-types@~2.1.34: + version "2.1.35" + resolved "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz" + integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== dependencies: - mime-db "~1.33.0" + mime-db "1.52.0" mime@1.6.0: version "1.6.0" @@ -6052,7 +6096,7 @@ minimalistic-assert@^1.0.0: resolved "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz" integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== -minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.1, minimatch@3.1.2: +minimatch@3.1.2, minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.1: version "3.1.2" resolved "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz" integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== @@ -6106,12 +6150,7 @@ mkdirp@^0.5.5: dependencies: minimist "^1.2.6" -mkdirp@^1.0.3: - version "1.0.4" - resolved "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz" - integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== - -mkdirp@^1.0.4: +mkdirp@^1.0.3, mkdirp@^1.0.4: version "1.0.4" resolved "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz" integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== @@ -6126,16 +6165,16 @@ mrmime@^1.0.0: resolved "https://registry.npmjs.org/mrmime/-/mrmime-1.0.1.tgz" integrity sha512-hzzEagAgDyoU1Q6yg5uI+AorQgdvMCur3FcKf7NhMKWsaYg+RnbTyHRa/9IlLF9rf455MOCtcqqrQQ83pPP7Uw== -ms@^2.1.1, ms@2.1.1: - version "2.1.1" - resolved "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz" - integrity sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg== - ms@2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz" integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A== +ms@2.1.1, ms@^2.1.1: + version "2.1.1" + resolved "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz" + integrity sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg== + ms@2.1.2: version "2.1.2" resolved "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz" @@ -6193,13 +6232,6 @@ node-emoji@^1.10.0: dependencies: lodash "^4.17.21" -node-fetch@^2.6.12, node-fetch@^2.6.7: - version "2.7.0" - resolved "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz" - integrity sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A== - dependencies: - whatwg-url "^5.0.0" - node-fetch@2.6.7: version "2.6.7" resolved "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz" @@ -6214,6 +6246,13 @@ node-fetch@2.6.9: dependencies: whatwg-url "^5.0.0" +node-fetch@^2.6.12, node-fetch@^2.6.7: + version "2.7.0" + resolved "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz" + integrity sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A== + dependencies: + whatwg-url "^5.0.0" + node-forge@^1: version "1.3.1" resolved "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz" @@ -6570,20 +6609,6 @@ path-parse@^1.0.7: resolved "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz" integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== -path-to-regexp@^1.0.0: - version "1.8.0" - resolved "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz" - integrity sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA== - dependencies: - isarray "0.0.1" - -path-to-regexp@^1.7.0: - version "1.8.0" - resolved "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz" - integrity sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA== - dependencies: - isarray "0.0.1" - path-to-regexp@0.1.7: version "0.1.7" resolved "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz" @@ -6604,6 +6629,13 @@ path-to-regexp@6.2.1: resolved "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.2.1.tgz" integrity sha512-JLyh7xT1kizaEvcaXOQwOc2/Yhw6KZOvPf1S8401UyLk86CU79LN3vl7ztXGm/pZ+YjoyAJ4rxmHwbkBXJX+yw== +path-to-regexp@^1.0.0, path-to-regexp@^1.7.0: + version "1.8.0" + resolved "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz" + integrity sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA== + dependencies: + isarray "0.0.1" + path-type@^4.0.0: version "4.0.0" resolved "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz" @@ -6622,7 +6654,7 @@ pend@~1.2.0: resolved "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz" integrity sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg== -picocolors@^1.0.0, picocolors@1.0.0: +picocolors@1.0.0, picocolors@^1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz" integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== @@ -6968,7 +7000,7 @@ postcss-zindex@^5.1.0: resolved "https://registry.npmjs.org/postcss-zindex/-/postcss-zindex-5.1.0.tgz" integrity sha512-fgFMf0OtVSBR1va1JNHYgMxYk73yhn/qb4uQDq1DLGYolz8gHCyr/sesEuGUaYs58E3ZJRcpoGuPVoB7Meiq9A== -"postcss@^7.0.0 || ^8.0.1", postcss@^8.0.0, postcss@^8.0.9, postcss@^8.1.0, postcss@^8.2.14, postcss@^8.2.15, postcss@^8.2.2, postcss@^8.3.11, postcss@^8.4.14, postcss@^8.4.16, postcss@^8.4.17, postcss@^8.4.21, postcss@^8.4.23, postcss@^8.4.31, postcss@>=8.0.9: +postcss@^8.3.11, postcss@^8.4.14, postcss@^8.4.17, postcss@^8.4.21, postcss@^8.4.23, postcss@^8.4.31: version "8.4.31" resolved "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz" integrity sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ== @@ -7122,16 +7154,16 @@ randombytes@^2.1.0: dependencies: safe-buffer "^5.1.0" -range-parser@^1.2.1, range-parser@~1.2.1: - version "1.2.1" - resolved "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz" - integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== - range-parser@1.2.0: version "1.2.0" resolved "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz" integrity sha512-kA5WQoNVo4t9lNx2kQNFCxKeBl5IbbSNBl1M/tLkw9WCn+hxNBAW5Qh8gdhs63CJnhjJ2zQWFoqPJP2sK1AV5A== +range-parser@^1.2.1, range-parser@~1.2.1: + version "1.2.1" + resolved "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz" + integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== + raw-body@2.4.1: version "2.4.1" resolved "https://registry.npmjs.org/raw-body/-/raw-body-2.4.1.tgz" @@ -7152,7 +7184,7 @@ raw-body@2.5.1: iconv-lite "0.4.24" unpipe "1.0.0" -rc@^1.2.8, rc@1.2.8: +rc@1.2.8, rc@^1.2.8: version "1.2.8" resolved "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz" integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw== @@ -7202,7 +7234,7 @@ react-dev-utils@^12.0.1: strip-ansi "^6.0.1" text-table "^0.2.0" -react-dom@*, "react-dom@^16.6.0 || ^17.0.0 || ^18.0.0", "react-dom@^16.8.4 || ^17.0.0", "react-dom@^17.0.0 || ^16.3.0 || ^15.5.4", react-dom@^17.0.2, "react-dom@>= 16.8.0 < 19.0.0": +react-dom@^17.0.2: version "17.0.2" resolved "https://registry.npmjs.org/react-dom/-/react-dom-17.0.2.tgz" integrity sha512-s4h96KtLDUQlsENhMn1ar8t2bEa+q/YAtj8pPPdIjPDGBDIVNsrD9aXNWqspUe6AzKCIG0C1HZZLqLV7qpOBGA== @@ -7259,14 +7291,6 @@ react-loadable-ssr-addon-v5-slorber@^1.0.1: dependencies: "@babel/runtime" "^7.10.3" -react-loadable@*, "react-loadable@npm:@docusaurus/react-loadable@5.5.2": - version "5.5.2" - resolved "https://registry.npmjs.org/@docusaurus/react-loadable/-/react-loadable-5.5.2.tgz" - integrity sha512-A3dYjdBGuy0IGT+wyLIGIKLRE+sAk1iNk0f1HjNDysO7u8lhL4N3VEm+FAubmJbAztn94F7MxBTPmnixbiyFdQ== - dependencies: - "@types/react" "*" - prop-types "^15.6.2" - react-router-config@^5.1.1: version "5.1.1" resolved "https://registry.npmjs.org/react-router-config/-/react-router-config-5.1.1.tgz" @@ -7287,7 +7311,7 @@ react-router-dom@^5.3.3: tiny-invariant "^1.0.2" tiny-warning "^1.0.0" -react-router@^5.3.3, react-router@>=5, react-router@5.3.4: +react-router@5.3.4, react-router@^5.3.3: version "5.3.4" resolved "https://registry.npmjs.org/react-router/-/react-router-5.3.4.tgz" integrity sha512-Ys9K+ppnJah3QuaRiLxk+jDWOR1MekYQrlytiXxC1RyfbdsZkS5pvKAzCCr031xHixZwpnsYNT5xysdFHQaYsA== @@ -7311,7 +7335,7 @@ react-textarea-autosize@^8.3.2: use-composed-ref "^1.3.0" use-latest "^1.2.1" -react@*, "react@^15.0.2 || ^16.0.0 || ^17.0.0", "react@^16.13.1 || ^17.0.0", "react@^16.6.0 || ^17.0.0 || ^18.0.0", "react@^16.8.0 || ^17.0.0 || ^18.0.0", "react@^16.8.4 || ^17.0.0", "react@^17.0.0 || ^16.3.0 || ^15.5.4", react@^17.0.2, "react@>= 16.8.0 < 19.0.0", react@>=0.14.9, react@>=15, react@17.0.2: +react@^17.0.2: version "17.0.2" resolved "https://registry.npmjs.org/react/-/react-17.0.2.tgz" integrity sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA== @@ -7608,22 +7632,12 @@ rxjs@^7.5.4: dependencies: tslib "^2.1.0" -safe-buffer@^5.1.0, safe-buffer@^5.1.2, safe-buffer@>=5.1.0, safe-buffer@~5.1.0, safe-buffer@~5.1.1, safe-buffer@5.1.2: +safe-buffer@5.1.2, safe-buffer@>=5.1.0, safe-buffer@^5.1.0, safe-buffer@^5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: version "5.1.2" resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz" integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== -safe-buffer@^5.2.1: - version "5.2.1" - resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz" - integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== - -safe-buffer@~5.2.0: - version "5.2.1" - resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz" - integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== - -safe-buffer@5.2.1: +safe-buffer@5.2.1, safe-buffer@^5.2.1, safe-buffer@~5.2.0: version "5.2.1" resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz" integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== @@ -7646,6 +7660,15 @@ scheduler@^0.20.2: loose-envify "^1.1.0" object-assign "^4.1.1" +schema-utils@2.7.0: + version "2.7.0" + resolved "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.0.tgz" + integrity sha512-0ilKFI6QQF5nxDZLFn2dMjvc4hjg/Wkg7rHd3jK6/A4a1Hl9VFdQWvgB1UMGoU94pad1P/8N7fMcEnLnSiju8A== + dependencies: + "@types/json-schema" "^7.0.4" + ajv "^6.12.2" + ajv-keywords "^3.4.1" + schema-utils@^2.6.5: version "2.7.1" resolved "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz" @@ -7655,25 +7678,7 @@ schema-utils@^2.6.5: ajv "^6.12.4" ajv-keywords "^3.5.2" -schema-utils@^3.0.0: - version "3.3.0" - resolved "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz" - integrity sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg== - dependencies: - "@types/json-schema" "^7.0.8" - ajv "^6.12.5" - ajv-keywords "^3.5.2" - -schema-utils@^3.1.1: - version "3.3.0" - resolved "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz" - integrity sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg== - dependencies: - "@types/json-schema" "^7.0.8" - ajv "^6.12.5" - ajv-keywords "^3.5.2" - -schema-utils@^3.2.0: +schema-utils@^3.0.0, schema-utils@^3.1.1, schema-utils@^3.2.0: version "3.3.0" resolved "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz" integrity sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg== @@ -7692,20 +7697,6 @@ schema-utils@^4.0.0: ajv-formats "^2.1.1" ajv-keywords "^5.1.0" -schema-utils@2.7.0: - version "2.7.0" - resolved "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.0.tgz" - integrity sha512-0ilKFI6QQF5nxDZLFn2dMjvc4hjg/Wkg7rHd3jK6/A4a1Hl9VFdQWvgB1UMGoU94pad1P/8N7fMcEnLnSiju8A== - dependencies: - "@types/json-schema" "^7.0.4" - ajv "^6.12.2" - ajv-keywords "^3.4.1" - -"search-insights@>= 1 < 3": - version "2.13.0" - resolved "https://registry.npmjs.org/search-insights/-/search-insights-2.13.0.tgz" - integrity sha512-Orrsjf9trHHxFRuo9/rzm0KIWmgzE8RMlZMzuhZOJ01Rnz3D0YBAe+V6473t6/H6c7irs6Lt48brULAiRWb3Vw== - section-matter@^1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/section-matter/-/section-matter-1.0.0.tgz" @@ -7734,58 +7725,30 @@ semver-diff@^3.1.1: dependencies: semver "^6.3.0" -semver@^5.4.1: - version "5.7.2" - resolved "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz" - integrity sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g== - -semver@^6.0.0, semver@^6.2.0, semver@^6.3.0, semver@^6.3.1, semver@6.3.1: +semver@6.3.1, semver@^6.0.0, semver@^6.2.0, semver@^6.3.0, semver@^6.3.1: version "6.3.1" resolved "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz" integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== -semver@^7.3.2: - version "7.5.4" - resolved "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz" - integrity sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA== - dependencies: - lru-cache "^6.0.0" - -semver@^7.3.4: - version "7.5.4" - resolved "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz" - integrity sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA== - dependencies: - lru-cache "^6.0.0" - -semver@^7.3.5: - version "7.5.4" - resolved "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz" - integrity sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA== +semver@7.3.5: + version "7.3.5" + resolved "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz" + integrity sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ== dependencies: lru-cache "^6.0.0" -semver@^7.3.7: - version "7.5.4" - resolved "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz" - integrity sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA== - dependencies: - lru-cache "^6.0.0" +semver@^5.4.1: + version "5.7.2" + resolved "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz" + integrity sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g== -semver@^7.3.8: +semver@^7.3.2, semver@^7.3.4, semver@^7.3.5, semver@^7.3.7, semver@^7.3.8: version "7.5.4" resolved "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz" integrity sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA== dependencies: lru-cache "^6.0.0" -semver@7.3.5: - version "7.3.5" - resolved "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz" - integrity sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ== - dependencies: - lru-cache "^6.0.0" - send@0.18.0: version "0.18.0" resolved "https://registry.npmjs.org/send/-/send-0.18.0.tgz" @@ -7921,16 +7884,16 @@ side-channel@^1.0.4: get-intrinsic "^1.0.2" object-inspect "^1.9.0" -signal-exit@^3.0.0, signal-exit@^3.0.2, signal-exit@^3.0.3: - version "3.0.7" - resolved "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz" - integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== - signal-exit@4.0.2: version "4.0.2" resolved "https://registry.npmjs.org/signal-exit/-/signal-exit-4.0.2.tgz" integrity sha512-MY2/qGx4enyjprQnFaZsHib3Yadh3IXyV2C321GY0pjGfVBu4un0uDJkwgdxqO+Rdx8JMT8IfJIRwbYVz3Ob3Q== +signal-exit@^3.0.0, signal-exit@^3.0.2, signal-exit@^3.0.3: + version "3.0.7" + resolved "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz" + integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== + sirv@^2.0.3: version "2.0.3" resolved "https://registry.npmjs.org/sirv/-/sirv-2.0.3.tgz" @@ -8050,26 +8013,16 @@ state-toggle@^1.0.0: resolved "https://registry.npmjs.org/state-toggle/-/state-toggle-1.0.3.tgz" integrity sha512-d/5Z4/2iiCnHw6Xzghyhb+GcmF89bxwgXG60wjIiZaxnymbyOmI8Hk4VqHXiVVp6u2ysaskFfXg3ekCj4WNftQ== -"statuses@>= 1.2.1 < 2": - version "1.5.0" - resolved "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz" - integrity sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA== - -"statuses@>= 1.4.0 < 2": - version "1.5.0" - resolved "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz" - integrity sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA== - -"statuses@>= 1.5.0 < 2": - version "1.5.0" - resolved "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz" - integrity sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA== - statuses@2.0.1: version "2.0.1" resolved "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz" integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== +"statuses@>= 1.2.1 < 2", "statuses@>= 1.4.0 < 2", "statuses@>= 1.5.0 < 2": + version "1.5.0" + resolved "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz" + integrity sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA== + std-env@^3.0.1: version "3.4.3" resolved "https://registry.npmjs.org/std-env/-/std-env-3.4.3.tgz" @@ -8091,20 +8044,6 @@ stream-to-promise@2.2.0: end-of-stream "~1.1.0" stream-to-array "~2.3.0" -string_decoder@^1.1.1: - version "1.3.0" - resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz" - integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== - dependencies: - safe-buffer "~5.2.0" - -string_decoder@~1.1.1: - version "1.1.1" - resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz" - integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== - dependencies: - safe-buffer "~5.1.0" - "string-width@^1.0.2 || 2 || 3 || 4", string-width@^4.0.0, string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.2, string-width@^4.2.3: version "4.2.3" resolved "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz" @@ -8123,6 +8062,20 @@ string-width@^5.0.1: emoji-regex "^9.2.2" strip-ansi "^7.0.1" +string_decoder@^1.1.1: + version "1.3.0" + resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz" + integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== + dependencies: + safe-buffer "~5.2.0" + +string_decoder@~1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz" + integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== + dependencies: + safe-buffer "~5.1.0" + stringify-object@^3.3.0: version "3.3.0" resolved "https://registry.npmjs.org/stringify-object/-/stringify-object-3.3.0.tgz" @@ -8166,7 +8119,7 @@ strip-json-comments@~2.0.1: resolved "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz" integrity sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ== -style-to-object@^0.3.0, style-to-object@0.3.0: +style-to-object@0.3.0, style-to-object@^0.3.0: version "0.3.0" resolved "https://registry.npmjs.org/style-to-object/-/style-to-object-0.3.0.tgz" integrity sha512-CzFnRRXhzWIdItT3OmF8SQfWyahHhjq3HwcMNCNLn+N7klOOqPjMeG/4JSu77D7ypZdGvSzvkrbyeTMizz2VrA== @@ -8276,18 +8229,6 @@ tapable@^2.0.0, tapable@^2.1.1, tapable@^2.2.0: resolved "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz" integrity sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ== -tar@^6.1.11: - version "6.2.0" - resolved "https://registry.npmjs.org/tar/-/tar-6.2.0.tgz" - integrity sha512-/Wo7DcT0u5HUV486xg675HtjNd3BXZ6xDbzsCUZPt5iw8bTQ63bP0Raut3mvro9u+CUyq7YQd8Cx55fsZXxqLQ== - dependencies: - chownr "^2.0.0" - fs-minipass "^2.0.0" - minipass "^5.0.0" - minizlib "^2.1.1" - mkdirp "^1.0.3" - yallist "^4.0.0" - tar@4.4.18: version "4.4.18" resolved "https://registry.npmjs.org/tar/-/tar-4.4.18.tgz" @@ -8301,6 +8242,18 @@ tar@4.4.18: safe-buffer "^5.2.1" yallist "^3.1.1" +tar@^6.1.11: + version "6.2.0" + resolved "https://registry.npmjs.org/tar/-/tar-6.2.0.tgz" + integrity sha512-/Wo7DcT0u5HUV486xg675HtjNd3BXZ6xDbzsCUZPt5iw8bTQ63bP0Raut3mvro9u+CUyq7YQd8Cx55fsZXxqLQ== + dependencies: + chownr "^2.0.0" + fs-minipass "^2.0.0" + minipass "^5.0.0" + minizlib "^2.1.1" + mkdirp "^1.0.3" + yallist "^4.0.0" + terser-webpack-plugin@^5.3.3, terser-webpack-plugin@^5.3.7: version "5.3.9" resolved "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.9.tgz" @@ -8433,7 +8386,7 @@ ts-morph@12.0.0: "@ts-morph/common" "~0.11.0" code-block-writer "^10.1.1" -ts-node@>=9.0.0, ts-node@10.9.1: +ts-node@10.9.1: version "10.9.1" resolved "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz" integrity sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw== @@ -8487,7 +8440,7 @@ typedarray-to-buffer@^3.1.5: dependencies: is-typedarray "^1.0.0" -typescript@^4.7.4, "typescript@>= 2.7", typescript@>=2.7, typescript@>=4.9.5, typescript@4.9.5: +typescript@4.9.5, typescript@^4.7.4: version "4.9.5" resolved "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz" integrity sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g== @@ -8545,10 +8498,10 @@ unicode-property-aliases-ecmascript@^2.0.0: resolved "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz" integrity sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w== -unified@^9.2.2: - version "9.2.2" - resolved "https://registry.npmjs.org/unified/-/unified-9.2.2.tgz" - integrity sha512-Sg7j110mtefBD+qunSLO1lqOEKdrwBFBrR6Qd8f4uwkhWNlbkaqwHse6e7QvD3AP/MNoJdEDLaf8OxYyoWgorQ== +unified@9.2.0: + version "9.2.0" + resolved "https://registry.npmjs.org/unified/-/unified-9.2.0.tgz" + integrity sha512-vx2Z0vY+a3YoTj8+pttM3tiJHCwY5UFbYdiWrwBEbHmK8pvsPj2rtAX2BFfgXen8T39CJWblWRDT4L5WGXtDdg== dependencies: bail "^1.0.0" extend "^3.0.0" @@ -8557,10 +8510,10 @@ unified@^9.2.2: trough "^1.0.0" vfile "^4.0.0" -unified@9.2.0: - version "9.2.0" - resolved "https://registry.npmjs.org/unified/-/unified-9.2.0.tgz" - integrity sha512-vx2Z0vY+a3YoTj8+pttM3tiJHCwY5UFbYdiWrwBEbHmK8pvsPj2rtAX2BFfgXen8T39CJWblWRDT4L5WGXtDdg== +unified@^9.2.2: + version "9.2.2" + resolved "https://registry.npmjs.org/unified/-/unified-9.2.2.tgz" + integrity sha512-Sg7j110mtefBD+qunSLO1lqOEKdrwBFBrR6Qd8f4uwkhWNlbkaqwHse6e7QvD3AP/MNoJdEDLaf8OxYyoWgorQ== dependencies: bail "^1.0.0" extend "^3.0.0" @@ -8576,7 +8529,7 @@ unique-string@^2.0.0: dependencies: crypto-random-string "^2.0.0" -unist-builder@^2.0.0, unist-builder@2.0.3: +unist-builder@2.0.3, unist-builder@^2.0.0: version "2.0.3" resolved "https://registry.npmjs.org/unist-builder/-/unist-builder-2.0.3.tgz" integrity sha512-f98yt5pnlMWlzP539tPc4grGMsFaQQlP/vM396b00jngsiINumNmsY8rkXjfoi1c6QaM8nQ3vaGDuoKWbe/1Uw== @@ -8625,7 +8578,7 @@ unist-util-visit-parents@^3.0.0: "@types/unist" "^2.0.0" unist-util-is "^4.0.0" -unist-util-visit@^2.0.0, unist-util-visit@^2.0.3, unist-util-visit@2.0.3: +unist-util-visit@2.0.3, unist-util-visit@^2.0.0, unist-util-visit@^2.0.3: version "2.0.3" resolved "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-2.0.3.tgz" integrity sha512-iJ4/RczbJMkD0712mGktuGpm/U4By4FfDonL7N/9tATGIF4imikjOuagyMY53tnZq3NP6BcmlrHhEKAfGWjh7Q== @@ -8644,7 +8597,7 @@ universalify@^2.0.0: resolved "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz" integrity sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ== -unpipe@~1.0.0, unpipe@1.0.0: +unpipe@1.0.0, unpipe@~1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz" integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ== @@ -8749,16 +8702,16 @@ utils-merge@1.0.1: resolved "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz" integrity sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA== -uuid@^8.3.2: - version "8.3.2" - resolved "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz" - integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== - uuid@3.3.2: version "3.3.2" resolved "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz" integrity sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA== +uuid@^8.3.2: + version "8.3.2" + resolved "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz" + integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== + v8-compile-cache-lib@^3.0.1: version "3.0.1" resolved "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz" @@ -8940,7 +8893,7 @@ webpack-sources@^3.2.2, webpack-sources@^3.2.3: resolved "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz" integrity sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w== -"webpack@^4.0.0 || ^5.0.0", "webpack@^4.37.0 || ^5.0.0", webpack@^5.0.0, webpack@^5.1.0, webpack@^5.20.0, webpack@^5.73.0, "webpack@>= 4", webpack@>=2, "webpack@>=4.41.1 || 5.x", "webpack@3 || 4 || 5": +webpack@^5.73.0: version "5.89.0" resolved "https://registry.npmjs.org/webpack/-/webpack-5.89.0.tgz" integrity sha512-qyfIC10pOr70V+jkmud8tMfajraGCZMBWJtrmuBymQKCrLTRejBI8STDp1MCyZu/QTdZSeacCQYpYNQVOzX5kw== @@ -8980,7 +8933,7 @@ webpackbar@^5.0.2: pretty-time "^1.1.0" std-env "^3.0.1" -websocket-driver@^0.7.4, websocket-driver@>=0.5.1: +websocket-driver@>=0.5.1, websocket-driver@^0.7.4: version "0.7.4" resolved "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz" integrity sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg== From 44cc1f61e845e527f5dee3f47fc87982a1908d7d Mon Sep 17 00:00:00 2001 From: bglynn Date: Mon, 5 Feb 2024 10:28:42 -0800 Subject: [PATCH 12/18] PR Comments. --- docs/getting-started/README.mdx | 11 +++++++---- docs/overview/index.mdx | 16 ++-------------- 2 files changed, 9 insertions(+), 18 deletions(-) diff --git a/docs/getting-started/README.mdx b/docs/getting-started/README.mdx index 6d01004b3..b41620b7a 100644 --- a/docs/getting-started/README.mdx +++ b/docs/getting-started/README.mdx @@ -49,21 +49,25 @@ export const features = [ export const tutorials_access = [ { title: 'Create and manage network policies', + icon: '/img/icons/networking.png', description: 'Create Kubernetes network policies using IBAC', url: '/features/networking/tutorials/k8s-network-policies' }, { title: 'Network policies on AWS EKS', + icon: '/img/icons/networking.png', description: 'Jump start network policies using AWS EKS and VPC CNI', url: '/features/networking/tutorials/aws-eks-cni-mini' }, { title: 'Create and manage Istio authorization policies', + icon: '/img/icons/istio-no-word-mark.svg', description: 'Using Istio and IBAC to secure your K8s cluster', url: '/features/istio/tutorials/k8s-istio-authorization-policies' }, { title: 'Configure secure access for Kafka using Otterize Cloud mTLS', + icon: '/img/icons/kafka-no-word-mark.svg', description: 'Declaring and applying intents to easily secure access to Kafka', url: '/features/kafka/tutorials/k8s-kafka-mtls-cert-manager' } @@ -72,16 +76,19 @@ export const tutorials_access = [ export const tutorials_visualization = [ { title: 'Network mapping a Kubernetes cluster', + icon: '/img/icons/networking.png', description: 'Map pod-to-pod traffic within your K8s cluster', url: '/features/networking/tutorials/k8s-network-mapper' }, { title: 'Istio HTTP-level access mapping', + icon: '/img/icons/istio-no-word-mark.svg', description: 'The network mapper allows you to map pod-to-pod Istio traffic', url: '/features/istio/tutorials/k8s-istio-watcher' }, { title: 'Kafka topic-level access mapping', + icon: '/img/icons/kafka-no-word-mark.svg', description: 'View topic-level access to Kafka servers within your Kubernetes cluster', url: 'features/kafka/tutorials/k8s-kafka-mapping' } @@ -112,10 +119,6 @@ Otterize makes it easy to automate and visualize workload IAM for your Kubernete ### Tutorials #### Automating workload IAM -:::danger -TODO -Add icons to the tutorials, same as the icons we have above. -::: diff --git a/docs/overview/index.mdx b/docs/overview/index.mdx index d495cf554..918680aa0 100644 --- a/docs/overview/index.mdx +++ b/docs/overview/index.mdx @@ -26,29 +26,17 @@ Out of the box, only pod-to-pod, Internet egress traffic and Istio traffic is co This information can then be viewed as a graph, exported textually, or used to automatically generate ClientIntents, a resource used with the intents operator. -:::danger -TODO -Let's keep people in the docs if they're here, don't send them away to the repo. The repo should be standalone for some basic explanations, then refer to the docs. -::: For more information, visit the [network mapper reference page](/reference/configuration/network-mapper). ### Credentials operator The credentials operator handles the provisioning just-in-time credentials for workloads to authenticate. It can issue mTLS credentials or database username + passwords as Kubernetes Secrets, or create AWS IAM roles. To learn about each of these, check the respective tutorials. -:::danger -TODO -Let's keep people in the docs if they're here, don't send them away to the repo. The repo should be standalone for some basic explanations, then refer to the docs. (see network mapper) -::: -For more information, visit the [credential operator repository](https://github.com/otterize/credentials-operator#about) +For more information, visit the [credential operator reference page](/reference/configuration/credentials-operator) ### Intents operator The intents operator handles the provisioning of just-in-time policies based on the declared ClientIntents of workloads within a cluster. It can manage network policies, Istio authorization policies, AWS IAM policies, PostgreSQL GRANTs, and Kafka ACLs. To learn about each of these, visit the respective tutorial. The intents operator does not implement its own policies, but instead configures your existing infrastructure's policies to allow the access required by each workload. This means that it does not ever see your data. -:::danger -TODO -Let's keep people in the docs if they're here, don't send them away to the repo. The repo should be standalone for some basic explanations, then refer to the docs. (see network mapper) -::: -For more information, visit the [intents operator repository](https://github.com/otterize/intents-operator#about) +For more information, visit the [intents operator reference page](reference/configuration/intents-operator) From 2430e5339d8947d5e18b0060eb1529576839252d Mon Sep 17 00:00:00 2001 From: bglynn Date: Wed, 7 Feb 2024 15:34:36 -0800 Subject: [PATCH 13/18] some clean up --- .../k8s-istio-authorization-policies.mdx | 3 ++- .../istio/tutorials/k8s-istio-watcher.mdx | 2 +- .../kafka/tutorials/k8s-kafka-mapping.mdx | 2 +- .../tutorials/k8s-kafka-mtls-cert-manager.mdx | 2 +- .../kafka/tutorials/k8s-kafka-mtls.mdx | 2 +- .../index.mdx | 7 +++--- .../tutorials/k8s-network-policies.mdx | 2 +- .../protect-1-service-network-policies.mdx | 2 ++ docs/overview/installation/README.mdx | 23 +++++++------------ 9 files changed, 21 insertions(+), 24 deletions(-) diff --git a/docs/features/istio/tutorials/k8s-istio-authorization-policies.mdx b/docs/features/istio/tutorials/k8s-istio-authorization-policies.mdx index 46205e0ef..11f392bf9 100644 --- a/docs/features/istio/tutorials/k8s-istio-authorization-policies.mdx +++ b/docs/features/istio/tutorials/k8s-istio-authorization-policies.mdx @@ -27,8 +27,9 @@ In this tutorial, we will: Already have Otterize deployed with Istio configured on your cluster? Skip to the [tutorial](#tutorial). ### 1. Deploy Otterize -To deploy Otterize, head over to [Otterize Cloud](https://app.otterize.com) and create a Kubernetes cluster on the [Clusters page](https://app.otterize.com/clusters), and follow the instructions. If you already have a Kubernetes cluster connected, skip this step. +If you do not have a cluster, we will need to prepare one with [network policy support](/overview/installation#create-a-cluster-with-support-for-network-policies) +To deploy Otterize, head over to [Otterize Cloud](https://app.otterize.com) and associate a Kubernetes cluster on the [Clusters page](https://app.otterize.com/clusters), and follow the instructions. If you already have a Kubernetes cluster connected, skip this step. ### 2. Install and configure Istio diff --git a/docs/features/istio/tutorials/k8s-istio-watcher.mdx b/docs/features/istio/tutorials/k8s-istio-watcher.mdx index d72e8495e..85679169d 100644 --- a/docs/features/istio/tutorials/k8s-istio-watcher.mdx +++ b/docs/features/istio/tutorials/k8s-istio-watcher.mdx @@ -21,7 +21,7 @@ In this tutorial, we will: Already have Otterize deployed with Istio configured on your cluster? Skip to the [tutorial](#tutorial). ### 1. Deploy Otterize -To deploy Otterize, head over to [Otterize Cloud](https://app.otterize.com) and create a Kubernetes cluster on the [Clusters page](https://app.otterize.com/clusters), and follow the instructions. If you already have a Kubernetes cluster connected, skip this step. +To deploy Otterize, head over to [Otterize Cloud](https://app.otterize.com) and associate a Kubernetes cluster on the [Clusters page](https://app.otterize.com/clusters), and follow the instructions. If you already have a Kubernetes cluster connected, skip this step. ### 2. Install and configure Istio diff --git a/docs/features/kafka/tutorials/k8s-kafka-mapping.mdx b/docs/features/kafka/tutorials/k8s-kafka-mapping.mdx index 0276ff82e..66721cf2e 100644 --- a/docs/features/kafka/tutorials/k8s-kafka-mapping.mdx +++ b/docs/features/kafka/tutorials/k8s-kafka-mapping.mdx @@ -22,7 +22,7 @@ We will **not** be doing any access control in this demo, just purely mapping cl Already have Otterize & a Kafka broker deployed on your cluster? Skip to the [tutorial](#tutorial). ### 1. Deploy Otterize -To deploy Otterize, head over to [Otterize Cloud](https://app.otterize.com) and create a Kubernetes cluster on the [Clusters page](https://app.otterize.com/clusters), and follow the instructions. If you already have a Kubernetes cluster connected, skip this step. +To deploy Otterize, head over to [Otterize Cloud](https://app.otterize.com) and associate a Kubernetes cluster on the [Clusters page](https://app.otterize.com/clusters), and follow the instructions. If you already have a Kubernetes cluster connected, skip this step. ### 2. Install Kafka diff --git a/docs/features/kafka/tutorials/k8s-kafka-mtls-cert-manager.mdx b/docs/features/kafka/tutorials/k8s-kafka-mtls-cert-manager.mdx index 1a4d1b13f..cccb495ac 100644 --- a/docs/features/kafka/tutorials/k8s-kafka-mtls-cert-manager.mdx +++ b/docs/features/kafka/tutorials/k8s-kafka-mtls-cert-manager.mdx @@ -55,7 +55,7 @@ You may have to wait for `cert-manager` to start successfully before you are abl Already have Otterize & a Kafka broker deployed on your cluster? Skip to the [tutorial](#tutorial). #### Deploy Otterize -To deploy Otterize, head over to [Otterize Cloud](https://app.otterize.com) and create a Kubernetes cluster on the [Clusters page](https://app.otterize.com/clusters), and follow the instructions. If you already have a Kubernetes cluster connected, skip this step. +To deploy Otterize, head over to [Otterize Cloud](https://app.otterize.com) and associate a Kubernetes cluster on the [Clusters page](https://app.otterize.com/clusters), and follow the instructions. If you already have a Kubernetes cluster connected, skip this step. ##### Note: * Under mTLS and Kafka support choose **cert-manager**. diff --git a/docs/features/kafka/tutorials/k8s-kafka-mtls.mdx b/docs/features/kafka/tutorials/k8s-kafka-mtls.mdx index 61e86ff89..e1fe429a0 100644 --- a/docs/features/kafka/tutorials/k8s-kafka-mtls.mdx +++ b/docs/features/kafka/tutorials/k8s-kafka-mtls.mdx @@ -24,7 +24,7 @@ In this tutorial, we will: Already have Otterize & a Kafka broker deployed on your cluster? Skip to the [tutorial](#tutorial). ### 1. Deploy Otterize -To deploy Otterize, head over to [Otterize Cloud](https://app.otterize.com) and create a Kubernetes cluster on the [Clusters page](https://app.otterize.com/clusters), and follow the instructions. If you already have a Kubernetes cluster connected, skip this step. +To deploy Otterize, head over to [Otterize Cloud](https://app.otterize.com) and associate a Kubernetes cluster on the [Clusters page](https://app.otterize.com/clusters), and follow the instructions. If you already have a Kubernetes cluster connected, skip this step. ##### Note: * Under mTLS and Kafka support choose **Otterize Cloud**. diff --git a/docs/features/network-mapping-network-policies/index.mdx b/docs/features/network-mapping-network-policies/index.mdx index 55297923d..b80cb2475 100644 --- a/docs/features/network-mapping-network-policies/index.mdx +++ b/docs/features/network-mapping-network-policies/index.mdx @@ -28,18 +28,19 @@ export const network_access_tutorials = [ ]; ### About -You can use Otterize to understand, visualize, and manage access for Kubernetes networks. Upon installation, Otterize inspects network traffic and builds an in-memory network map of connections. The network map can then be exported or viewed in various ways to understand the connections within your networks. With IBAC-based policies, Otterize becomes a control plane for your K8s networks. Mapped network traffic can autogenerate declarative intent-based access policies to create least privileged pod-to-pod access easily. + +Otterize empowers you to comprehend, visualize, and oversee access across Kubernetes networks. Once installed, it analyzes network traffic to construct an in-memory map detailing the connections. This map can be explored or exported through multiple formats, offering insights into your network's interconnectivity. Leveraging Intent-Based Access Control (IBAC) policies, Otterize acts as a sophisticated control plane for Kubernetes networks. It enables the automatic generation of declarative, intent-based access policies, facilitating the establishment of minimal privilege access between pods with ease. ### Mapping & visualizing -After installation, Otterize collects network traffic data in memory, creating a graph of relationships between pod-to-pod and pod-to-public internet traffic. Once the graph is in place, the data can be exported or viewed in various ways. Otterize Cloud users can see and interact with the graph structures within the Otterize application. OSS users can use the CLI tool to export the data into JSON, list the relationship, or generate IBAC policies reflecting the existing traffic. +Following installation, Otterize begins to gather network traffic data, assembling it into a comprehensive graph that illustrates the connections between pod-to-pod and pod-to-public internet traffic. This graph serves as a dynamic blueprint of network interactions, which can be exported or visualized through multiple methods. Users of Otterize Cloud have the advantage of directly interacting with these graph structures within the Otterize application interface, offering an intuitive and interactive experience. For open-source software (OSS) users, Otterize provides a command-line interface (CLI) tool. This tool enables users to export the network data into JSON format, list the relationships captured in the graph, or even generate Intent-Based Access Control (IBAC) policies that mirror the observed traffic patterns, facilitating a tailored and secure network environment. To learn more about Visualizing, check out [Visualizing a Kubernetes Network](/features/Networking/tutorials/k8s-network-mapper) ### Access control -By default, Kubernetes pods allow all egress and ingress traffic. Kubernetes [NetworkPolicies](/reference/terminology#network-policies) provide `policyTypes` to restrict egress or ingress traffic, providing a more secure and compliant environment. Utilizing the in-memory tariff map, Otterize can automatically generate IBAC policies to reflect the current traffic flow within a cluster. Once the IBAC policies are submitted, Otterize will generate and apply the corresponding NetworkPolicies to your namespaces. +By default, Kubernetes pods permit all outgoing and incoming traffic, posing potential security risks. Kubernetes [NetworkPolicies](/reference/terminology#network-policies) offer `policyTypes` that can be employed to limit either egress or ingress traffic, thereby enhancing security and compliance. Leveraging its in-memory traffic map, Otterize is capable of automatically crafting Intent-Based Access Control (IBAC) policies that accurately represent the existing traffic patterns within a cluster. Upon the submission of these IBAC policies, Otterize proceeds to create and implement the appropriate NetworkPolicies for your namespaces, ensuring a secure network configuration that aligns with your traffic's actual flow. Further details are available within the [Network Policies Deep Dive](/features/Networking/Reference/Network-Policies-Deep-Dive) diff --git a/docs/features/network-mapping-network-policies/tutorials/k8s-network-policies.mdx b/docs/features/network-mapping-network-policies/tutorials/k8s-network-policies.mdx index 714d508a9..f76bbe470 100644 --- a/docs/features/network-mapping-network-policies/tutorials/k8s-network-policies.mdx +++ b/docs/features/network-mapping-network-policies/tutorials/k8s-network-policies.mdx @@ -24,7 +24,7 @@ In this tutorial, we will: ## Prerequisites ### Install Otterize on your cluster -To deploy Otterize, head over to [Otterize Cloud](https://app.otterize.com) and create a Kubernetes cluster on the [Clusters page](https://app.otterize.com/clusters), and follow the instructions. +To deploy Otterize, head over to [Otterize Cloud](https://app.otterize.com) and associate a Kubernetes cluster on the [Clusters page](https://app.otterize.com/clusters), and follow the instructions. We will also need the [Otterize CLI](/overview/installation#install-the-otterize-cli). diff --git a/docs/features/network-mapping-network-policies/tutorials/protect-1-service-network-policies.mdx b/docs/features/network-mapping-network-policies/tutorials/protect-1-service-network-policies.mdx index ab317035b..279e71e5c 100644 --- a/docs/features/network-mapping-network-policies/tutorials/protect-1-service-network-policies.mdx +++ b/docs/features/network-mapping-network-policies/tutorials/protect-1-service-network-policies.mdx @@ -27,6 +27,8 @@ Note: all the capabilities of IBAC are within Otterize OSS, while the access gra ## Prerequisites ### Install Otterize on your cluster +If you do not have a cluster, we will need to prepare one with [network policy support](/overview/installation#create-a-cluster-with-support-for-network-policies) + To deploy Otterize, head over to [Otterize Cloud](https://app.otterize.com) and create a Kubernetes cluster on the [Clusters page](https://app.otterize.com/clusters), and follow the instructions. We will also need the [Otterize CLI](/overview/installation#install-the-otterize-cli). diff --git a/docs/overview/installation/README.mdx b/docs/overview/installation/README.mdx index 8c41a55dc..6944b3976 100644 --- a/docs/overview/installation/README.mdx +++ b/docs/overview/installation/README.mdx @@ -8,29 +8,22 @@ import TabItem from '@theme/TabItem'; ## Install Otterize without Otterize Cloud (OSS only) {@include: ../../_common/install-otterize.md} - -
- - If you are installing Otterize for network policies, make sure your cluster supports network policies. -
Expand to see how. -
- -Before you start, you need to have a Kubernetes cluster with a [CNI](https://kubernetes.io/docs/concepts/extend-kubernetes/compute-storage-net/network-plugins/) that supports [NetworkPolicies](https://kubernetes.io/docs/concepts/services-networking/network-policies/). - -{@include: ../../_common/cluster-setup.md} -
- ### Upgrade Otterize {@include: ../../_common/upgrade-otterize.md} -## Connect Otterize OSS to Otterize Cloud, or install Otterize with Otterize Cloud -To connect Otterize OSS to Otterize Cloud you will need to [login](https://app.otterize.com), create a cluster, and follow the instructions. +## Install Otterize with Otterize Cloud -In a nutshell, you need to `helm upgrade` the same Helm chart, but provide Otterize Cloud credentials. Upon creating a cluster, a guide will appear that walks you through doing this with the new credentials jut created. +To connect Otterize OSS to Otterize Cloud you will need to [log in](https://app.otterize.com), create a cluster, and follow the instructions which generates unique credentials for your cluster to communicate to Otterize Cloud. ## Install just the Otterize network mapper {@include: ../../_common/install-otterize-network-mapper.md} +## Create a cluster with support for network policies +Before you start, you need to have a Kubernetes cluster with a [CNI](https://kubernetes.io/docs/concepts/extend-kubernetes/compute-storage-net/network-plugins/) that supports [NetworkPolicies](https://kubernetes.io/docs/concepts/services-networking/network-policies/). + +{@include: ../../_common/cluster-setup.md} +--- + ## Install the Otterize CLI The [Otterize CLI](/reference/cli) is a command-line utility used to control and interact with the Otterize network mapper, manipulate local intents files, and interact with Otterize Cloud. From 15f9bec003955bd6753eaa2c0999f8a4ded78352 Mon Sep 17 00:00:00 2001 From: bglynn Date: Wed, 7 Feb 2024 16:21:14 -0800 Subject: [PATCH 14/18] some more clean up --- docs/features/postgresql/index.mdx | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/docs/features/postgresql/index.mdx b/docs/features/postgresql/index.mdx index 76ff7b306..4adfadf60 100644 --- a/docs/features/postgresql/index.mdx +++ b/docs/features/postgresql/index.mdx @@ -18,7 +18,9 @@ export const postgres_tutorials = [ ### About -Once integrated into your cluster, PostgreSQL support for Otterize provides intent-based access control ([IBAC](/overview/intent-based-access-control/)) from your services to your database. Making it easy to provide just in time least privilege access without having to write a lot of complex `GRANT` statements. You can provide access to all the tables in a database or limit access to just a select number of tables. Similarly, access can be limited to `ALL` operations or just to those that are needed by the service, such as `SELECT.` PostgreSQL support is a feature of Otterize Cloud. +Upon integration with your cluster, Otterize’s PostgreSQL support streamlines and secures your workloads and database connections using Intent-Based Access Control ([IBAC](/overview/intent-based-access-control/)). This feature allows teams to provide just-in-time, least-privilege access to your database, eliminating the need for complex `GRANT` statement configurations. With Otterize, you can grant access to all tables within a database or restrict it to a specific subset of tables. Moreover, you can define the scope of permitted operations, ranging from `ALL` operations to specific actions required by the service, such as `SELECT.` This capability to fine-tune access rights ensures that services only have the necessary permissions, enhancing security. + +PostgreSQL support is exclusively available in the Otterize Cloud. ### How does it work From f660f3374d3c1f38ad9b530d73b3e9e385cdf8d5 Mon Sep 17 00:00:00 2001 From: bglynn Date: Thu, 8 Feb 2024 11:14:38 -0800 Subject: [PATCH 15/18] updating broken paths. --- .../network-mapping-network-policies/index.mdx | 12 ++++++------ docs/getting-started/README.mdx | 6 +++--- docs/reference/cli/README.mdx | 2 +- docusaurus.config.js | 10 +++++----- 4 files changed, 15 insertions(+), 15 deletions(-) diff --git a/docs/features/network-mapping-network-policies/index.mdx b/docs/features/network-mapping-network-policies/index.mdx index b80cb2475..3ddc3656f 100644 --- a/docs/features/network-mapping-network-policies/index.mdx +++ b/docs/features/network-mapping-network-policies/index.mdx @@ -8,22 +8,22 @@ export const network_access_tutorials = [ { title: 'Visualizing a Kubernetes Network', description: 'Map network traffic in a cluster and view the connections', - url: '/features/Networking/tutorials/k8s-network-mapper' + url: '/features/network-mapping-network-policies/tutorials/k8s-network-mapper' }, { title: 'Create and manage network policies', description: 'Create Kubernetes network policies using IBAC', - url: '/features/Networking/tutorials/k8s-network-policies' + url: '/features/network-mapping-network-policies/tutorials/k8s-network-policies' }, { title: 'Protecting a service with network policies', description: 'An example on how to secure a single service', - url: '/features/Networking/tutorials/protect-1-service-network-policies' + url: '/features/network-mapping-network-policies/tutorials/protect-1-service-network-policies' }, { title: 'AWS EKS network policies with the VPC CNI', description: 'Leverage AWS VPC CNI to apply network policies in EKS', - url: '/features/Networking/tutorials/aws-eks-cni-mini' + url: '/features/network-mapping-network-policies/tutorials/aws-eks-cni-mini' } ]; @@ -35,14 +35,14 @@ Otterize empowers you to comprehend, visualize, and oversee access across Kubern Following installation, Otterize begins to gather network traffic data, assembling it into a comprehensive graph that illustrates the connections between pod-to-pod and pod-to-public internet traffic. This graph serves as a dynamic blueprint of network interactions, which can be exported or visualized through multiple methods. Users of Otterize Cloud have the advantage of directly interacting with these graph structures within the Otterize application interface, offering an intuitive and interactive experience. For open-source software (OSS) users, Otterize provides a command-line interface (CLI) tool. This tool enables users to export the network data into JSON format, list the relationships captured in the graph, or even generate Intent-Based Access Control (IBAC) policies that mirror the observed traffic patterns, facilitating a tailored and secure network environment. -To learn more about Visualizing, check out [Visualizing a Kubernetes Network](/features/Networking/tutorials/k8s-network-mapper) +To learn more about Visualizing, check out [Visualizing a Kubernetes Network](/features/network-mapping-network-policies/tutorials/k8s-network-mapper) ### Access control By default, Kubernetes pods permit all outgoing and incoming traffic, posing potential security risks. Kubernetes [NetworkPolicies](/reference/terminology#network-policies) offer `policyTypes` that can be employed to limit either egress or ingress traffic, thereby enhancing security and compliance. Leveraging its in-memory traffic map, Otterize is capable of automatically crafting Intent-Based Access Control (IBAC) policies that accurately represent the existing traffic patterns within a cluster. Upon the submission of these IBAC policies, Otterize proceeds to create and implement the appropriate NetworkPolicies for your namespaces, ensuring a secure network configuration that aligns with your traffic's actual flow. -Further details are available within the [Network Policies Deep Dive](/features/Networking/Reference/Network-Policies-Deep-Dive) +Further details are available within the [Network Policies Deep Dive](/features/network-mapping-network-policies/Reference/Network-Policies-Deep-Dive) ```yaml diff --git a/docs/getting-started/README.mdx b/docs/getting-started/README.mdx index b41620b7a..2e6928edd 100644 --- a/docs/getting-started/README.mdx +++ b/docs/getting-started/README.mdx @@ -51,13 +51,13 @@ export const tutorials_access = [ title: 'Create and manage network policies', icon: '/img/icons/networking.png', description: 'Create Kubernetes network policies using IBAC', - url: '/features/networking/tutorials/k8s-network-policies' + url: '/features/network-mapping-network-policies/tutorials/k8s-network-policies' }, { title: 'Network policies on AWS EKS', icon: '/img/icons/networking.png', description: 'Jump start network policies using AWS EKS and VPC CNI', - url: '/features/networking/tutorials/aws-eks-cni-mini' + url: '/features/network-mapping-network-policies/tutorials/aws-eks-cni-mini' }, { title: 'Create and manage Istio authorization policies', @@ -78,7 +78,7 @@ export const tutorials_visualization = [ title: 'Network mapping a Kubernetes cluster', icon: '/img/icons/networking.png', description: 'Map pod-to-pod traffic within your K8s cluster', - url: '/features/networking/tutorials/k8s-network-mapper' + url: '/features/network-mapping-network-policies/tutorials/k8s-network-mapper' }, { title: 'Istio HTTP-level access mapping', diff --git a/docs/reference/cli/README.mdx b/docs/reference/cli/README.mdx index 3c648230f..809d84c89 100644 --- a/docs/reference/cli/README.mdx +++ b/docs/reference/cli/README.mdx @@ -4,7 +4,7 @@ title: CLI --- The Otterize command line interface (CLI) offers the following capabilities: -- [Interact with](#network-mapper) the [Otterize network mapper](/features/networking/tutorials/k8s-network-mapper) running in a Kubernetes cluster. +- [Interact with](#network-mapper) the [Otterize network mapper](/features/network-mapping-network-policies/tutorials/k8s-network-mapper) running in a Kubernetes cluster. - [Transform](#otterize-intents-convert--f-path) [intents files](/reference/intents-and-intents-files/#intents-file-formats) from plain YAML format to Kubernetes custom resource YAML format. - Interact with the Otterize Cloud, through its REST API. diff --git a/docusaurus.config.js b/docusaurus.config.js index 81a744b3f..e5702225e 100644 --- a/docusaurus.config.js +++ b/docusaurus.config.js @@ -150,7 +150,7 @@ const config = { }, { from: ['/reference/access-controls/network-policies'], - to: '/features/networking/reference/Network-Policies-Deep-Dive' + to: '/features/network-mapping-network-policies/reference/Network-Policies-Deep-Dive' }, { from: ['/shadow-vs-active-enforcement'], @@ -178,7 +178,7 @@ const config = { }, { from: ['/guides/protect-1-service-network-policies'], - to: '/features/networking/tutorials/protect-1-service-network-policies' + to: '/features/network-mapping-network-policies/tutorials/protect-1-service-network-policies' }, { from: ['/quick-tutorials/k8s-kafka-mtls', '/quickstart/access-control/k8s-kafka-mtls'], @@ -186,7 +186,7 @@ const config = { }, { from: ['/quick-tutorials/aws-eks-cni-mini','/quickstart/access-control/aws-eks-cni-mini'], - to: '/features/networking/tutorials/aws-eks-cni-mini', + to: '/features/network-mapping-network-policies/tutorials/aws-eks-cni-mini', }, { from: ['/quick-tutorials/k8s-kafka-mtls-cert-manager', '/quickstart/access-control/k8s-kafka-mtls-cert-manager', '/quick-tutorials/k8s-mtls'], @@ -206,11 +206,11 @@ const config = { }, { from: ['/quick-visual-tutorials/visual-ibac-network-policies', '/quick-tutorials/k8s-network-policies', '/quickstart/access-control/k8s-network-policies'], - to: '/features/networking/tutorials/k8s-network-policies', + to: '/features/network-mapping-network-policies/tutorials/k8s-network-policies', }, { from: ['/quick-visual-tutorials/visual-k8s-cluster-mapping', '/quickstart/visualization/k8s-network-mapper', '/quick-tutorials/k8s-network-mapper'], - to: '/features/networking/tutorials/k8s-network-mapper', + to: '/features/network-mapping-network-policies/tutorials/k8s-network-mapper', }, // Redirect from multiple old paths to the new path // { From ebbf9632f67e4c87d39355c140151cff4cf121ef Mon Sep 17 00:00:00 2001 From: Ori Shoshan Date: Thu, 15 Feb 2024 20:31:20 +0100 Subject: [PATCH 16/18] Feature pages edits --- docs/features/aws-iam/index.mdx | 35 +++++--- docs/features/aws-iam/reference.mdx | 2 +- docs/features/istio/index.mdx | 75 +++++++++--------- docs/features/istio/reference.mdx | 2 +- docs/features/kafka/index.mdx | 79 +++++++++---------- docs/features/kafka/reference.mdx | 2 +- .../index.mdx | 30 ++++--- .../reference/README.mdx | 2 +- .../tutorials/k8s-network-mapper.mdx | 2 +- docs/features/postgresql/index.mdx | 41 ++++++---- 10 files changed, 145 insertions(+), 125 deletions(-) diff --git a/docs/features/aws-iam/index.mdx b/docs/features/aws-iam/index.mdx index 7d4bd288f..a40a74cca 100644 --- a/docs/features/aws-iam/index.mdx +++ b/docs/features/aws-iam/index.mdx @@ -5,23 +5,35 @@ hide_table_of_contents: true hide_title: true --- +import DocsLinkCard from "@site/src/components/LinkCard"; + +export const tutorials = [ + { + title: 'Automate AWS IAM for EKS', + description: 'Create just-in-time AWS IAM roles and policies that are kept in sync with your workloads', + url: 'aws-iam/tutorials/aws-iam-eks' + }, +]; + + # AWS IAM -Otterize can provide least-privilege access from your EKS Kubernetes clusters to AWS Resources with [IBAC](/overview/intent-based-access-control/) support for AWS's IAM policies. +Otterize can create just-in-time AWS IAM roles and policies for your workloads running on EKS Kubernetes clusters, greatly simplifying the lifecycle of managing IAM roles and policies. -### About +### Tutorials -In many workloads, EKS clusters must access external cloud resources such as databases, object storage, or additional services. Otterize provides unique credentials and policies for each pod for exactly the authorization they require. +To learn how to use the Intents Operator and Credentials Operator to manage just-in-time AWS IAM access, check out the tutorial. + -### How does it work -To follow along with a full example, take a look at [Automate AWS IAM for EKS](/features/aws-iam/tutorials/aws-iam-eks) +### How does Otterize work with AWS IAM? 1. First, the EKS cluster must have [Otterize installed](/overview/installation). -2. We must label the pod with `credentials-operator.otterize.com/create-aws-role: "true"` -3. Once that is complete, Otterize’s credential operator will create a role and an `AssumeRolePolicy` bound to ServiceAccount. -4. At this point, the role does not have the ability to perform any actions. We will need to create a ClientIntents YAML for the access the service requires and apply it to our cluster. Below is an example of a ClientIntents file for accessing an S3 bucket. View the [reference](/features/aws-iam/reference) to learn more about the AWS IAM Client Intent syntax. -5. Once the intent is applied, a new policy will be attached to the service’s role with the appropriate access. +2. To have a role created for a pod, label the pod with `credentials-operator.otterize.com/create-aws-role: "true"` +3. The credentials operator will create a role and an `AssumeRolePolicy` (trust relationship) bound to the pod's ServiceAccount. The ServiceAccount will be annotated automatically. +4. At this point, the pod is able to assume the role, but role does not have the ability to perform any actions. We will need to create a ClientIntents YAML for the access the service requires and apply it to our cluster. Below is an example of a ClientIntents file for accessing an S3 bucket. View the [reference](/features/aws-iam/reference) to learn more about the AWS IAM ClientIntents syntax. +5. Once the intent is applied, the intents operator will create a new policy, which will be attached to the service’s role with the appropriate access. +6. Done! ```yaml apiVersion: k8s.otterize.com/v1alpha3 @@ -39,8 +51,9 @@ spec: - "s3:GetObject" ``` -### Coming soon +### Automatically generating ClientIntents for AWS IAM -Building least-privilege access can be difficult. Many actions have dependent actions, or services can require a lot of access to perform their functions. To help reduce this burden, Otterize will provide automated ClientIntents based on the actions your service actually requires by detecting the calls being made and converting them into the necessary YAML syntax. +Figuring out which access you need for AWS can be a painful, trial and error process, and something you _must_ do if you're tightening production access. +Otterize is getting ready to release support for using existing traffic to generate least-privilege IAM policies. Keen to try this out as part of early access? Sign up to the [Early Access Beta Program](https://otterize.com/EarlyAccessBetaProgram) and we'll be in touch! diff --git a/docs/features/aws-iam/reference.mdx b/docs/features/aws-iam/reference.mdx index 04ead9d00..fe0517232 100644 --- a/docs/features/aws-iam/reference.mdx +++ b/docs/features/aws-iam/reference.mdx @@ -44,4 +44,4 @@ spec: | `global.aws.eksClusterNameOverride` | EKS cluster name (overrides auto-detection) | `(none)` | | `aws.roleARN` | ARN of the AWS role the operator will use to access AWS. By defeault, Otterize will create a unique role for each service an annotate the service with the role's ARN. | `(none)` | -View the [helm chart reference](/reference/configuration/otterize-chart) for all other options \ No newline at end of file +View the [Helm chart reference](/reference/configuration/otterize-chart) for all other options \ No newline at end of file diff --git a/docs/features/istio/index.mdx b/docs/features/istio/index.mdx index a07d425d9..3d4d0ccfb 100644 --- a/docs/features/istio/index.mdx +++ b/docs/features/istio/index.mdx @@ -10,12 +10,12 @@ export const istio_tutorials = [ { title: 'Istio AuthorizationPolicy automation', description: 'Generate AuthorizationPolicy docs from existing connections', - url: '/features/istio/examples/k8s-istio-authorization-policies' + url: 'istio/tutorials/k8s-istio-authorization-policies' }, { title: 'Istio HTTP-level access mapping', - description: 'View the HTTP methods being used across services', - url: '/features/istio/examples/k8s-istio-water' + description: 'Map access between services including HTTP paths and methods', + url: 'istio/tutorials/k8s-istio-watcher' } ]; @@ -23,21 +23,42 @@ export const istio_tutorials = [ # Istio -Otterize can map and secure access with Istio HTTP connections across your Kubernetes services. +Otterize can build a map of your cluster based on Istio Envoy metrics, and enforce access between services using Istio Authorization Policies. + +### Tutorials + +To learn how to use the Intents Operator to enforce access using Istio authorization policies, or map your cluster, try one of these quickstart tutorials. + + -### About -When enabling Istio support, Otterize's network mapping tool can determine which Kubernetes services are connected and which HTTP methods are being used. This graph of connections can then be leveraged to automate IBAC based access policies that result in Istio AuthorizationPolicy(s). +### How does Otterize work with Istio? -### How does it work +1. First, the cluster must have [Otterize installed](/overview/installation). +2. To have Otterize generate Istio authorization policies, declare and apply ([IBAC](/overview/intent-based-access-control)) ClientIntents for your services. +Once you do so, Otterize will generate an Istio authorization policy allowing access from the client service, identified by its ServiceAccount, to the server, identified by its labels. +The HTTP Resources section in the ClientIntents is optional: if you do not specify it, all pod-to-pod access is allowed. -1. First, the cluster must have [Otterize installed](/overview/installation). With Istio support enabled by setting the following flag: +```yaml + +apiVersion: k8s.otterize.com/v1alpha3 +kind: ClientIntents +metadata: + name: client + namespace: otterize-tutorial-istio +spec: + service: + name: client + calls: + - name: server-abc + type: http + HTTPResources: + - path: /client-path + methods: [ GET ] -```bash ---set networkMapper.istiowatcher.enable=true ``` -2. To monitor connections and HTTP methods, we need to enable connection telemetry data within Istio. This can be enabled with the following YAML: +3. If you would like Otterize to be able to autogenerate ClientIntents and map your network at the HTTP path and method level, we need to enable connection telemetry data within Istio. This can be enabled with the following YAML: ```yaml apiVersion: telemetry.istio.io/v1alpha1 @@ -64,36 +85,12 @@ spec: # Map the "request_path" metric tag to "request.path" value request_path: value: request.path - ``` -Once installed, Otterize will query Envoy sidecars for known connections and building an in-memory map of the relationships. After the map is built your can then view those relationships. - -**To Manage Access** - -You simply need to define and apply your intent based access control ([IBAC](/overview/intent-based-access-control)) policies for your services. - -```yaml - -apiVersion: k8s.otterize.com/v1alpha3 -kind: ClientIntents -metadata: - name: client - namespace: otterize-tutorial-istio -spec: - service: - name: client - calls: - - name: server-abc - type: http - HTTPResources: - - path: /client-path - methods: [ GET ] - +Or, as a ready-to-paste command: +``` +kubectl apply -f ${ABSOLUTE_URL}/code-examples/network-mapper/istio-telemetry-enablement.yaml -n istio-system ``` -### Tutorials - -For further details about mapping, or access automation, view the tutorials below: +Once installed, Otterize will query Envoy sidecars for known connections and build an in-memory map of the relationships. After the map is built you can then view those relationships. - diff --git a/docs/features/istio/reference.mdx b/docs/features/istio/reference.mdx index 69131cd88..edf4247bb 100644 --- a/docs/features/istio/reference.mdx +++ b/docs/features/istio/reference.mdx @@ -35,4 +35,4 @@ spec: | `istiowatcher.pullSecrets` | Istio watcher pull secrets. | `(none)` | | `istiowatcher.resources` | Resources override. | `(none)` | -View the [helm chart reference](/reference/configuration/otterize-chart) for all other options \ No newline at end of file +View the [Helm chart reference](/reference/configuration/otterize-chart) for all other options \ No newline at end of file diff --git a/docs/features/kafka/index.mdx b/docs/features/kafka/index.mdx index 46a1caf45..c3178535d 100644 --- a/docs/features/kafka/index.mdx +++ b/docs/features/kafka/index.mdx @@ -11,44 +11,34 @@ export const kafka_tutorials = [ { title: 'Kafka topic-level access mapping', description: 'View Kafka network connections', - url: '/features/Kafka/tutorials/k8s-kafka-mapping' + url: '/features/kafka/tutorials/k8s-kafka-mapping' }, { title: 'Kafka access automation using Otterize Cloud mTLS', description: 'Manage access to Kafka topics with Otterize Cloud mTLS', - url: '/features/Kafka/tutorials/k8s-kafka-mtls' + url: '/features/kafka/tutorials/k8s-kafka-mtls' }, { title: 'Kafka access automation using cert-manager mTLS', description: 'Manage access to Kafka topics with a cert-manager', - url: '/features/Kafka/tutorials/k8s-kafka-mtls-cert-manager' + url: '/features/kafka/tutorials/k8s-kafka-mtls-cert-manager' } ]; # Kafka -Otterize can map and secure access to Kafka Topics from your Kubernetes clusters. +Otterize can build a map of your cluster, and enforce access between services using Kafka ACLs. Otterize is also able to map access to the Kafka topic and operation level, by reading Kafka access logs. -### About - -By enabling Kafka support, Otterize's network mapping tool can determine which Kubernetes services are connecting to topics and the determine their access privileges. This graph of connections can then be leveraged to automate IBAC based access policies that result in Kakfa ACLs. - -### How does it work +### Tutorials -1. First, the cluster must have [Otterize installed](/overview/installation). With Kakfa support enabled by setting the following flags: +To learn how to use the Intents Operator and Credentials Operator to enforce access with Kafka ACLs, or how to map your cluster to the Kafka topic and operation level, try one of these quickstart tutorials. + -```bash ---set kafkawatcher.enable=true \ ---set kafkawatcher.kafkaServers={"kafka-0.kafka"} -``` -Once installed, Otterize will map Kafka connections allowing you to view those relationships, but to manage access we need to: +### How does Otterize work with Kafka? -2. Configure Otterize to manage Kafka access with a `KafkaServerConfig`. See the example yaml below. - -```bash -kubectl apply -f ${ABSOLUTE_URL}/code-examples/kafka-mtls/kafkaserverconfig.yaml -``` +1. First, the cluster must have [Otterize installed](/overview/installation). +2. Configure the Otterize Intents Operator to manage a Kafka broker by declaring a `KafkaServerConfig`. See the example yaml below. ```yaml apiVersion: k8s.otterize.com/v1alpha3 @@ -62,9 +52,36 @@ spec: addr: kafka.kafka:9092 ``` +Or, as a ready-to-paste command: +```bash +kubectl apply -f ${ABSOLUTE_URL}/code-examples/kafka-mtls/kafkaserverconfig.yaml +``` -3. Once that is complete, the Kafka broker and it's clients require mTLS credentials, which they can receive from Otterize or through a [cert-manager](/features/Kafka/tutorials/k8s-kafka-mtls-cert-manager). This requires a annotation to inform Otterize to generate the credentials and volume mount to store them. To orchestrate this, see the example deployment below: +The Kafka broker must be configured with a superuser for the Intents Operator to be able to set ACLs, with the ACL authorizer enabled, and to use mTLS, which the Intents Operator and other clients will use to authenticate. +Here's an example configuration based on the `values.yaml` of the Bitnami Kafka Helm chart. To see a working example, check out the tutorials for Kafka. +```yaml +superUsers: User:CN=intents-operator.otterize-system +allowEveryoneIfNoAclFound: true +podAnnotations: + credentials-operator.otterize.com/cert-type: jks + credentials-operator.otterize.com/tls-secret-name: kafka-tls-secret + credentials-operator.otterize.com/dns-names: "kafka-0.kafka-headless.kafka.svc.cluster.local,kafka.kafka.svc.cluster.local" +# Authenticate clients using mTLS +auth: + clientProtocol: mtls + interBrokerProtocol: mtls + tls: + type: jks + existingSecrets: + - kafka-tls-secret + password: password + jksTruststore: truststore.jks + jksKeystoreSAN: keystore.jks +authorizerClassName: kafka.security.authorizer.AclAuthorizer +``` + +To acquire TLS credentials for another pod, specify a Pod annotation with the required TLS secret name. ```yaml spec: template: @@ -90,7 +107,7 @@ spec: readOnly: true ``` -4. Once the Kafka clients are deployed with the mTLS credentials they should be able to access their associated topics as there's no active enforcement enabled. By applying IBAC ClientIntents we can declare access for our Services. See an example of a Kafka policy. +4. Once the Kafka clients are deployed with the mTLS credentials, they should be able to access topics as we have enabled `allowEveryoneIfNoAclFound`. To begin enforcing, declare ClientIntents, which will cause the Intents Operator to configure ACLs allowing this access. ```yaml apiVersion: k8s.otterize.com/v1alpha3 @@ -109,22 +126,4 @@ spec: operations: [ produce,describe,consume ] - name: transactions operations: [ produce,describe,consume ] ---- -apiVersion: k8s.otterize.com/v1alpha3 -kind: ClientIntents -metadata: - name: kafka - namespace: kafka -spec: - service: - name: kafka - calls: - - name: kafka - - name: kafka-zookeeper ``` -### Tutorials - -For further details about mapping, or access automation, view the tutorials below: - - - diff --git a/docs/features/kafka/reference.mdx b/docs/features/kafka/reference.mdx index 42fce1a56..a2f704193 100644 --- a/docs/features/kafka/reference.mdx +++ b/docs/features/kafka/reference.mdx @@ -57,4 +57,4 @@ spec: | `kafkawatcher.resources` | Resources override. | `(none)` | | `kafkawatcher.kafkaServers` | Kafka servers to watch, specified as `pod.namespace` items. | `(none)` | -View the [helm chart reference](/reference/configuration/otterize-chart) for all other options \ No newline at end of file +View the [Helm chart reference](/reference/configuration/otterize-chart) for all other options \ No newline at end of file diff --git a/docs/features/network-mapping-network-policies/index.mdx b/docs/features/network-mapping-network-policies/index.mdx index 3ddc3656f..4c93ea01f 100644 --- a/docs/features/network-mapping-network-policies/index.mdx +++ b/docs/features/network-mapping-network-policies/index.mdx @@ -27,25 +27,34 @@ export const network_access_tutorials = [ } ]; -### About - -Otterize empowers you to comprehend, visualize, and oversee access across Kubernetes networks. Once installed, it analyzes network traffic to construct an in-memory map detailing the connections. This map can be explored or exported through multiple formats, offering insights into your network's interconnectivity. Leveraging Intent-Based Access Control (IBAC) policies, Otterize acts as a sophisticated control plane for Kubernetes networks. It enables the automatic generation of declarative, intent-based access policies, facilitating the establishment of minimal privilege access between pods with ease. +Otterize's open-source [Network Mapper](/reference/configuration/network-mapper) and [Intents Operator](/reference/configuration/intents-operator) can map your cluster, with zero configuration, low privileges and low resource usage, and automate the management of network policies. ### Mapping & visualizing -Following installation, Otterize begins to gather network traffic data, assembling it into a comprehensive graph that illustrates the connections between pod-to-pod and pod-to-public internet traffic. This graph serves as a dynamic blueprint of network interactions, which can be exported or visualized through multiple methods. Users of Otterize Cloud have the advantage of directly interacting with these graph structures within the Otterize application interface, offering an intuitive and interactive experience. For open-source software (OSS) users, Otterize provides a command-line interface (CLI) tool. This tool enables users to export the network data into JSON format, list the relationships captured in the graph, or even generate Intent-Based Access Control (IBAC) policies that mirror the observed traffic patterns, facilitating a tailored and secure network environment. +Otterize's [Network Mapper](/reference/configuration/network-mapper) is a zero-config, open-source and non-invasive tool to map your cluster. Deploy it on your cluster to get a graphical, textual or JSON representation of your cluster, and optionally use it to generate ClientIntents, which are declarations of the access each service in your cluster requires. -To learn more about Visualizing, check out [Visualizing a Kubernetes Network](/features/network-mapping-network-policies/tutorials/k8s-network-mapper) +By connecting your cluster to Otterize Cloud, you'll immediately be presented with an interactive, historic and filterable map of your cluster. +You can access the same information in different formats by using the open-source Otterize CLI, with the commands `otterize mapper export`, `otterize mapper list` and `otterize mapper visualize`. +:::danger +TODO +Brian, please add screenshots of the access graph and network mapper visual and textual output here. +::: ### Access control -By default, Kubernetes pods permit all outgoing and incoming traffic, posing potential security risks. Kubernetes [NetworkPolicies](/reference/terminology#network-policies) offer `policyTypes` that can be employed to limit either egress or ingress traffic, thereby enhancing security and compliance. Leveraging its in-memory traffic map, Otterize is capable of automatically crafting Intent-Based Access Control (IBAC) policies that accurately represent the existing traffic patterns within a cluster. Upon the submission of these IBAC policies, Otterize proceeds to create and implement the appropriate NetworkPolicies for your namespaces, ensuring a secure network configuration that aligns with your traffic's actual flow. +By default, Kubernetes pods permit all outgoing and incoming traffic, posing potential security risks. -Further details are available within the [Network Policies Deep Dive](/features/network-mapping-network-policies/Reference/Network-Policies-Deep-Dive) +Kubernetes [NetworkPolicies](/reference/terminology#network-policies) can be employed to limit either egress or ingress traffic, thereby enhancing security and compliance. +Having deployed Otterize, you can then apply the ClientIntents generated by the network mapper, or declared by you, to your cluster. The [Intents Operator](/reference/configuration/intents-operator) calculates which [Network Policies](/reference/terminology#network-policies) are required to allow the traffic declared by the ClientIntents, enforcing access on your cluster so that only intentional access is allowed. +:::danger +TODO +Brian, please add links to ClientIntents reference here whenever it's mentioned. +::: -```yaml +Read more in the [Network Policies Deep Dive](/features/network-mapping-network-policies/Reference/Network-Policies-Deep-Dive). +```yaml apiVersion: k8s.otterize.com/v1alpha3 kind: ClientIntents metadata: @@ -56,11 +65,6 @@ spec: name: client calls: - name: nginx - type: http - HTTPResources: - - path: /client-path - methods: [ GET ] - ``` ### Tutorials diff --git a/docs/features/network-mapping-network-policies/reference/README.mdx b/docs/features/network-mapping-network-policies/reference/README.mdx index 3b239324d..b81897009 100644 --- a/docs/features/network-mapping-network-policies/reference/README.mdx +++ b/docs/features/network-mapping-network-policies/reference/README.mdx @@ -37,7 +37,7 @@ spec: | `operator.autoCreateNetworkPoliciesForExternalTraffic` | (deprecated, use `allowExternalTraffic` instead) Automatically allow external traffic, if a new ClientIntents resource would result in blocking external (internet) traffic and there is an Ingress/Service resource indicating external traffic is expected. | `true` | | `operator.autoCreateNetworkPoliciesForExternalTrafficDisableIntentsRequirement` | (deprecated, use `allowExternalTraffic` instead) **experimental** - If `autoCreateNetworkPoliciesForExternalTraffic` is enabled, do not require ClientIntents resources - simply create network policies based off of the existence of an Ingress/Service resource. | `false` | -View the [helm chart reference](/reference/configuration/otterize-chart) for all other options +View the [Helm chart reference](/reference/configuration/otterize-chart) for all other options ### Network mapper parameters All configurable parameters of the network mapper can be configured under the alias `networkMapper`. diff --git a/docs/features/network-mapping-network-policies/tutorials/k8s-network-mapper.mdx b/docs/features/network-mapping-network-policies/tutorials/k8s-network-mapper.mdx index b462db79e..6a9ef08c2 100644 --- a/docs/features/network-mapping-network-policies/tutorials/k8s-network-mapper.mdx +++ b/docs/features/network-mapping-network-policies/tutorials/k8s-network-mapper.mdx @@ -1,6 +1,6 @@ --- sidebar_position: 1 -title: Visualizing a Kubernetes network +title: Mapping a Kubernetes network image: /img/visualization/k8s-network-mapper/social.png --- diff --git a/docs/features/postgresql/index.mdx b/docs/features/postgresql/index.mdx index 4adfadf60..38d87a00c 100644 --- a/docs/features/postgresql/index.mdx +++ b/docs/features/postgresql/index.mdx @@ -9,26 +9,38 @@ import DocsLinkCard from "@site/src/components/LinkCard"; export const postgres_tutorials = [ { title: 'Just-in-time PostgreSQL Access', - description: 'Provide least privilege service access to databases and tables', - url: '/features/postgresql/examples/posgres' + description: 'Learn how to manage just-in-time users and SQL GRANTs', + url: 'postgresql/tutorials/postgres' + }, + { + title: 'Map PostgreSQL access', + description: 'Learn how to use PostgreSQL audit logs to map access to your database', + url: 'postgresql/tutorials/postgres-mapping' } ]; # PostgreSQL -### About +Otterize is able to create just-in-time username-and-password pairs for your service, providing them as a Kubernetes Secret that can be mounted to file or mapped to environment variables, as well as `GRANT`ing access to databases and tables, based on `ClientIntents` ([Intents-Based Access Control](/overview/intent-based-access-control)) declarations. +In addition, Otterize can map the access to your PostgreSQL database, showing you which service is accessing which database, table and which operation it's performing. This can be used to automatically generate the `ClientIntents` declarations. + +Unlike other access controls in Otterize, PostgreSQL support is exclusively available when using Otterize Cloud. + +### Tutorials + +To learn how to use the Intents Operator and Credentials Operator to enforce access using PostgreSQL GRANTs, or map access to your PostgreSQL database, try one of these quickstart tutorials. + + -Upon integration with your cluster, Otterize’s PostgreSQL support streamlines and secures your workloads and database connections using Intent-Based Access Control ([IBAC](/overview/intent-based-access-control/)). This feature allows teams to provide just-in-time, least-privilege access to your database, eliminating the need for complex `GRANT` statement configurations. With Otterize, you can grant access to all tables within a database or restrict it to a specific subset of tables. Moreover, you can define the scope of permitted operations, ranging from `ALL` operations to specific actions required by the service, such as `SELECT.` This capability to fine-tune access rights ensures that services only have the necessary permissions, enhancing security. -PostgreSQL support is exclusively available in the Otterize Cloud. -### How does it work +### How does Otterize work with PostgreSQL? -Once a service is annotated, Otterize Cloud will create a unique PostgreSQL credential for its exclusive use. The service will use these credentials to connect to the database. IBAC policies will define the access to that service. As the policies are applied, Otterize Cloud will update the service’s credentials in the database to have the defined access. +Otterize Cloud will create a unique PostgreSQL username-password combination for each service's use, exposed via a Kubernetes Secret. The service will use these credentials to connect to the database. `ClientIntents` will define the access required by that service. As the intents are applied, Otterize Cloud will keep the database's list of users and GRANTs up to date so that the service is able to access it. -1. To get started, your cluster must have Otterized Cloud installed. +1. To get started, your cluster must have Otterize Cloud installed. 2. You’ll need to [integrate](https://app.otterize.com/integrations) your database by providing a connection URL and admin-level credentials to manage permissions in your database. -3. Each service included in access controls will need to have Otterize managed credentials by annotating the service’s deployment with `credentials-operator.otterize.com/user-password-secret-name` below is an example of that annotation and passing the generated credentials into a container with environmental variables. +3. Each service can request a username-password Secret to be created, by annotating the Pod with `credentials-operator.otterize.com/user-password-secret-name`. Below is an example of that annotation and passing the generated credentials into a container with environmental variables. ```yaml apiVersion: apps/v1 @@ -43,6 +55,7 @@ spec: template: metadata: annotations: + # highlight-next-line credentials-operator.otterize.com/user-password-secret-name: server-creds labels: app: server @@ -68,7 +81,7 @@ spec: ``` -4. Once the cluster and the database are available in Otterize Cloud, IBAC policies can be applied to create unique credentials for each service scoped to the defined access. +4. Apply `ClientIntents` and the specified access will be `GRANT`ed to the service in the `ClientIntents`. ```yaml @@ -91,10 +104,4 @@ spec: - INSERT ``` - -### Tutorials - -For further details, view the tutorial below: - - - +5. Done! \ No newline at end of file From ac4470e14ad2ba88523701d454c3344b8fb8c1e0 Mon Sep 17 00:00:00 2001 From: Ori Shoshan Date: Thu, 15 Feb 2024 20:36:00 +0100 Subject: [PATCH 17/18] Fixup --- .../postgresql/tutorials/postgres-mapping.mdx} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename docs/{quickstart/visualization/postgresql.mdx => features/postgresql/tutorials/postgres-mapping.mdx} (100%) diff --git a/docs/quickstart/visualization/postgresql.mdx b/docs/features/postgresql/tutorials/postgres-mapping.mdx similarity index 100% rename from docs/quickstart/visualization/postgresql.mdx rename to docs/features/postgresql/tutorials/postgres-mapping.mdx From ebbde39b3505489d21cab56e2ad8553f7256af18 Mon Sep 17 00:00:00 2001 From: bglynn Date: Fri, 16 Feb 2024 10:28:49 -0800 Subject: [PATCH 18/18] PR Comments. -Added redirect links for new tutorials -Fixed broken includes for new tutorial -examples of the otterize OSS CLI -consistency of tutorial placement for feature overview pages -Added ClientIntent reference link (looked for any similar issues, but didn't see any) --- .../index.mdx | 60 +++++++++++++----- .../postgresql/tutorials/postgres-mapping.mdx | 6 +- docusaurus.config.js | 8 +++ static/img/examples/example-visualize.png | Bin 0 -> 32636 bytes 4 files changed, 55 insertions(+), 19 deletions(-) create mode 100644 static/img/examples/example-visualize.png diff --git a/docs/features/network-mapping-network-policies/index.mdx b/docs/features/network-mapping-network-policies/index.mdx index 4c93ea01f..bdfc1beae 100644 --- a/docs/features/network-mapping-network-policies/index.mdx +++ b/docs/features/network-mapping-network-policies/index.mdx @@ -29,6 +29,13 @@ export const network_access_tutorials = [ Otterize's open-source [Network Mapper](/reference/configuration/network-mapper) and [Intents Operator](/reference/configuration/intents-operator) can map your cluster, with zero configuration, low privileges and low resource usage, and automate the management of network policies. +### Tutorials + +View the tutorials below to learn more about how to get started: + + + + ### Mapping & visualizing Otterize's [Network Mapper](/reference/configuration/network-mapper) is a zero-config, open-source and non-invasive tool to map your cluster. Deploy it on your cluster to get a graphical, textual or JSON representation of your cluster, and optionally use it to generate ClientIntents, which are declarations of the access each service in your cluster requires. @@ -36,21 +43,48 @@ Otterize's [Network Mapper](/reference/configuration/network-mapper) is a zero-c By connecting your cluster to Otterize Cloud, you'll immediately be presented with an interactive, historic and filterable map of your cluster. You can access the same information in different formats by using the open-source Otterize CLI, with the commands `otterize mapper export`, `otterize mapper list` and `otterize mapper visualize`. -:::danger -TODO -Brian, please add screenshots of the access graph and network mapper visual and textual output here. -::: +**visualize example:**: +![visualize example](/img/examples/example-visualize.png) + +**list example:** +``` +client in namespace otterize-tutorial-npol calls: + - server in namespace otterize-tutorial-npol +client-other in namespace otterize-tutorial-npol calls: + - server in namespace otterize-tutorial-npol +``` +**export example:** +```yaml +apiVersion: k8s.otterize.com/v1alpha3 +kind: ClientIntents +metadata: + name: client + namespace: otterize-tutorial-npol +spec: + service: + name: client + calls: + - name: server +--- +apiVersion: k8s.otterize.com/v1alpha3 +kind: ClientIntents +metadata: + name: client-other + namespace: otterize-tutorial-npol +spec: + service: + name: client-other + calls: + - name: server +``` + ### Access control By default, Kubernetes pods permit all outgoing and incoming traffic, posing potential security risks. Kubernetes [NetworkPolicies](/reference/terminology#network-policies) can be employed to limit either egress or ingress traffic, thereby enhancing security and compliance. -Having deployed Otterize, you can then apply the ClientIntents generated by the network mapper, or declared by you, to your cluster. The [Intents Operator](/reference/configuration/intents-operator) calculates which [Network Policies](/reference/terminology#network-policies) are required to allow the traffic declared by the ClientIntents, enforcing access on your cluster so that only intentional access is allowed. -:::danger -TODO -Brian, please add links to ClientIntents reference here whenever it's mentioned. -::: +Having deployed Otterize, you can then apply the [ClientIntents](/reference/IBAC-Overview) generated by the network mapper, or declared by you, to your cluster. The [Intents Operator](/reference/configuration/intents-operator) calculates which [Network Policies](/reference/terminology#network-policies) are required to allow the traffic declared by the ClientIntents, enforcing access on your cluster so that only intentional access is allowed. Read more in the [Network Policies Deep Dive](/features/network-mapping-network-policies/Reference/Network-Policies-Deep-Dive). @@ -65,10 +99,4 @@ spec: name: client calls: - name: nginx -``` - -### Tutorials - -View the tutorials below to learn more about how to get started: - - +``` \ No newline at end of file diff --git a/docs/features/postgresql/tutorials/postgres-mapping.mdx b/docs/features/postgresql/tutorials/postgres-mapping.mdx index 5fc6dfa38..32202f76b 100644 --- a/docs/features/postgresql/tutorials/postgres-mapping.mdx +++ b/docs/features/postgresql/tutorials/postgres-mapping.mdx @@ -30,7 +30,7 @@ Already have Otterize deployed with the database integration configured on your
Prepare a Kubernetes cluster - {@include: ../../_common/cluster-setup.md} + {@include: ../../../_common/cluster-setup.md}
@@ -38,11 +38,11 @@ Already have Otterize deployed with the database integration configured on your #### Create an Otterize Cloud account - {@include: ../../_common/create-account.md} + {@include: ../../../_common/create-account.md} #### Install Otterize OSS, connected to Otterize Cloud - {@include: ../../_common/install-otterize-from-cloud-with-enforcement.md} + {@include: ../../../_common/install-otterize-from-cloud-with-enforcement.md}
diff --git a/docusaurus.config.js b/docusaurus.config.js index 003b57101..de800e73b 100644 --- a/docusaurus.config.js +++ b/docusaurus.config.js @@ -204,6 +204,14 @@ const config = { from: ['/quick-visual-tutorials/visual-ibac-kafka-k8s'], to: '/features/kafka/tutorials/k8s-kafka-mapping', }, + { + from: ['/quickstart/visualization/postgresql'], + to: '/features/postgresql/tutorials/postgres-mapping' + }, + { + from: ['/quickstart/access-control/postgresql'], + to: '/features/postgresql/tutorials/postgres' + }, { from: ['/quick-visual-tutorials/visual-ibac-network-policies', '/quick-tutorials/k8s-network-policies', '/quickstart/access-control/k8s-network-policies'], to: '/features/network-mapping-network-policies/tutorials/k8s-network-policies', diff --git a/static/img/examples/example-visualize.png b/static/img/examples/example-visualize.png new file mode 100644 index 0000000000000000000000000000000000000000..6dea8e9f55e1f914a547803886420dd750184e3d GIT binary patch literal 32636 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 r9sC~T?&&z?*Kuw71c26U{EX literal 0 HcmV?d00001