diff --git a/.gitignore b/.gitignore
index 94975bdf..35a25d54 100644
--- a/.gitignore
+++ b/.gitignore
@@ -22,3 +22,5 @@ yarn-error.log*
.idea
package-lock.json
+/.next/
+/yarn.lock
diff --git a/babel.config.js b/babel.config.js
deleted file mode 100644
index e00595da..00000000
--- a/babel.config.js
+++ /dev/null
@@ -1,3 +0,0 @@
-module.exports = {
- presets: [require.resolve('@docusaurus/core/lib/babel/preset')],
-};
diff --git a/docs/FAQ/firewall-ports.md b/docs/FAQ/firewall-ports.md
deleted file mode 100644
index 9c6e2cb5..00000000
--- a/docs/FAQ/firewall-ports.md
+++ /dev/null
@@ -1,22 +0,0 @@
----
-id: firewall-ports
-title: What firewall ports should I open to use NetBird?
-sidebar_position: 1
----
-### Incoming ports
-NetBird's agent doesn't require any incoming port to be open; It negotiates the connection with the support of the signal and relay services.
-### Outgoing ports
-NetBird usually won't need open ports, but sometimes you or your IT team needs to secure and verify
-all outgoing traffic, and that may affect how NetBird clients connect to the [control layer](/overview/architecture)
-and negotiate the peer-to-peer connections.
-
-Below is the list of NetBird hosted endpoints and ports they listen to:
-* Management service:
- * **Endpoint**: api.wiretrustee.com
- * **Port**: TCP/443
-* Signal service:
- * **Endpoint**: signal2.wiretrustee.com
- * **Port**: TCP/443
-* Relay (TURN) service:
- * **Endpoint**: turn.netbird.io
- * **Port range**: UDP/5555-65535
\ No newline at end of file
diff --git a/docs/examples/_category_.json b/docs/examples/_category_.json
deleted file mode 100644
index 4d81ec12..00000000
--- a/docs/examples/_category_.json
+++ /dev/null
@@ -1,4 +0,0 @@
-{
- "label": "Examples",
- "position": 5
-}
diff --git a/docs/examples/netbird-docker.md b/docs/examples/netbird-docker.md
deleted file mode 100644
index 6c4ad7c0..00000000
--- a/docs/examples/netbird-docker.md
+++ /dev/null
@@ -1,27 +0,0 @@
----
-sidebar_position: 2
----
-
-# NetBird Client in Docker
-
-One of the simplest ways of running NetBird client application is to use a pre-built [Docker image](https://hub.docker.com/r/netbirdio/netbird).
-
-**Prerequisites:**
-* **Docker installed.**
- If you don't have docker installed, please refer to the installation guide on the official [Docker website](https://docs.docker.com/get-docker/).
-* **NetBird account.**
- Register one at [app.netbird.io](https://app.netbird.io/).
-
-You would need to obtain a [setup key](/overview/setup-keys) to associate NetBird client with your account.
-
-The setup key could be found in the NetBird Management dashboard under the Setup Keys tab - [https://app.netbird.io/setup-keys](https://app.netbird.io/setup-keys).
-
-Set the ```NB_SETUP_KEY``` environment variable and run the command.
-
-```bash
-docker run --rm --name PEER_NAME --hostname PEER_NAME --cap-add=NET_ADMIN -d -e NB_SETUP_KEY= -v netbird-client:/etc/netbird netbirdio/netbird:latest
-```
-
-That is it! Enjoy using NetBird.
-
-If you would like to learn how to run NetBird Client as an ECS agent on AWS, please refer to [this guide](/examples/aws-ecs-client-daemon).
\ No newline at end of file
diff --git a/docs/getting-started/_category_.json b/docs/getting-started/_category_.json
deleted file mode 100644
index 4bd4025b..00000000
--- a/docs/getting-started/_category_.json
+++ /dev/null
@@ -1,4 +0,0 @@
-{
- "label": "Getting Started",
- "position": 4
-}
diff --git a/docs/getting-started/quickstart.md b/docs/getting-started/quickstart.md
deleted file mode 100644
index 7999c22a..00000000
--- a/docs/getting-started/quickstart.md
+++ /dev/null
@@ -1,75 +0,0 @@
----
-sidebar_position: 1
-title: Quickstart Guide
----
-
-Step-by-step video guide on YouTube:
-
-
-VIDEO
-
-
-This guide describes how to quickly get started with NetBird and create a secure private network with 2 connected machines.
-
-One machine is a Linux laptop, and the other one a EC2 node running on AWS.
-Both machines are running Linux but NetBird also works on Windows and MacOS.
-
-1. Sign-up at [https://app.netbird.io/](https://app.netbird.io/)
-
- You can use your Google, GitHub or Microsoft account.
-
- 
-
-2. After a successful login you will be redirected to the ```Peers``` screen which is empty because you don't have any peers yet.
-
- Click ```Add peer``` to add a new machine.
-
- 
-
-3. Choose your machine operating system (in our case it is ```Linux```) and proceed with the installation steps.
-
- 
-
-4. If you installed NetBird Desktop UI you can use it to connect to the network instead of running `netbird up` command. Look for `NetBird` in your application list, run it, and click `Connect`.
- >
-
- 
-
-5. At this point a browser window pops up starting a device registration process. Click confirm and follow the steps if required.
-
- 
-
-6. On the EC2 node repeat the installation steps and run `netbird up` command.
-
- ```bash
- sudo netbird up
- ```
-7. Copy the verification URL from the terminal output and paste it in your browser. Repeat step #5
-
- 
-
-8. Return to ```Peers``` and you should notice 2 new machines with status ```online```
-
- 
-
-9. To test the connection you could try pinging devices:
-
- On your laptop:
- ```bash
- ping 100.64.0.2
- ```
-
- On the EC2 node:
- ```bash
- ping 100.64.0.1
- ```
-10. Done! You now have a secure peer-to-peer private network configured.
-
-
-
-- Make sure to [star us on GitHub](https://github.com/netbirdio/netbird)
-- Follow us [on Twitter](https://twitter.com/netbird)
-- Join our [Slack Channel](https://join.slack.com/t/netbirdio/shared_invite/zt-vrahf41g-ik1v7fV8du6t0RwxSrJ96A)
-- NetBird release page on GitHub: [releases](https://github.com/netbirdio/netbird/releases/latest)
-
-
diff --git a/docs/how-to-guides/_category_.json b/docs/how-to-guides/_category_.json
deleted file mode 100644
index 9529feb5..00000000
--- a/docs/how-to-guides/_category_.json
+++ /dev/null
@@ -1,4 +0,0 @@
-{
- "label": "How-to Guides",
- "position": 3
-}
diff --git a/docs/integrations/_category_.json b/docs/integrations/_category_.json
deleted file mode 100644
index 731c2471..00000000
--- a/docs/integrations/_category_.json
+++ /dev/null
@@ -1,4 +0,0 @@
-{
- "label": "Integrations",
- "position": 4
-}
diff --git a/docs/integrations/identity-providers/_category_.json b/docs/integrations/identity-providers/_category_.json
deleted file mode 100644
index b1cc6fa3..00000000
--- a/docs/integrations/identity-providers/_category_.json
+++ /dev/null
@@ -1,4 +0,0 @@
-{
- "label": "Identity Providers",
- "position": 4
-}
diff --git a/docs/integrations/identity-providers/self-hosted/_category_.json b/docs/integrations/identity-providers/self-hosted/_category_.json
deleted file mode 100644
index 9889c7bc..00000000
--- a/docs/integrations/identity-providers/self-hosted/_category_.json
+++ /dev/null
@@ -1,4 +0,0 @@
-{
- "label": "Self-Hosted NetBird",
- "position": 4
-}
diff --git a/docs/integrations/identity-providers/self-hosted/auth0.md b/docs/integrations/identity-providers/self-hosted/auth0.md
deleted file mode 100644
index 53c0e9c2..00000000
--- a/docs/integrations/identity-providers/self-hosted/auth0.md
+++ /dev/null
@@ -1,91 +0,0 @@
----
-id: using-netbird-with-auth0
-title: Using NetBird with Auth0
-sidebar_position: 2
-tags:
-- integrations
-- idp
-- auth0
-- oidc
-- how-to
----
-
-This guide is a part of the [NetBird Self-hosting Guide](/getting-started/self-hosting) and explains how to integrate **self-hosted** NetBird with [Auth0](https://auth0.com/).
-
-Auth0 is a flexible, drop-in solution to add authentication and authorization services to your applications.
-It is a 3rd party managed service and can't be self-hosted. Auth0 is the right choice if you don't want to manage an Identity Provider (IDP)
-instance on your own.
-
-:::tip self-hosted idp
-If you prefer to have full control over authentication and authorization of your NetBird network, there are good
-self-hosted alternatives to the managed Auth0 service like [Keycloak](/integrations/identity-providers/self-hosted/using-netbird-with-keycloak).
-:::
-
-### Step 1: Create Auth0 account
-To create an Auth0 account, sign up at [https://auth0.com](https://auth0.com/).
-
-There are five properties of the **`setup.env`** file that we will configure in this guide:
-- `NETBIRD_AUTH_CLIENT_ID`
-- `NETBIRD_AUTH_OIDC_CONFIGURATION_ENDPOINT`
-- `NETBIRD_USE_AUTH0`
-- `NETBIRD_AUTH_AUDIENCE`
-- `NETBIRD_AUTH_DEVICE_AUTH_CLIENT_ID` (Optional)
-
-### Step 2: Create and configure Auth0 application
-
-This Auth0 application will be used to authorize access to NetBird Dashboard (Web UI).
-
-- Follow the steps in the [Auth0 React SDK Guide](https://auth0.com/docs/quickstart/spa/react/01-login#configure-auth0)
-up until "Install the Auth0 React SDK".
-- Use **`https://YOUR DOMAIN`** as: `Allowed Callback URLs`, `Allowed Logout URLs`, `Allowed Web Origins`, `Allowed Origins (CORS)`
- :::caution
- Make sure that **`Token Endpoint Authentication Method`** is set to **`None`**.
- :::
-
-- Use **`Client ID`** to set ```NETBIRD_AUTH_CLIENT_ID``` property in the `setup.env` file.
-- Use **`Domain`** to configure ```NETBIRD_AUTH_OIDC_CONFIGURATION_ENDPOINT``` property in the `setup.env` file like so:
- ```
- https:///.well-known/openid-configuration
- ```
- :::caution
- Double-check if the endpoint returns a JSON response by calling it from your browser.
- :::
-
-### Step 3: Create and configure Auth0 API
-
-This Auth0 API will be used to access NetBird Management Service API.
-
-- Follow the steps in the [Auth0 Create An API](https://auth0.com/docs/quickstart/backend/golang#create-an-api).
-- Use API **`Identifier`** to set ```NETBIRD_AUTH_AUDIENCE``` property in the `setup.env` file.
-- Set ```NETBIRD_USE_AUTH0``` to `true`in the `setup.env` file.
-
-### Step 4: Enable Interactive SSO Login (Optional)
-
-The [Interactive SSO Login feature](/getting-started/installation#running-netbird-with-sso-login) allows for machine
-authorization with your Identity Provider. This feature can be used as an alternative to [setup keys](/overview/setup-keys)
-and is optional.
-
-You can enable it by following these steps:
-- Log in to your Auth0 account https://manage.auth0.com/
-- Go to `Applications` (left-hand menu)
-- Click `Create Application` button (top right)
-- Fill in the form with the following values:
- - Name: `Interactive Login`
- - Application type: `Native`
-- Click `Create`
-
-
-
-- Click `Settings` tab
-- Copy **`Client ID`** to `NETBIRD_AUTH_DEVICE_AUTH_CLIENT_ID` in the `setup.env` file
-
-
-
-- Scroll down to the `Advanced Settings` section
-- Enable **`Device Code`**
-- Click `Save Changes`
-
-
-
-### Step 4: Continue with the self-hosting guide
-You can now continue with the [NetBird Self-hosting Guide](/getting-started/self-hosting#step-3-configure-identity-provider).
\ No newline at end of file
diff --git a/docs/integrations/identity-providers/self-hosted/available-integrations.md b/docs/integrations/identity-providers/self-hosted/available-integrations.md
deleted file mode 100644
index 86f85a26..00000000
--- a/docs/integrations/identity-providers/self-hosted/available-integrations.md
+++ /dev/null
@@ -1,17 +0,0 @@
----
-id: available-idp-integrations
-title: Available IDP Integrations
-sidebar_position: 1
----
-
-There are a few Identity Provider options that you can choose to run a self-hosted version NetBird.
-
-:::tip OpenID
-NetBird supports generic OpenID (OIDC) protocol allowing for the integration with any IDP that follows the specification.
-:::
-
-List of available guides:
-- [Auth0](/integrations/identity-providers/self-hosted/using-netbird-with-auth0) (managed service)
-- [Azure AD](/integrations/identity-providers/self-hosted/using-netbird-with-azure-ad) (managed service)
-- [Keycloak](/integrations/identity-providers/self-hosted/using-netbird-with-keycloak)
-- [Zitadel](/integrations/identity-providers/self-hosted/using-netbird-with-zitadel)
diff --git a/docs/integrations/identity-providers/self-hosted/keycloak.md b/docs/integrations/identity-providers/self-hosted/keycloak.md
deleted file mode 100644
index 57aa41ae..00000000
--- a/docs/integrations/identity-providers/self-hosted/keycloak.md
+++ /dev/null
@@ -1,238 +0,0 @@
----
-id: using-netbird-with-keycloak
-title: Using NetBird with Keycloak
-sidebar_position: 3
-tags:
-- integrations
-- idp
-- keycloak
-- oidc
-- how-to
----
-
-This guide is a part of the [NetBird Self-hosting Guide](/getting-started/self-hosting) and explains how to integrate
-**self-hosted** NetBird with [Keycloak](https://www.keycloak.org/).
-
-Keycloak is an open source software product to allow single sign-on with Identity and Access Management aimed at modern applications and services.
-
-:::tip managed idp
-If you prefer not to self-host an Identity and Access Management solution, then you could use a managed alternative like
-[Auth0](/integrations/identity-providers/self-hosted/using-netbird-with-auth0).
-:::
-
-The following guide is an adapted version of the original
-[Keycloak on Docker](https://www.keycloak.org/getting-started/getting-started-docker) guide from the official website.
-
-### Expected Result
-
-After completing this guide, you can log in to your self-hosted NetBird Dashboard and add your machines
-to your network using the [Interactive SSO Login feature](/getting-started/installation#running-netbird-with-sso-login)
-over Keycloak.
-
-
-
-### Step 1: Check your Keycloak Instance
-
-For this guide, you need a fully configured Keycloak instance running with SSL.
-
-We assume that your Keycloak instance is available at **`https://YOUR-KEYCLOAK-HOST-AND_PORT`**.
-Feel free to change the port if you have configured Keycloak with a different one.
-
-Most of the OIDC software requires SSL for production use.
-We encourage you to comply with this requirement to make the world more secure 😊.
-
-### Step 2: Create a realm
-
-To create a realm you need to:
-
-- Open the Keycloak Admin Console
-- Hover the mouse over the dropdown in the top-left corner where it says `Master`, then click on `Create Realm`
-- Fill in the form with the following values:
- - Realm name: `netbird`
-- Click `Create`
--
-
-
-### Step 3: Create a user
-
-In this step we will create a NetBird administrator user.
-
-- Open the Keycloak Admin Console
-- Make sure, that the selected realm is `Netbird`
-- Click `Users` (left-hand menu)
-- Click `Create new user`
-- Fill in the form with the following values:
- - Username: `netbird`
-- Click `Create`
-
-
-
-The user will need an initial password set to be able to log in. To do this:
-- Click `Credentials` tab
-- Click `Set password` button
-- Fill in the password form with a password
-- Set the `Temporary` field to `Off` to prevent having to update password on first login
-- Click `Save`
-
-
-
-### Step 4: Create a NetBird client
-
-In this step we will create NetBird application client and register with the Keycloak instance.
-
-- Open the Keycloak Admin Console
-- Make sure, that the selected realm is `Netbird`
-- Click `Clients`
-- Click `Create client` button
-- Fill in the form with the following values and click Next:
- - Client Type: `OpenID Connect`
- - Client ID: `netbird-client`
-- Your newly client `netbird-client` will be used later to set `NETBIRD_AUTH_CLIENT_ID` in the `setup.env`
-
-
-
-- Check the checkboxes as on the screenshot below and click Save
-
-
-
-### Step 5: Adjust NetBird client access settings
-
-In this step we will configure NetBird application client access with the NetBird URLs.
-
-- Open the Keycloak Admin Console
-- Make sure, that the selected realm is `Netbird`
-- Click `Clients`
-- Choose `netbird-client` from the list
-- Go to `Access Settings` section
-- Fill in the fields with the following values:
- - Root URL: `https://YOUR DOMAIN/` (this is the NetBird Dashboard root URL)
- - Valid redirect URIs: `https://YOUR DOMAIN/*`
- - Valid post logout redirect URIs: `https://YOUR DOMAIN/*`
- - Web origins: `+`
- - Click `Save`
-
-
-
-### Step 6: Create a NetBird client scope
-
-In this step, we will create and configure the NetBird client audience for Keycloak to add it to the generated JWT tokens.
-
-- Open the Keycloak Admin Console
-- Make sure, that the selected realm is `Netbird`
-- Click `Client scopes` (left-hand menu)
-- Click `Create client scope` button
-- Fill in the form with the following values:
- - Name: `api`
- - Type: `Default`
- - Protocol: `OpenID Connect`
-- Click `Save`
-
-
-
-- While in the newly created Client Scope, switch to the `Mappers` tab
-- Click `Configure a new mapper`
-- Choose the `Audience` mapping
-
-
-
-- Fill in the form with the following values:
- - Name: `Audience for NetBird Management API`
- - Included Client Audience: `netbird-client`
- - Add to access token: `On`
- - Click `Save`
-
-
-
-### Step 7: Add client scope to NetBird client
-
-- Open the Keycloak Admin Console
-- Make sure, that the selected realm is `Netbird`
-- Click `Clients`
-- Choose `netbird-client` from the list
-- Switch to `Client scopes` tab
-- Click `Add client scope` button
-- Choose `api`
-- Click `Add` choosing `Default`
-- The value `netbird-client` will be used as audience
-
-
-
-### Step 8: Create a NetBird-Backend client
-
-In this step we will create NetBird backend client and register with the Keycloak instance.
-
-- Open the Keycloak Admin Console
-- Make sure, that the selected realm is `Netbird`
-- Click `Clients`
-- Click `Create client` button
-- Fill in the form with the following values and click Next:
- - Client Type: `OpenID Connect`
- - Client ID: `netbird-backend`
-- Your newly client `netbird-backend` will be used later to set `KeycloakClientCredentials` in the `management.json`
-
-
-
-- Check the checkboxes as on the screenshot below and click Save
-
-
-
-The client will need secret to authenticate. To do this:
-- Click `Credentials` tab
-- Copy `client secret` will be used later to set `ClientSecret` in the `management.json`
-
-
-
-### Step 9: Add manage-users role to netbird-backend
-
-- Open the Keycloak Admin Console
-- Make sure, that the selected realm is `Netbird`
-- Click `Clients`
-- Choose `netbird-backend` from the list
-- Switch to `Service accounts roles` tab
-- Click `Assign roles` button
-- Select `Filter by clients` and search for `manage-users`
-
-
-
-- Check the role checkbox and click assign
-
-
-
-Your authority OIDC configuration will be available under:
-```
-https:///realms/netbird/.well-known/openid-configuration
-```
-:::caution
-Double-check if the endpoint returns a JSON response by calling it from your browser.
-:::
-
-- Set properties in the `setup.env` file:
- - NETBIRD_AUTH_OIDC_CONFIGURATION_ENDPOINT=`https:///realms/netbird/.well-known/openid-configuration`.
- - NETBIRD_AUTH_CLIENT_ID=`netbird-client`
- - NETBIRD_AUTH_AUDIENCE=`netbird-client`
- - NETBIRD_AUTH_DEVICE_AUTH_CLIENT_ID=`netbird-client`. Optional,
- it enables the [Interactive SSO Login feature](/getting-started/installation#running-netbird-with-sso-login) (Oauth 2.0 Device Authorization Flow)
-
-- You can now continue with the [NetBird Self-hosting Guide](/getting-started/self-hosting#step-3-configure-identity-provider).
-
-- Set property `IdpManagerConfig` in the `management.json` file with:
- :::caution
- The file management.json is created automatically. Please refer [here](/getting-started/self-hosting#step-5-run-configuration-script) for more information.
- :::
-
- ```json
- {
- "ManagerType": "keycloak",
- "KeycloakClientCredentials": {
- "ClientID": "netbird-backend",
- "ClientSecret": "",
- "GrantType": "client_credentials",
- "TokenEndpoint": "https:///realms/netbird/protocol/openid-connect/token",
- "AdminEndpoint": "https:///admin/realms/netbird"
- }
- }
- ```
-
-:::note
-Make sure that your Keycloak instance use HTTPS. Otherwise, the setup won't work.
-:::
\ No newline at end of file
diff --git a/docs/introduction.md b/docs/introduction.md
deleted file mode 100644
index a5b5ab41..00000000
--- a/docs/introduction.md
+++ /dev/null
@@ -1,23 +0,0 @@
----
-id: introduction
-slug: /
-sidebar_position: 1
----
-
-# Introduction
-
-NetBird is a simple and fast alternative to corporate VPNs built on top of [WireGuard®](https://www.wireguard.com/) making it easy to create secure private networks for your organization or home.
-
-NetBird can connect machines running anywhere in just a few clicks.
-
-It requires near zero configuration effort leaving behind the hassle of opening ports, complex firewall rules, vpn gateways, and so forth.
-
-:::tip open-source
-NetBird is an **open-source** project.
-
-Check it out on GitHub: **[https://github.com/netbirdio/netbird](https://github.com/netbirdio/netbird)**
-:::
-
-There is no centralized VPN server with NetBird - your computers, devices, machines, and servers connect to each other directly over a fast encrypted tunnel.
-
-It literally takes less than 5 minutes to deploy a secure peer-to-peer VPN with NetBird. Check our [Quick Start Guide](/getting-started/quickstart) to get started.
diff --git a/docs/other/_category_.json b/docs/other/_category_.json
deleted file mode 100644
index d7ef8267..00000000
--- a/docs/other/_category_.json
+++ /dev/null
@@ -1,4 +0,0 @@
-{
- "label": "Other",
- "position": 8
-}
diff --git a/docs/overview/_category_.json b/docs/overview/_category_.json
deleted file mode 100644
index d5352d28..00000000
--- a/docs/overview/_category_.json
+++ /dev/null
@@ -1,4 +0,0 @@
-{
- "label": "How NetBird Works",
- "position": 2
-}
diff --git a/docs/overview/architecture.md b/docs/overview/architecture.md
deleted file mode 100644
index 92439532..00000000
--- a/docs/overview/architecture.md
+++ /dev/null
@@ -1,123 +0,0 @@
----
-sidebar_position: 1
----
-
-# Architecture
-
-### Overview
-NetBird is an open source platform consisting of a collection of components, responsible for handling peer-to-peer connections, tunneling, authentication, and network management (IPs, keys, ACLs, etc).
-
-It uses open-source technologies like [WireGuard®](https://www.wireguard.com/), [Pion ICE (WebRTC)](https://github.com/pion/ice), [Coturn](https://github.com/coturn/coturn),
-and [software](https://github.com/netbirdio/netbird) developed by NetBird authors to make secure private networks deployment and management simple.
-
-NetBird relies on four components - **Client** application (or agent), **Management**, **Signal** and **Relay** services.
-
-The combination of these elements ensures that direct point-to-point connections are established and only authenticated users (or machines) have access to the resources for which they are authorized.
-
-A **Peer** is a machine or any device that is connected to the network.
-It can be a Linux server running in the cloud or on-premises, a personal laptop, or even a Raspberry PI.
-
-
-
-
-
-With NetBird clients installed and authorized on the Management service, machines form a mesh network connecting to each other directly via an encrypted point-to-point Wireguard tunnel.
-
-
-
-
-
-While it is possible to create a full mesh network, it might be not a desirable outcome. In this case, [ACLs](/overview/acls) can be utilized to limit the access to certain machines.
-
-Let's now take a closer look at each of NetBird's components.
-
-### Management Service
-
-The Management service is the central coordination component for NetBird with a UI dashboard.
-It keeps the network state, public Wireguard keys of the peers, authenticates and distributes network changes to peers.
-
-The Management Service's responsibilities include:
-
-* **Registering and authenticating new peers.** Every new machine has to register itself in the network in order to connect to other machines.
- After installation, NetBird client requires login that can be done through Identity Provider (IDP) or with a [setup key](/overview/setup-keys).
-* **Keeping the network map.** The Management service stores information about all the registered peers including Wireguard public key that was sent during the registration process.
-* **Managing private IP addresses.** Each peer receives a unique private IP with which it can be identified in the network.
- We use [Carrier Grade NAT](https://en.wikipedia.org/wiki/Carrier-grade_NAT) address space with an allocated address block 100.64.0.0/10 .
-* **Synchronizing network changes to peers.** The Management Service keeps a control channel open to each peer sending network updates.
- Whenever a new peer joins the network, all other peers that are authorized to connect to it receive an update.
- After that, they are able to establish a connection to the new peer.
-* **Creating and managing ACLs.** ACL is a list of peers that a given peer has access to. Coming Soon .
-* **Managing private DNS.** [DNS](/overview/dns) allows referring to each of the peers with a fully qualified domain name (FQDN). Coming Soon .
-* **Monitoring network activity.** Coming Soon .
-* **Wireguard key rotation.** Coming Soon .
-
-The Management service runs in the cloud NetBird-managed. It can also be self-hosted.
-
-
-
-
-
-### Client Application
-
-The NetBird Client application (or agent) is a software that is installed on your machines.
-It is an entry point to you private network that makes it possible for machines to communicate with each other.
-Once installed and registered, a machine becomes a peer in the network.
-
-The Client's roles are the following:
-
-* **Generating private and public Wireguard keys.** These keys are used for packet encryption between peers and for [Wireguard Cryptokey Routing](https://www.wireguard.com/#cryptokey-routing).
- To accept the incoming connections, peers have to know each other, therefore, the generated public keys have to be pre-shared on the machines. The client application sends its public key to the Management service which then distributes it to the authorized peers.
-* **Handling peer registration and authentication.** Each peer has to be authenticated and registered in the system. The client application requests a user to log in with an Identity Provider (IDP) or a [setup key](/overview/setup-keys) so that the peer can be associated with the organization's account.
-* **Receiving network updates from the Management service.**
- Each peer receives initial configuration and a list of peers with corresponding public keys and IP addresses so that it can establish a peer-to-peer connection.
-* **Establishing peer-to-peer Wireguard connection.** To establish a connection with a remote peer, the Client first discovers the most suitable connection candidate, or simply address (IP:port) that other peer can use to connect to it.
- Then sends it to the remote peer via Signal. This message is encrypted with the peer's private key and a public key of the remote peer.
- The remote peer does the same and once the peers can reach each other, they establish an encrypted Wireguard tunnel.
-
-:::important
-
-The **private key**, generated by the Client, **never leaves the machine**, ensuring that only the machine that owns the key can decrypt traffic addressed to it.
-
-:::
-
-### Signal Service
-
-The Signal Service or simply Signal is a lightweight piece of software that helps peers to negotiate direct connections.
-It does not store any data and no traffic passes through it.
-
-The only Signal's responsibility is:
-* **Serve as a notification mechanism for peers.** Before a connection can be established, peers need to find each other and exchange the most suitable connection candidates.
- This is done through Signal. After a connection has been established, Signal steps out.
-
-
-
-
-
-:::important
-
-Messages that are sent over Signal are **peer-to-peer encrypted**, so Signal can't see the contents.
-
-:::
-
-NetBird Signal is very similar to the signaling servers used in [WebRTC](https://developer.mozilla.org/en-US/docs/Web/API/WebRTC_API/Signaling_and_video_calling#the_signaling_server).
-It runs in the cloud NetBird-managed and can be self-hosted.
-
-### Relay Service
-
-The Relay service is a [TURN server](https://webrtc.org/getting-started/turn-server) in WebRTC terminology.
-In fact, we use an open-source implementation called [Coturn](https://github.com/coturn/coturn).
-The purpose of this service is to be a "plan B" and relay traffic between peers in case a peer-to-peer connection isn't possible.
-
-
-
-
-
-:::important
-
-Similar to Signal, traffic that flows through the Relay can't be decrypted due to the **Wireguard peer-to-peer encryption**.
-
-:::
-
-It runs in the cloud or can be self-hosted.
-
-### STUN (NAT Traversal)
diff --git a/docs/overview/dns.md b/docs/overview/dns.md
deleted file mode 100644
index 9dcc7a57..00000000
--- a/docs/overview/dns.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-sidebar_position: 5
----
-
-# Private DNS
\ No newline at end of file
diff --git a/docs/overview/general-flow.md b/docs/overview/general-flow.md
deleted file mode 100644
index bd2a4d34..00000000
--- a/docs/overview/general-flow.md
+++ /dev/null
@@ -1,26 +0,0 @@
----
-sidebar_position: 2
----
-
-# General Flow Overview
-
-Below is a high level, step-by-step overview of the flow of communications within NetBird.
-
-1. Administrator creates an account at [app.netbird.io](https://app.netbird.io/).
-2. The system automatically generates a new network with an allocated address block 100.64.0.0/10 .
-3. The system automatically generates 2 [setup keys](/overview/setup-keys) that can be used for authenticating new machines.
-4. Administrator (or a user) installs NetBird client and runs ```netbird up``` command providing one of the setup keys.
-5. NetBird client generates Wireguard private and public keys along with the initial configuration.
-6. NetBird client sends a registration request to the NetBird Management service calling Login gRPC endpoint, providing setup key, Wireguard public key and additional information about the machine.
-7. NetBird Management service checks the provided setup key, registers the machine and returns initial configuration to the NetBird client.
-8. NetBird client receives initial configuration and starts the engine configuring Wireguard, connecting to the Signal Service channel, and the Management Service network updates channel.
-9. NetBird client receives network map update from the Management Service that includes a list of peers/machines to connect to, and a private IP address.
-10. For each peer NetBird client initiates a connection process by sending a connection offer message through the Signal service indicating its intent to connect, and a Wireguard public key.
-11. If the client wasn't the initiator of the connection and receives an offer message, it checks whether the initiator is in the allowed peers list and sends an acknowledgement message through Signal.
-12. Once the acknowledgement message has been received, NetBird Client (on both ends) starts a connection negotiation process using [Interactive Connectivity Establishment protocol (ICE)](https://datatracker.ietf.org/doc/html/rfc8445).
-13. Once the direct connection between peers has been established successfully, NetBird Client starts proxying data to Wireguard.
-14. In case a direct Wireguard connection is possible (e.g., peers are in the same network or one of the peers has a public IP), NetBird Client establishes a direct Wireguard connection avoiding proxy.
-15. NetBird Client keeps a connection to the Management service receiving network updates such as new peers joining the network or peers deleted from the network.
-16. When a new peer joins the network, the NetBird client receives an update and triggers connection (see #10).
-17. When network administrator removes a peer, the NetBird client receives an update and removes the connection.
-
diff --git a/docs/reference/_category_.json b/docs/reference/_category_.json
deleted file mode 100644
index 3ce2f2b7..00000000
--- a/docs/reference/_category_.json
+++ /dev/null
@@ -1,4 +0,0 @@
-{
- "label": "Reference",
- "position": 6
-}
diff --git a/docusaurus.config.js b/docusaurus.config.js
deleted file mode 100644
index 9eeecfee..00000000
--- a/docusaurus.config.js
+++ /dev/null
@@ -1,91 +0,0 @@
-// @ts-check
-// Note: type annotations allow type checking and IDEs autocompletion
-
-const lightCodeTheme = require('prism-react-renderer/themes/github');
-const darkCodeTheme = require('prism-react-renderer/themes/dracula');
-
-/** @type {import('@docusaurus/types').Config} */
-const config = {
- title: 'NetBird Documentation',
- tagline: '',
- url: 'https://netbird.io',
- baseUrl: '/docs/',
- onBrokenLinks: 'throw',
- onBrokenMarkdownLinks: 'warn',
- favicon: '/img/favicon.ico',
- organizationName: 'netbirdio',
- projectName: 'netbird',
-
- presets: [
- [
- '@docusaurus/preset-classic',
- ({
- docs: {
- sidebarPath: require.resolve('./sidebars.js'),
- routeBasePath: '/',
- editUrl: 'https://github.com/netbirdio/docs/tree/main',
- },
- theme: {
- customCss: require.resolve('./src/css/custom.css'),
- },
- googleAnalytics: {
- trackingID: 'UA-188381981-2',
- anonymizeIP: true,
- },
- })
- ],
- ],
-
- themeConfig:
- /** @type {import('@docusaurus/preset-classic').ThemeConfig} */
- ({
- navbar: {
- title: '',
- logo: {
- alt: 'netbird Logo',
- src: '/img/logo.svg',
- srcDark: '/img/logo-dark.svg',
- href: '/',
- },
- items: [
- {
- to: 'https://netbird.io/',
- label: 'Home',
- position: 'right',
- target: '_self'
- }, // or position: 'right'
- {
- type: 'doc',
- docId: 'introduction',
- position: 'right',
- label: 'Docs',
- },
- {
- to: 'https://netbird.io/blog/',
- label: 'Blog',
- position: 'right',
- target: '_self'
- },
- {
- href: 'https://github.com/netbirdio/netbird',
- label: 'GitHub',
- position: 'right',
- },
- ],
- },
- prism: {
- theme: lightCodeTheme,
- darkTheme: darkCodeTheme,
- },
- announcementBar: {
- id: 'announcementBar-docs',
- content:
- '⭐ If you like NetBird, give it a star on GitHub ',
- backgroundColor: '#e3e3e3',
- textColor: '#091E42',
- isCloseable: true,
- },
- }),
-};
-
-module.exports = config;
diff --git a/generator/api.json/.swagger-codegen-ignore b/generator/api.json/.swagger-codegen-ignore
new file mode 100644
index 00000000..c5fa491b
--- /dev/null
+++ b/generator/api.json/.swagger-codegen-ignore
@@ -0,0 +1,23 @@
+# Swagger Codegen Ignore
+# Generated by swagger-codegen https://github.com/swagger-api/swagger-codegen
+
+# Use this file to prevent files from being overwritten by the generator.
+# The patterns follow closely to .gitignore or .dockerignore.
+
+# As an example, the C# client generator defines ApiClient.cs.
+# You can make changes and tell Swagger Codgen to ignore just this file by uncommenting the following line:
+#ApiClient.cs
+
+# You can match any string of characters against a directory, file or extension with a single asterisk (*):
+#foo/*/qux
+# The above matches foo/bar/qux and foo/baz/qux, but not foo/bar/baz/qux
+
+# You can recursively match patterns against a directory, file or extension with a double asterisk (**):
+#foo/**/qux
+# This matches foo/bar/qux, foo/baz/qux, and foo/bar/baz/qux
+
+# You can also negate patterns with an exclamation (!).
+# For example, you can ignore all files in a docs folder with the file extension .md:
+#docs/*.md
+# Then explicitly reverse the ignore rule for a single file:
+#!docs/README.md
diff --git a/generator/api.json/.swagger-codegen/VERSION b/generator/api.json/.swagger-codegen/VERSION
new file mode 100644
index 00000000..34ec317a
--- /dev/null
+++ b/generator/api.json/.swagger-codegen/VERSION
@@ -0,0 +1 @@
+3.0.42
\ No newline at end of file
diff --git a/static/.nojekyll b/generator/api.json/README.md
similarity index 100%
rename from static/.nojekyll
rename to generator/api.json/README.md
diff --git a/generator/api.json/openapi.json b/generator/api.json/openapi.json
new file mode 100644
index 00000000..b0a40828
--- /dev/null
+++ b/generator/api.json/openapi.json
@@ -0,0 +1,3271 @@
+{
+ "openapi" : "3.0.1",
+ "info" : {
+ "title" : "NetBird REST API",
+ "description" : "API to manipulate groups, rules, policies and retrieve information about peers and users",
+ "version" : "0.0.1"
+ },
+ "servers" : [ {
+ "url" : "https://api.netbird.io",
+ "description" : "Default server"
+ } ],
+ "security" : [ {
+ "BearerAuth" : [ ]
+ }, {
+ "TokenAuth" : [ ]
+ } ],
+ "tags" : [ {
+ "name" : "Users",
+ "description" : "Interact with and view information about users."
+ }, {
+ "name" : "Tokens",
+ "description" : "Interact with and view information about tokens."
+ }, {
+ "name" : "Peers",
+ "description" : "Interact with and view information about peers."
+ }, {
+ "name" : "Setup Keys",
+ "description" : "Interact with and view information about setup keys."
+ }, {
+ "name" : "Groups",
+ "description" : "Interact with and view information about groups."
+ }, {
+ "name" : "Rules",
+ "description" : "Interact with and view information about rules."
+ }, {
+ "name" : "Policies",
+ "description" : "Interact with and view information about policies."
+ }, {
+ "name" : "Routes",
+ "description" : "Interact with and view information about routes."
+ }, {
+ "name" : "DNS",
+ "description" : "Interact with and view information about DNS configuration."
+ }, {
+ "name" : "Events",
+ "description" : "View information about the account and network events."
+ }, {
+ "name" : "Accounts",
+ "description" : "View information about the accounts."
+ } ],
+ "paths" : {
+ "/api/accounts" : {
+ "get" : {
+ "tags" : [ "Accounts" ],
+ "summary" : "List all Accounts",
+ "description" : "Returns a list of accounts of a user. Always returns a list of one account.",
+ "operationId" : "getAccounts",
+ "responses" : {
+ "200" : {
+ "description" : "A JSON array of accounts",
+ "content" : {
+ "application/json" : {
+ "schema" : {
+ "type" : "array",
+ "items" : {
+ "$ref" : "#/components/schemas/Account"
+ }
+ }
+ }
+ }
+ },
+ "400" : {
+ "description" : "Bad Request",
+ "content" : { }
+ },
+ "401" : {
+ "description" : "Requires authentication",
+ "content" : { }
+ },
+ "403" : {
+ "description" : "Forbidden",
+ "content" : { }
+ },
+ "500" : {
+ "description" : "Internal Server Error",
+ "content" : { }
+ }
+ },
+ "security" : [ {
+ "BearerAuth" : [ ]
+ }, {
+ "TokenAuth" : [ ]
+ } ]
+ }
+ },
+ "/api/accounts/{accountId}" : {
+ "put" : {
+ "tags" : [ "Accounts" ],
+ "summary" : "Update an Account",
+ "description" : "Update information about an account",
+ "operationId" : "updateAccount",
+ "parameters" : [ {
+ "name" : "accountId",
+ "in" : "path",
+ "description" : "The unique identifier of an account",
+ "required" : true,
+ "style" : "simple",
+ "explode" : false,
+ "schema" : {
+ "type" : "string"
+ }
+ } ],
+ "requestBody" : {
+ "description" : "update an account",
+ "content" : {
+ "application/json" : {
+ "schema" : {
+ "$ref" : "#/components/schemas/AccountSettings"
+ }
+ }
+ }
+ },
+ "responses" : {
+ "200" : {
+ "description" : "An Account object",
+ "content" : {
+ "application/json" : {
+ "schema" : {
+ "$ref" : "#/components/schemas/Account"
+ }
+ }
+ }
+ },
+ "400" : {
+ "description" : "Bad Request",
+ "content" : { }
+ },
+ "401" : {
+ "description" : "Requires authentication",
+ "content" : { }
+ },
+ "403" : {
+ "description" : "Forbidden",
+ "content" : { }
+ },
+ "500" : {
+ "description" : "Internal Server Error",
+ "content" : { }
+ }
+ },
+ "security" : [ {
+ "BearerAuth" : [ ]
+ }, {
+ "TokenAuth" : [ ]
+ } ]
+ }
+ },
+ "/api/users" : {
+ "get" : {
+ "tags" : [ "Users" ],
+ "summary" : "List all Users",
+ "description" : "Returns a list of all users",
+ "operationId" : "getUsers",
+ "parameters" : [ {
+ "name" : "service_user",
+ "in" : "query",
+ "description" : "Filters users and returns either regular users or service users",
+ "required" : false,
+ "style" : "form",
+ "explode" : true,
+ "schema" : {
+ "type" : "boolean"
+ }
+ } ],
+ "responses" : {
+ "200" : {
+ "description" : "A JSON array of Users",
+ "content" : {
+ "application/json" : {
+ "schema" : {
+ "type" : "array",
+ "items" : {
+ "$ref" : "#/components/schemas/User"
+ }
+ }
+ }
+ }
+ },
+ "400" : {
+ "description" : "Bad Request",
+ "content" : { }
+ },
+ "401" : {
+ "description" : "Requires authentication",
+ "content" : { }
+ },
+ "403" : {
+ "description" : "Forbidden",
+ "content" : { }
+ },
+ "500" : {
+ "description" : "Internal Server Error",
+ "content" : { }
+ }
+ },
+ "security" : [ {
+ "BearerAuth" : [ ]
+ }, {
+ "TokenAuth" : [ ]
+ } ]
+ },
+ "post" : {
+ "tags" : [ "Users" ],
+ "summary" : "Create a User",
+ "description" : "Creates a new service user or sends an invite to a regular user",
+ "operationId" : "createUser",
+ "requestBody" : {
+ "description" : "User invite information",
+ "content" : {
+ "application/json" : {
+ "schema" : {
+ "$ref" : "#/components/schemas/UserCreateRequest"
+ }
+ }
+ }
+ },
+ "responses" : {
+ "200" : {
+ "description" : "A User object",
+ "content" : {
+ "application/json" : {
+ "schema" : {
+ "$ref" : "#/components/schemas/User"
+ }
+ }
+ }
+ },
+ "400" : {
+ "description" : "Bad Request",
+ "content" : { }
+ },
+ "401" : {
+ "description" : "Requires authentication",
+ "content" : { }
+ },
+ "403" : {
+ "description" : "Forbidden",
+ "content" : { }
+ },
+ "500" : {
+ "description" : "Internal Server Error",
+ "content" : { }
+ }
+ },
+ "security" : [ {
+ "BearerAuth" : [ ]
+ }, {
+ "TokenAuth" : [ ]
+ } ]
+ }
+ },
+ "/api/users/{userId}" : {
+ "put" : {
+ "tags" : [ "Users" ],
+ "summary" : "Update a User",
+ "description" : "Update information about a User",
+ "operationId" : "updateUser",
+ "parameters" : [ {
+ "name" : "userId",
+ "in" : "path",
+ "description" : "The unique identifier of a user",
+ "required" : true,
+ "style" : "simple",
+ "explode" : false,
+ "schema" : {
+ "type" : "string"
+ }
+ } ],
+ "requestBody" : {
+ "description" : "User update",
+ "content" : {
+ "application/json" : {
+ "schema" : {
+ "$ref" : "#/components/schemas/UserRequest"
+ }
+ }
+ }
+ },
+ "responses" : {
+ "200" : {
+ "description" : "A User object",
+ "content" : {
+ "application/json" : {
+ "schema" : {
+ "$ref" : "#/components/schemas/User"
+ }
+ }
+ }
+ },
+ "400" : {
+ "description" : "Bad Request",
+ "content" : { }
+ },
+ "401" : {
+ "description" : "Requires authentication",
+ "content" : { }
+ },
+ "403" : {
+ "description" : "Forbidden",
+ "content" : { }
+ },
+ "500" : {
+ "description" : "Internal Server Error",
+ "content" : { }
+ }
+ },
+ "security" : [ {
+ "BearerAuth" : [ ]
+ }, {
+ "TokenAuth" : [ ]
+ } ]
+ },
+ "delete" : {
+ "tags" : [ "Users" ],
+ "summary" : "Delete a User",
+ "description" : "Delete a User",
+ "operationId" : "deleteUser",
+ "parameters" : [ {
+ "name" : "userId",
+ "in" : "path",
+ "description" : "The unique identifier of a user",
+ "required" : true,
+ "style" : "simple",
+ "explode" : false,
+ "schema" : {
+ "type" : "string"
+ }
+ } ],
+ "responses" : {
+ "200" : {
+ "description" : "Delete status code",
+ "content" : { }
+ },
+ "400" : {
+ "description" : "Bad Request",
+ "content" : { }
+ },
+ "401" : {
+ "description" : "Requires authentication",
+ "content" : { }
+ },
+ "403" : {
+ "description" : "Forbidden",
+ "content" : { }
+ },
+ "500" : {
+ "description" : "Internal Server Error",
+ "content" : { }
+ }
+ },
+ "security" : [ {
+ "BearerAuth" : [ ]
+ }, {
+ "TokenAuth" : [ ]
+ } ]
+ }
+ },
+ "/api/users/{userId}/tokens" : {
+ "get" : {
+ "tags" : [ "Tokens" ],
+ "summary" : "List all Tokens",
+ "description" : "Returns a list of all tokens for a user",
+ "operationId" : "getTokens",
+ "parameters" : [ {
+ "name" : "userId",
+ "in" : "path",
+ "description" : "The unique identifier of a user",
+ "required" : true,
+ "style" : "simple",
+ "explode" : false,
+ "schema" : {
+ "type" : "string"
+ }
+ } ],
+ "responses" : {
+ "200" : {
+ "description" : "A JSON Array of PersonalAccessTokens",
+ "content" : {
+ "application/json" : {
+ "schema" : {
+ "type" : "array",
+ "items" : {
+ "$ref" : "#/components/schemas/PersonalAccessToken"
+ }
+ }
+ }
+ }
+ },
+ "400" : {
+ "description" : "Bad Request",
+ "content" : { }
+ },
+ "401" : {
+ "description" : "Requires authentication",
+ "content" : { }
+ },
+ "403" : {
+ "description" : "Forbidden",
+ "content" : { }
+ },
+ "500" : {
+ "description" : "Internal Server Error",
+ "content" : { }
+ }
+ },
+ "security" : [ {
+ "BearerAuth" : [ ]
+ }, {
+ "TokenAuth" : [ ]
+ } ]
+ },
+ "post" : {
+ "tags" : [ "Tokens" ],
+ "summary" : "Create a Token",
+ "description" : "Create a new token for a user",
+ "operationId" : "createToken",
+ "parameters" : [ {
+ "name" : "userId",
+ "in" : "path",
+ "description" : "The unique identifier of a user",
+ "required" : true,
+ "style" : "simple",
+ "explode" : false,
+ "schema" : {
+ "type" : "string"
+ }
+ } ],
+ "requestBody" : {
+ "description" : "PersonalAccessToken create parameters",
+ "content" : {
+ "application/json" : {
+ "schema" : {
+ "$ref" : "#/components/schemas/PersonalAccessTokenRequest"
+ }
+ }
+ }
+ },
+ "responses" : {
+ "200" : {
+ "description" : "The token in plain text",
+ "content" : {
+ "application/json" : {
+ "schema" : {
+ "$ref" : "#/components/schemas/PersonalAccessTokenGenerated"
+ }
+ }
+ }
+ },
+ "400" : {
+ "description" : "Bad Request",
+ "content" : { }
+ },
+ "401" : {
+ "description" : "Requires authentication",
+ "content" : { }
+ },
+ "403" : {
+ "description" : "Forbidden",
+ "content" : { }
+ },
+ "500" : {
+ "description" : "Internal Server Error",
+ "content" : { }
+ }
+ },
+ "security" : [ {
+ "BearerAuth" : [ ]
+ }, {
+ "TokenAuth" : [ ]
+ } ]
+ }
+ },
+ "/api/users/{userId}/tokens/{tokenId}" : {
+ "get" : {
+ "tags" : [ "Tokens" ],
+ "summary" : "Retrieve a Token",
+ "description" : "Returns a specific token for a user",
+ "operationId" : "getToken",
+ "parameters" : [ {
+ "name" : "userId",
+ "in" : "path",
+ "description" : "The unique identifier of a user",
+ "required" : true,
+ "style" : "simple",
+ "explode" : false,
+ "schema" : {
+ "type" : "string"
+ }
+ }, {
+ "name" : "tokenId",
+ "in" : "path",
+ "description" : "The unique identifier of a token",
+ "required" : true,
+ "style" : "simple",
+ "explode" : false,
+ "schema" : {
+ "type" : "string"
+ }
+ } ],
+ "responses" : {
+ "200" : {
+ "description" : "A PersonalAccessTokens Object",
+ "content" : {
+ "application/json" : {
+ "schema" : {
+ "$ref" : "#/components/schemas/PersonalAccessToken"
+ }
+ }
+ }
+ },
+ "400" : {
+ "description" : "Bad Request",
+ "content" : { }
+ },
+ "401" : {
+ "description" : "Requires authentication",
+ "content" : { }
+ },
+ "403" : {
+ "description" : "Forbidden",
+ "content" : { }
+ },
+ "500" : {
+ "description" : "Internal Server Error",
+ "content" : { }
+ }
+ },
+ "security" : [ {
+ "BearerAuth" : [ ]
+ }, {
+ "TokenAuth" : [ ]
+ } ]
+ },
+ "delete" : {
+ "tags" : [ "Tokens" ],
+ "summary" : "Delete a Token",
+ "description" : "Delete a token for a user",
+ "operationId" : "deleteToken",
+ "parameters" : [ {
+ "name" : "userId",
+ "in" : "path",
+ "description" : "The unique identifier of a user",
+ "required" : true,
+ "style" : "simple",
+ "explode" : false,
+ "schema" : {
+ "type" : "string"
+ }
+ }, {
+ "name" : "tokenId",
+ "in" : "path",
+ "description" : "The unique identifier of a token",
+ "required" : true,
+ "style" : "simple",
+ "explode" : false,
+ "schema" : {
+ "type" : "string"
+ }
+ } ],
+ "responses" : {
+ "200" : {
+ "description" : "Delete status code",
+ "content" : { }
+ },
+ "400" : {
+ "description" : "Bad Request",
+ "content" : { }
+ },
+ "401" : {
+ "description" : "Requires authentication",
+ "content" : { }
+ },
+ "403" : {
+ "description" : "Forbidden",
+ "content" : { }
+ },
+ "500" : {
+ "description" : "Internal Server Error",
+ "content" : { }
+ }
+ },
+ "security" : [ {
+ "BearerAuth" : [ ]
+ }, {
+ "TokenAuth" : [ ]
+ } ]
+ }
+ },
+ "/api/peers" : {
+ "get" : {
+ "tags" : [ "Peers" ],
+ "summary" : "List all Peers",
+ "description" : "Returns a list of all peers",
+ "operationId" : "getPeers",
+ "responses" : {
+ "200" : {
+ "description" : "A JSON Array of Peers",
+ "content" : {
+ "application/json" : {
+ "schema" : {
+ "type" : "array",
+ "items" : {
+ "$ref" : "#/components/schemas/Peer"
+ }
+ }
+ }
+ }
+ },
+ "400" : {
+ "description" : "Bad Request",
+ "content" : { }
+ },
+ "401" : {
+ "description" : "Requires authentication",
+ "content" : { }
+ },
+ "403" : {
+ "description" : "Forbidden",
+ "content" : { }
+ },
+ "500" : {
+ "description" : "Internal Server Error",
+ "content" : { }
+ }
+ },
+ "security" : [ {
+ "BearerAuth" : [ ]
+ }, {
+ "TokenAuth" : [ ]
+ } ]
+ }
+ },
+ "/api/peers/{peerId}" : {
+ "get" : {
+ "tags" : [ "Peers" ],
+ "summary" : "Retrieve a Peer",
+ "description" : "Get information about a peer",
+ "operationId" : "getPeer",
+ "parameters" : [ {
+ "name" : "peerId",
+ "in" : "path",
+ "description" : "The unique identifier of a peer",
+ "required" : true,
+ "style" : "simple",
+ "explode" : false,
+ "schema" : {
+ "type" : "string"
+ }
+ } ],
+ "responses" : {
+ "200" : {
+ "description" : "A Peer object",
+ "content" : {
+ "application/json" : {
+ "schema" : {
+ "$ref" : "#/components/schemas/Peer"
+ }
+ }
+ }
+ },
+ "400" : {
+ "description" : "Bad Request",
+ "content" : { }
+ },
+ "401" : {
+ "description" : "Requires authentication",
+ "content" : { }
+ },
+ "403" : {
+ "description" : "Forbidden",
+ "content" : { }
+ },
+ "500" : {
+ "description" : "Internal Server Error",
+ "content" : { }
+ }
+ },
+ "security" : [ {
+ "BearerAuth" : [ ]
+ }, {
+ "TokenAuth" : [ ]
+ } ]
+ },
+ "put" : {
+ "tags" : [ "Peers" ],
+ "summary" : "Update a Peer",
+ "description" : "Update information about a peer",
+ "parameters" : [ {
+ "name" : "peerId",
+ "in" : "path",
+ "description" : "The unique identifier of a peer",
+ "required" : true,
+ "style" : "simple",
+ "explode" : false,
+ "schema" : {
+ "type" : "string"
+ }
+ } ],
+ "requestBody" : {
+ "description" : "update a peer",
+ "content" : {
+ "application/json" : {
+ "schema" : {
+ "$ref" : "#/components/schemas/PeerRequest"
+ }
+ }
+ }
+ },
+ "responses" : {
+ "200" : {
+ "description" : "A Peer object",
+ "content" : {
+ "application/json" : {
+ "schema" : {
+ "$ref" : "#/components/schemas/Peer"
+ }
+ }
+ }
+ },
+ "400" : {
+ "description" : "Bad Request",
+ "content" : { }
+ },
+ "401" : {
+ "description" : "Requires authentication",
+ "content" : { }
+ },
+ "403" : {
+ "description" : "Forbidden",
+ "content" : { }
+ },
+ "500" : {
+ "description" : "Internal Server Error",
+ "content" : { }
+ }
+ },
+ "security" : [ {
+ "BearerAuth" : [ ]
+ }, {
+ "TokenAuth" : [ ]
+ } ]
+ },
+ "delete" : {
+ "tags" : [ "Peers" ],
+ "summary" : "Delete a Peer",
+ "description" : "Delete a peer",
+ "parameters" : [ {
+ "name" : "peerId",
+ "in" : "path",
+ "description" : "The unique identifier of a peer",
+ "required" : true,
+ "style" : "simple",
+ "explode" : false,
+ "schema" : {
+ "type" : "string"
+ }
+ } ],
+ "responses" : {
+ "200" : {
+ "description" : "Delete status code",
+ "content" : { }
+ },
+ "400" : {
+ "description" : "Bad Request",
+ "content" : { }
+ },
+ "401" : {
+ "description" : "Requires authentication",
+ "content" : { }
+ },
+ "403" : {
+ "description" : "Forbidden",
+ "content" : { }
+ },
+ "500" : {
+ "description" : "Internal Server Error",
+ "content" : { }
+ }
+ },
+ "security" : [ {
+ "BearerAuth" : [ ]
+ }, {
+ "TokenAuth" : [ ]
+ } ]
+ }
+ },
+ "/api/setup-keys" : {
+ "get" : {
+ "tags" : [ "Setup Keys" ],
+ "summary" : "List all Setup Keys",
+ "description" : "Returns a list of all Setup Keys",
+ "responses" : {
+ "200" : {
+ "description" : "A JSON Array of Setup keys",
+ "content" : {
+ "application/json" : {
+ "schema" : {
+ "type" : "array",
+ "items" : {
+ "$ref" : "#/components/schemas/SetupKey"
+ }
+ }
+ }
+ }
+ },
+ "400" : {
+ "description" : "Bad Request",
+ "content" : { }
+ },
+ "401" : {
+ "description" : "Requires authentication",
+ "content" : { }
+ },
+ "403" : {
+ "description" : "Forbidden",
+ "content" : { }
+ },
+ "500" : {
+ "description" : "Internal Server Error",
+ "content" : { }
+ }
+ },
+ "security" : [ {
+ "BearerAuth" : [ ]
+ }, {
+ "TokenAuth" : [ ]
+ } ]
+ },
+ "post" : {
+ "tags" : [ "Setup Keys" ],
+ "summary" : "Create a Setup Key",
+ "description" : "Creates a Setup Key",
+ "requestBody" : {
+ "description" : "New Setup Key request",
+ "content" : {
+ "application/json" : {
+ "schema" : {
+ "$ref" : "#/components/schemas/SetupKeyRequest"
+ }
+ }
+ }
+ },
+ "responses" : {
+ "200" : {
+ "description" : "A Setup Keys Object",
+ "content" : {
+ "application/json" : {
+ "schema" : {
+ "$ref" : "#/components/schemas/SetupKey"
+ }
+ }
+ }
+ },
+ "400" : {
+ "description" : "Bad Request",
+ "content" : { }
+ },
+ "401" : {
+ "description" : "Requires authentication",
+ "content" : { }
+ },
+ "403" : {
+ "description" : "Forbidden",
+ "content" : { }
+ },
+ "500" : {
+ "description" : "Internal Server Error",
+ "content" : { }
+ }
+ },
+ "security" : [ {
+ "BearerAuth" : [ ]
+ }, {
+ "TokenAuth" : [ ]
+ } ]
+ }
+ },
+ "/api/setup-keys/{keyId}" : {
+ "get" : {
+ "tags" : [ "Setup Keys" ],
+ "summary" : "Retrieve a Setup Key",
+ "description" : "Get information about a Setup Key",
+ "parameters" : [ {
+ "name" : "keyId",
+ "in" : "path",
+ "description" : "The unique identifier of a setup key",
+ "required" : true,
+ "style" : "simple",
+ "explode" : false,
+ "schema" : {
+ "type" : "string"
+ }
+ } ],
+ "responses" : {
+ "200" : {
+ "description" : "A Setup Key object",
+ "content" : {
+ "application/json" : {
+ "schema" : {
+ "$ref" : "#/components/schemas/SetupKey"
+ }
+ }
+ }
+ },
+ "400" : {
+ "description" : "Bad Request",
+ "content" : { }
+ },
+ "401" : {
+ "description" : "Requires authentication",
+ "content" : { }
+ },
+ "403" : {
+ "description" : "Forbidden",
+ "content" : { }
+ },
+ "500" : {
+ "description" : "Internal Server Error",
+ "content" : { }
+ }
+ },
+ "security" : [ {
+ "BearerAuth" : [ ]
+ }, {
+ "TokenAuth" : [ ]
+ } ]
+ },
+ "put" : {
+ "tags" : [ "Setup Keys" ],
+ "summary" : "Update a Setup Key",
+ "description" : "Update information about a Setup Key",
+ "parameters" : [ {
+ "name" : "keyId",
+ "in" : "path",
+ "description" : "The unique identifier of a setup key",
+ "required" : true,
+ "style" : "simple",
+ "explode" : false,
+ "schema" : {
+ "type" : "string"
+ }
+ } ],
+ "requestBody" : {
+ "description" : "update to Setup Key",
+ "content" : {
+ "application/json" : {
+ "schema" : {
+ "$ref" : "#/components/schemas/SetupKeyRequest"
+ }
+ }
+ }
+ },
+ "responses" : {
+ "200" : {
+ "description" : "A Setup Key object",
+ "content" : {
+ "application/json" : {
+ "schema" : {
+ "$ref" : "#/components/schemas/SetupKey"
+ }
+ }
+ }
+ },
+ "400" : {
+ "description" : "Bad Request",
+ "content" : { }
+ },
+ "401" : {
+ "description" : "Requires authentication",
+ "content" : { }
+ },
+ "403" : {
+ "description" : "Forbidden",
+ "content" : { }
+ },
+ "500" : {
+ "description" : "Internal Server Error",
+ "content" : { }
+ }
+ },
+ "security" : [ {
+ "BearerAuth" : [ ]
+ }, {
+ "TokenAuth" : [ ]
+ } ]
+ }
+ },
+ "/api/groups" : {
+ "get" : {
+ "tags" : [ "Groups" ],
+ "summary" : "List all Groups",
+ "description" : "Returns a list of all Groups",
+ "responses" : {
+ "200" : {
+ "description" : "A JSON Array of Groups",
+ "content" : {
+ "application/json" : {
+ "schema" : {
+ "type" : "array",
+ "items" : {
+ "$ref" : "#/components/schemas/Group"
+ }
+ }
+ }
+ }
+ },
+ "400" : {
+ "description" : "Bad Request",
+ "content" : { }
+ },
+ "401" : {
+ "description" : "Requires authentication",
+ "content" : { }
+ },
+ "403" : {
+ "description" : "Forbidden",
+ "content" : { }
+ },
+ "500" : {
+ "description" : "Internal Server Error",
+ "content" : { }
+ }
+ },
+ "security" : [ {
+ "BearerAuth" : [ ]
+ }, {
+ "TokenAuth" : [ ]
+ } ]
+ },
+ "post" : {
+ "tags" : [ "Groups" ],
+ "summary" : "Create a Group",
+ "description" : "Creates a Group",
+ "requestBody" : {
+ "description" : "New Group request",
+ "content" : {
+ "application/json" : {
+ "schema" : {
+ "$ref" : "#/components/schemas/GroupRequest"
+ }
+ }
+ }
+ },
+ "responses" : {
+ "200" : {
+ "description" : "A Group Object",
+ "content" : {
+ "application/json" : {
+ "schema" : {
+ "$ref" : "#/components/schemas/Group"
+ }
+ }
+ }
+ },
+ "400" : {
+ "description" : "Bad Request",
+ "content" : { }
+ },
+ "401" : {
+ "description" : "Requires authentication",
+ "content" : { }
+ },
+ "403" : {
+ "description" : "Forbidden",
+ "content" : { }
+ },
+ "500" : {
+ "description" : "Internal Server Error",
+ "content" : { }
+ }
+ },
+ "security" : [ {
+ "BearerAuth" : [ ]
+ }, {
+ "TokenAuth" : [ ]
+ } ]
+ }
+ },
+ "/api/groups/{groupId}" : {
+ "get" : {
+ "tags" : [ "Groups" ],
+ "summary" : "Retrieve a Group",
+ "description" : "Get information about a Group",
+ "parameters" : [ {
+ "name" : "groupId",
+ "in" : "path",
+ "description" : "The unique identifier of a group",
+ "required" : true,
+ "style" : "simple",
+ "explode" : false,
+ "schema" : {
+ "type" : "string"
+ }
+ } ],
+ "responses" : {
+ "200" : {
+ "description" : "A Group object",
+ "content" : {
+ "application/json" : {
+ "schema" : {
+ "$ref" : "#/components/schemas/Group"
+ }
+ }
+ }
+ },
+ "400" : {
+ "description" : "Bad Request",
+ "content" : { }
+ },
+ "401" : {
+ "description" : "Requires authentication",
+ "content" : { }
+ },
+ "403" : {
+ "description" : "Forbidden",
+ "content" : { }
+ },
+ "500" : {
+ "description" : "Internal Server Error",
+ "content" : { }
+ }
+ },
+ "security" : [ {
+ "BearerAuth" : [ ]
+ }, {
+ "TokenAuth" : [ ]
+ } ]
+ },
+ "put" : {
+ "tags" : [ "Groups" ],
+ "summary" : "Update a Group",
+ "description" : "Update/Replace a Group",
+ "parameters" : [ {
+ "name" : "groupId",
+ "in" : "path",
+ "description" : "The unique identifier of a group",
+ "required" : true,
+ "style" : "simple",
+ "explode" : false,
+ "schema" : {
+ "type" : "string"
+ }
+ } ],
+ "requestBody" : {
+ "description" : "Update Group request",
+ "content" : {
+ "application/json" : {
+ "schema" : {
+ "$ref" : "#/components/schemas/GroupRequest"
+ }
+ }
+ }
+ },
+ "responses" : {
+ "200" : {
+ "description" : "A Group object",
+ "content" : {
+ "application/json" : {
+ "schema" : {
+ "$ref" : "#/components/schemas/Group"
+ }
+ }
+ }
+ },
+ "400" : {
+ "description" : "Bad Request",
+ "content" : { }
+ },
+ "401" : {
+ "description" : "Requires authentication",
+ "content" : { }
+ },
+ "403" : {
+ "description" : "Forbidden",
+ "content" : { }
+ },
+ "500" : {
+ "description" : "Internal Server Error",
+ "content" : { }
+ }
+ },
+ "security" : [ {
+ "BearerAuth" : [ ]
+ }, {
+ "TokenAuth" : [ ]
+ } ]
+ },
+ "delete" : {
+ "tags" : [ "Groups" ],
+ "summary" : "Delete a Group",
+ "description" : "Delete a Group",
+ "parameters" : [ {
+ "name" : "groupId",
+ "in" : "path",
+ "description" : "The unique identifier of a group",
+ "required" : true,
+ "style" : "simple",
+ "explode" : false,
+ "schema" : {
+ "type" : "string"
+ }
+ } ],
+ "responses" : {
+ "200" : {
+ "description" : "Delete status code",
+ "content" : { }
+ },
+ "400" : {
+ "description" : "Bad Request",
+ "content" : { }
+ },
+ "401" : {
+ "description" : "Requires authentication",
+ "content" : { }
+ },
+ "403" : {
+ "description" : "Forbidden",
+ "content" : { }
+ },
+ "500" : {
+ "description" : "Internal Server Error",
+ "content" : { }
+ }
+ },
+ "security" : [ {
+ "BearerAuth" : [ ]
+ }, {
+ "TokenAuth" : [ ]
+ } ]
+ }
+ },
+ "/api/rules" : {
+ "get" : {
+ "tags" : [ "Rules" ],
+ "summary" : "List all Rules",
+ "description" : "Returns a list of all Rules",
+ "responses" : {
+ "200" : {
+ "description" : "A JSON Array of Rules",
+ "content" : {
+ "application/json" : {
+ "schema" : {
+ "type" : "array",
+ "items" : {
+ "$ref" : "#/components/schemas/Rule"
+ }
+ }
+ }
+ }
+ },
+ "400" : {
+ "description" : "Bad Request",
+ "content" : { }
+ },
+ "401" : {
+ "description" : "Requires authentication",
+ "content" : { }
+ },
+ "403" : {
+ "description" : "Forbidden",
+ "content" : { }
+ },
+ "500" : {
+ "description" : "Internal Server Error",
+ "content" : { }
+ }
+ },
+ "security" : [ {
+ "BearerAuth" : [ ]
+ }, {
+ "TokenAuth" : [ ]
+ } ]
+ },
+ "post" : {
+ "tags" : [ "Rules" ],
+ "summary" : "Create a Rule",
+ "description" : "Creates a Rule",
+ "requestBody" : {
+ "description" : "New Rule request",
+ "content" : {
+ "application/json" : {
+ "schema" : {
+ "$ref" : "#/components/schemas/RuleRequest"
+ }
+ }
+ }
+ },
+ "responses" : {
+ "200" : {
+ "description" : "A Rule Object",
+ "content" : {
+ "application/json" : {
+ "schema" : {
+ "$ref" : "#/components/schemas/Rule"
+ }
+ }
+ }
+ }
+ },
+ "security" : [ {
+ "BearerAuth" : [ ]
+ }, {
+ "TokenAuth" : [ ]
+ } ]
+ }
+ },
+ "/api/rules/{ruleId}" : {
+ "get" : {
+ "tags" : [ "Rules" ],
+ "summary" : "Retrieve a Rule",
+ "description" : "Get information about a Rules",
+ "parameters" : [ {
+ "name" : "ruleId",
+ "in" : "path",
+ "description" : "The unique identifier of a rule",
+ "required" : true,
+ "style" : "simple",
+ "explode" : false,
+ "schema" : {
+ "type" : "string"
+ }
+ } ],
+ "responses" : {
+ "200" : {
+ "description" : "A Rule object",
+ "content" : {
+ "application/json" : {
+ "schema" : {
+ "$ref" : "#/components/schemas/Rule"
+ }
+ }
+ }
+ },
+ "400" : {
+ "description" : "Bad Request",
+ "content" : { }
+ },
+ "401" : {
+ "description" : "Requires authentication",
+ "content" : { }
+ },
+ "403" : {
+ "description" : "Forbidden",
+ "content" : { }
+ },
+ "500" : {
+ "description" : "Internal Server Error",
+ "content" : { }
+ }
+ },
+ "security" : [ {
+ "BearerAuth" : [ ]
+ }, {
+ "TokenAuth" : [ ]
+ } ]
+ },
+ "put" : {
+ "tags" : [ "Rules" ],
+ "summary" : "Update a Rule",
+ "description" : "Update/Replace a Rule",
+ "parameters" : [ {
+ "name" : "ruleId",
+ "in" : "path",
+ "description" : "The unique identifier of a rule",
+ "required" : true,
+ "style" : "simple",
+ "explode" : false,
+ "schema" : {
+ "type" : "string"
+ }
+ } ],
+ "requestBody" : {
+ "description" : "Update Rule request",
+ "content" : {
+ "application/json" : {
+ "schema" : {
+ "$ref" : "#/components/schemas/RuleRequest"
+ }
+ }
+ }
+ },
+ "responses" : {
+ "200" : {
+ "description" : "A Rule object",
+ "content" : {
+ "application/json" : {
+ "schema" : {
+ "$ref" : "#/components/schemas/Rule"
+ }
+ }
+ }
+ },
+ "400" : {
+ "description" : "Bad Request",
+ "content" : { }
+ },
+ "401" : {
+ "description" : "Requires authentication",
+ "content" : { }
+ },
+ "403" : {
+ "description" : "Forbidden",
+ "content" : { }
+ },
+ "500" : {
+ "description" : "Internal Server Error",
+ "content" : { }
+ }
+ },
+ "security" : [ {
+ "BearerAuth" : [ ]
+ }, {
+ "TokenAuth" : [ ]
+ } ]
+ },
+ "delete" : {
+ "tags" : [ "Rules" ],
+ "summary" : "Delete a Rule",
+ "description" : "Delete a Rule",
+ "parameters" : [ {
+ "name" : "ruleId",
+ "in" : "path",
+ "description" : "The unique identifier of a rule",
+ "required" : true,
+ "style" : "simple",
+ "explode" : false,
+ "schema" : {
+ "type" : "string"
+ }
+ } ],
+ "responses" : {
+ "200" : {
+ "description" : "Delete status code",
+ "content" : { }
+ },
+ "400" : {
+ "description" : "Bad Request",
+ "content" : { }
+ },
+ "401" : {
+ "description" : "Requires authentication",
+ "content" : { }
+ },
+ "403" : {
+ "description" : "Forbidden",
+ "content" : { }
+ },
+ "500" : {
+ "description" : "Internal Server Error",
+ "content" : { }
+ }
+ },
+ "security" : [ {
+ "BearerAuth" : [ ]
+ }, {
+ "TokenAuth" : [ ]
+ } ]
+ }
+ },
+ "/api/policies" : {
+ "get" : {
+ "tags" : [ "Policies" ],
+ "summary" : "List all Policies",
+ "description" : "Returns a list of all Policies",
+ "responses" : {
+ "200" : {
+ "description" : "A JSON Array of Policies",
+ "content" : {
+ "application/json" : {
+ "schema" : {
+ "type" : "array",
+ "items" : {
+ "$ref" : "#/components/schemas/Policy"
+ }
+ }
+ }
+ }
+ },
+ "400" : {
+ "description" : "Bad Request",
+ "content" : { }
+ },
+ "401" : {
+ "description" : "Requires authentication",
+ "content" : { }
+ },
+ "403" : {
+ "description" : "Forbidden",
+ "content" : { }
+ },
+ "500" : {
+ "description" : "Internal Server Error",
+ "content" : { }
+ }
+ },
+ "security" : [ {
+ "BearerAuth" : [ ]
+ }, {
+ "TokenAuth" : [ ]
+ } ]
+ },
+ "post" : {
+ "tags" : [ "Policies" ],
+ "summary" : "Create a Policy",
+ "description" : "Creates a Policy",
+ "requestBody" : {
+ "description" : "New Policy request",
+ "content" : {
+ "application/json" : {
+ "schema" : {
+ "$ref" : "#/components/schemas/PolicyMinimum"
+ }
+ }
+ }
+ },
+ "responses" : {
+ "200" : {
+ "description" : "A Policy Object",
+ "content" : {
+ "application/json" : {
+ "schema" : {
+ "$ref" : "#/components/schemas/Policy"
+ }
+ }
+ }
+ }
+ },
+ "security" : [ {
+ "BearerAuth" : [ ]
+ }, {
+ "TokenAuth" : [ ]
+ } ]
+ }
+ },
+ "/api/policies/{policyId}" : {
+ "get" : {
+ "tags" : [ "Policies" ],
+ "summary" : "Retrieve a Policy",
+ "description" : "Get information about a Policies",
+ "parameters" : [ {
+ "name" : "policyId",
+ "in" : "path",
+ "description" : "The unique identifier of a policy",
+ "required" : true,
+ "style" : "simple",
+ "explode" : false,
+ "schema" : {
+ "type" : "string"
+ }
+ } ],
+ "responses" : {
+ "200" : {
+ "description" : "A Policy object",
+ "content" : {
+ "application/json" : {
+ "schema" : {
+ "$ref" : "#/components/schemas/Policy"
+ }
+ }
+ }
+ },
+ "400" : {
+ "description" : "Bad Request",
+ "content" : { }
+ },
+ "401" : {
+ "description" : "Requires authentication",
+ "content" : { }
+ },
+ "403" : {
+ "description" : "Forbidden",
+ "content" : { }
+ },
+ "500" : {
+ "description" : "Internal Server Error",
+ "content" : { }
+ }
+ },
+ "security" : [ {
+ "BearerAuth" : [ ]
+ }, {
+ "TokenAuth" : [ ]
+ } ]
+ },
+ "put" : {
+ "tags" : [ "Policies" ],
+ "summary" : "Update a Policy",
+ "description" : "Update/Replace a Policy",
+ "parameters" : [ {
+ "name" : "policyId",
+ "in" : "path",
+ "description" : "The unique identifier of a policy",
+ "required" : true,
+ "style" : "simple",
+ "explode" : false,
+ "schema" : {
+ "type" : "string"
+ }
+ } ],
+ "requestBody" : {
+ "description" : "Update Policy request",
+ "content" : {
+ "application/json" : {
+ "schema" : {
+ "$ref" : "#/components/schemas/PolicyMinimum"
+ }
+ }
+ }
+ },
+ "responses" : {
+ "200" : {
+ "description" : "A Policy object",
+ "content" : {
+ "application/json" : {
+ "schema" : {
+ "$ref" : "#/components/schemas/Policy"
+ }
+ }
+ }
+ },
+ "400" : {
+ "description" : "Bad Request",
+ "content" : { }
+ },
+ "401" : {
+ "description" : "Requires authentication",
+ "content" : { }
+ },
+ "403" : {
+ "description" : "Forbidden",
+ "content" : { }
+ },
+ "500" : {
+ "description" : "Internal Server Error",
+ "content" : { }
+ }
+ },
+ "security" : [ {
+ "BearerAuth" : [ ]
+ }, {
+ "TokenAuth" : [ ]
+ } ]
+ },
+ "delete" : {
+ "tags" : [ "Policies" ],
+ "summary" : "Delete a Policy",
+ "description" : "Delete a Policy",
+ "parameters" : [ {
+ "name" : "policyId",
+ "in" : "path",
+ "description" : "The unique identifier of a policy",
+ "required" : true,
+ "style" : "simple",
+ "explode" : false,
+ "schema" : {
+ "type" : "string"
+ }
+ } ],
+ "responses" : {
+ "200" : {
+ "description" : "Delete status code",
+ "content" : { }
+ },
+ "400" : {
+ "description" : "Bad Request",
+ "content" : { }
+ },
+ "401" : {
+ "description" : "Requires authentication",
+ "content" : { }
+ },
+ "403" : {
+ "description" : "Forbidden",
+ "content" : { }
+ },
+ "500" : {
+ "description" : "Internal Server Error",
+ "content" : { }
+ }
+ },
+ "security" : [ {
+ "BearerAuth" : [ ]
+ }, {
+ "TokenAuth" : [ ]
+ } ]
+ }
+ },
+ "/api/routes" : {
+ "get" : {
+ "tags" : [ "Routes" ],
+ "summary" : "List all Routes",
+ "description" : "Returns a list of all routes",
+ "responses" : {
+ "200" : {
+ "description" : "A JSON Array of Routes",
+ "content" : {
+ "application/json" : {
+ "schema" : {
+ "type" : "array",
+ "items" : {
+ "$ref" : "#/components/schemas/Route"
+ }
+ }
+ }
+ }
+ },
+ "400" : {
+ "description" : "Bad Request",
+ "content" : { }
+ },
+ "401" : {
+ "description" : "Requires authentication",
+ "content" : { }
+ },
+ "403" : {
+ "description" : "Forbidden",
+ "content" : { }
+ },
+ "500" : {
+ "description" : "Internal Server Error",
+ "content" : { }
+ }
+ },
+ "security" : [ {
+ "BearerAuth" : [ ]
+ }, {
+ "TokenAuth" : [ ]
+ } ]
+ },
+ "post" : {
+ "tags" : [ "Routes" ],
+ "summary" : "Create a Route",
+ "description" : "Creates a Route",
+ "requestBody" : {
+ "description" : "New Routes request",
+ "content" : {
+ "application/json" : {
+ "schema" : {
+ "$ref" : "#/components/schemas/RouteRequest"
+ }
+ }
+ }
+ },
+ "responses" : {
+ "200" : {
+ "description" : "A Route Object",
+ "content" : {
+ "application/json" : {
+ "schema" : {
+ "$ref" : "#/components/schemas/Route"
+ }
+ }
+ }
+ },
+ "400" : {
+ "description" : "Bad Request",
+ "content" : { }
+ },
+ "401" : {
+ "description" : "Requires authentication",
+ "content" : { }
+ },
+ "403" : {
+ "description" : "Forbidden",
+ "content" : { }
+ },
+ "500" : {
+ "description" : "Internal Server Error",
+ "content" : { }
+ }
+ },
+ "security" : [ {
+ "BearerAuth" : [ ]
+ }, {
+ "TokenAuth" : [ ]
+ } ]
+ }
+ },
+ "/api/routes/{routeId}" : {
+ "get" : {
+ "tags" : [ "Routes" ],
+ "summary" : "Retrieve a Route",
+ "description" : "Get information about a Routes",
+ "parameters" : [ {
+ "name" : "routeId",
+ "in" : "path",
+ "description" : "The unique identifier of a route",
+ "required" : true,
+ "style" : "simple",
+ "explode" : false,
+ "schema" : {
+ "type" : "string"
+ }
+ } ],
+ "responses" : {
+ "200" : {
+ "description" : "A Route object",
+ "content" : {
+ "application/json" : {
+ "schema" : {
+ "$ref" : "#/components/schemas/Route"
+ }
+ }
+ }
+ },
+ "400" : {
+ "description" : "Bad Request",
+ "content" : { }
+ },
+ "401" : {
+ "description" : "Requires authentication",
+ "content" : { }
+ },
+ "403" : {
+ "description" : "Forbidden",
+ "content" : { }
+ },
+ "500" : {
+ "description" : "Internal Server Error",
+ "content" : { }
+ }
+ },
+ "security" : [ {
+ "BearerAuth" : [ ]
+ }, {
+ "TokenAuth" : [ ]
+ } ]
+ },
+ "put" : {
+ "tags" : [ "Routes" ],
+ "summary" : "Update a Route",
+ "description" : "Update/Replace a Route",
+ "parameters" : [ {
+ "name" : "routeId",
+ "in" : "path",
+ "description" : "The unique identifier of a route",
+ "required" : true,
+ "style" : "simple",
+ "explode" : false,
+ "schema" : {
+ "type" : "string"
+ }
+ } ],
+ "requestBody" : {
+ "description" : "Update Route request",
+ "content" : {
+ "application/json" : {
+ "schema" : {
+ "$ref" : "#/components/schemas/RouteRequest"
+ }
+ }
+ }
+ },
+ "responses" : {
+ "200" : {
+ "description" : "A Route object",
+ "content" : {
+ "application/json" : {
+ "schema" : {
+ "$ref" : "#/components/schemas/Route"
+ }
+ }
+ }
+ },
+ "400" : {
+ "description" : "Bad Request",
+ "content" : { }
+ },
+ "401" : {
+ "description" : "Requires authentication",
+ "content" : { }
+ },
+ "403" : {
+ "description" : "Forbidden",
+ "content" : { }
+ },
+ "500" : {
+ "description" : "Internal Server Error",
+ "content" : { }
+ }
+ },
+ "security" : [ {
+ "BearerAuth" : [ ]
+ }, {
+ "TokenAuth" : [ ]
+ } ]
+ },
+ "delete" : {
+ "tags" : [ "Routes" ],
+ "summary" : "Delete a Route",
+ "description" : "Delete a Route",
+ "parameters" : [ {
+ "name" : "routeId",
+ "in" : "path",
+ "description" : "The unique identifier of a route",
+ "required" : true,
+ "style" : "simple",
+ "explode" : false,
+ "schema" : {
+ "type" : "string"
+ }
+ } ],
+ "responses" : {
+ "200" : {
+ "description" : "Delete status code",
+ "content" : { }
+ },
+ "400" : {
+ "description" : "Bad Request",
+ "content" : { }
+ },
+ "401" : {
+ "description" : "Requires authentication",
+ "content" : { }
+ },
+ "403" : {
+ "description" : "Forbidden",
+ "content" : { }
+ },
+ "500" : {
+ "description" : "Internal Server Error",
+ "content" : { }
+ }
+ },
+ "security" : [ {
+ "BearerAuth" : [ ]
+ }, {
+ "TokenAuth" : [ ]
+ } ]
+ }
+ },
+ "/api/dns/nameservers" : {
+ "get" : {
+ "tags" : [ "DNS" ],
+ "summary" : "List all Nameserver Groups",
+ "description" : "Returns a list of all Nameserver Groups",
+ "responses" : {
+ "200" : {
+ "description" : "A JSON Array of Nameserver Groups",
+ "content" : {
+ "application/json" : {
+ "schema" : {
+ "type" : "array",
+ "items" : {
+ "$ref" : "#/components/schemas/NameserverGroup"
+ }
+ }
+ }
+ }
+ },
+ "400" : {
+ "description" : "Bad Request",
+ "content" : { }
+ },
+ "401" : {
+ "description" : "Requires authentication",
+ "content" : { }
+ },
+ "403" : {
+ "description" : "Forbidden",
+ "content" : { }
+ },
+ "500" : {
+ "description" : "Internal Server Error",
+ "content" : { }
+ }
+ },
+ "security" : [ {
+ "BearerAuth" : [ ]
+ }, {
+ "TokenAuth" : [ ]
+ } ]
+ },
+ "post" : {
+ "tags" : [ "DNS" ],
+ "summary" : "Create a Nameserver Group",
+ "description" : "Creates a Nameserver Group",
+ "requestBody" : {
+ "description" : "New Nameserver Groups request",
+ "content" : {
+ "application/json" : {
+ "schema" : {
+ "$ref" : "#/components/schemas/NameserverGroupRequest"
+ }
+ }
+ }
+ },
+ "responses" : {
+ "200" : {
+ "description" : "A Nameserver Groups Object",
+ "content" : {
+ "application/json" : {
+ "schema" : {
+ "$ref" : "#/components/schemas/NameserverGroup"
+ }
+ }
+ }
+ },
+ "400" : {
+ "description" : "Bad Request",
+ "content" : { }
+ },
+ "401" : {
+ "description" : "Requires authentication",
+ "content" : { }
+ },
+ "403" : {
+ "description" : "Forbidden",
+ "content" : { }
+ },
+ "500" : {
+ "description" : "Internal Server Error",
+ "content" : { }
+ }
+ },
+ "security" : [ {
+ "BearerAuth" : [ ]
+ }, {
+ "TokenAuth" : [ ]
+ } ]
+ }
+ },
+ "/api/dns/nameservers/{nsgroupId}" : {
+ "get" : {
+ "tags" : [ "DNS" ],
+ "summary" : "Retrieve a Nameserver Group",
+ "description" : "Get information about a Nameserver Groups",
+ "parameters" : [ {
+ "name" : "nsgroupId",
+ "in" : "path",
+ "description" : "The unique identifier of a Nameserver Group",
+ "required" : true,
+ "style" : "simple",
+ "explode" : false,
+ "schema" : {
+ "type" : "string"
+ }
+ } ],
+ "responses" : {
+ "200" : {
+ "description" : "A Nameserver Group object",
+ "content" : {
+ "application/json" : {
+ "schema" : {
+ "$ref" : "#/components/schemas/NameserverGroup"
+ }
+ }
+ }
+ },
+ "400" : {
+ "description" : "Bad Request",
+ "content" : { }
+ },
+ "401" : {
+ "description" : "Requires authentication",
+ "content" : { }
+ },
+ "403" : {
+ "description" : "Forbidden",
+ "content" : { }
+ },
+ "500" : {
+ "description" : "Internal Server Error",
+ "content" : { }
+ }
+ },
+ "security" : [ {
+ "BearerAuth" : [ ]
+ }, {
+ "TokenAuth" : [ ]
+ } ]
+ },
+ "put" : {
+ "tags" : [ "DNS" ],
+ "summary" : "Update a Nameserver Group",
+ "description" : "Update/Replace a Nameserver Group",
+ "parameters" : [ {
+ "name" : "nsgroupId",
+ "in" : "path",
+ "description" : "The unique identifier of a Nameserver Group",
+ "required" : true,
+ "style" : "simple",
+ "explode" : false,
+ "schema" : {
+ "type" : "string"
+ }
+ } ],
+ "requestBody" : {
+ "description" : "Update Nameserver Group request",
+ "content" : {
+ "application/json" : {
+ "schema" : {
+ "$ref" : "#/components/schemas/NameserverGroupRequest"
+ }
+ }
+ }
+ },
+ "responses" : {
+ "200" : {
+ "description" : "A Nameserver Group object",
+ "content" : {
+ "application/json" : {
+ "schema" : {
+ "$ref" : "#/components/schemas/NameserverGroup"
+ }
+ }
+ }
+ },
+ "400" : {
+ "description" : "Bad Request",
+ "content" : { }
+ },
+ "401" : {
+ "description" : "Requires authentication",
+ "content" : { }
+ },
+ "403" : {
+ "description" : "Forbidden",
+ "content" : { }
+ },
+ "500" : {
+ "description" : "Internal Server Error",
+ "content" : { }
+ }
+ },
+ "security" : [ {
+ "BearerAuth" : [ ]
+ }, {
+ "TokenAuth" : [ ]
+ } ]
+ },
+ "delete" : {
+ "tags" : [ "DNS" ],
+ "summary" : "Delete a Nameserver Group",
+ "description" : "Delete a Nameserver Group",
+ "parameters" : [ {
+ "name" : "nsgroupId",
+ "in" : "path",
+ "description" : "The unique identifier of a Nameserver Group",
+ "required" : true,
+ "style" : "simple",
+ "explode" : false,
+ "schema" : {
+ "type" : "string"
+ }
+ } ],
+ "responses" : {
+ "200" : {
+ "description" : "Delete status code",
+ "content" : { }
+ },
+ "400" : {
+ "description" : "Bad Request",
+ "content" : { }
+ },
+ "401" : {
+ "description" : "Requires authentication",
+ "content" : { }
+ },
+ "403" : {
+ "description" : "Forbidden",
+ "content" : { }
+ },
+ "500" : {
+ "description" : "Internal Server Error",
+ "content" : { }
+ }
+ },
+ "security" : [ {
+ "BearerAuth" : [ ]
+ }, {
+ "TokenAuth" : [ ]
+ } ]
+ }
+ },
+ "/api/dns/settings" : {
+ "get" : {
+ "tags" : [ "DNS" ],
+ "summary" : "Retrieve DNS Settings",
+ "description" : "Returns a DNS settings object",
+ "responses" : {
+ "200" : {
+ "description" : "A JSON Object of DNS Setting",
+ "content" : {
+ "application/json" : {
+ "schema" : {
+ "type" : "array",
+ "items" : {
+ "$ref" : "#/components/schemas/DNSSettings"
+ }
+ }
+ }
+ }
+ },
+ "400" : {
+ "description" : "Bad Request",
+ "content" : { }
+ },
+ "401" : {
+ "description" : "Requires authentication",
+ "content" : { }
+ },
+ "403" : {
+ "description" : "Forbidden",
+ "content" : { }
+ },
+ "500" : {
+ "description" : "Internal Server Error",
+ "content" : { }
+ }
+ },
+ "security" : [ {
+ "BearerAuth" : [ ]
+ }, {
+ "TokenAuth" : [ ]
+ } ]
+ },
+ "put" : {
+ "tags" : [ "DNS" ],
+ "summary" : "Update DNS Settings",
+ "description" : "Updates a DNS settings object",
+ "requestBody" : {
+ "description" : "A DNS settings object",
+ "content" : {
+ "application/json" : {
+ "schema" : {
+ "$ref" : "#/components/schemas/DNSSettings"
+ }
+ }
+ }
+ },
+ "responses" : {
+ "200" : {
+ "description" : "A JSON Object of DNS Setting",
+ "content" : {
+ "application/json" : {
+ "schema" : {
+ "$ref" : "#/components/schemas/DNSSettings"
+ }
+ }
+ }
+ },
+ "400" : {
+ "description" : "Bad Request",
+ "content" : { }
+ },
+ "401" : {
+ "description" : "Requires authentication",
+ "content" : { }
+ },
+ "403" : {
+ "description" : "Forbidden",
+ "content" : { }
+ },
+ "500" : {
+ "description" : "Internal Server Error",
+ "content" : { }
+ }
+ },
+ "security" : [ {
+ "BearerAuth" : [ ]
+ }, {
+ "TokenAuth" : [ ]
+ } ]
+ }
+ },
+ "/api/events" : {
+ "get" : {
+ "tags" : [ "Events" ],
+ "summary" : "List all Events",
+ "description" : "Returns a list of all events",
+ "responses" : {
+ "200" : {
+ "description" : "A JSON Array of Events",
+ "content" : {
+ "application/json" : {
+ "schema" : {
+ "type" : "array",
+ "items" : {
+ "$ref" : "#/components/schemas/Event"
+ }
+ }
+ }
+ }
+ },
+ "400" : {
+ "description" : "Bad Request",
+ "content" : { }
+ },
+ "401" : {
+ "description" : "Requires authentication",
+ "content" : { }
+ },
+ "403" : {
+ "description" : "Forbidden",
+ "content" : { }
+ },
+ "500" : {
+ "description" : "Internal Server Error",
+ "content" : { }
+ }
+ },
+ "security" : [ {
+ "BearerAuth" : [ ]
+ }, {
+ "TokenAuth" : [ ]
+ } ]
+ }
+ }
+ },
+ "components" : {
+ "schemas" : {
+ "Account" : {
+ "required" : [ "id", "settings" ],
+ "properties" : {
+ "id" : {
+ "type" : "string",
+ "description" : "Account ID",
+ "example" : "ch8i4ug6lnn4g9hqv7l0"
+ },
+ "settings" : {
+ "$ref" : "#/components/schemas/AccountSettings"
+ }
+ }
+ },
+ "AccountSettings" : {
+ "required" : [ "peer_login_expiration", "peer_login_expiration_enabled" ],
+ "properties" : {
+ "peer_login_expiration_enabled" : {
+ "type" : "boolean",
+ "description" : "Enables or disables peer login expiration globally. After peer's login has expired the user has to log in (authenticate). Applies only to peers that were added by a user (interactive SSO login).",
+ "example" : true
+ },
+ "peer_login_expiration" : {
+ "type" : "integer",
+ "description" : "Period of time after which peer login expires (seconds).",
+ "example" : 43200
+ }
+ }
+ },
+ "User" : {
+ "required" : [ "auto_groups", "email", "id", "name", "role", "status" ],
+ "type" : "object",
+ "properties" : {
+ "id" : {
+ "type" : "string",
+ "description" : "User ID",
+ "example" : "google-oauth2|277474792786460067937"
+ },
+ "email" : {
+ "type" : "string",
+ "description" : "User's email address",
+ "example" : "demo@netbird.io"
+ },
+ "name" : {
+ "type" : "string",
+ "description" : "User's name from idp provider",
+ "example" : "Tom Schulz"
+ },
+ "role" : {
+ "type" : "string",
+ "description" : "User's NetBird account role",
+ "example" : "admin"
+ },
+ "status" : {
+ "type" : "string",
+ "description" : "User's status",
+ "example" : "active",
+ "enum" : [ "active", "invited", "disabled" ]
+ },
+ "auto_groups" : {
+ "type" : "array",
+ "description" : "Groups to auto-assign to peers registered by this user",
+ "items" : {
+ "type" : "string",
+ "example" : "devs"
+ }
+ },
+ "is_current" : {
+ "type" : "boolean",
+ "description" : "Is true if authenticated user is the same as this user",
+ "readOnly" : true,
+ "example" : true
+ },
+ "is_service_user" : {
+ "type" : "boolean",
+ "description" : "Is true if this user is a service user",
+ "readOnly" : true,
+ "example" : false
+ }
+ }
+ },
+ "UserRequest" : {
+ "required" : [ "auto_groups", "role" ],
+ "type" : "object",
+ "properties" : {
+ "role" : {
+ "type" : "string",
+ "description" : "User's NetBird account role",
+ "example" : "admin"
+ },
+ "auto_groups" : {
+ "type" : "array",
+ "description" : "Groups to auto-assign to peers registered by this user",
+ "items" : {
+ "type" : "string",
+ "example" : "devs"
+ }
+ }
+ }
+ },
+ "UserCreateRequest" : {
+ "required" : [ "auto_groups", "is_service_user", "role" ],
+ "type" : "object",
+ "properties" : {
+ "email" : {
+ "type" : "string",
+ "description" : "User's Email to send invite to",
+ "example" : "demo@netbird.io"
+ },
+ "name" : {
+ "type" : "string",
+ "description" : "User's full name",
+ "example" : "Tom Schulz"
+ },
+ "role" : {
+ "type" : "string",
+ "description" : "User's NetBird account role",
+ "example" : "admin"
+ },
+ "auto_groups" : {
+ "type" : "array",
+ "description" : "Groups to auto-assign to peers registered by this user",
+ "items" : {
+ "type" : "string",
+ "example" : "devs"
+ }
+ },
+ "is_service_user" : {
+ "type" : "boolean",
+ "description" : "Is true if this user is a service user",
+ "example" : false
+ }
+ }
+ },
+ "PeerMinimum" : {
+ "required" : [ "id", "name" ],
+ "type" : "object",
+ "properties" : {
+ "id" : {
+ "type" : "string",
+ "description" : "Peer ID",
+ "example" : "chacbco6lnnbn6cg5s90"
+ },
+ "name" : {
+ "type" : "string",
+ "description" : "Peer's hostname",
+ "example" : "stage-host-1"
+ }
+ }
+ },
+ "PeerRequest" : {
+ "required" : [ "login_expiration_enabled", "name", "ssh_enabled" ],
+ "type" : "object",
+ "properties" : {
+ "name" : {
+ "type" : "string",
+ "example" : "stage-host-1"
+ },
+ "ssh_enabled" : {
+ "type" : "boolean",
+ "example" : true
+ },
+ "login_expiration_enabled" : {
+ "type" : "boolean",
+ "example" : false
+ }
+ }
+ },
+ "Peer" : {
+ "allOf" : [ {
+ "$ref" : "#/components/schemas/PeerMinimum"
+ }, {
+ "required" : [ "connected", "dns_label", "groups", "hostname", "ip", "last_login", "last_seen", "login_expiration_enabled", "login_expired", "os", "ssh_enabled", "version" ],
+ "type" : "object",
+ "properties" : {
+ "ip" : {
+ "type" : "string",
+ "description" : "Peer's IP address",
+ "example" : "10.64.0.1"
+ },
+ "connected" : {
+ "type" : "boolean",
+ "description" : "Peer to Management connection status",
+ "example" : true
+ },
+ "last_seen" : {
+ "type" : "string",
+ "description" : "Last time peer connected to Netbird's management service",
+ "format" : "date-time",
+ "example" : "2023-05-05T10:05:26.420578Z"
+ },
+ "os" : {
+ "type" : "string",
+ "description" : "Peer's operating system and version",
+ "example" : "Darwin 13.2.1"
+ },
+ "version" : {
+ "type" : "string",
+ "description" : "Peer's daemon or cli version",
+ "example" : "0.14.0"
+ },
+ "groups" : {
+ "type" : "array",
+ "description" : "Groups that the peer belongs to",
+ "items" : {
+ "$ref" : "#/components/schemas/GroupMinimum"
+ }
+ },
+ "ssh_enabled" : {
+ "type" : "boolean",
+ "description" : "Indicates whether SSH server is enabled on this peer",
+ "example" : true
+ },
+ "user_id" : {
+ "type" : "string",
+ "description" : "User ID of the user that enrolled this peer",
+ "example" : "google-oauth2|277474792786460067937"
+ },
+ "hostname" : {
+ "type" : "string",
+ "description" : "Hostname of the machine",
+ "example" : "stage-host-1"
+ },
+ "ui_version" : {
+ "type" : "string",
+ "description" : "Peer's desktop UI version",
+ "example" : "0.14.0"
+ },
+ "dns_label" : {
+ "type" : "string",
+ "description" : "Peer's DNS label is the parsed peer name for domain resolution. It is used to form an FQDN by appending the account's domain to the peer label. e.g. peer-dns-label.netbird.cloud",
+ "example" : "stage-host-1.netbird.cloud"
+ },
+ "login_expiration_enabled" : {
+ "type" : "boolean",
+ "description" : "Indicates whether peer login expiration has been enabled or not",
+ "example" : false
+ },
+ "login_expired" : {
+ "type" : "boolean",
+ "description" : "Indicates whether peer's login expired or not",
+ "example" : false
+ },
+ "last_login" : {
+ "type" : "string",
+ "description" : "Last time this peer performed log in (authentication). E.g., user authenticated.",
+ "format" : "date-time",
+ "example" : "2023-05-05T09:00:35.477782Z"
+ }
+ }
+ } ]
+ },
+ "SetupKey" : {
+ "required" : [ "auto_groups", "expires", "id", "key", "last_used", "name", "revoked", "state", "type", "updated_at", "usage_limit", "used_times", "valid" ],
+ "type" : "object",
+ "properties" : {
+ "id" : {
+ "type" : "string",
+ "description" : "Setup Key ID",
+ "example" : "2531583362"
+ },
+ "key" : {
+ "type" : "string",
+ "description" : "Setup Key value",
+ "example" : "A616097E-FCF0-48FA-9354-CA4A61142761"
+ },
+ "name" : {
+ "type" : "string",
+ "description" : "Setup key name identifier",
+ "example" : "Default key"
+ },
+ "expires" : {
+ "type" : "string",
+ "description" : "Setup Key expiration date",
+ "format" : "date-time",
+ "example" : "2023-06-01T14:47:22.291057Z"
+ },
+ "type" : {
+ "type" : "string",
+ "description" : "Setup key type, one-off for single time usage and reusable",
+ "example" : "reusable"
+ },
+ "valid" : {
+ "type" : "boolean",
+ "description" : "Setup key validity status",
+ "example" : true
+ },
+ "revoked" : {
+ "type" : "boolean",
+ "description" : "Setup key revocation status",
+ "example" : false
+ },
+ "used_times" : {
+ "type" : "integer",
+ "description" : "Usage count of setup key",
+ "example" : 2
+ },
+ "last_used" : {
+ "type" : "string",
+ "description" : "Setup key last usage date",
+ "format" : "date-time",
+ "example" : "2023-05-05T09:00:35.477782Z"
+ },
+ "state" : {
+ "type" : "string",
+ "description" : "Setup key status, \"valid\", \"overused\",\"expired\" or \"revoked\"",
+ "example" : "valid"
+ },
+ "auto_groups" : {
+ "type" : "array",
+ "description" : "Setup key groups to auto-assign to peers registered with this key",
+ "items" : {
+ "type" : "string",
+ "example" : "devs"
+ }
+ },
+ "updated_at" : {
+ "type" : "string",
+ "description" : "Setup key last update date",
+ "format" : "date-time",
+ "example" : "2023-05-05T09:00:35.477782Z"
+ },
+ "usage_limit" : {
+ "type" : "integer",
+ "description" : "A number of times this key can be used. The value of 0 indicates the unlimited usage.",
+ "example" : 0
+ }
+ }
+ },
+ "SetupKeyRequest" : {
+ "required" : [ "auto_groups", "expires_in", "name", "revoked", "type", "usage_limit" ],
+ "type" : "object",
+ "properties" : {
+ "name" : {
+ "type" : "string",
+ "description" : "Setup Key name",
+ "example" : "Default key"
+ },
+ "type" : {
+ "type" : "string",
+ "description" : "Setup key type, one-off for single time usage and reusable",
+ "example" : "reusable"
+ },
+ "expires_in" : {
+ "type" : "integer",
+ "description" : "Expiration time in seconds",
+ "example" : 43200
+ },
+ "revoked" : {
+ "type" : "boolean",
+ "description" : "Setup key revocation status",
+ "example" : false
+ },
+ "auto_groups" : {
+ "type" : "array",
+ "description" : "Setup key groups to auto-assign to peers registered with this key",
+ "items" : {
+ "type" : "string",
+ "example" : "devs"
+ }
+ },
+ "usage_limit" : {
+ "type" : "integer",
+ "description" : "A number of times this key can be used. The value of 0 indicates the unlimited usage.",
+ "example" : 0
+ }
+ }
+ },
+ "PersonalAccessToken" : {
+ "required" : [ "created_at", "created_by", "expiration_date", "id", "name" ],
+ "type" : "object",
+ "properties" : {
+ "id" : {
+ "type" : "string",
+ "description" : "ID of a token",
+ "example" : "ch8i54g6lnn4g9hqv7n0"
+ },
+ "name" : {
+ "type" : "string",
+ "description" : "Name of the token",
+ "example" : "My first token"
+ },
+ "expiration_date" : {
+ "type" : "string",
+ "description" : "Date the token expires",
+ "format" : "date-time",
+ "example" : "2023-05-05T14:38:28.977616Z"
+ },
+ "created_by" : {
+ "type" : "string",
+ "description" : "User ID of the user who created the token",
+ "example" : "google-oauth2|277474792786460067937"
+ },
+ "created_at" : {
+ "type" : "string",
+ "description" : "Date the token was created",
+ "format" : "date-time",
+ "example" : "2023-05-02T14:48:20.465209Z"
+ },
+ "last_used" : {
+ "type" : "string",
+ "description" : "Date the token was last used",
+ "format" : "date-time",
+ "example" : "2023-05-04T12:45:25.9723616Z"
+ }
+ }
+ },
+ "PersonalAccessTokenGenerated" : {
+ "required" : [ "personal_access_token", "plain_token" ],
+ "type" : "object",
+ "properties" : {
+ "plain_token" : {
+ "type" : "string",
+ "description" : "Plain text representation of the generated token",
+ "example" : "2023-05-02T14:48:20.465209Z"
+ },
+ "personal_access_token" : {
+ "$ref" : "#/components/schemas/PersonalAccessToken"
+ }
+ }
+ },
+ "PersonalAccessTokenRequest" : {
+ "required" : [ "expires_in", "name" ],
+ "type" : "object",
+ "properties" : {
+ "name" : {
+ "type" : "string",
+ "description" : "Name of the token",
+ "example" : "My first token"
+ },
+ "expires_in" : {
+ "maximum" : 365,
+ "minimum" : 1,
+ "type" : "integer",
+ "description" : "Expiration in days",
+ "example" : 30
+ }
+ }
+ },
+ "GroupMinimum" : {
+ "required" : [ "id", "name", "peers_count" ],
+ "type" : "object",
+ "properties" : {
+ "id" : {
+ "type" : "string",
+ "description" : "Group ID",
+ "example" : "ch8i4ug6lnn4g9hqv7m0"
+ },
+ "name" : {
+ "type" : "string",
+ "description" : "Group Name identifier",
+ "example" : "devs"
+ },
+ "peers_count" : {
+ "type" : "integer",
+ "description" : "Count of peers associated to the group",
+ "example" : 2
+ }
+ }
+ },
+ "GroupRequest" : {
+ "required" : [ "name" ],
+ "type" : "object",
+ "properties" : {
+ "name" : {
+ "type" : "string",
+ "description" : "Group name identifier",
+ "example" : "devs"
+ },
+ "peers" : {
+ "type" : "array",
+ "description" : "List of peers ids",
+ "example" : "ch8i4ug6lnn4g9hqv7m1",
+ "items" : {
+ "type" : "string"
+ }
+ }
+ }
+ },
+ "Group" : {
+ "allOf" : [ {
+ "$ref" : "#/components/schemas/GroupMinimum"
+ }, {
+ "required" : [ "peers" ],
+ "type" : "object",
+ "properties" : {
+ "peers" : {
+ "type" : "array",
+ "description" : "List of peers object",
+ "items" : {
+ "$ref" : "#/components/schemas/PeerMinimum"
+ }
+ }
+ }
+ } ]
+ },
+ "RuleMinimum" : {
+ "required" : [ "description", "disabled", "flow", "name" ],
+ "type" : "object",
+ "properties" : {
+ "name" : {
+ "type" : "string",
+ "description" : "Rule name identifier",
+ "example" : "Default"
+ },
+ "description" : {
+ "type" : "string",
+ "description" : "Rule friendly description",
+ "example" : "This is a default rule that allows connections between all the resources"
+ },
+ "disabled" : {
+ "type" : "boolean",
+ "description" : "Rules status",
+ "example" : false
+ },
+ "flow" : {
+ "type" : "string",
+ "description" : "Rule flow, currently, only \"bidirect\" for bi-directional traffic is accepted",
+ "example" : "bidirect"
+ }
+ }
+ },
+ "RuleRequest" : {
+ "allOf" : [ {
+ "$ref" : "#/components/schemas/RuleMinimum"
+ }, {
+ "type" : "object",
+ "properties" : {
+ "sources" : {
+ "type" : "array",
+ "description" : "List of source groups",
+ "items" : {
+ "type" : "string",
+ "example" : "ch8i4ug6lnn4g9hqv7m1"
+ }
+ },
+ "destinations" : {
+ "type" : "array",
+ "description" : "List of destination groups",
+ "items" : {
+ "type" : "string",
+ "example" : "ch8i4ug6lnn4g9hqv7m0"
+ }
+ }
+ }
+ } ]
+ },
+ "Rule" : {
+ "allOf" : [ {
+ "required" : [ "id" ],
+ "type" : "object",
+ "properties" : {
+ "id" : {
+ "type" : "string",
+ "description" : "Rule ID",
+ "example" : "ch8i4ug6lnn4g9hqv7mg"
+ }
+ }
+ }, {
+ "$ref" : "#/components/schemas/RuleMinimum"
+ }, {
+ "required" : [ "destinations", "sources" ],
+ "type" : "object",
+ "properties" : {
+ "sources" : {
+ "type" : "array",
+ "description" : "Rule source groups",
+ "items" : {
+ "$ref" : "#/components/schemas/GroupMinimum"
+ }
+ },
+ "destinations" : {
+ "type" : "array",
+ "description" : "Rule destination groups",
+ "items" : {
+ "$ref" : "#/components/schemas/GroupMinimum"
+ }
+ }
+ }
+ } ]
+ },
+ "PolicyRule" : {
+ "required" : [ "action", "destinations", "enabled", "name", "sources" ],
+ "type" : "object",
+ "properties" : {
+ "id" : {
+ "type" : "string",
+ "description" : "Rule ID",
+ "example" : "ch8i4ug6lnn4g9hqv7mg"
+ },
+ "name" : {
+ "type" : "string",
+ "description" : "Rule name identifier",
+ "example" : "Default"
+ },
+ "description" : {
+ "type" : "string",
+ "description" : "Rule friendly description",
+ "example" : "This is a default rule that allows connections between all the resources"
+ },
+ "enabled" : {
+ "type" : "boolean",
+ "description" : "Rules status",
+ "example" : true
+ },
+ "sources" : {
+ "type" : "array",
+ "description" : "policy source groups",
+ "items" : {
+ "$ref" : "#/components/schemas/GroupMinimum"
+ }
+ },
+ "destinations" : {
+ "type" : "array",
+ "description" : "policy destination groups",
+ "items" : {
+ "$ref" : "#/components/schemas/GroupMinimum"
+ }
+ },
+ "action" : {
+ "type" : "string",
+ "description" : "policy accept or drops packets",
+ "example" : "accept",
+ "enum" : [ "accept", "drop" ]
+ }
+ }
+ },
+ "PolicyMinimum" : {
+ "required" : [ "description", "enabled", "name", "query", "rules" ],
+ "type" : "object",
+ "properties" : {
+ "name" : {
+ "type" : "string",
+ "description" : "Policy name identifier",
+ "example" : "ch8i4ug6lnn4g9hqv7mg"
+ },
+ "description" : {
+ "type" : "string",
+ "description" : "Policy friendly description",
+ "example" : "This is a default policy that allows connections between all the resources"
+ },
+ "enabled" : {
+ "type" : "boolean",
+ "description" : "Policy status",
+ "example" : true
+ },
+ "query" : {
+ "type" : "string",
+ "description" : "Policy Rego query",
+ "example" : "package netbird\\n\\nall[rule] {\\n is_peer_in_any_group([\\\"ch8i4ug6lnn4g9hqv7m0\\\",\\\"ch8i4ug6lnn4g9hqv7m0\\\"])\\n rule := {\\n rules_from_group(\\\"ch8i4ug6lnn4g9hqv7m0\\\", \\\"dst\\\", \\\"accept\\\", \\\"\\\"),\\n rules_from_group(\\\"ch8i4ug6lnn4g9hqv7m0\\\", \\\"src\\\", \\\"accept\\\", \\\"\\\"),\\n }[_][_]\\n}\\n"
+ },
+ "rules" : {
+ "type" : "array",
+ "description" : "Policy rule object for policy UI editor",
+ "items" : {
+ "$ref" : "#/components/schemas/PolicyRule"
+ }
+ }
+ }
+ },
+ "Policy" : {
+ "allOf" : [ {
+ "$ref" : "#/components/schemas/PolicyMinimum"
+ }, {
+ "required" : [ "id" ],
+ "type" : "object",
+ "properties" : {
+ "id" : {
+ "type" : "string",
+ "description" : "Policy ID",
+ "example" : "ch8i4ug6lnn4g9hqv7mg"
+ }
+ }
+ } ]
+ },
+ "RouteRequest" : {
+ "required" : [ "description", "enabled", "groups", "id", "masquerade", "metric", "network", "network_id", "peer" ],
+ "type" : "object",
+ "properties" : {
+ "description" : {
+ "type" : "string",
+ "description" : "Route description",
+ "example" : "My first route"
+ },
+ "network_id" : {
+ "maxLength" : 40,
+ "minLength" : 1,
+ "type" : "string",
+ "description" : "Route network identifier, to group HA routes",
+ "example" : "Route 1"
+ },
+ "enabled" : {
+ "type" : "boolean",
+ "description" : "Route status",
+ "example" : true
+ },
+ "peer" : {
+ "type" : "string",
+ "description" : "Peer Identifier associated with route",
+ "example" : "chacbco6lnnbn6cg5s91"
+ },
+ "network" : {
+ "type" : "string",
+ "description" : "Network range in CIDR format",
+ "example" : "10.64.0.0/24"
+ },
+ "metric" : {
+ "maximum" : 9999,
+ "minimum" : 1,
+ "type" : "integer",
+ "description" : "Route metric number. Lowest number has higher priority",
+ "example" : 9999
+ },
+ "masquerade" : {
+ "type" : "boolean",
+ "description" : "Indicate if peer should masquerade traffic to this route's prefix",
+ "example" : true
+ },
+ "groups" : {
+ "type" : "array",
+ "description" : "Route group tag groups",
+ "items" : {
+ "type" : "string",
+ "example" : "chacdk86lnnboviihd70"
+ }
+ }
+ }
+ },
+ "Route" : {
+ "allOf" : [ {
+ "required" : [ "id", "network_type" ],
+ "type" : "object",
+ "properties" : {
+ "id" : {
+ "type" : "string",
+ "description" : "Route Id",
+ "example" : "chacdk86lnnboviihd7g"
+ },
+ "network_type" : {
+ "type" : "string",
+ "description" : "Network type indicating if it is IPv4 or IPv6",
+ "example" : "IPv4"
+ }
+ }
+ }, {
+ "$ref" : "#/components/schemas/RouteRequest"
+ } ]
+ },
+ "Nameserver" : {
+ "required" : [ "ip", "ns_type", "port" ],
+ "type" : "object",
+ "properties" : {
+ "ip" : {
+ "type" : "string",
+ "description" : "Nameserver IP",
+ "example" : "8.8.8.8"
+ },
+ "ns_type" : {
+ "type" : "string",
+ "description" : "Nameserver Type",
+ "example" : "udp",
+ "enum" : [ "udp" ]
+ },
+ "port" : {
+ "type" : "integer",
+ "description" : "Nameserver Port",
+ "example" : 53
+ }
+ }
+ },
+ "NameserverGroupRequest" : {
+ "required" : [ "description", "domains", "enabled", "groups", "name", "nameservers", "primary" ],
+ "type" : "object",
+ "properties" : {
+ "name" : {
+ "maxLength" : 40,
+ "minLength" : 1,
+ "type" : "string",
+ "description" : "Nameserver group name",
+ "example" : "Google DNS"
+ },
+ "description" : {
+ "type" : "string",
+ "description" : "Nameserver group description",
+ "example" : "Google DNS servers"
+ },
+ "nameservers" : {
+ "maxLength" : 2,
+ "minLength" : 1,
+ "type" : "array",
+ "description" : "Nameserver group",
+ "items" : {
+ "$ref" : "#/components/schemas/Nameserver"
+ }
+ },
+ "enabled" : {
+ "type" : "boolean",
+ "description" : "Nameserver group status",
+ "example" : true
+ },
+ "groups" : {
+ "type" : "array",
+ "description" : "Nameserver group tag groups",
+ "items" : {
+ "type" : "string",
+ "example" : "ch8i4ug6lnn4g9hqv7m0"
+ }
+ },
+ "primary" : {
+ "type" : "boolean",
+ "description" : "Nameserver group primary status",
+ "example" : true
+ },
+ "domains" : {
+ "type" : "array",
+ "description" : "Nameserver group domain list",
+ "items" : {
+ "maxLength" : 255,
+ "minLength" : 1,
+ "type" : "string",
+ "example" : "example.com"
+ }
+ }
+ }
+ },
+ "NameserverGroup" : {
+ "allOf" : [ {
+ "required" : [ "id" ],
+ "type" : "object",
+ "properties" : {
+ "id" : {
+ "type" : "string",
+ "description" : "Nameserver group ID",
+ "example" : "ch8i4ug6lnn4g9hqv7m0"
+ }
+ }
+ }, {
+ "$ref" : "#/components/schemas/NameserverGroupRequest"
+ } ]
+ },
+ "DNSSettings" : {
+ "required" : [ "disabled_management_groups" ],
+ "type" : "object",
+ "properties" : {
+ "disabled_management_groups" : {
+ "type" : "array",
+ "description" : "Groups whose DNS management is disabled",
+ "items" : {
+ "type" : "string",
+ "example" : "ch8i4ug6lnn4g9hqv7m0"
+ }
+ }
+ }
+ },
+ "Event" : {
+ "required" : [ "activity", "activity_code", "id", "initiator_id", "meta", "target_id", "timestamp" ],
+ "type" : "object",
+ "properties" : {
+ "id" : {
+ "type" : "string",
+ "description" : "Event unique identifier",
+ "example" : "10"
+ },
+ "timestamp" : {
+ "type" : "string",
+ "description" : "The date and time when the event occurred",
+ "format" : "date-time",
+ "example" : "2023-05-05T10:04:37.473542Z"
+ },
+ "activity" : {
+ "type" : "string",
+ "description" : "The activity that occurred during the event",
+ "example" : "Route created"
+ },
+ "activity_code" : {
+ "type" : "string",
+ "description" : "The string code of the activity that occurred during the event",
+ "example" : "route.add",
+ "enum" : [ "user.peer.delete", "user.join", "user.invite", "user.peer.add", "user.group.add", "user.group.delete", "user.role.update", "setupkey.peer.add", "setupkey.add", "setupkey.update", "setupkey.revoke", "setupkey.overuse", "setupkey.group.delete", "setupkey.group.add", "rule.add", "rule.delete", "rule.update", "policy.add", "policy.delete", "policy.update", "group.add", "group.update", "dns.setting.disabled.management.group.add", "dns.setting.disabled.management.group.delete", "account.create", "account.setting.peer.login.expiration.update", "account.setting.peer.login.expiration.disable", "account.setting.peer.login.expiration.enable", "route.add", "route.delete", "route.update", "nameserver.group.add", "nameserver.group.delete", "nameserver.group.update", "peer.ssh.disable", "peer.ssh.enable", "peer.rename", "peer.login.expiration.disable", "peer.login.expiration.enable", "service.user.create", "personal.access.token.create", "service.user.delete", "personal.access.token.delete" ]
+ },
+ "initiator_id" : {
+ "type" : "string",
+ "description" : "The ID of the initiator of the event. E.g., an ID of a user that triggered the event.",
+ "example" : "google-oauth2|123456789012345678901"
+ },
+ "target_id" : {
+ "type" : "string",
+ "description" : "The ID of the target of the event. E.g., an ID of the peer that a user removed.",
+ "example" : "chad9d86lnnc59g18ou0"
+ },
+ "meta" : {
+ "type" : "object",
+ "additionalProperties" : {
+ "type" : "string"
+ },
+ "description" : "The metadata of the event",
+ "example" : {
+ "name" : "my route",
+ "network_range" : "10.64.0.0/24",
+ "peer_id" : "chacbco6lnnbn6cg5s91"
+ }
+ }
+ }
+ }
+ },
+ "responses" : {
+ "not_found" : {
+ "description" : "Resource not found",
+ "content" : { }
+ },
+ "validation_failed_simple" : {
+ "description" : "Validation failed",
+ "content" : { }
+ },
+ "bad_request" : {
+ "description" : "Bad Request",
+ "content" : { }
+ },
+ "internal_error" : {
+ "description" : "Internal Server Error",
+ "content" : { }
+ },
+ "validation_failed" : {
+ "description" : "Validation failed",
+ "content" : { }
+ },
+ "forbidden" : {
+ "description" : "Forbidden",
+ "content" : { }
+ },
+ "requires_authentication" : {
+ "description" : "Requires authentication",
+ "content" : { }
+ }
+ },
+ "securitySchemes" : {
+ "BearerAuth" : {
+ "type" : "http",
+ "scheme" : "bearer",
+ "bearerFormat" : "JWT"
+ },
+ "TokenAuth" : {
+ "type" : "apiKey",
+ "description" : "Enter the token with the `Token` prefix, e.g. \"Token nbp_F3f0d.....\".",
+ "name" : "Authorization",
+ "in" : "header"
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/generator/api.ts b/generator/api.ts
new file mode 100644
index 00000000..be74f984
--- /dev/null
+++ b/generator/api.ts
@@ -0,0 +1,233 @@
+import template from './templates/ApiTemplate'
+import { slugify, toArrayWithKey, toTitle, writeToDisk } from './helpers'
+import { OpenAPIV3, OpenAPIV2 } from 'openapi-types'
+import * as fs from 'fs'
+import * as ejs from 'ejs'
+
+export default async function gen(inputFileName: string, outputDir: string) {
+ const specRaw = fs.readFileSync(inputFileName, 'utf8')
+ const spec = JSON.parse(specRaw) as any
+ // console.log('spec', spec)
+
+ switch (spec.openapi || spec.swagger) {
+ case '3.0.0':
+ case '3.0.1':
+ case '3.0.3':
+ await gen_v3(spec, outputDir)
+ break
+
+ default:
+ console.log('Unrecognized specification version:', spec.openapi)
+ break
+ }
+}
+
+/**
+ * Versioned Generator
+ */
+
+// OPENAPI-SPEC-VERSION: 3.0.0
+type v3OperationWithPath = OpenAPIV3.OperationObject & {
+ path: string
+}
+export type enrichedOperation = OpenAPIV3.OperationObject & {
+ path: string
+ fullPath: string
+ operationId: string
+}
+
+
+export type schemaParameter = {
+ name: string
+ type: string
+ description: string
+ required: boolean
+ minimum?: number
+ maximum?: number
+ minLength?: number
+ maxLength?: number
+ enum?: string[]
+}
+
+export type component = {
+ example: Object
+ schema: Object
+ parameters: schemaParameter[]
+}
+
+async function gen_v3(spec: OpenAPIV3.Document, dest: string) {
+ const specLayout = spec.tags || []
+ // const operations: enrichedOperation[] = []
+ const tagGroups = new Map()
+ const server = spec.servers.pop().url
+ Object.entries(spec.paths).forEach(([key, val]) => {
+ const fullPath = `${server}${key}`
+
+ toArrayWithKey(val!, 'operation').forEach((o) => {
+ const operation = o as v3OperationWithPath
+ const enriched = {
+ ...operation,
+ path: key,
+ fullPath,
+ operationId: slugify(operation.summary!),
+
+ responseList: toArrayWithKey(operation.responses!, 'responseCode') || [],
+ }
+ let tag = operation.tags.pop()
+ let tagOperations = tagGroups.get(tag) ?? []
+ tagGroups.set(tag, tagOperations.concat(enriched))
+ })
+ })
+
+ let components = new Map();
+ Object.entries(spec.components?.schemas).forEach(([key, val]) => {
+ const schema = val as OpenAPIV3.SchemaObject
+ let outputSchema = new Map();
+ let outputExample = new Map();
+ let parameters : schemaParameter[] = []
+ if(schema.allOf){
+ schema.allOf.forEach((item) => {
+ if((item as OpenAPIV3.ReferenceObject).$ref){
+ let component = components.get((item as OpenAPIV3.ReferenceObject).$ref.split('/').pop())
+ let schemaMap = new Map(Object.entries(component.schema))
+ let exampleMap = new Map(Object.entries(component.example))
+ schemaMap.forEach((value, key) => {
+ outputSchema.set(key, value)
+ })
+ exampleMap.forEach((value, key) => {
+ outputExample.set(key, value)
+ })
+ parameters = parameters.concat(component.parameters)
+ }
+ if((item as OpenAPIV3.SchemaObject).properties){
+ Object.entries((item as OpenAPIV3.SchemaObject).properties).forEach(([key, val]) => {
+ let property = val as OpenAPIV3.SchemaObject
+ let type, exampleValue
+ if (property.type === "array") {
+ type = new Array(resolveType(property.items, spec.components?.schemas))
+ exampleValue = new Array(resolveExampleValue(property.items, spec.components?.schemas))
+ } else {
+ type = resolveType(property, spec.components?.schemas)
+ exampleValue = resolveExampleValue(property, spec.components?.schemas)
+ }
+ outputSchema.set(key, type)
+ outputExample.set(key, exampleValue)
+ let parameter: schemaParameter = {
+ name: key,
+ type: property.type === "array" ? ((property.items as OpenAPIV3.SchemaObject).type || (property.items as OpenAPIV3.ReferenceObject).$ref.split('/').pop()) + "[]" : property.type,
+ description: property.description,
+ required: schema.required?.includes(key) || false,
+ minimum: property.minimum,
+ maximum: property.maximum,
+ minLength: property.minLength,
+ maxLength: property.maxLength,
+ enum: property.enum
+ }
+ parameters.push(parameter)
+ })
+ }
+ })
+ } else {
+ Object.entries(schema.properties).forEach(([key, val]) => {
+ let property = val as OpenAPIV3.SchemaObject
+ let type, exampleValue
+ if(property.type === "array"){
+ type = new Array(resolveType(property.items, spec.components?.schemas))
+ exampleValue = new Array(resolveExampleValue(property.items, spec.components?.schemas))
+ } else {
+ type = resolveType(property, spec.components?.schemas)
+ exampleValue = resolveExampleValue(property, spec.components?.schemas)
+ }
+ outputSchema.set(key, type)
+ outputExample.set(key, exampleValue)
+ let parameter : schemaParameter = {
+ name: key,
+ type: property.type === "array" ? ((property.items as OpenAPIV3.SchemaObject).type || (property.items as OpenAPIV3.ReferenceObject).$ref.split('/').pop()) + "[]" : property.type,
+ description: property.description,
+ required: schema.required?.includes(key) || false,
+ minimum: property.minimum,
+ maximum: property.maximum,
+ minLength: property.minLength,
+ maxLength: property.maxLength,
+ enum: property.enum
+ }
+ parameters.push(parameter)
+ })
+ }
+
+ let output : component = {
+ example: Object.fromEntries(outputExample),
+ schema: Object.fromEntries(outputSchema),
+ parameters: parameters
+ }
+ components.set(key, output)
+ })
+
+
+ tagGroups.forEach((value: enrichedOperation[], key: string) => {
+
+ const operations = value
+
+ const sections = specLayout.map((section) => {
+ return {
+ ...section,
+ title: toTitle(section.name),
+ id: slugify(section.name),
+ operations: operations,
+ }
+ })
+
+ const content = ejs.render(template, {
+ info: spec.info,
+ tag: key,
+ sections,
+ operations,
+ components,
+ })
+
+ // Write to disk
+ let outputFile = dest + "/" + key.toLowerCase().replace(" ", "-") + ".mdx"
+ writeToDisk(outputFile, content)
+ // console.log('Saved: ', outputFile)
+ })
+}
+
+function resolveType(items: OpenAPIV3.ReferenceObject | OpenAPIV3.SchemaObject | OpenAPIV3.NonArraySchemaObjectType, schemas) : any {
+ if((items as OpenAPIV3.ReferenceObject).$ref){
+ let ref = (items as OpenAPIV3.ReferenceObject).$ref
+ let map = new Map()
+ Object.entries(schemas[ref.split('/').pop()].properties).forEach(([key, val]) => {
+ let property = val as OpenAPIV3.SchemaObject
+ let type
+ if(property.type === "array"){
+ type = new Array(resolveType(property.items, schemas))
+ } else {
+ type = resolveType(property, schemas)
+ }
+ map.set(key, type)
+ })
+ return Object.fromEntries(map)
+ }
+ return (items as OpenAPIV3.ArraySchemaObject).type
+}
+
+
+function resolveExampleValue(items: OpenAPIV3.ReferenceObject | OpenAPIV3.SchemaObject | OpenAPIV3.NonArraySchemaObjectType, schemas) : any {
+ if((items as OpenAPIV3.ReferenceObject).$ref){
+ let ref = (items as OpenAPIV3.ReferenceObject).$ref
+ let map = new Map()
+ Object.entries(schemas[ref.split('/').pop()].properties).forEach(([key, val]) => {
+ let property = val as OpenAPIV3.SchemaObject
+ let exampleValue
+ if(property.type === "array"){
+ exampleValue = new Array(resolveExampleValue(property.items, schemas))
+ } else {
+ exampleValue = resolveExampleValue(property, schemas)
+ }
+ map.set(key, exampleValue)
+ })
+ return Object.fromEntries(map)
+ }
+ return (items as OpenAPIV3.ArraySchemaObject).example
+}
+
diff --git a/generator/helpers.ts b/generator/helpers.ts
new file mode 100644
index 00000000..e7796c91
--- /dev/null
+++ b/generator/helpers.ts
@@ -0,0 +1,42 @@
+import * as _ from 'lodash'
+import * as fs from 'fs'
+
+export const slugify = (text: string) => {
+ if (!text) return ''
+ return text
+ .toString()
+ .toLowerCase()
+ .replace(/[. )(]/g, '-') // Replace spaces and brackets -
+ .replace(/[^\w\-]+/g, '') // Remove all non-word chars
+ .replace(/\-\-+/g, '-') // Replace multiple - with single -
+ .replace(/^-+/, '') // Trim - from start of text
+ .replace(/-+$/, '') // Trim - from end of text
+}
+
+// Uppercase the first letter of a string
+export const toTitle = (text: string) => {
+ return text.charAt(0).toUpperCase() + text.slice(1)
+}
+
+/**
+ * writeToDisk()
+ */
+export const writeToDisk = (fileName: string, content: any) => {
+ return new Promise((resolve, reject) => {
+ fs.writeFile(fileName, content, (err: any) => {
+ if (err) return reject(err)
+ else return resolve(true)
+ })
+ })
+}
+
+/**
+ * Convert Object to Array of values
+ */
+export const toArrayWithKey = (obj: object, keyAs: string) =>
+ _.values(
+ _.mapValues(obj, (value: any, key: string) => {
+ value[keyAs] = key
+ return value
+ })
+ )
diff --git a/generator/index.ts b/generator/index.ts
new file mode 100644
index 00000000..e215d25c
--- /dev/null
+++ b/generator/index.ts
@@ -0,0 +1,33 @@
+import ApiGenerator from './api'
+
+
+const main = (command: string[], options: any) => {
+ handleInput(command[0], options)
+}
+
+// Run everything
+const argv = require('minimist')(process.argv.slice(2))
+main(argv['_'], argv)
+
+function handleInput(command: string, options: any) {
+ switch (command) {
+ case 'gen':
+ DocGenerator(options)
+ break
+
+ default:
+ console.log('Unrecognized command:', command)
+ break
+ }
+}
+
+export default async function DocGenerator({
+ input,
+ output,
+}: {
+ input: string
+ output: string
+}) {
+ await ApiGenerator(input, output)
+ return 'Done'
+}
diff --git a/generator/openapi.yml b/generator/openapi.yml
new file mode 100644
index 00000000..8d3b7a5b
--- /dev/null
+++ b/generator/openapi.yml
@@ -0,0 +1,2219 @@
+openapi: 3.0.1
+servers:
+ - url: https://api.netbird.io
+ description: Default server
+info:
+ title: NetBird REST API
+ description: API to manipulate groups, rules, policies and retrieve information about peers and users
+ version: 0.0.1
+tags:
+ - name: Users
+ description: Interact with and view information about users.
+ - name: Tokens
+ description: Interact with and view information about tokens.
+ - name: Peers
+ description: Interact with and view information about peers.
+ - name: Setup Keys
+ description: Interact with and view information about setup keys.
+ - name: Groups
+ description: Interact with and view information about groups.
+ - name: Rules
+ description: Interact with and view information about rules.
+ - name: Policies
+ description: Interact with and view information about policies.
+ - name: Routes
+ description: Interact with and view information about routes.
+ - name: DNS
+ description: Interact with and view information about DNS configuration.
+ - name: Events
+ description: View information about the account and network events.
+ - name: Accounts
+ description: View information about the accounts.
+components:
+ schemas:
+ Account:
+ properties:
+ id:
+ description: Account ID
+ type: string
+ example: ch8i4ug6lnn4g9hqv7l0
+ settings:
+ $ref: '#/components/schemas/AccountSettings'
+ required:
+ - id
+ - settings
+ AccountSettings:
+ properties:
+ peer_login_expiration_enabled:
+ description: Enables or disables peer login expiration globally. After peer's login has expired the user has to log in (authenticate). Applies only to peers that were added by a user (interactive SSO login).
+ type: boolean
+ example: true
+ peer_login_expiration:
+ description: Period of time after which peer login expires (seconds).
+ type: integer
+ example: 43200
+ required:
+ - peer_login_expiration_enabled
+ - peer_login_expiration
+ User:
+ type: object
+ properties:
+ id:
+ description: User ID
+ type: string
+ example: google-oauth2|277474792786460067937
+ email:
+ description: User's email address
+ type: string
+ example: demo@netbird.io
+ name:
+ description: User's name from idp provider
+ type: string
+ example: Tom Schulz
+ role:
+ description: User's NetBird account role
+ type: string
+ example: admin
+ status:
+ description: User's status
+ type: string
+ enum: [ "active","invited","disabled" ]
+ example: active
+ auto_groups:
+ description: Groups to auto-assign to peers registered by this user
+ type: array
+ items:
+ type: string
+ example: devs
+ is_current:
+ description: Is true if authenticated user is the same as this user
+ type: boolean
+ readOnly: true
+ example: true
+ is_service_user:
+ description: Is true if this user is a service user
+ type: boolean
+ readOnly: true
+ example: false
+ required:
+ - id
+ - email
+ - name
+ - role
+ - auto_groups
+ - status
+ UserRequest:
+ type: object
+ properties:
+ role:
+ description: User's NetBird account role
+ type: string
+ example: admin
+ auto_groups:
+ description: Groups to auto-assign to peers registered by this user
+ type: array
+ items:
+ type: string
+ example: devs
+ required:
+ - role
+ - auto_groups
+ UserCreateRequest:
+ type: object
+ properties:
+ email:
+ description: User's Email to send invite to
+ type: string
+ example: demo@netbird.io
+ name:
+ description: User's full name
+ type: string
+ example: Tom Schulz
+ role:
+ description: User's NetBird account role
+ type: string
+ example: admin
+ auto_groups:
+ description: Groups to auto-assign to peers registered by this user
+ type: array
+ items:
+ type: string
+ example: devs
+ is_service_user:
+ description: Is true if this user is a service user
+ type: boolean
+ example: false
+ required:
+ - role
+ - auto_groups
+ - is_service_user
+ PeerMinimum:
+ type: object
+ properties:
+ id:
+ description: Peer ID
+ type: string
+ example: chacbco6lnnbn6cg5s90
+ name:
+ description: Peer's hostname
+ type: string
+ example: stage-host-1
+ required:
+ - id
+ - name
+ PeerRequest:
+ type: object
+ properties:
+ name:
+ type: string
+ example: stage-host-1
+ ssh_enabled:
+ type: boolean
+ example: true
+ login_expiration_enabled:
+ type: boolean
+ example: false
+ required:
+ - name
+ - ssh_enabled
+ - login_expiration_enabled
+ Peer:
+ allOf:
+ - $ref: '#/components/schemas/PeerMinimum'
+ - type: object
+ properties:
+ ip:
+ description: Peer's IP address
+ type: string
+ example: 10.64.0.1
+ connected:
+ description: Peer to Management connection status
+ type: boolean
+ example: true
+ last_seen:
+ description: Last time peer connected to Netbird's management service
+ type: string
+ format: date-time
+ example: 2023-05-05T10:05:26.420578Z
+ os:
+ description: Peer's operating system and version
+ type: string
+ example: Darwin 13.2.1
+ version:
+ description: Peer's daemon or cli version
+ type: string
+ example: 0.14.0
+ groups:
+ description: Groups that the peer belongs to
+ type: array
+ items:
+ $ref: '#/components/schemas/GroupMinimum'
+ ssh_enabled:
+ description: Indicates whether SSH server is enabled on this peer
+ type: boolean
+ example: true
+ user_id:
+ description: User ID of the user that enrolled this peer
+ type: string
+ example: google-oauth2|277474792786460067937
+ hostname:
+ description: Hostname of the machine
+ type: string
+ example: stage-host-1
+ ui_version:
+ description: Peer's desktop UI version
+ type: string
+ example: 0.14.0
+ dns_label:
+ description: Peer's DNS label is the parsed peer name for domain resolution. It is used to form an FQDN by appending the account's domain to the peer label. e.g. peer-dns-label.netbird.cloud
+ type: string
+ example: stage-host-1.netbird.cloud
+ login_expiration_enabled:
+ description: Indicates whether peer login expiration has been enabled or not
+ type: boolean
+ example: false
+ login_expired:
+ description: Indicates whether peer's login expired or not
+ type: boolean
+ example: false
+ last_login:
+ description: Last time this peer performed log in (authentication). E.g., user authenticated.
+ type: string
+ format: date-time
+ example: 2023-05-05T09:00:35.477782Z
+ required:
+ - ip
+ - connected
+ - last_seen
+ - os
+ - version
+ - groups
+ - ssh_enabled
+ - hostname
+ - dns_label
+ - login_expiration_enabled
+ - login_expired
+ - last_login
+ SetupKey:
+ type: object
+ properties:
+ id:
+ description: Setup Key ID
+ type: string
+ example: 2531583362
+ key:
+ description: Setup Key value
+ type: string
+ example: A616097E-FCF0-48FA-9354-CA4A61142761
+ name:
+ description: Setup key name identifier
+ type: string
+ example: Default key
+ expires:
+ description: Setup Key expiration date
+ type: string
+ format: date-time
+ example: 2023-06-01T14:47:22.291057Z
+ type:
+ description: Setup key type, one-off for single time usage and reusable
+ type: string
+ example: reusable
+ valid:
+ description: Setup key validity status
+ type: boolean
+ example: true
+ revoked:
+ description: Setup key revocation status
+ type: boolean
+ example: false
+ used_times:
+ description: Usage count of setup key
+ type: integer
+ example: 2
+ last_used:
+ description: Setup key last usage date
+ type: string
+ format: date-time
+ example: 2023-05-05T09:00:35.477782Z
+ state:
+ description: Setup key status, "valid", "overused","expired" or "revoked"
+ type: string
+ example: valid
+ auto_groups:
+ description: Setup key groups to auto-assign to peers registered with this key
+ type: array
+ items:
+ type: string
+ example: "devs"
+ updated_at:
+ description: Setup key last update date
+ type: string
+ format: date-time
+ example: 2023-05-05T09:00:35.477782Z
+ usage_limit:
+ description: A number of times this key can be used. The value of 0 indicates the unlimited usage.
+ type: integer
+ example: 0
+ required:
+ - id
+ - key
+ - name
+ - expires
+ - type
+ - valid
+ - revoked
+ - used_times
+ - last_used
+ - state
+ - auto_groups
+ - updated_at
+ - usage_limit
+ SetupKeyRequest:
+ type: object
+ properties:
+ name:
+ description: Setup Key name
+ type: string
+ example: Default key
+ type:
+ description: Setup key type, one-off for single time usage and reusable
+ type: string
+ example: reusable
+ expires_in:
+ description: Expiration time in seconds
+ type: integer
+ example: 43200
+ revoked:
+ description: Setup key revocation status
+ type: boolean
+ example: false
+ auto_groups:
+ description: Setup key groups to auto-assign to peers registered with this key
+ type: array
+ items:
+ type: string
+ example: "devs"
+ usage_limit:
+ description: A number of times this key can be used. The value of 0 indicates the unlimited usage.
+ type: integer
+ example: 0
+ required:
+ - name
+ - type
+ - expires_in
+ - revoked
+ - auto_groups
+ - usage_limit
+ PersonalAccessToken:
+ type: object
+ properties:
+ id:
+ description: ID of a token
+ type: string
+ example: ch8i54g6lnn4g9hqv7n0
+ name:
+ description: Name of the token
+ type: string
+ example: My first token
+ expiration_date:
+ description: Date the token expires
+ type: string
+ format: date-time
+ example: 2023-05-05T14:38:28.977616Z
+ created_by:
+ description: User ID of the user who created the token
+ type: string
+ example: google-oauth2|277474792786460067937
+ created_at:
+ description: Date the token was created
+ type: string
+ format: date-time
+ example: 2023-05-02T14:48:20.465209Z
+ last_used:
+ description: Date the token was last used
+ type: string
+ format: date-time
+ example: 2023-05-04T12:45:25.9723616Z
+ required:
+ - id
+ - name
+ - expiration_date
+ - created_by
+ - created_at
+ PersonalAccessTokenGenerated:
+ type: object
+ properties:
+ plain_token:
+ description: Plain text representation of the generated token
+ type: string
+ example: 2023-05-02T14:48:20.465209Z
+ personal_access_token:
+ $ref: '#/components/schemas/PersonalAccessToken'
+ required:
+ - plain_token
+ - personal_access_token
+ PersonalAccessTokenRequest:
+ type: object
+ properties:
+ name:
+ description: Name of the token
+ type: string
+ example: My first token
+ expires_in:
+ description: Expiration in days
+ type: integer
+ minimum: 1
+ maximum: 365
+ example: 30
+ required:
+ - name
+ - expires_in
+ GroupMinimum:
+ type: object
+ properties:
+ id:
+ description: Group ID
+ type: string
+ example: ch8i4ug6lnn4g9hqv7m0
+ name:
+ description: Group Name identifier
+ type: string
+ example: devs
+ peers_count:
+ description: Count of peers associated to the group
+ type: integer
+ example: 2
+ required:
+ - id
+ - name
+ - peers_count
+ GroupRequest:
+ type: object
+ properties:
+ name:
+ type: string
+ description: Group name identifier
+ example: devs
+ peers:
+ type: array
+ description: List of peers ids
+ items:
+ type: string
+ example: "ch8i4ug6lnn4g9hqv7m1"
+ required:
+ - name
+ Group:
+ allOf:
+ - $ref: '#/components/schemas/GroupMinimum'
+ - type: object
+ properties:
+ peers:
+ description: List of peers object
+ type: array
+ items:
+ $ref: '#/components/schemas/PeerMinimum'
+ required:
+ - peers
+ RuleMinimum:
+ type: object
+ properties:
+ name:
+ description: Rule name identifier
+ type: string
+ example: Default
+ description:
+ description: Rule friendly description
+ type: string
+ example: This is a default rule that allows connections between all the resources
+ disabled:
+ description: Rules status
+ type: boolean
+ example: false
+ flow:
+ description: Rule flow, currently, only "bidirect" for bi-directional traffic is accepted
+ type: string
+ example: bidirect
+ required:
+ - name
+ - description
+ - disabled
+ - flow
+ RuleRequest:
+ allOf:
+ - $ref: '#/components/schemas/RuleMinimum'
+ - type: object
+ properties:
+ sources:
+ type: array
+ description: List of source groups
+ items:
+ type: string
+ example: "ch8i4ug6lnn4g9hqv7m1"
+ destinations:
+ type: array
+ description: List of destination groups
+ items:
+ type: string
+ example: "ch8i4ug6lnn4g9hqv7m0"
+ Rule:
+ allOf:
+ - type: object
+ properties:
+ id:
+ description: Rule ID
+ type: string
+ example: ch8i4ug6lnn4g9hqv7mg
+ required:
+ - id
+ - $ref: '#/components/schemas/RuleMinimum'
+ - type: object
+ properties:
+ sources:
+ description: Rule source groups
+ type: array
+ items:
+ $ref: '#/components/schemas/GroupMinimum'
+ destinations:
+ description: Rule destination groups
+ type: array
+ items:
+ $ref: '#/components/schemas/GroupMinimum'
+ required:
+ - sources
+ - destinations
+ PolicyRule:
+ type: object
+ properties:
+ id:
+ description: Rule ID
+ type: string
+ example: ch8i4ug6lnn4g9hqv7mg
+ name:
+ description: Rule name identifier
+ type: string
+ example: Default
+ description:
+ description: Rule friendly description
+ type: string
+ example: This is a default rule that allows connections between all the resources
+ enabled:
+ description: Rules status
+ type: boolean
+ example: true
+ sources:
+ description: policy source groups
+ type: array
+ items:
+ $ref: '#/components/schemas/GroupMinimum'
+ destinations:
+ description: policy destination groups
+ type: array
+ items:
+ $ref: '#/components/schemas/GroupMinimum'
+ action:
+ description: policy accept or drops packets
+ type: string
+ enum: ["accept","drop"]
+ example: accept
+ required:
+ - name
+ - sources
+ - destinations
+ - action
+ - enabled
+ PolicyMinimum:
+ type: object
+ properties:
+ name:
+ description: Policy name identifier
+ type: string
+ example: ch8i4ug6lnn4g9hqv7mg
+ description:
+ description: Policy friendly description
+ type: string
+ example: This is a default policy that allows connections between all the resources
+ enabled:
+ description: Policy status
+ type: boolean
+ example: true
+ query:
+ description: Policy Rego query
+ type: string
+ example: package netbird\n\nall[rule] {\n is_peer_in_any_group([\"ch8i4ug6lnn4g9hqv7m0\",\"ch8i4ug6lnn4g9hqv7m0\"])\n rule := {\n rules_from_group(\"ch8i4ug6lnn4g9hqv7m0\", \"dst\", \"accept\", \"\"),\n rules_from_group(\"ch8i4ug6lnn4g9hqv7m0\", \"src\", \"accept\", \"\"),\n }[_][_]\n}\n
+ rules:
+ description: Policy rule object for policy UI editor
+ type: array
+ items:
+ $ref: '#/components/schemas/PolicyRule'
+ required:
+ - name
+ - description
+ - enabled
+ - query
+ - rules
+ Policy:
+ allOf:
+ - $ref: '#/components/schemas/PolicyMinimum'
+ - type: object
+ properties:
+ id:
+ description: Policy ID
+ type: string
+ example: ch8i4ug6lnn4g9hqv7mg
+ required:
+ - id
+ RouteRequest:
+ type: object
+ properties:
+ description:
+ description: Route description
+ type: string
+ example: My first route
+ network_id:
+ description: Route network identifier, to group HA routes
+ type: string
+ maxLength: 40
+ minLength: 1
+ example: Route 1
+ enabled:
+ description: Route status
+ type: boolean
+ example: true
+ peer:
+ description: Peer Identifier associated with route
+ type: string
+ example: chacbco6lnnbn6cg5s91
+ network:
+ description: Network range in CIDR format
+ type: string
+ example: 10.64.0.0/24
+ metric:
+ description: Route metric number. Lowest number has higher priority
+ type: integer
+ maximum: 9999
+ minimum: 1
+ example: 9999
+ masquerade:
+ description: Indicate if peer should masquerade traffic to this route's prefix
+ type: boolean
+ example: true
+ groups:
+ description: Route group tag groups
+ type: array
+ items:
+ type: string
+ example: "chacdk86lnnboviihd70"
+ required:
+ - id
+ - description
+ - network_id
+ - enabled
+ - peer
+ - network
+ - metric
+ - masquerade
+ - groups
+ Route:
+ allOf:
+ - type: object
+ properties:
+ id:
+ description: Route Id
+ type: string
+ example: chacdk86lnnboviihd7g
+ network_type:
+ description: Network type indicating if it is IPv4 or IPv6
+ type: string
+ example: IPv4
+ required:
+ - id
+ - network_type
+ - $ref: '#/components/schemas/RouteRequest'
+ Nameserver:
+ type: object
+ properties:
+ ip:
+ description: Nameserver IP
+ type: string
+ example: 8.8.8.8
+ ns_type:
+ description: Nameserver Type
+ type: string
+ enum: [ "udp" ]
+ example: udp
+ port:
+ description: Nameserver Port
+ type: integer
+ example: 53
+ required:
+ - ip
+ - ns_type
+ - port
+ NameserverGroupRequest:
+ type: object
+ properties:
+ name:
+ description: Nameserver group name
+ type: string
+ maxLength: 40
+ minLength: 1
+ example: Google DNS
+ description:
+ description: Nameserver group description
+ type: string
+ example: Google DNS servers
+ nameservers:
+ description: Nameserver group
+ minLength: 1
+ maxLength: 2
+ type: array
+ items:
+ $ref: '#/components/schemas/Nameserver'
+ enabled:
+ description: Nameserver group status
+ type: boolean
+ example: true
+ groups:
+ description: Nameserver group tag groups
+ type: array
+ items:
+ type: string
+ example: ch8i4ug6lnn4g9hqv7m0
+ primary:
+ description: Nameserver group primary status
+ type: boolean
+ example: true
+ domains:
+ description: Nameserver group domain list
+ type: array
+ items:
+ type: string
+ minLength: 1
+ maxLength: 255
+ example: "example.com"
+ required:
+ - name
+ - description
+ - nameservers
+ - enabled
+ - groups
+ - primary
+ - domains
+ NameserverGroup:
+ allOf:
+ - type: object
+ properties:
+ id:
+ description: Nameserver group ID
+ type: string
+ example: ch8i4ug6lnn4g9hqv7m0
+ required:
+ - id
+ - $ref: '#/components/schemas/NameserverGroupRequest'
+ DNSSettings:
+ type: object
+ properties:
+ disabled_management_groups:
+ description: Groups whose DNS management is disabled
+ type: array
+ items:
+ type: string
+ example: ch8i4ug6lnn4g9hqv7m0
+ required:
+ - disabled_management_groups
+ Event:
+ type: object
+ properties:
+ id:
+ description: Event unique identifier
+ type: string
+ example: 10
+ timestamp:
+ description: The date and time when the event occurred
+ type: string
+ format: date-time
+ example: 2023-05-05T10:04:37.473542Z
+ activity:
+ description: The activity that occurred during the event
+ type: string
+ example: Route created
+ activity_code:
+ description: The string code of the activity that occurred during the event
+ type: string
+ enum: [ "user.peer.delete", "user.join", "user.invite", "user.peer.add", "user.group.add", "user.group.delete",
+ "user.role.update",
+ "setupkey.peer.add", "setupkey.add", "setupkey.update", "setupkey.revoke", "setupkey.overuse",
+ "setupkey.group.delete", "setupkey.group.add",
+ "rule.add", "rule.delete", "rule.update",
+ "policy.add", "policy.delete", "policy.update",
+ "group.add", "group.update", "dns.setting.disabled.management.group.add", "dns.setting.disabled.management.group.delete",
+ "account.create", "account.setting.peer.login.expiration.update", "account.setting.peer.login.expiration.disable", "account.setting.peer.login.expiration.enable",
+ "route.add", "route.delete", "route.update",
+ "nameserver.group.add", "nameserver.group.delete", "nameserver.group.update",
+ "peer.ssh.disable", "peer.ssh.enable", "peer.rename", "peer.login.expiration.disable", "peer.login.expiration.enable",
+ "service.user.create", "personal.access.token.create", "service.user.delete", "personal.access.token.delete" ]
+ example: route.add
+ initiator_id:
+ description: The ID of the initiator of the event. E.g., an ID of a user that triggered the event.
+ type: string
+ example: google-oauth2|123456789012345678901
+ target_id:
+ description: The ID of the target of the event. E.g., an ID of the peer that a user removed.
+ type: string
+ example: chad9d86lnnc59g18ou0
+ meta:
+ description: The metadata of the event
+ type: object
+ additionalProperties:
+ type: string
+ example: { "name": "my route", "network_range": "10.64.0.0/24", "peer_id": "chacbco6lnnbn6cg5s91"}
+ required:
+ - id
+ - timestamp
+ - activity
+ - activity_code
+ - initiator_id
+ - target_id
+ - meta
+ responses:
+ not_found:
+ description: Resource not found
+ content: { }
+ validation_failed_simple:
+ description: Validation failed
+ content: { }
+ bad_request:
+ description: Bad Request
+ content: { }
+ internal_error:
+ description: Internal Server Error
+ content: { }
+ validation_failed:
+ description: Validation failed
+ content: { }
+ forbidden:
+ description: Forbidden
+ content: { }
+ requires_authentication:
+ description: Requires authentication
+ content: { }
+ securitySchemes:
+ BearerAuth:
+ type: http
+ scheme: bearer
+ bearerFormat: JWT
+ TokenAuth:
+ type: apiKey
+ in: header
+ name: Authorization
+ description: >-
+ Enter the token with the `Token` prefix, e.g. "Token nbp_F3f0d.....".
+security:
+ - BearerAuth: [ ]
+ - TokenAuth: [ ]
+paths:
+ /api/accounts:
+ get:
+ summary: List all Accounts
+ description: Returns a list of accounts of a user. Always returns a list of one account.
+ tags: [ Accounts ]
+ operationId: getAccounts
+ security:
+ - BearerAuth: [ ]
+ - TokenAuth: [ ]
+ responses:
+ '200':
+ description: A JSON array of accounts
+ content:
+ application/json:
+ schema:
+ type: array
+ items:
+ $ref: '#/components/schemas/Account'
+ '400':
+ "$ref": "#/components/responses/bad_request"
+ '401':
+ "$ref": "#/components/responses/requires_authentication"
+ '403':
+ "$ref": "#/components/responses/forbidden"
+ '500':
+ "$ref": "#/components/responses/internal_error"
+ /api/accounts/{accountId}:
+ put:
+ summary: Update an Account
+ description: Update information about an account
+ tags: [ Accounts ]
+ operationId: updateAccount
+ security:
+ - BearerAuth: [ ]
+ - TokenAuth: [ ]
+ parameters:
+ - in: path
+ name: accountId
+ required: true
+ schema:
+ type: string
+ description: The unique identifier of an account
+ requestBody:
+ description: update an account
+ content:
+ 'application/json':
+ schema:
+ $ref: '#/components/schemas/AccountSettings'
+ responses:
+ '200':
+ description: An Account object
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/Account'
+ '400':
+ "$ref": "#/components/responses/bad_request"
+ '401':
+ "$ref": "#/components/responses/requires_authentication"
+ '403':
+ "$ref": "#/components/responses/forbidden"
+ '500':
+ "$ref": "#/components/responses/internal_error"
+ /api/users:
+ get:
+ summary: List all Users
+ description: Returns a list of all users
+ tags: [ Users ]
+ operationId: getUsers
+ security:
+ - BearerAuth: [ ]
+ - TokenAuth: [ ]
+ parameters:
+ - in: query
+ name: service_user
+ schema:
+ type: boolean
+ description: Filters users and returns either regular users or service users
+ responses:
+ '200':
+ description: A JSON array of Users
+ content:
+ application/json:
+ schema:
+ type: array
+ items:
+ $ref: '#/components/schemas/User'
+ '400':
+ "$ref": "#/components/responses/bad_request"
+ '401':
+ "$ref": "#/components/responses/requires_authentication"
+ '403':
+ "$ref": "#/components/responses/forbidden"
+ '500':
+ "$ref": "#/components/responses/internal_error"
+ post:
+ summary: Create a User
+ description: Creates a new service user or sends an invite to a regular user
+ tags: [ Users ]
+ operationId: createUser
+ security:
+ - BearerAuth: [ ]
+ - TokenAuth: [ ]
+ requestBody:
+ description: User invite information
+ content:
+ 'application/json':
+ schema:
+ $ref: '#/components/schemas/UserCreateRequest'
+ responses:
+ '200':
+ description: A User object
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/User'
+ '400':
+ "$ref": "#/components/responses/bad_request"
+ '401':
+ "$ref": "#/components/responses/requires_authentication"
+ '403':
+ "$ref": "#/components/responses/forbidden"
+ '500':
+ "$ref": "#/components/responses/internal_error"
+ /api/users/{userId}:
+ put:
+ summary: Update a User
+ description: Update information about a User
+ tags: [ Users ]
+ operationId: updateUser
+ security:
+ - BearerAuth: [ ]
+ - TokenAuth: [ ]
+ parameters:
+ - in: path
+ name: userId
+ required: true
+ schema:
+ type: string
+ description: The unique identifier of a user
+ requestBody:
+ description: User update
+ content:
+ 'application/json':
+ schema:
+ $ref: '#/components/schemas/UserRequest'
+ responses:
+ '200':
+ description: A User object
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/User'
+ '400':
+ "$ref": "#/components/responses/bad_request"
+ '401':
+ "$ref": "#/components/responses/requires_authentication"
+ '403':
+ "$ref": "#/components/responses/forbidden"
+ '500':
+ "$ref": "#/components/responses/internal_error"
+ delete:
+ summary: Delete a User
+ description: Delete a User
+ tags: [ Users ]
+ operationId: deleteUser
+ security:
+ - BearerAuth: [ ]
+ - TokenAuth: [ ]
+ parameters:
+ - in: path
+ name: userId
+ required: true
+ schema:
+ type: string
+ description: The unique identifier of a user
+ responses:
+ '200':
+ description: Delete status code
+ content: { }
+ '400':
+ "$ref": "#/components/responses/bad_request"
+ '401':
+ "$ref": "#/components/responses/requires_authentication"
+ '403':
+ "$ref": "#/components/responses/forbidden"
+ '500':
+ "$ref": "#/components/responses/internal_error"
+ /api/users/{userId}/tokens:
+ get:
+ summary: List all Tokens
+ description: Returns a list of all tokens for a user
+ tags: [ Tokens ]
+ operationId: getTokens
+ security:
+ - BearerAuth: [ ]
+ - TokenAuth: [ ]
+ parameters:
+ - in: path
+ name: userId
+ required: true
+ schema:
+ type: string
+ description: The unique identifier of a user
+ responses:
+ '200':
+ description: A JSON Array of PersonalAccessTokens
+ content:
+ application/json:
+ schema:
+ type: array
+ items:
+ $ref: '#/components/schemas/PersonalAccessToken'
+ '400':
+ "$ref": "#/components/responses/bad_request"
+ '401':
+ "$ref": "#/components/responses/requires_authentication"
+ '403':
+ "$ref": "#/components/responses/forbidden"
+ '500':
+ "$ref": "#/components/responses/internal_error"
+ post:
+ summary: Create a Token
+ description: Create a new token for a user
+ tags: [ Tokens ]
+ operationId: createToken
+ security:
+ - BearerAuth: [ ]
+ - TokenAuth: [ ]
+ parameters:
+ - in: path
+ name: userId
+ required: true
+ schema:
+ type: string
+ description: The unique identifier of a user
+ requestBody:
+ description: PersonalAccessToken create parameters
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/PersonalAccessTokenRequest'
+ responses:
+ '200':
+ description: The token in plain text
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/PersonalAccessTokenGenerated'
+ '400':
+ "$ref": "#/components/responses/bad_request"
+ '401':
+ "$ref": "#/components/responses/requires_authentication"
+ '403':
+ "$ref": "#/components/responses/forbidden"
+ '500':
+ "$ref": "#/components/responses/internal_error"
+ /api/users/{userId}/tokens/{tokenId}:
+ get:
+ summary: Retrieve a Token
+ description: Returns a specific token for a user
+ tags: [ Tokens ]
+ operationId: getToken
+ security:
+ - BearerAuth: [ ]
+ - TokenAuth: [ ]
+ parameters:
+ - in: path
+ name: userId
+ required: true
+ schema:
+ type: string
+ description: The unique identifier of a user
+ - in: path
+ name: tokenId
+ required: true
+ schema:
+ type: string
+ description: The unique identifier of a token
+ responses:
+ '200':
+ description: A PersonalAccessTokens Object
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/PersonalAccessToken'
+ '400':
+ "$ref": "#/components/responses/bad_request"
+ '401':
+ "$ref": "#/components/responses/requires_authentication"
+ '403':
+ "$ref": "#/components/responses/forbidden"
+ '500':
+ "$ref": "#/components/responses/internal_error"
+ delete:
+ summary: Delete a Token
+ description: Delete a token for a user
+ tags: [ Tokens ]
+ operationId: deleteToken
+ security:
+ - BearerAuth: [ ]
+ - TokenAuth: [ ]
+ parameters:
+ - in: path
+ name: userId
+ required: true
+ schema:
+ type: string
+ description: The unique identifier of a user
+ - in: path
+ name: tokenId
+ required: true
+ schema:
+ type: string
+ description: The unique identifier of a token
+ responses:
+ '200':
+ description: Delete status code
+ content: { }
+ '400':
+ "$ref": "#/components/responses/bad_request"
+ '401':
+ "$ref": "#/components/responses/requires_authentication"
+ '403':
+ "$ref": "#/components/responses/forbidden"
+ '500':
+ "$ref": "#/components/responses/internal_error"
+ /api/peers:
+ get:
+ summary: List all Peers
+ description: Returns a list of all peers
+ tags: [ Peers ]
+ operationId: getPeers
+ security:
+ - BearerAuth: [ ]
+ - TokenAuth: [ ]
+ responses:
+ '200':
+ description: A JSON Array of Peers
+ content:
+ application/json:
+ schema:
+ type: array
+ items:
+ $ref: '#/components/schemas/Peer'
+ '400':
+ "$ref": "#/components/responses/bad_request"
+ '401':
+ "$ref": "#/components/responses/requires_authentication"
+ '403':
+ "$ref": "#/components/responses/forbidden"
+ '500':
+ "$ref": "#/components/responses/internal_error"
+ /api/peers/{peerId}:
+ get:
+ summary: Retrieve a Peer
+ description: Get information about a peer
+ tags: [ Peers ]
+ operationId: getPeer
+ security:
+ - BearerAuth: [ ]
+ - TokenAuth: [ ]
+ parameters:
+ - in: path
+ name: peerId
+ required: true
+ schema:
+ type: string
+ description: The unique identifier of a peer
+ responses:
+ '200':
+ description: A Peer object
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/Peer'
+ '400':
+ "$ref": "#/components/responses/bad_request"
+ '401':
+ "$ref": "#/components/responses/requires_authentication"
+ '403':
+ "$ref": "#/components/responses/forbidden"
+ '500':
+ "$ref": "#/components/responses/internal_error"
+ put:
+ summary: Update a Peer
+ description: Update information about a peer
+ tags: [ Peers ]
+ security:
+ - BearerAuth: [ ]
+ - TokenAuth: [ ]
+ parameters:
+ - in: path
+ name: peerId
+ required: true
+ schema:
+ type: string
+ description: The unique identifier of a peer
+ requestBody:
+ description: update a peer
+ content:
+ 'application/json':
+ schema:
+ $ref: '#/components/schemas/PeerRequest'
+ responses:
+ '200':
+ description: A Peer object
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/Peer'
+ '400':
+ "$ref": "#/components/responses/bad_request"
+ '401':
+ "$ref": "#/components/responses/requires_authentication"
+ '403':
+ "$ref": "#/components/responses/forbidden"
+ '500':
+ "$ref": "#/components/responses/internal_error"
+ delete:
+ summary: Delete a Peer
+ description: Delete a peer
+ tags: [ Peers ]
+ security:
+ - BearerAuth: [ ]
+ - TokenAuth: [ ]
+ parameters:
+ - in: path
+ name: peerId
+ required: true
+ schema:
+ type: string
+ description: The unique identifier of a peer
+ responses:
+ '200':
+ description: Delete status code
+ content: { }
+ '400':
+ "$ref": "#/components/responses/bad_request"
+ '401':
+ "$ref": "#/components/responses/requires_authentication"
+ '403':
+ "$ref": "#/components/responses/forbidden"
+ '500':
+ "$ref": "#/components/responses/internal_error"
+ /api/setup-keys:
+ get:
+ summary: List all Setup Keys
+ description: Returns a list of all Setup Keys
+ tags: [ Setup Keys ]
+ security:
+ - BearerAuth: [ ]
+ - TokenAuth: [ ]
+ responses:
+ '200':
+ description: A JSON Array of Setup keys
+ content:
+ application/json:
+ schema:
+ type: array
+ items:
+ $ref: '#/components/schemas/SetupKey'
+ '400':
+ "$ref": "#/components/responses/bad_request"
+ '401':
+ "$ref": "#/components/responses/requires_authentication"
+ '403':
+ "$ref": "#/components/responses/forbidden"
+ '500':
+ "$ref": "#/components/responses/internal_error"
+ post:
+ summary: Create a Setup Key
+ description: Creates a Setup Key
+ tags: [ Setup Keys ]
+ security:
+ - BearerAuth: [ ]
+ - TokenAuth: [ ]
+ requestBody:
+ description: New Setup Key request
+ content:
+ 'application/json':
+ schema:
+ $ref: '#/components/schemas/SetupKeyRequest'
+ responses:
+ '200':
+ description: A Setup Keys Object
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/SetupKey'
+ '400':
+ "$ref": "#/components/responses/bad_request"
+ '401':
+ "$ref": "#/components/responses/requires_authentication"
+ '403':
+ "$ref": "#/components/responses/forbidden"
+ '500':
+ "$ref": "#/components/responses/internal_error"
+ /api/setup-keys/{keyId}:
+ get:
+ summary: Retrieve a Setup Key
+ description: Get information about a Setup Key
+ tags: [ Setup Keys ]
+ security:
+ - BearerAuth: [ ]
+ - TokenAuth: [ ]
+ parameters:
+ - in: path
+ name: keyId
+ required: true
+ schema:
+ type: string
+ description: The unique identifier of a setup key
+ responses:
+ '200':
+ description: A Setup Key object
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/SetupKey'
+ '400':
+ "$ref": "#/components/responses/bad_request"
+ '401':
+ "$ref": "#/components/responses/requires_authentication"
+ '403':
+ "$ref": "#/components/responses/forbidden"
+ '500':
+ "$ref": "#/components/responses/internal_error"
+ put:
+ summary: Update a Setup Key
+ description: Update information about a Setup Key
+ tags: [ Setup Keys ]
+ security:
+ - BearerAuth: [ ]
+ - TokenAuth: [ ]
+ parameters:
+ - in: path
+ name: keyId
+ required: true
+ schema:
+ type: string
+ description: The unique identifier of a setup key
+ requestBody:
+ description: update to Setup Key
+ content:
+ 'application/json':
+ schema:
+ $ref: '#/components/schemas/SetupKeyRequest'
+ responses:
+ '200':
+ description: A Setup Key object
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/SetupKey'
+ '400':
+ "$ref": "#/components/responses/bad_request"
+ '401':
+ "$ref": "#/components/responses/requires_authentication"
+ '403':
+ "$ref": "#/components/responses/forbidden"
+ '500':
+ "$ref": "#/components/responses/internal_error"
+ /api/groups:
+ get:
+ summary: List all Groups
+ description: Returns a list of all Groups
+ tags: [ Groups ]
+ security:
+ - BearerAuth: [ ]
+ - TokenAuth: [ ]
+ responses:
+ '200':
+ description: A JSON Array of Groups
+ content:
+ application/json:
+ schema:
+ type: array
+ items:
+ $ref: '#/components/schemas/Group'
+ '400':
+ "$ref": "#/components/responses/bad_request"
+ '401':
+ "$ref": "#/components/responses/requires_authentication"
+ '403':
+ "$ref": "#/components/responses/forbidden"
+ '500':
+ "$ref": "#/components/responses/internal_error"
+ post:
+ summary: Create a Group
+ description: Creates a Group
+ tags: [ Groups ]
+ security:
+ - BearerAuth: [ ]
+ - TokenAuth: [ ]
+ requestBody:
+ description: New Group request
+ content:
+ 'application/json':
+ schema:
+ $ref: '#/components/schemas/GroupRequest'
+ responses:
+ '200':
+ description: A Group Object
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/Group'
+ '400':
+ "$ref": "#/components/responses/bad_request"
+ '401':
+ "$ref": "#/components/responses/requires_authentication"
+ '403':
+ "$ref": "#/components/responses/forbidden"
+ '500':
+ "$ref": "#/components/responses/internal_error"
+ /api/groups/{groupId}:
+ get:
+ summary: Retrieve a Group
+ description: Get information about a Group
+ tags: [ Groups ]
+ security:
+ - BearerAuth: [ ]
+ - TokenAuth: [ ]
+ parameters:
+ - in: path
+ name: groupId
+ required: true
+ schema:
+ type: string
+ description: The unique identifier of a group
+ responses:
+ '200':
+ description: A Group object
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/Group'
+ '400':
+ "$ref": "#/components/responses/bad_request"
+ '401':
+ "$ref": "#/components/responses/requires_authentication"
+ '403':
+ "$ref": "#/components/responses/forbidden"
+ '500':
+ "$ref": "#/components/responses/internal_error"
+ put:
+ summary: Update a Group
+ description: Update/Replace a Group
+ tags: [ Groups ]
+ security:
+ - BearerAuth: [ ]
+ - TokenAuth: [ ]
+ parameters:
+ - in: path
+ name: groupId
+ required: true
+ schema:
+ type: string
+ description: The unique identifier of a group
+ requestBody:
+ description: Update Group request
+ content:
+ 'application/json':
+ schema:
+ $ref: '#/components/schemas/GroupRequest'
+ responses:
+ '200':
+ description: A Group object
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/Group'
+ '400':
+ "$ref": "#/components/responses/bad_request"
+ '401':
+ "$ref": "#/components/responses/requires_authentication"
+ '403':
+ "$ref": "#/components/responses/forbidden"
+ '500':
+ "$ref": "#/components/responses/internal_error"
+ delete:
+ summary: Delete a Group
+ description: Delete a Group
+ tags: [ Groups ]
+ security:
+ - BearerAuth: [ ]
+ - TokenAuth: [ ]
+ parameters:
+ - in: path
+ name: groupId
+ required: true
+ schema:
+ type: string
+ description: The unique identifier of a group
+ responses:
+ '200':
+ description: Delete status code
+ content: { }
+ '400':
+ "$ref": "#/components/responses/bad_request"
+ '401':
+ "$ref": "#/components/responses/requires_authentication"
+ '403':
+ "$ref": "#/components/responses/forbidden"
+ '500':
+ "$ref": "#/components/responses/internal_error"
+ /api/rules:
+ get:
+ summary: List all Rules
+ description: Returns a list of all Rules
+ tags: [ Rules ]
+ security:
+ - BearerAuth: [ ]
+ - TokenAuth: [ ]
+ responses:
+ '200':
+ description: A JSON Array of Rules
+ content:
+ application/json:
+ schema:
+ type: array
+ items:
+ $ref: '#/components/schemas/Rule'
+ '400':
+ "$ref": "#/components/responses/bad_request"
+ '401':
+ "$ref": "#/components/responses/requires_authentication"
+ '403':
+ "$ref": "#/components/responses/forbidden"
+ '500':
+ "$ref": "#/components/responses/internal_error"
+ post:
+ summary: Create a Rule
+ description: Creates a Rule
+ tags: [ Rules ]
+ security:
+ - BearerAuth: [ ]
+ - TokenAuth: [ ]
+ requestBody:
+ description: New Rule request
+ content:
+ 'application/json':
+ schema:
+ $ref: '#/components/schemas/RuleRequest'
+ responses:
+ '200':
+ description: A Rule Object
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/Rule'
+ /api/rules/{ruleId}:
+ get:
+ summary: Retrieve a Rule
+ description: Get information about a Rules
+ tags: [ Rules ]
+ security:
+ - BearerAuth: [ ]
+ - TokenAuth: [ ]
+ parameters:
+ - in: path
+ name: ruleId
+ required: true
+ schema:
+ type: string
+ description: The unique identifier of a rule
+ responses:
+ '200':
+ description: A Rule object
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/Rule'
+ '400':
+ "$ref": "#/components/responses/bad_request"
+ '401':
+ "$ref": "#/components/responses/requires_authentication"
+ '403':
+ "$ref": "#/components/responses/forbidden"
+ '500':
+ "$ref": "#/components/responses/internal_error"
+ put:
+ summary: Update a Rule
+ description: Update/Replace a Rule
+ tags: [ Rules ]
+ security:
+ - BearerAuth: [ ]
+ - TokenAuth: [ ]
+ parameters:
+ - in: path
+ name: ruleId
+ required: true
+ schema:
+ type: string
+ description: The unique identifier of a rule
+ requestBody:
+ description: Update Rule request
+ content:
+ 'application/json':
+ schema:
+ $ref: '#/components/schemas/RuleRequest'
+ responses:
+ '200':
+ description: A Rule object
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/Rule'
+ '400':
+ "$ref": "#/components/responses/bad_request"
+ '401':
+ "$ref": "#/components/responses/requires_authentication"
+ '403':
+ "$ref": "#/components/responses/forbidden"
+ '500':
+ "$ref": "#/components/responses/internal_error"
+ delete:
+ summary: Delete a Rule
+ description: Delete a Rule
+ tags: [ Rules ]
+ security:
+ - BearerAuth: [ ]
+ - TokenAuth: [ ]
+ parameters:
+ - in: path
+ name: ruleId
+ required: true
+ schema:
+ type: string
+ description: The unique identifier of a rule
+ responses:
+ '200':
+ description: Delete status code
+ content: { }
+ '400':
+ "$ref": "#/components/responses/bad_request"
+ '401':
+ "$ref": "#/components/responses/requires_authentication"
+ '403':
+ "$ref": "#/components/responses/forbidden"
+ '500':
+ "$ref": "#/components/responses/internal_error"
+ /api/policies:
+ get:
+ summary: List all Policies
+ description: Returns a list of all Policies
+ tags: [ Policies ]
+ security:
+ - BearerAuth: [ ]
+ - TokenAuth: [ ]
+ responses:
+ '200':
+ description: A JSON Array of Policies
+ content:
+ application/json:
+ schema:
+ type: array
+ items:
+ $ref: '#/components/schemas/Policy'
+ '400':
+ "$ref": "#/components/responses/bad_request"
+ '401':
+ "$ref": "#/components/responses/requires_authentication"
+ '403':
+ "$ref": "#/components/responses/forbidden"
+ '500':
+ "$ref": "#/components/responses/internal_error"
+ post:
+ summary: Create a Policy
+ description: Creates a Policy
+ tags: [ Policies ]
+ security:
+ - BearerAuth: [ ]
+ - TokenAuth: [ ]
+ requestBody:
+ description: New Policy request
+ content:
+ 'application/json':
+ schema:
+ $ref: '#/components/schemas/PolicyMinimum'
+ responses:
+ '200':
+ description: A Policy Object
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/Policy'
+ /api/policies/{policyId}:
+ get:
+ summary: Retrieve a Policy
+ description: Get information about a Policies
+ tags: [ Policies ]
+ security:
+ - BearerAuth: [ ]
+ - TokenAuth: [ ]
+ parameters:
+ - in: path
+ name: policyId
+ required: true
+ schema:
+ type: string
+ description: The unique identifier of a policy
+ responses:
+ '200':
+ description: A Policy object
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/Policy'
+ '400':
+ "$ref": "#/components/responses/bad_request"
+ '401':
+ "$ref": "#/components/responses/requires_authentication"
+ '403':
+ "$ref": "#/components/responses/forbidden"
+ '500':
+ "$ref": "#/components/responses/internal_error"
+ put:
+ summary: Update a Policy
+ description: Update/Replace a Policy
+ tags: [ Policies ]
+ security:
+ - BearerAuth: [ ]
+ - TokenAuth: [ ]
+ parameters:
+ - in: path
+ name: policyId
+ required: true
+ schema:
+ type: string
+ description: The unique identifier of a policy
+ requestBody:
+ description: Update Policy request
+ content:
+ 'application/json':
+ schema:
+ $ref: '#/components/schemas/PolicyMinimum'
+ responses:
+ '200':
+ description: A Policy object
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/Policy'
+ '400':
+ "$ref": "#/components/responses/bad_request"
+ '401':
+ "$ref": "#/components/responses/requires_authentication"
+ '403':
+ "$ref": "#/components/responses/forbidden"
+ '500':
+ "$ref": "#/components/responses/internal_error"
+ delete:
+ summary: Delete a Policy
+ description: Delete a Policy
+ tags: [ Policies ]
+ security:
+ - BearerAuth: [ ]
+ - TokenAuth: [ ]
+ parameters:
+ - in: path
+ name: policyId
+ required: true
+ schema:
+ type: string
+ description: The unique identifier of a policy
+ responses:
+ '200':
+ description: Delete status code
+ content: { }
+ '400':
+ "$ref": "#/components/responses/bad_request"
+ '401':
+ "$ref": "#/components/responses/requires_authentication"
+ '403':
+ "$ref": "#/components/responses/forbidden"
+ '500':
+ "$ref": "#/components/responses/internal_error"
+ /api/routes:
+ get:
+ summary: List all Routes
+ description: Returns a list of all routes
+ tags: [ Routes ]
+ security:
+ - BearerAuth: [ ]
+ - TokenAuth: [ ]
+ responses:
+ '200':
+ description: A JSON Array of Routes
+ content:
+ application/json:
+ schema:
+ type: array
+ items:
+ $ref: '#/components/schemas/Route'
+ '400':
+ "$ref": "#/components/responses/bad_request"
+ '401':
+ "$ref": "#/components/responses/requires_authentication"
+ '403':
+ "$ref": "#/components/responses/forbidden"
+ '500':
+ "$ref": "#/components/responses/internal_error"
+ post:
+ summary: Create a Route
+ description: Creates a Route
+ tags: [ Routes ]
+ security:
+ - BearerAuth: [ ]
+ - TokenAuth: [ ]
+ requestBody:
+ description: New Routes request
+ content:
+ 'application/json':
+ schema:
+ $ref: '#/components/schemas/RouteRequest'
+ responses:
+ '200':
+ description: A Route Object
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/Route'
+ '400':
+ "$ref": "#/components/responses/bad_request"
+ '401':
+ "$ref": "#/components/responses/requires_authentication"
+ '403':
+ "$ref": "#/components/responses/forbidden"
+ '500':
+ "$ref": "#/components/responses/internal_error"
+
+ /api/routes/{routeId}:
+ get:
+ summary: Retrieve a Route
+ description: Get information about a Routes
+ tags: [ Routes ]
+ security:
+ - BearerAuth: [ ]
+ - TokenAuth: [ ]
+ parameters:
+ - in: path
+ name: routeId
+ required: true
+ schema:
+ type: string
+ description: The unique identifier of a route
+ responses:
+ '200':
+ description: A Route object
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/Route'
+ '400':
+ "$ref": "#/components/responses/bad_request"
+ '401':
+ "$ref": "#/components/responses/requires_authentication"
+ '403':
+ "$ref": "#/components/responses/forbidden"
+ '500':
+ "$ref": "#/components/responses/internal_error"
+ put:
+ summary: Update a Route
+ description: Update/Replace a Route
+ tags: [ Routes ]
+ security:
+ - BearerAuth: [ ]
+ - TokenAuth: [ ]
+ parameters:
+ - in: path
+ name: routeId
+ required: true
+ schema:
+ type: string
+ description: The unique identifier of a route
+ requestBody:
+ description: Update Route request
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/RouteRequest'
+ responses:
+ '200':
+ description: A Route object
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/Route'
+ '400':
+ "$ref": "#/components/responses/bad_request"
+ '401':
+ "$ref": "#/components/responses/requires_authentication"
+ '403':
+ "$ref": "#/components/responses/forbidden"
+ '500':
+ "$ref": "#/components/responses/internal_error"
+ delete:
+ summary: Delete a Route
+ description: Delete a Route
+ tags: [ Routes ]
+ security:
+ - BearerAuth: [ ]
+ - TokenAuth: [ ]
+ parameters:
+ - in: path
+ name: routeId
+ required: true
+ schema:
+ type: string
+ description: The unique identifier of a route
+ responses:
+ '200':
+ description: Delete status code
+ content: { }
+ '400':
+ "$ref": "#/components/responses/bad_request"
+ '401':
+ "$ref": "#/components/responses/requires_authentication"
+ '403':
+ "$ref": "#/components/responses/forbidden"
+ '500':
+ "$ref": "#/components/responses/internal_error"
+ /api/dns/nameservers:
+ get:
+ summary: List all Nameserver Groups
+ description: Returns a list of all Nameserver Groups
+ tags: [ DNS ]
+ security:
+ - BearerAuth: [ ]
+ - TokenAuth: [ ]
+ responses:
+ '200':
+ description: A JSON Array of Nameserver Groups
+ content:
+ application/json:
+ schema:
+ type: array
+ items:
+ $ref: '#/components/schemas/NameserverGroup'
+ '400':
+ "$ref": "#/components/responses/bad_request"
+ '401':
+ "$ref": "#/components/responses/requires_authentication"
+ '403':
+ "$ref": "#/components/responses/forbidden"
+ '500':
+ "$ref": "#/components/responses/internal_error"
+ post:
+ summary: Create a Nameserver Group
+ description: Creates a Nameserver Group
+ tags: [ DNS ]
+ security:
+ - BearerAuth: [ ]
+ - TokenAuth: [ ]
+ requestBody:
+ description: New Nameserver Groups request
+ content:
+ 'application/json':
+ schema:
+ $ref: '#/components/schemas/NameserverGroupRequest'
+ responses:
+ '200':
+ description: A Nameserver Groups Object
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/NameserverGroup'
+ '400':
+ "$ref": "#/components/responses/bad_request"
+ '401':
+ "$ref": "#/components/responses/requires_authentication"
+ '403':
+ "$ref": "#/components/responses/forbidden"
+ '500':
+ "$ref": "#/components/responses/internal_error"
+ /api/dns/nameservers/{nsgroupId}:
+ get:
+ summary: Retrieve a Nameserver Group
+ description: Get information about a Nameserver Groups
+ tags: [ DNS ]
+ security:
+ - BearerAuth: [ ]
+ - TokenAuth: [ ]
+ parameters:
+ - in: path
+ name: nsgroupId
+ required: true
+ schema:
+ type: string
+ description: The unique identifier of a Nameserver Group
+ responses:
+ '200':
+ description: A Nameserver Group object
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/NameserverGroup'
+ '400':
+ "$ref": "#/components/responses/bad_request"
+ '401':
+ "$ref": "#/components/responses/requires_authentication"
+ '403':
+ "$ref": "#/components/responses/forbidden"
+ '500':
+ "$ref": "#/components/responses/internal_error"
+ put:
+ summary: Update a Nameserver Group
+ description: Update/Replace a Nameserver Group
+ tags: [ DNS ]
+ security:
+ - BearerAuth: [ ]
+ - TokenAuth: [ ]
+ parameters:
+ - in: path
+ name: nsgroupId
+ required: true
+ schema:
+ type: string
+ description: The unique identifier of a Nameserver Group
+ requestBody:
+ description: Update Nameserver Group request
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/NameserverGroupRequest'
+ responses:
+ '200':
+ description: A Nameserver Group object
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/NameserverGroup'
+ '400':
+ "$ref": "#/components/responses/bad_request"
+ '401':
+ "$ref": "#/components/responses/requires_authentication"
+ '403':
+ "$ref": "#/components/responses/forbidden"
+ '500':
+ "$ref": "#/components/responses/internal_error"
+ delete:
+ summary: Delete a Nameserver Group
+ description: Delete a Nameserver Group
+ tags: [ DNS ]
+ security:
+ - BearerAuth: [ ]
+ - TokenAuth: [ ]
+ parameters:
+ - in: path
+ name: nsgroupId
+ required: true
+ schema:
+ type: string
+ description: The unique identifier of a Nameserver Group
+ responses:
+ '200':
+ description: Delete status code
+ content: { }
+ '400':
+ "$ref": "#/components/responses/bad_request"
+ '401':
+ "$ref": "#/components/responses/requires_authentication"
+ '403':
+ "$ref": "#/components/responses/forbidden"
+ '500':
+ "$ref": "#/components/responses/internal_error"
+ /api/dns/settings:
+ get:
+ summary: Retrieve DNS Settings
+ description: Returns a DNS settings object
+ tags: [ DNS ]
+ security:
+ - BearerAuth: [ ]
+ - TokenAuth: [ ]
+ responses:
+ '200':
+ description: A JSON Object of DNS Setting
+ content:
+ application/json:
+ schema:
+ items:
+ $ref: '#/components/schemas/DNSSettings'
+ '400':
+ "$ref": "#/components/responses/bad_request"
+ '401':
+ "$ref": "#/components/responses/requires_authentication"
+ '403':
+ "$ref": "#/components/responses/forbidden"
+ '500':
+ "$ref": "#/components/responses/internal_error"
+ put:
+ summary: Update DNS Settings
+ description: Updates a DNS settings object
+ tags: [ DNS ]
+ security:
+ - BearerAuth: [ ]
+ - TokenAuth: [ ]
+ requestBody:
+ description: A DNS settings object
+ content:
+ 'application/json':
+ schema:
+ $ref: '#/components/schemas/DNSSettings'
+ responses:
+ '200':
+ description: A JSON Object of DNS Setting
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/DNSSettings'
+ '400':
+ "$ref": "#/components/responses/bad_request"
+ '401':
+ "$ref": "#/components/responses/requires_authentication"
+ '403':
+ "$ref": "#/components/responses/forbidden"
+ '500':
+ "$ref": "#/components/responses/internal_error"
+ /api/events:
+ get:
+ summary: List all Events
+ description: Returns a list of all events
+ tags: [ Events ]
+ security:
+ - BearerAuth: [ ]
+ - TokenAuth: [ ]
+ responses:
+ '200':
+ description: A JSON Array of Events
+ content:
+ application/json:
+ schema:
+ type: array
+ items:
+ $ref: '#/components/schemas/Event'
+ '400':
+ "$ref": "#/components/responses/bad_request"
+ '401':
+ "$ref": "#/components/responses/requires_authentication"
+ '403':
+ "$ref": "#/components/responses/forbidden"
+ '500':
+ "$ref": "#/components/responses/internal_error"
diff --git a/generator/templates/ApiTemplate.ts b/generator/templates/ApiTemplate.ts
new file mode 100644
index 00000000..e35a7c81
--- /dev/null
+++ b/generator/templates/ApiTemplate.ts
@@ -0,0 +1,272 @@
+const template = `
+
+export const title = '<%- tag %>'
+
+<% operations.forEach(function(operation){ %>
+
+## <%- operation.summary %> {{ tag: '<%- operation.operation.toUpperCase() %>' , label: '<%- operation.path %>' }}
+
+
+
+ <%- operation.description %>
+ <% if(operation.parameters && operation.parameters.filter((parameter) => parameter.in === 'path').length > 0){ %>
+ #### Path Parameters
+
+ <% operation.parameters.filter((parameter) => parameter.in === 'path').forEach(function(parameter){ %>
+
+ <%- parameter.description %>
+
+ <% }); -%>
+
+ <% }; -%>
+ <% if(operation.parameters && operation.parameters.filter((parameter) => parameter.in === 'query').length > 0){ %>
+ #### Query Parameters
+
+ <% operation.parameters.filter((parameter) => parameter.in === 'query').forEach(function(parameter){ %>
+
+ <%- parameter.description %>
+
+ <% }); -%>
+
+ <% }; -%>
+ <% if(operation.requestBody?.content && operation.requestBody?.content['application/json']){ %>
+ #### Request-Body Parameters
+
+ <% components.get(operation.requestBody?.content['application/json'].schema.$ref.split('/').pop())?.parameters.forEach(function(parameter){ %>
+ \}
+ <% if(parameter.enum){ %>
+ enumList="<%- parameter.enum %>"
+ <% }; -%>
+ <% if(parameter.minimum){ %>
+ min=\{<%- parameter.minimum %>\}
+ <% }; -%>
+ <% if(parameter.maximum){ %>
+ max=\{<%- parameter.maximum %>\}
+ <% }; -%>
+ <% if(parameter.minLength){ %>
+ minLen=\{<%- parameter.minLength %>\}
+ <% }; -%>
+ <% if(parameter.maxLength){ %>
+ maxLen=\{<%- parameter.maxLength %>\}
+ <% }; -%> >
+ <%- parameter.description %>
+
+ <% }); -%>
+
+ <% }; -%>
+
+
+
+
+\`\`\`bash {{ title: 'cURL' }}
+<% if(true){ -%>
+curl -X <%- operation.operation.toUpperCase() %> <%- operation.fullPath %> \\<% }; -%>
+<% if(operation.responseList[0].content && operation.responseList[0].content['application/json']){ %>
+-H 'Accept: application/json' \\<% }; -%>
+<% if(operation.requestBody?.content && operation.requestBody?.content['application/json']){ %>
+-H 'Content-Type: application/json' \\<% }; %>
+-H 'Authorization: Token ' <% if(operation.requestBody?.content && operation.requestBody?.content['application/json']){ %>\\\n--data-raw '<%- JSON.stringify(components.get(operation.requestBody?.content['application/json'].schema.$ref?.split('/').pop())?.example, null, 2) -%>'<% }; %>
+\`\`\`
+
+\`\`\`js
+const axios = require('axios');
+<% if(operation.requestBody?.content && operation.requestBody?.content['application/json']){ -%>
+let data = JSON.stringify(<%- JSON.stringify(components.get(operation.requestBody?.content['application/json'].schema.$ref?.split('/').pop())?.example, null, 2) %>);<% }; -%>
+
+let config = {
+ method: '<%- operation.operation.toLowerCase() %>',
+ maxBodyLength: Infinity,
+ url: '<%- operation.path %>',
+ <% if(true){%>headers: { <% }; -%>
+ <% if(operation.responseList[0].content && operation.responseList[0].content['application/json']){ %>
+ 'Accept': 'application/json',<% }; -%>
+ <% if(operation.requestBody?.content && operation.requestBody?.content['application/json']){ %>
+ 'Content-Type': 'application/json',<% }; %>
+ 'Authorization': 'Token '
+ <% if(true){ -%>}<% }; -%><% if(operation.requestBody?.content && operation.requestBody?.content['application/json']){ -%>,<% }; -%>
+ <% if(operation.requestBody?.content && operation.requestBody?.content['application/json']){ %>
+ data : data<% }; %>
+};
+
+axios(config)
+.then((response) => {
+ console.log(JSON.stringify(response.data));
+})
+.catch((error) => {
+ console.log(error);
+});
+\`\`\`
+
+\`\`\`python
+import requests
+import json
+
+url = "<%- operation.fullPath %>"
+<% if(operation.requestBody?.content && operation.requestBody?.content['application/json']){ -%>
+payload = json.dumps(<%- JSON.stringify(components.get(operation.requestBody?.content['application/json'].schema.$ref?.split('/').pop())?.example, null, 2) %>)<% }; -%>
+
+<% if(true){%>headers: { <% }; -%>
+ <% if(operation.requestBody?.content && operation.requestBody?.content['application/json']){ %>
+ 'Content-Type': 'application/json',<% }; -%>
+ <% if(operation.responseList[0].content && operation.responseList[0].content['application/json']){ %>
+ 'Accept': 'application/json',<% }; %>
+ 'Authorization': 'Token '
+}
+
+response = requests.request("<%- operation.operation.toUpperCase() %>", url, headers=headers<% if(operation.requestBody?.content && operation.requestBody?.content['application/json']){ %>, data=payload<% }; %>)
+
+print(response.text)
+\`\`\`
+
+\`\`\`go
+package main
+
+import (
+ "fmt"
+ "strings"
+ "net/http"
+ "io/ioutil"
+)
+
+func main() {
+
+ url := "<%- operation.fullPath %>"
+ method := "<%- operation.operation.toUpperCase() %>"
+ <% if(operation.requestBody?.content && operation.requestBody?.content['application/json']){ %>
+ payload := strings.NewReader(\`<%- JSON.stringify(components.get(operation.requestBody?.content['application/json'].schema.$ref?.split('/').pop())?.example, null, 2) %>\`)<% }; -%>
+
+ client := &http.Client {
+ }
+ req, err := http.NewRequest(method, url, <% if(operation.requestBody?.content && operation.requestBody?.content['application/json']){ %>payload<% } else { %>nil<% }; %>)
+
+ if err != nil {
+ fmt.Println(err)
+ return
+ <% if(true){%>{<% }; -%>
+
+ <% if(operation.requestBody?.content && operation.requestBody?.content['application/json']){ %>
+ req.Header.Add("Content-Type", "application/json")<% }; -%>
+ <% if(operation.responseList[0].content && operation.responseList[0].content['application/json']){ %>
+ req.Header.Add("Accept", "application/json")<% }; %>
+ req.Header.Add("Authorization", "Token ")
+
+ res, err := client.Do(req)
+ if err != nil {
+ fmt.Println(err)
+ return
+ }
+ defer res.Body.Close()
+
+ body, err := ioutil.ReadAll(res.Body)
+ if err != nil {
+ fmt.Println(err)
+ return
+ }
+ fmt.Println(string(body))
+}
+\`\`\`
+
+\`\`\`ruby
+require "uri"
+require "json"
+require "net/http"
+
+url = URI("<%- operation.fullPath %>")
+
+https = Net::HTTP.new(url.host, url.port)
+https.use_ssl = true
+
+<% if(true){ %>request = Net::HTTP::<%- operation.operation.slice(0,1).toUpperCase() + operation.operation.slice(1).toLowerCase()%>.new(url)<% }; -%>
+<% if(operation.requestBody?.content && operation.requestBody?.content['application/json']){ %>
+request["Content-Type"] = "application/json"<% }; -%>
+<% if(operation.responseList[0].content && operation.responseList[0].content['application/json']){ %>
+request["Accept"] = "application/json"<% }; %>
+request["Authorization"] = "Token "
+<% if(operation.requestBody?.content && operation.requestBody?.content['application/json']){ %>
+request.body = JSON.dump(<%- JSON.stringify(components.get(operation.requestBody?.content['application/json'].schema.$ref?.split('/').pop())?.example, null, 2) %>)<% }; -%>
+
+response = https.request(request)
+puts response.read_body
+\`\`\`
+
+\`\`\`java
+OkHttpClient client = new OkHttpClient().newBuilder()
+ .build();
+<% if(operation.requestBody?.content && operation.requestBody?.content['application/json']){ -%>
+MediaType mediaType = MediaType.parse("application/json");
+RequestBody body = RequestBody.create(mediaType, '<%- JSON.stringify(components.get(operation.requestBody?.content['application/json'].schema.$ref?.split('/').pop())?.example, null, 2) %>');<% }; %>
+Request request = new Request.Builder()
+ .url("<%- operation.fullPath %>")
+ <% if(true){ %>.method("<%- operation.operation.toUpperCase() %>"<% if(operation.requestBody?.content && operation.requestBody?.content['application/json']){ %>, body<% }; %>)<% }; -%>
+ <% if(operation.requestBody?.content && operation.requestBody?.content['application/json']){ %>
+ .addHeader("Content-Type", "application/json")<% }; -%>
+ <% if(operation.responseList[0].content && operation.responseList[0].content['application/json']){ %>
+ .addHeader("Accept", "application/json")<% }; %>
+ .addHeader("Authorization: Token ")
+ .build();
+Response response = client.newCall(request).execute();
+\`\`\`
+
+\`\`\`php
+ '<%- operation.fullPath %>',
+ CURLOPT_RETURNTRANSFER => true,
+ CURLOPT_ENCODING => '',
+ CURLOPT_MAXREDIRS => 10,
+ CURLOPT_TIMEOUT => 0,
+ CURLOPT_FOLLOWLOCATION => true,
+ CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
+ <% if(true){ %>CURLOPT_CUSTOMREQUEST => '<%- operation.operation.toUpperCase() %>',<% }; -%>
+ <% if(operation.requestBody?.content && operation.requestBody?.content['application/json']){ %>
+ CURLOPT_POSTFIELDS => '<%- JSON.stringify(components.get(operation.requestBody?.content['application/json'].schema.$ref?.split('/').pop())?.example, null, 2) %>',<% }; %>
+ <% if(true){ %>CURLOPT_HTTPHEADER => array(<% }; -%>
+ <% if(operation.requestBody?.content && operation.requestBody?.content['application/json']){ %>
+ 'Content-Type: application/json',<% }; -%>
+ <% if(operation.responseList[0].content && operation.responseList[0].content['application/json']){ %>
+ 'Accept: application/json',<% }; %>
+ 'Authorization: Token '
+ ),
+));
+
+$response = curl_exec($curl);
+
+curl_close($curl);
+echo $response;
+\`\`\`
+
+
+ <% operation.responseList.forEach(function(response){ %>
+ <% if(response?.content && response?.content['application/json']){ %>
+ <% if(response?.content['application/json'].schema.type === 'array'){ %>
+
+\`\`\`json {{ title: 'Example' }}
+<%- JSON.stringify(new Array(components.get(response?.content['application/json'].schema.items.$ref?.split('/').pop())?.example), null, 2) %>
+\`\`\`
+\`\`\`json {{ title: 'Schema' }}
+<%- JSON.stringify(new Array(components.get(response?.content['application/json'].schema.items.$ref?.split('/').pop())?.schema), null, 2) %>
+\`\`\`
+
+ <% } else { %>
+
+\`\`\`json {{ title: 'Example' }}
+<%- JSON.stringify(components.get(response?.content['application/json'].schema.$ref?.split('/').pop())?.example, null, 2) %>
+\`\`\`
+\`\`\`json {{ title: 'Schema' }}
+<%- JSON.stringify(components.get(response?.content['application/json'].schema.$ref?.split('/').pop())?.schema, null, 2) %>
+\`\`\`
+
+ <% }; -%>
+ <% }; -%>
+ <% }); -%>
+
+
+
+---
+<% }); -%>
+`.trim()
+
+export default template
diff --git a/generator/tsconfig.json b/generator/tsconfig.json
new file mode 100644
index 00000000..8615cb56
--- /dev/null
+++ b/generator/tsconfig.json
@@ -0,0 +1,13 @@
+// generator files need their own tsconfig.json because they don't like "module": "esnext" setting that nextjs requires in the main tsconfig
+{
+ "compilerOptions": {
+ "incremental": true,
+ "noImplicitAny": false,
+ "baseUrl": ".",
+ "paths": {
+ "~/*": ["./*"]
+ }
+ },
+ "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx"],
+ "exclude": ["node_modules"]
+}
diff --git a/jsconfig.json b/jsconfig.json
new file mode 100644
index 00000000..2c8ee2bb
--- /dev/null
+++ b/jsconfig.json
@@ -0,0 +1,8 @@
+{
+ "compilerOptions": {
+ "baseUrl": ".",
+ "paths": {
+ "@/*": ["src/*"]
+ }
+ }
+}
diff --git a/mdx/recma.mjs b/mdx/recma.mjs
new file mode 100644
index 00000000..48901160
--- /dev/null
+++ b/mdx/recma.mjs
@@ -0,0 +1,19 @@
+import { mdxAnnotations } from 'mdx-annotations'
+import recmaNextjsStaticProps from 'recma-nextjs-static-props'
+
+function recmaRemoveNamedExports() {
+ return (tree) => {
+ tree.body = tree.body.map((node) => {
+ if (node.type === 'ExportNamedDeclaration') {
+ return node.declaration
+ }
+ return node
+ })
+ }
+}
+
+export const recmaPlugins = [
+ mdxAnnotations.recma,
+ recmaRemoveNamedExports,
+ recmaNextjsStaticProps,
+]
diff --git a/mdx/rehype.mjs b/mdx/rehype.mjs
new file mode 100644
index 00000000..9c93cab1
--- /dev/null
+++ b/mdx/rehype.mjs
@@ -0,0 +1,128 @@
+import { mdxAnnotations } from 'mdx-annotations'
+import { visit } from 'unist-util-visit'
+import rehypeMdxTitle from 'rehype-mdx-title'
+import shiki from 'shiki'
+import { toString } from 'mdast-util-to-string'
+import * as acorn from 'acorn'
+import { slugifyWithCounter } from '@sindresorhus/slugify'
+
+function rehypeParseCodeBlocks() {
+ return (tree) => {
+ visit(tree, 'element', (node, _nodeIndex, parentNode) => {
+ if (node.tagName === 'code' && node.properties.className) {
+ parentNode.properties.language = node.properties.className[0]?.replace(
+ /^language-/,
+ ''
+ )
+ }
+ })
+ }
+}
+
+let highlighter
+
+function rehypeShiki() {
+ return async (tree) => {
+ highlighter =
+ highlighter ?? (await shiki.getHighlighter({ theme: 'css-variables' }))
+
+ visit(tree, 'element', (node) => {
+ if (node.tagName === 'pre' && node.children[0]?.tagName === 'code') {
+ let codeNode = node.children[0]
+ let textNode = codeNode.children[0]
+
+ node.properties.code = textNode.value
+
+ if (node.properties.language) {
+ let tokens = highlighter.codeToThemedTokens(
+ textNode.value,
+ node.properties.language
+ )
+
+ textNode.value = shiki.renderToHtml(tokens, {
+ elements: {
+ pre: ({ children }) => children,
+ code: ({ children }) => children,
+ line: ({ children }) => `${children} `,
+ },
+ })
+ }
+ }
+ })
+ }
+}
+
+function rehypeSlugify() {
+ return (tree) => {
+ let slugify = slugifyWithCounter()
+ visit(tree, 'element', (node) => {
+ if ( ['h2', 'h3', 'h4', 'h5', 'h6'].includes(node.tagName) && !node.properties.id) {
+ node.properties.id = slugify(toString(node))
+ }
+ })
+ }
+}
+
+function rehypeAddMDXExports(getExports) {
+ return (tree) => {
+ let exports = Object.entries(getExports(tree))
+
+ for (let [name, value] of exports) {
+ for (let node of tree.children) {
+ if (
+ node.type === 'mdxjsEsm' &&
+ new RegExp(`export\\s+const\\s+${name}\\s*=`).test(node.value)
+ ) {
+ return
+ }
+ }
+
+ let exportStr = `export const ${name} = ${value}`
+
+ tree.children.push({
+ type: 'mdxjsEsm',
+ value: exportStr,
+ data: {
+ estree: acorn.parse(exportStr, {
+ sourceType: 'module',
+ ecmaVersion: 'latest',
+ }),
+ },
+ })
+ }
+ }
+}
+
+function getSections(node) {
+ let sections = []
+
+ for (let child of node.children ?? []) {
+ if (child.type === 'element' && ['h2', 'h3', 'h4', 'h5', 'h6'].includes(child.tagName)) {
+ sections.push(`{
+ title: ${JSON.stringify(toString(child))},
+ id: ${JSON.stringify(child.properties.id)},
+ tagName: ${JSON.stringify(child.tagName)},
+ tag: ${JSON.stringify(child.tag)},
+ ...${child.properties.annotation}
+ }`)
+ } else if (child.children) {
+ sections.push(...getSections(child))
+ }
+ }
+
+ return sections
+}
+
+export const rehypePlugins = [
+ mdxAnnotations.rehype,
+ rehypeParseCodeBlocks,
+ rehypeShiki,
+ rehypeSlugify,
+ rehypeMdxTitle,
+ [
+ rehypeAddMDXExports,
+ (tree) => ({
+ sections: `[${getSections(tree).join()}]`,
+ }),
+ ],
+]
diff --git a/mdx/remark.mjs b/mdx/remark.mjs
new file mode 100644
index 00000000..e523464b
--- /dev/null
+++ b/mdx/remark.mjs
@@ -0,0 +1,4 @@
+import { mdxAnnotations } from 'mdx-annotations'
+import remarkGfm from 'remark-gfm'
+
+export const remarkPlugins = [mdxAnnotations.remark, remarkGfm]
diff --git a/next.config.mjs b/next.config.mjs
new file mode 100644
index 00000000..50e393d7
--- /dev/null
+++ b/next.config.mjs
@@ -0,0 +1,45 @@
+import nextMDX from '@next/mdx'
+import { remarkPlugins } from './mdx/remark.mjs'
+import { rehypePlugins } from './mdx/rehype.mjs'
+import { recmaPlugins } from './mdx/recma.mjs'
+import rehypeSlug from "rehype-slug";
+
+const withMDX = nextMDX({
+ options: {
+ remarkPlugins,
+ // rehypeSlug,
+ rehypePlugins,
+ recmaPlugins,
+ providerImportSource: '@mdx-js/react',
+ },
+})
+
+/** @type {import('next').NextConfig} */
+const nextConfig = {
+ reactStrictMode: true,
+ pageExtensions: ['js', 'jsx', 'ts', 'tsx', 'mdx'],
+ experimental: {
+ scrollRestoration: true,
+ },
+ redirects: async () => {
+ return [
+ {
+ source: '/',
+ destination: '/docs/introduction',
+ permanent: true,
+ },
+ {
+ source: '/docs',
+ destination: '/docs/introduction',
+ permanent: true,
+ },
+ {
+ source: '/ipa',
+ destination: '/ipa/introduction',
+ permanent: true,
+ },
+ ]
+ }
+}
+
+export default withMDX(nextConfig)
diff --git a/package.json b/package.json
index 51fc0e1a..18c5b3ea 100644
--- a/package.json
+++ b/package.json
@@ -3,40 +3,62 @@
"version": "1.0.0",
"private": true,
"scripts": {
- "docusaurus": "docusaurus",
- "start": "docusaurus serve",
- "dev": "docusaurus start --host 0.0.0.0",
- "build": "docusaurus build",
- "swizzle": "docusaurus swizzle",
- "deploy": "docusaurus deploy",
- "clear": "docusaurus clear",
- "serve": "docusaurus serve",
- "write-translations": "docusaurus write-translations",
- "write-heading-ids": "docusaurus write-heading-ids"
- },
- "dependencies": {
- "@docusaurus/core": "2.0.0-beta.20",
- "@docusaurus/plugin-google-analytics": "^2.0.0-beta.21",
- "@docusaurus/preset-classic": "2.0.0-beta.20",
- "@mdx-js/react": "^1.6.21",
- "@svgr/webpack": "^5.5.0",
- "clsx": "^1.1.1",
- "file-loader": "^6.2.0",
- "prism-react-renderer": "^1.2.1",
- "react": "^17.0.1",
- "react-dom": "^17.0.1",
- "url-loader": "^4.1.1"
+ "dev": "next dev",
+ "build": "next build",
+ "gen": "swagger-codegen generate -i generator/openapi.yml -l openapi -o generator/api.json && npx ts-node generator/index.ts gen --input generator/api.json/openapi.json --output src/pages/ipa/resources",
+ "start": "next start",
+ "lint": "next lint"
},
"browserslist": {
"production": [
">0.5%",
"not dead",
- "not op_mini all"
+ "not op_mini all",
+ "defaults, not ie <= 11"
],
"development": [
"last 1 chrome version",
"last 1 firefox version",
"last 1 safari version"
]
+ },
+ "dependencies": {
+ "@algolia/autocomplete-core": "^1.9.2",
+ "@algolia/autocomplete-preset-algolia": "^1.9.2",
+ "@headlessui/react": "^1.7.13",
+ "@mdx-js/loader": "^2.1.5",
+ "@mdx-js/react": "^2.1.5",
+ "@next/mdx": "^13.4.1",
+ "@sindresorhus/slugify": "^2.1.1",
+ "@tailwindcss/typography": "^0.5.8",
+ "acorn": "^8.8.2",
+ "algoliasearch": "^4.17.0",
+ "autoprefixer": "^10.4.7",
+ "clsx": "^1.2.0",
+ "ejs": "^3.1.9",
+ "focus-visible": "^5.2.0",
+ "framer-motion": "10.12.9",
+ "lodash": "^4.17.21",
+ "mdast-util-to-string": "^3.2.0",
+ "mdx-annotations": "^0.1.1",
+ "next": "13.4.1",
+ "openapi-types": "^12.1.0",
+ "postcss-focus-visible": "^8.0.2",
+ "react": "18.2.0",
+ "react-dom": "18.2.0",
+ "recma-nextjs-static-props": "^1.0.0",
+ "rehype-mdx-title": "^2.0.0",
+ "rehype-slug": "^5.1.0",
+ "remark-gfm": "^3.0.1",
+ "shiki": "^0.14.2",
+ "tailwindcss": "^3.3.0",
+ "unist-util-visit": "^4.1.2",
+ "zustand": "^4.3.8"
+ },
+ "devDependencies": {
+ "eslint": "8.40.0",
+ "eslint-config-next": "13.4.1",
+ "prettier": "^2.8.7",
+ "prettier-plugin-tailwindcss": "^0.2.6"
}
}
diff --git a/postcss.config.js b/postcss.config.js
new file mode 100644
index 00000000..6573c253
--- /dev/null
+++ b/postcss.config.js
@@ -0,0 +1,9 @@
+module.exports = {
+ plugins: {
+ tailwindcss: {},
+ 'postcss-focus-visible': {
+ replaceWith: '[data-focus-visible-added]',
+ },
+ autoprefixer: {},
+ },
+}
diff --git a/prettier.config.js b/prettier.config.js
new file mode 100644
index 00000000..35bb2b2a
--- /dev/null
+++ b/prettier.config.js
@@ -0,0 +1,5 @@
+module.exports = {
+ singleQuote: true,
+ semi: false,
+ plugins: [require('prettier-plugin-tailwindcss')],
+}
diff --git a/static/img/architecture/acls.png b/public/img/architecture/acls.png
similarity index 100%
rename from static/img/architecture/acls.png
rename to public/img/architecture/acls.png
diff --git a/static/img/architecture/high-level-dia.png b/public/img/architecture/high-level-dia.png
similarity index 100%
rename from static/img/architecture/high-level-dia.png
rename to public/img/architecture/high-level-dia.png
diff --git a/static/img/architecture/management.png b/public/img/architecture/management.png
similarity index 100%
rename from static/img/architecture/management.png
rename to public/img/architecture/management.png
diff --git a/static/img/architecture/mesh.png b/public/img/architecture/mesh.png
similarity index 100%
rename from static/img/architecture/mesh.png
rename to public/img/architecture/mesh.png
diff --git a/static/img/architecture/netbird-peer-auto-tagging-newkey.png b/public/img/architecture/netbird-peer-auto-tagging-newkey.png
similarity index 100%
rename from static/img/architecture/netbird-peer-auto-tagging-newkey.png
rename to public/img/architecture/netbird-peer-auto-tagging-newkey.png
diff --git a/static/img/architecture/peer-auto-tagging-setupkey.gif b/public/img/architecture/peer-auto-tagging-setupkey.gif
similarity index 100%
rename from static/img/architecture/peer-auto-tagging-setupkey.gif
rename to public/img/architecture/peer-auto-tagging-setupkey.gif
diff --git a/static/img/architecture/relay.png b/public/img/architecture/relay.png
similarity index 100%
rename from static/img/architecture/relay.png
rename to public/img/architecture/relay.png
diff --git a/static/img/architecture/setup-keys.png b/public/img/architecture/setup-keys.png
similarity index 100%
rename from static/img/architecture/setup-keys.png
rename to public/img/architecture/setup-keys.png
diff --git a/static/img/architecture/signal.png b/public/img/architecture/signal.png
similarity index 100%
rename from static/img/architecture/signal.png
rename to public/img/architecture/signal.png
diff --git a/static/img/examples/wiretrustee-on-aws-ecs.png b/public/img/examples/wiretrustee-on-aws-ecs.png
similarity index 100%
rename from static/img/examples/wiretrustee-on-aws-ecs.png
rename to public/img/examples/wiretrustee-on-aws-ecs.png
diff --git a/static/img/favicon.ico b/public/img/favicon.ico
similarity index 100%
rename from static/img/favicon.ico
rename to public/img/favicon.ico
diff --git a/public/img/getting-started/add-peer.png b/public/img/getting-started/add-peer.png
new file mode 100644
index 00000000..f8e6932e
Binary files /dev/null and b/public/img/getting-started/add-peer.png differ
diff --git a/public/img/getting-started/auth.png b/public/img/getting-started/auth.png
new file mode 100644
index 00000000..e3de1f96
Binary files /dev/null and b/public/img/getting-started/auth.png differ
diff --git a/public/img/getting-started/device-confirmation.png b/public/img/getting-started/device-confirmation.png
new file mode 100644
index 00000000..3d53b2b0
Binary files /dev/null and b/public/img/getting-started/device-confirmation.png differ
diff --git a/public/img/getting-started/empty-peers.png b/public/img/getting-started/empty-peers.png
new file mode 100644
index 00000000..389de4e8
Binary files /dev/null and b/public/img/getting-started/empty-peers.png differ
diff --git a/static/img/getting-started/high-level-dia.png b/public/img/getting-started/high-level-dia.png
similarity index 100%
rename from static/img/getting-started/high-level-dia.png
rename to public/img/getting-started/high-level-dia.png
diff --git a/public/img/getting-started/img.png b/public/img/getting-started/img.png
new file mode 100644
index 00000000..d76fd6e7
Binary files /dev/null and b/public/img/getting-started/img.png differ
diff --git a/static/img/getting-started/logo-full.png b/public/img/getting-started/logo-full.png
similarity index 100%
rename from static/img/getting-started/logo-full.png
rename to public/img/getting-started/logo-full.png
diff --git a/static/img/getting-started/logo.png b/public/img/getting-started/logo.png
similarity index 100%
rename from static/img/getting-started/logo.png
rename to public/img/getting-started/logo.png
diff --git a/static/img/getting-started/netbird-sso-login-cmd.gif b/public/img/getting-started/netbird-sso-login-cmd.gif
similarity index 100%
rename from static/img/getting-started/netbird-sso-login-cmd.gif
rename to public/img/getting-started/netbird-sso-login-cmd.gif
diff --git a/static/img/getting-started/netbird-sso-login-ui.gif b/public/img/getting-started/netbird-sso-login-ui.gif
similarity index 100%
rename from static/img/getting-started/netbird-sso-login-ui.gif
rename to public/img/getting-started/netbird-sso-login-ui.gif
diff --git a/public/img/getting-started/netbird-up.png b/public/img/getting-started/netbird-up.png
new file mode 100644
index 00000000..bfe674a9
Binary files /dev/null and b/public/img/getting-started/netbird-up.png differ
diff --git a/static/img/getting-started/peerA.gif b/public/img/getting-started/peerA.gif
similarity index 100%
rename from static/img/getting-started/peerA.gif
rename to public/img/getting-started/peerA.gif
diff --git a/static/img/getting-started/peerB.gif b/public/img/getting-started/peerB.gif
similarity index 100%
rename from static/img/getting-started/peerB.gif
rename to public/img/getting-started/peerB.gif
diff --git a/static/img/getting-started/peers.gif b/public/img/getting-started/peers.gif
similarity index 100%
rename from static/img/getting-started/peers.gif
rename to public/img/getting-started/peers.gif
diff --git a/public/img/getting-started/peers.png b/public/img/getting-started/peers.png
new file mode 100644
index 00000000..aeef5368
Binary files /dev/null and b/public/img/getting-started/peers.png differ
diff --git a/static/img/getting-started/systray.png b/public/img/getting-started/systray.png
similarity index 100%
rename from static/img/getting-started/systray.png
rename to public/img/getting-started/systray.png
diff --git a/static/img/how-to-guides/activity-monitoring.png b/public/img/how-to-guides/activity-monitoring.png
similarity index 100%
rename from static/img/how-to-guides/activity-monitoring.png
rename to public/img/how-to-guides/activity-monitoring.png
diff --git a/static/img/how-to-guides/individual-peer-login-expiration.png b/public/img/how-to-guides/individual-peer-login-expiration.png
similarity index 100%
rename from static/img/how-to-guides/individual-peer-login-expiration.png
rename to public/img/how-to-guides/individual-peer-login-expiration.png
diff --git a/static/img/how-to-guides/netbird-nameserver-add-button.png b/public/img/how-to-guides/netbird-nameserver-add-button.png
similarity index 100%
rename from static/img/how-to-guides/netbird-nameserver-add-button.png
rename to public/img/how-to-guides/netbird-nameserver-add-button.png
diff --git a/static/img/how-to-guides/netbird-nameserver-all-group.png b/public/img/how-to-guides/netbird-nameserver-all-group.png
similarity index 100%
rename from static/img/how-to-guides/netbird-nameserver-all-group.png
rename to public/img/how-to-guides/netbird-nameserver-all-group.png
diff --git a/static/img/how-to-guides/netbird-nameserver-custom.png b/public/img/how-to-guides/netbird-nameserver-custom.png
similarity index 100%
rename from static/img/how-to-guides/netbird-nameserver-custom.png
rename to public/img/how-to-guides/netbird-nameserver-custom.png
diff --git a/static/img/how-to-guides/netbird-nameserver-predefined-selected.png b/public/img/how-to-guides/netbird-nameserver-predefined-selected.png
similarity index 100%
rename from static/img/how-to-guides/netbird-nameserver-predefined-selected.png
rename to public/img/how-to-guides/netbird-nameserver-predefined-selected.png
diff --git a/static/img/how-to-guides/netbird-nameserver-remote-resolver.png b/public/img/how-to-guides/netbird-nameserver-remote-resolver.png
similarity index 100%
rename from static/img/how-to-guides/netbird-nameserver-remote-resolver.png
rename to public/img/how-to-guides/netbird-nameserver-remote-resolver.png
diff --git a/static/img/how-to-guides/netbird-nameserver-remote-route.png b/public/img/how-to-guides/netbird-nameserver-remote-route.png
similarity index 100%
rename from static/img/how-to-guides/netbird-nameserver-remote-route.png
rename to public/img/how-to-guides/netbird-nameserver-remote-route.png
diff --git a/static/img/how-to-guides/netbird-nameserver-remote-rule.png b/public/img/how-to-guides/netbird-nameserver-remote-rule.png
similarity index 100%
rename from static/img/how-to-guides/netbird-nameserver-remote-rule.png
rename to public/img/how-to-guides/netbird-nameserver-remote-rule.png
diff --git a/static/img/how-to-guides/netbird-nameserver-selection-view-open.png b/public/img/how-to-guides/netbird-nameserver-selection-view-open.png
similarity index 100%
rename from static/img/how-to-guides/netbird-nameserver-selection-view-open.png
rename to public/img/how-to-guides/netbird-nameserver-selection-view-open.png
diff --git a/static/img/how-to-guides/netbird-nameserver-selection-view.png b/public/img/how-to-guides/netbird-nameserver-selection-view.png
similarity index 100%
rename from static/img/how-to-guides/netbird-nameserver-selection-view.png
rename to public/img/how-to-guides/netbird-nameserver-selection-view.png
diff --git a/static/img/how-to-guides/netbird-network-routes-add-button.png b/public/img/how-to-guides/netbird-network-routes-add-button.png
similarity index 100%
rename from static/img/how-to-guides/netbird-network-routes-add-button.png
rename to public/img/how-to-guides/netbird-network-routes-add-button.png
diff --git a/static/img/how-to-guides/netbird-network-routes-create-ha.png b/public/img/how-to-guides/netbird-network-routes-create-ha.png
similarity index 100%
rename from static/img/how-to-guides/netbird-network-routes-create-ha.png
rename to public/img/how-to-guides/netbird-network-routes-create-ha.png
diff --git a/static/img/how-to-guides/netbird-network-routes-create.png b/public/img/how-to-guides/netbird-network-routes-create.png
similarity index 100%
rename from static/img/how-to-guides/netbird-network-routes-create.png
rename to public/img/how-to-guides/netbird-network-routes-create.png
diff --git a/static/img/how-to-guides/netbird-network-routes-masquerading.png b/public/img/how-to-guides/netbird-network-routes-masquerading.png
similarity index 100%
rename from static/img/how-to-guides/netbird-network-routes-masquerading.png
rename to public/img/how-to-guides/netbird-network-routes-masquerading.png
diff --git a/static/img/how-to-guides/netbird-network-routes-saved-new-ha.png b/public/img/how-to-guides/netbird-network-routes-saved-new-ha.png
similarity index 100%
rename from static/img/how-to-guides/netbird-network-routes-saved-new-ha.png
rename to public/img/how-to-guides/netbird-network-routes-saved-new-ha.png
diff --git a/static/img/how-to-guides/netbird-network-routes-saved-new.png b/public/img/how-to-guides/netbird-network-routes-saved-new.png
similarity index 100%
rename from static/img/how-to-guides/netbird-network-routes-saved-new.png
rename to public/img/how-to-guides/netbird-network-routes-saved-new.png
diff --git a/static/img/how-to-guides/netbird-network-routes.png b/public/img/how-to-guides/netbird-network-routes.png
similarity index 100%
rename from static/img/how-to-guides/netbird-network-routes.png
rename to public/img/how-to-guides/netbird-network-routes.png
diff --git a/static/img/how-to-guides/peer-login-expiration.png b/public/img/how-to-guides/peer-login-expiration.png
similarity index 100%
rename from static/img/how-to-guides/peer-login-expiration.png
rename to public/img/how-to-guides/peer-login-expiration.png
diff --git a/static/img/how-to-guides/peer-needs-login.png b/public/img/how-to-guides/peer-needs-login.png
similarity index 100%
rename from static/img/how-to-guides/peer-needs-login.png
rename to public/img/how-to-guides/peer-needs-login.png
diff --git a/static/img/how-to-guides/user-invites.gif b/public/img/how-to-guides/user-invites.gif
similarity index 100%
rename from static/img/how-to-guides/user-invites.gif
rename to public/img/how-to-guides/user-invites.gif
diff --git a/static/img/integrations/identity-providers/self-hosted/auth0-create-interactive-login-app.png b/public/img/integrations/identity-providers/self-hosted/auth0-create-interactive-login-app.png
similarity index 100%
rename from static/img/integrations/identity-providers/self-hosted/auth0-create-interactive-login-app.png
rename to public/img/integrations/identity-providers/self-hosted/auth0-create-interactive-login-app.png
diff --git a/static/img/integrations/identity-providers/self-hosted/auth0-grant-types.png b/public/img/integrations/identity-providers/self-hosted/auth0-grant-types.png
similarity index 100%
rename from static/img/integrations/identity-providers/self-hosted/auth0-grant-types.png
rename to public/img/integrations/identity-providers/self-hosted/auth0-grant-types.png
diff --git a/static/img/integrations/identity-providers/self-hosted/auth0-interactive-login-settings.png b/public/img/integrations/identity-providers/self-hosted/auth0-interactive-login-settings.png
similarity index 100%
rename from static/img/integrations/identity-providers/self-hosted/auth0-interactive-login-settings.png
rename to public/img/integrations/identity-providers/self-hosted/auth0-interactive-login-settings.png
diff --git a/static/img/integrations/identity-providers/self-hosted/azure-add-application-scope.png b/public/img/integrations/identity-providers/self-hosted/azure-add-application-scope.png
similarity index 100%
rename from static/img/integrations/identity-providers/self-hosted/azure-add-application-scope.png
rename to public/img/integrations/identity-providers/self-hosted/azure-add-application-scope.png
diff --git a/static/img/integrations/identity-providers/self-hosted/azure-add-scope.png b/public/img/integrations/identity-providers/self-hosted/azure-add-scope.png
similarity index 100%
rename from static/img/integrations/identity-providers/self-hosted/azure-add-scope.png
rename to public/img/integrations/identity-providers/self-hosted/azure-add-scope.png
diff --git a/static/img/integrations/identity-providers/self-hosted/azure-applications-permissions.png b/public/img/integrations/identity-providers/self-hosted/azure-applications-permissions.png
similarity index 100%
rename from static/img/integrations/identity-providers/self-hosted/azure-applications-permissions.png
rename to public/img/integrations/identity-providers/self-hosted/azure-applications-permissions.png
diff --git a/static/img/integrations/identity-providers/self-hosted/azure-client-secret.png b/public/img/integrations/identity-providers/self-hosted/azure-client-secret.png
similarity index 100%
rename from static/img/integrations/identity-providers/self-hosted/azure-client-secret.png
rename to public/img/integrations/identity-providers/self-hosted/azure-client-secret.png
diff --git a/static/img/integrations/identity-providers/self-hosted/azure-flows-setup.png b/public/img/integrations/identity-providers/self-hosted/azure-flows-setup.png
similarity index 100%
rename from static/img/integrations/identity-providers/self-hosted/azure-flows-setup.png
rename to public/img/integrations/identity-providers/self-hosted/azure-flows-setup.png
diff --git a/static/img/integrations/identity-providers/self-hosted/azure-grant-admin-conset.png b/public/img/integrations/identity-providers/self-hosted/azure-grant-admin-conset.png
similarity index 100%
rename from static/img/integrations/identity-providers/self-hosted/azure-grant-admin-conset.png
rename to public/img/integrations/identity-providers/self-hosted/azure-grant-admin-conset.png
diff --git a/static/img/integrations/identity-providers/self-hosted/azure-netbird-api-permisssions.png b/public/img/integrations/identity-providers/self-hosted/azure-netbird-api-permisssions.png
similarity index 100%
rename from static/img/integrations/identity-providers/self-hosted/azure-netbird-api-permisssions.png
rename to public/img/integrations/identity-providers/self-hosted/azure-netbird-api-permisssions.png
diff --git a/static/img/integrations/identity-providers/self-hosted/azure-new-application.png b/public/img/integrations/identity-providers/self-hosted/azure-new-application.png
similarity index 100%
rename from static/img/integrations/identity-providers/self-hosted/azure-new-application.png
rename to public/img/integrations/identity-providers/self-hosted/azure-new-application.png
diff --git a/static/img/integrations/identity-providers/self-hosted/azure-openid-permissions.png b/public/img/integrations/identity-providers/self-hosted/azure-openid-permissions.png
similarity index 100%
rename from static/img/integrations/identity-providers/self-hosted/azure-openid-permissions.png
rename to public/img/integrations/identity-providers/self-hosted/azure-openid-permissions.png
diff --git a/static/img/integrations/identity-providers/self-hosted/azure-spa-uri-setup.png b/public/img/integrations/identity-providers/self-hosted/azure-spa-uri-setup.png
similarity index 100%
rename from static/img/integrations/identity-providers/self-hosted/azure-spa-uri-setup.png
rename to public/img/integrations/identity-providers/self-hosted/azure-spa-uri-setup.png
diff --git a/static/img/integrations/identity-providers/self-hosted/azure-user-permissions.png b/public/img/integrations/identity-providers/self-hosted/azure-user-permissions.png
similarity index 100%
rename from static/img/integrations/identity-providers/self-hosted/azure-user-permissions.png
rename to public/img/integrations/identity-providers/self-hosted/azure-user-permissions.png
diff --git a/public/img/integrations/identity-providers/self-hosted/azure_api_scope.png b/public/img/integrations/identity-providers/self-hosted/azure_api_scope.png
new file mode 100755
index 00000000..c77feace
Binary files /dev/null and b/public/img/integrations/identity-providers/self-hosted/azure_api_scope.png differ
diff --git a/static/img/integrations/identity-providers/self-hosted/keycloack-add-client-scope.png b/public/img/integrations/identity-providers/self-hosted/keycloack-add-client-scope.png
similarity index 100%
rename from static/img/integrations/identity-providers/self-hosted/keycloack-add-client-scope.png
rename to public/img/integrations/identity-providers/self-hosted/keycloack-add-client-scope.png
diff --git a/static/img/integrations/identity-providers/self-hosted/keycloack-domain-token-claim-mapper-domain-category.png b/public/img/integrations/identity-providers/self-hosted/keycloack-domain-token-claim-mapper-domain-category.png
similarity index 100%
rename from static/img/integrations/identity-providers/self-hosted/keycloack-domain-token-claim-mapper-domain-category.png
rename to public/img/integrations/identity-providers/self-hosted/keycloack-domain-token-claim-mapper-domain-category.png
diff --git a/static/img/integrations/identity-providers/self-hosted/keycloack-domain-token-claim-mapper-domain.png b/public/img/integrations/identity-providers/self-hosted/keycloack-domain-token-claim-mapper-domain.png
similarity index 100%
rename from static/img/integrations/identity-providers/self-hosted/keycloack-domain-token-claim-mapper-domain.png
rename to public/img/integrations/identity-providers/self-hosted/keycloack-domain-token-claim-mapper-domain.png
diff --git a/static/img/integrations/identity-providers/self-hosted/keycloack-domain-token-claim-mapper.png b/public/img/integrations/identity-providers/self-hosted/keycloack-domain-token-claim-mapper.png
similarity index 100%
rename from static/img/integrations/identity-providers/self-hosted/keycloack-domain-token-claim-mapper.png
rename to public/img/integrations/identity-providers/self-hosted/keycloack-domain-token-claim-mapper.png
diff --git a/static/img/integrations/identity-providers/self-hosted/keycloack-domain-token-claims-client.png b/public/img/integrations/identity-providers/self-hosted/keycloack-domain-token-claims-client.png
similarity index 100%
rename from static/img/integrations/identity-providers/self-hosted/keycloack-domain-token-claims-client.png
rename to public/img/integrations/identity-providers/self-hosted/keycloack-domain-token-claims-client.png
diff --git a/static/img/integrations/identity-providers/self-hosted/keycloak-access-settings.png b/public/img/integrations/identity-providers/self-hosted/keycloak-access-settings.png
similarity index 100%
rename from static/img/integrations/identity-providers/self-hosted/keycloak-access-settings.png
rename to public/img/integrations/identity-providers/self-hosted/keycloak-access-settings.png
diff --git a/static/img/integrations/identity-providers/self-hosted/keycloak-add-role.png b/public/img/integrations/identity-providers/self-hosted/keycloak-add-role.png
similarity index 100%
rename from static/img/integrations/identity-providers/self-hosted/keycloak-add-role.png
rename to public/img/integrations/identity-providers/self-hosted/keycloak-add-role.png
diff --git a/static/img/integrations/identity-providers/self-hosted/keycloak-auth-grant.gif b/public/img/integrations/identity-providers/self-hosted/keycloak-auth-grant.gif
similarity index 100%
rename from static/img/integrations/identity-providers/self-hosted/keycloak-auth-grant.gif
rename to public/img/integrations/identity-providers/self-hosted/keycloak-auth-grant.gif
diff --git a/static/img/integrations/identity-providers/self-hosted/keycloak-backend-client-auth.png b/public/img/integrations/identity-providers/self-hosted/keycloak-backend-client-auth.png
similarity index 100%
rename from static/img/integrations/identity-providers/self-hosted/keycloak-backend-client-auth.png
rename to public/img/integrations/identity-providers/self-hosted/keycloak-backend-client-auth.png
diff --git a/static/img/integrations/identity-providers/self-hosted/keycloak-backend-client-credentials.png b/public/img/integrations/identity-providers/self-hosted/keycloak-backend-client-credentials.png
similarity index 100%
rename from static/img/integrations/identity-providers/self-hosted/keycloak-backend-client-credentials.png
rename to public/img/integrations/identity-providers/self-hosted/keycloak-backend-client-credentials.png
diff --git a/static/img/integrations/identity-providers/self-hosted/keycloak-configure-audience-mapper-2.png b/public/img/integrations/identity-providers/self-hosted/keycloak-configure-audience-mapper-2.png
similarity index 100%
rename from static/img/integrations/identity-providers/self-hosted/keycloak-configure-audience-mapper-2.png
rename to public/img/integrations/identity-providers/self-hosted/keycloak-configure-audience-mapper-2.png
diff --git a/static/img/integrations/identity-providers/self-hosted/keycloak-configure-audience-mapper.png b/public/img/integrations/identity-providers/self-hosted/keycloak-configure-audience-mapper.png
similarity index 100%
rename from static/img/integrations/identity-providers/self-hosted/keycloak-configure-audience-mapper.png
rename to public/img/integrations/identity-providers/self-hosted/keycloak-configure-audience-mapper.png
diff --git a/static/img/integrations/identity-providers/self-hosted/keycloak-create-backend-client.png b/public/img/integrations/identity-providers/self-hosted/keycloak-create-backend-client.png
similarity index 100%
rename from static/img/integrations/identity-providers/self-hosted/keycloak-create-backend-client.png
rename to public/img/integrations/identity-providers/self-hosted/keycloak-create-backend-client.png
diff --git a/static/img/integrations/identity-providers/self-hosted/keycloak-create-client-scope.png b/public/img/integrations/identity-providers/self-hosted/keycloak-create-client-scope.png
similarity index 100%
rename from static/img/integrations/identity-providers/self-hosted/keycloak-create-client-scope.png
rename to public/img/integrations/identity-providers/self-hosted/keycloak-create-client-scope.png
diff --git a/static/img/integrations/identity-providers/self-hosted/keycloak-create-client.png b/public/img/integrations/identity-providers/self-hosted/keycloak-create-client.png
similarity index 100%
rename from static/img/integrations/identity-providers/self-hosted/keycloak-create-client.png
rename to public/img/integrations/identity-providers/self-hosted/keycloak-create-client.png
diff --git a/static/img/integrations/identity-providers/self-hosted/keycloak-create-realm.png b/public/img/integrations/identity-providers/self-hosted/keycloak-create-realm.png
similarity index 100%
rename from static/img/integrations/identity-providers/self-hosted/keycloak-create-realm.png
rename to public/img/integrations/identity-providers/self-hosted/keycloak-create-realm.png
diff --git a/static/img/integrations/identity-providers/self-hosted/keycloak-create-user.png b/public/img/integrations/identity-providers/self-hosted/keycloak-create-user.png
similarity index 100%
rename from static/img/integrations/identity-providers/self-hosted/keycloak-create-user.png
rename to public/img/integrations/identity-providers/self-hosted/keycloak-create-user.png
diff --git a/static/img/integrations/identity-providers/self-hosted/keycloak-domain-token-claim-scope.png b/public/img/integrations/identity-providers/self-hosted/keycloak-domain-token-claim-scope.png
similarity index 100%
rename from static/img/integrations/identity-providers/self-hosted/keycloak-domain-token-claim-scope.png
rename to public/img/integrations/identity-providers/self-hosted/keycloak-domain-token-claim-scope.png
diff --git a/static/img/integrations/identity-providers/self-hosted/keycloak-enable-auth.png b/public/img/integrations/identity-providers/self-hosted/keycloak-enable-auth.png
similarity index 100%
rename from static/img/integrations/identity-providers/self-hosted/keycloak-enable-auth.png
rename to public/img/integrations/identity-providers/self-hosted/keycloak-enable-auth.png
diff --git a/static/img/integrations/identity-providers/self-hosted/keycloak-service-account-role.png b/public/img/integrations/identity-providers/self-hosted/keycloak-service-account-role.png
similarity index 100%
rename from static/img/integrations/identity-providers/self-hosted/keycloak-service-account-role.png
rename to public/img/integrations/identity-providers/self-hosted/keycloak-service-account-role.png
diff --git a/static/img/integrations/identity-providers/self-hosted/keycloak-set-password.png b/public/img/integrations/identity-providers/self-hosted/keycloak-set-password.png
similarity index 100%
rename from static/img/integrations/identity-providers/self-hosted/keycloak-set-password.png
rename to public/img/integrations/identity-providers/self-hosted/keycloak-set-password.png
diff --git a/static/img/integrations/identity-providers/self-hosted/zitadel-create-user.png b/public/img/integrations/identity-providers/self-hosted/zitadel-create-user.png
similarity index 100%
rename from static/img/integrations/identity-providers/self-hosted/zitadel-create-user.png
rename to public/img/integrations/identity-providers/self-hosted/zitadel-create-user.png
diff --git a/static/img/integrations/identity-providers/self-hosted/zitadel-new-application-auth.png b/public/img/integrations/identity-providers/self-hosted/zitadel-new-application-auth.png
similarity index 100%
rename from static/img/integrations/identity-providers/self-hosted/zitadel-new-application-auth.png
rename to public/img/integrations/identity-providers/self-hosted/zitadel-new-application-auth.png
diff --git a/static/img/integrations/identity-providers/self-hosted/zitadel-new-application-overview.png b/public/img/integrations/identity-providers/self-hosted/zitadel-new-application-overview.png
similarity index 100%
rename from static/img/integrations/identity-providers/self-hosted/zitadel-new-application-overview.png
rename to public/img/integrations/identity-providers/self-hosted/zitadel-new-application-overview.png
diff --git a/static/img/integrations/identity-providers/self-hosted/zitadel-new-application-uri.png b/public/img/integrations/identity-providers/self-hosted/zitadel-new-application-uri.png
similarity index 100%
rename from static/img/integrations/identity-providers/self-hosted/zitadel-new-application-uri.png
rename to public/img/integrations/identity-providers/self-hosted/zitadel-new-application-uri.png
diff --git a/static/img/integrations/identity-providers/self-hosted/zitadel-new-application.png b/public/img/integrations/identity-providers/self-hosted/zitadel-new-application.png
similarity index 100%
rename from static/img/integrations/identity-providers/self-hosted/zitadel-new-application.png
rename to public/img/integrations/identity-providers/self-hosted/zitadel-new-application.png
diff --git a/static/img/integrations/identity-providers/self-hosted/zitadel-new-project.png b/public/img/integrations/identity-providers/self-hosted/zitadel-new-project.png
similarity index 100%
rename from static/img/integrations/identity-providers/self-hosted/zitadel-new-project.png
rename to public/img/integrations/identity-providers/self-hosted/zitadel-new-project.png
diff --git a/static/img/integrations/identity-providers/self-hosted/zitadel-redirect-settings.png b/public/img/integrations/identity-providers/self-hosted/zitadel-redirect-settings.png
similarity index 100%
rename from static/img/integrations/identity-providers/self-hosted/zitadel-redirect-settings.png
rename to public/img/integrations/identity-providers/self-hosted/zitadel-redirect-settings.png
diff --git a/static/img/integrations/identity-providers/self-hosted/zitadel-service-account-role.png b/public/img/integrations/identity-providers/self-hosted/zitadel-service-account-role.png
similarity index 100%
rename from static/img/integrations/identity-providers/self-hosted/zitadel-service-account-role.png
rename to public/img/integrations/identity-providers/self-hosted/zitadel-service-account-role.png
diff --git a/static/img/integrations/identity-providers/self-hosted/zitadel-service-user-secret.png b/public/img/integrations/identity-providers/self-hosted/zitadel-service-user-secret.png
similarity index 100%
rename from static/img/integrations/identity-providers/self-hosted/zitadel-service-user-secret.png
rename to public/img/integrations/identity-providers/self-hosted/zitadel-service-user-secret.png
diff --git a/static/img/integrations/identity-providers/self-hosted/zitadel-token-settings.png b/public/img/integrations/identity-providers/self-hosted/zitadel-token-settings.png
similarity index 100%
rename from static/img/integrations/identity-providers/self-hosted/zitadel-token-settings.png
rename to public/img/integrations/identity-providers/self-hosted/zitadel-token-settings.png
diff --git a/public/img/logo/logo-api-dark.svg b/public/img/logo/logo-api-dark.svg
new file mode 100644
index 00000000..29055bf9
--- /dev/null
+++ b/public/img/logo/logo-api-dark.svg
@@ -0,0 +1,121 @@
+
+
+
+
+
+
+
+
+
+
+ API
+ netbird
+
+
+
+
+
+
+
diff --git a/public/img/logo/logo-api.svg b/public/img/logo/logo-api.svg
new file mode 100644
index 00000000..6bc9a282
--- /dev/null
+++ b/public/img/logo/logo-api.svg
@@ -0,0 +1,121 @@
+
+
+
+
+
+
+
+
+
+
+ API
+ netbird
+
+
+
+
+
+
+
diff --git a/static/img/logo-dark.svg b/public/img/logo/logo-docs-dark.svg
similarity index 95%
rename from static/img/logo-dark.svg
rename to public/img/logo/logo-docs-dark.svg
index 068c330e..1a7d05b9 100644
--- a/static/img/logo-dark.svg
+++ b/public/img/logo/logo-docs-dark.svg
@@ -8,7 +8,7 @@
version="1.1"
id="svg1203"
inkscape:version="1.1.1 (1:1.1+202109281944+c3084ef5ed)"
- sodipodi:docname="logo-dark.svg"
+ sodipodi:docname="logo-docs-dark.svg"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
@@ -60,7 +60,7 @@
inkscape:groupmode="layer"
id="layer1">
+
+ About NetBird
+
+
+ {aboutNetbird.map((guide) => (
+
+
+ {guide.name}
+
+
+ {guide.description}
+
+
+
+ Read more
+
+
+
+ ))}
+
+
+ )
+}
diff --git a/src/components/Button.jsx b/src/components/Button.jsx
new file mode 100644
index 00000000..5603694c
--- /dev/null
+++ b/src/components/Button.jsx
@@ -0,0 +1,62 @@
+import Link from 'next/link'
+import clsx from 'clsx'
+
+function ArrowIcon(props) {
+ return (
+
+
+
+ )
+}
+
+const variantStyles = {
+ primary:
+ 'rounded-full bg-zinc-900 py-1 px-3 text-white hover:bg-zinc-700 dark:bg-orange-400/10 dark:text-orange-400 dark:ring-1 dark:ring-inset dark:ring-orange-400/20 dark:hover:bg-orange-400/10 dark:hover:text-orange-300 dark:hover:ring-orange-300',
+ secondary:
+ 'rounded-full bg-zinc-100 py-1 px-3 text-zinc-900 hover:bg-zinc-200 dark:bg-zinc-800/40 dark:text-zinc-400 dark:ring-1 dark:ring-inset dark:ring-zinc-800 dark:hover:bg-zinc-800 dark:hover:text-zinc-300',
+ filled:
+ 'rounded-full bg-zinc-900 py-1 px-3 text-white hover:bg-zinc-700 dark:bg-orange-500 dark:text-white dark:hover:bg-orange-400',
+ outline:
+ 'rounded-full py-1 px-3 text-zinc-700 ring-1 ring-inset ring-zinc-900/10 hover:bg-zinc-900/2.5 hover:text-zinc-900 dark:text-zinc-400 dark:ring-white/10 dark:hover:bg-white/5 dark:hover:text-white',
+ text: 'text-orange-500 hover:text-orange-600 dark:text-orange-400 dark:hover:text-orange-500',
+}
+
+export function Button({
+ variant = 'primary',
+ className,
+ children,
+ arrow,
+ ...props
+}) {
+ let Component = props.href ? Link : 'button'
+
+ className = clsx(
+ 'inline-flex gap-0.5 justify-center overflow-hidden text-sm font-medium transition',
+ variantStyles[variant],
+ className
+ )
+
+ let arrowIcon = (
+
+ )
+
+ return (
+
+ {arrow === 'left' && arrowIcon}
+ {children}
+ {arrow === 'right' && arrowIcon}
+
+ )
+}
diff --git a/src/components/Clients.jsx b/src/components/Clients.jsx
new file mode 100644
index 00000000..c864932d
--- /dev/null
+++ b/src/components/Clients.jsx
@@ -0,0 +1,167 @@
+import Link from 'next/link'
+import { motion, useMotionTemplate, useMotionValue } from 'framer-motion'
+
+import { GridPattern } from '@/components/GridPattern'
+import { Heading } from '@/components/Heading'
+import { ChatBubbleIcon } from '@/components/icons/ChatBubbleIcon'
+import { EnvelopeIcon } from '@/components/icons/EnvelopeIcon'
+import { UserIcon } from '@/components/icons/UserIcon'
+import { UsersIcon } from '@/components/icons/UsersIcon'
+
+const clients = [
+ {
+ href: '/docs/client-installation#linux',
+ name: 'Linux',
+ description:
+ 'Learn how to install the NetBird client on Linux devices.',
+ icon: UserIcon,
+ pattern: {
+ y: 16,
+ squares: [
+ [0, 1],
+ [1, 3],
+ ],
+ },
+ },
+ {
+ href: '/docs/client-installation#mac-os',
+ name: 'MacOS',
+ description:
+ 'Learn how to install the NetBird client on MacOS devices.',
+ icon: ChatBubbleIcon,
+ pattern: {
+ y: -6,
+ squares: [
+ [-1, 2],
+ [1, 3],
+ ],
+ },
+ },
+ {
+ href: '/docs/client-installation#windows',
+ name: 'Windows',
+ description:
+ 'Learn how to install the NetBird client on Windows devices.',
+ icon: EnvelopeIcon,
+ pattern: {
+ y: 32,
+ squares: [
+ [0, 2],
+ [1, 4],
+ ],
+ },
+ },
+ {
+ href: '/docs/client-installation#android',
+ name: 'Android',
+ description:
+ 'Learn how to install the NetBird client on Android devices.',
+ icon: UsersIcon,
+ pattern: {
+ y: 22,
+ squares: [[0, 1]],
+ },
+ },
+ {
+ href: '/docs/client-installation#ios',
+ name: 'iOS',
+ description:
+ 'Learn how to install the NetBird client on OS devices.',
+ icon: UsersIcon,
+ pattern: {
+ y: 22,
+ squares: [[0, 1]],
+ },
+ },
+]
+
+function ClientIcon({ icon: Icon }) {
+ return (
+
+
+
+ )
+}
+
+function ClientPattern({ mouseX, mouseY, ...gridProps }) {
+ let maskImage = useMotionTemplate`radial-gradient(180px at ${mouseX}px ${mouseY}px, white, transparent)`
+ let style = { maskImage, WebkitMaskImage: maskImage }
+
+ return (
+
+ )
+}
+
+function Client({ client }) {
+ let mouseX = useMotionValue(0)
+ let mouseY = useMotionValue(0)
+
+ function onMouseMove({ currentTarget, clientX, clientY }) {
+ let { left, top } = currentTarget.getBoundingClientRect()
+ mouseX.set(clientX - left)
+ mouseY.set(clientY - top)
+ }
+
+ return (
+
+
+
+
+
+
+
+ {client.name}
+
+
+
+ {client.description}
+
+
+
+ )
+}
+
+export function Clients() {
+ return (
+
+
+ Clients
+
+
+ {clients.map((client) => (
+
+ ))}
+
+
+ )
+}
diff --git a/src/components/Code.jsx b/src/components/Code.jsx
new file mode 100644
index 00000000..602dba23
--- /dev/null
+++ b/src/components/Code.jsx
@@ -0,0 +1,298 @@
+import {
+ Children,
+ createContext,
+ useContext,
+ useEffect,
+ useRef,
+ useState,
+} from 'react'
+import { Tab } from '@headlessui/react'
+import clsx from 'clsx'
+import { create } from 'zustand'
+
+import { Tag } from '@/components/Tag'
+
+const languageNames = {
+ js: 'JavaScript',
+ ts: 'TypeScript',
+ javascript: 'JavaScript',
+ typescript: 'TypeScript',
+ php: 'PHP',
+ python: 'Python',
+ ruby: 'Ruby',
+ go: 'Go',
+ java: 'Java',
+}
+
+function getPanelTitle({ title, language }) {
+ return title ?? languageNames[language] ?? 'Code'
+}
+
+function ClipboardIcon(props) {
+ return (
+
+
+
+
+ )
+}
+
+function CopyButton({ code }) {
+ let [copyCount, setCopyCount] = useState(0)
+ let copied = copyCount > 0
+
+ useEffect(() => {
+ if (copyCount > 0) {
+ let timeout = setTimeout(() => setCopyCount(0), 1000)
+ return () => {
+ clearTimeout(timeout)
+ }
+ }
+ }, [copyCount])
+
+ return (
+ {
+ window.navigator.clipboard.writeText(code).then(() => {
+ setCopyCount((count) => count + 1)
+ })
+ }}
+ >
+
+
+ Copy
+
+
+ Copied!
+
+
+ )
+}
+
+function CodePanelHeader({ tag, label }) {
+ if (!tag && !label) {
+ return null
+ }
+
+ return (
+
+ {tag && (
+
+ {tag}
+
+ )}
+ {tag && label && (
+
+ )}
+ {label && (
+
{label}
+ )}
+
+ )
+}
+
+function CodePanel({ tag, label, code, children }) {
+ let child = Children.only(children)
+
+ return (
+
+ )
+}
+
+function CodeGroupHeader({ title, children, selectedIndex }) {
+ let hasTabs = Children.count(children) > 1
+
+ if (!title && !hasTabs) {
+ return null
+ }
+
+ return (
+
+ {title && (
+
+ {title}
+
+ )}
+ {hasTabs && (
+
+ {Children.map(children, (child, childIndex) => (
+
+ {getPanelTitle(child.props)}
+
+ ))}
+
+ )}
+
+ )
+}
+
+function CodeGroupPanels({ children, ...props }) {
+ let hasTabs = Children.count(children) > 1
+
+ if (hasTabs) {
+ return (
+
+ {Children.map(children, (child) => (
+
+ {child}
+
+ ))}
+
+ )
+ }
+
+ return {children}
+}
+
+function usePreventLayoutShift() {
+ let positionRef = useRef()
+ let rafRef = useRef()
+
+ useEffect(() => {
+ return () => {
+ window.cancelAnimationFrame(rafRef.current)
+ }
+ }, [])
+
+ return {
+ positionRef,
+ preventLayoutShift(callback) {
+ let initialTop = positionRef.current.getBoundingClientRect().top
+
+ callback()
+
+ rafRef.current = window.requestAnimationFrame(() => {
+ let newTop = positionRef.current.getBoundingClientRect().top
+ window.scrollBy(0, newTop - initialTop)
+ })
+ },
+ }
+}
+
+const usePreferredLanguageStore = create((set) => ({
+ preferredLanguages: [],
+ addPreferredLanguage: (language) =>
+ set((state) => ({
+ preferredLanguages: [
+ ...state.preferredLanguages.filter(
+ (preferredLanguage) => preferredLanguage !== language
+ ),
+ language,
+ ],
+ })),
+}))
+
+function useTabGroupProps(availableLanguages) {
+ let { preferredLanguages, addPreferredLanguage } = usePreferredLanguageStore()
+ let [selectedIndex, setSelectedIndex] = useState(0)
+ let activeLanguage = [...availableLanguages].sort(
+ (a, z) => preferredLanguages.indexOf(z) - preferredLanguages.indexOf(a)
+ )[0]
+ let languageIndex = availableLanguages.indexOf(activeLanguage)
+ let newSelectedIndex = languageIndex === -1 ? selectedIndex : languageIndex
+ if (newSelectedIndex !== selectedIndex) {
+ setSelectedIndex(newSelectedIndex)
+ }
+
+ let { positionRef, preventLayoutShift } = usePreventLayoutShift()
+
+ return {
+ as: 'div',
+ ref: positionRef,
+ selectedIndex,
+ onChange: (newSelectedIndex) => {
+ preventLayoutShift(() =>
+ addPreferredLanguage(availableLanguages[newSelectedIndex])
+ )
+ },
+ }
+}
+
+const CodeGroupContext = createContext(false)
+
+export function CodeGroup({ children, title, ...props }) {
+ let languages = Children.map(children, (child) => getPanelTitle(child.props))
+ let tabGroupProps = useTabGroupProps(languages)
+ let hasTabs = Children.count(children) > 1
+ let Container = hasTabs ? Tab.Group : 'div'
+ let containerProps = hasTabs ? tabGroupProps : {}
+ let headerProps = hasTabs
+ ? { selectedIndex: tabGroupProps.selectedIndex }
+ : {}
+
+ return (
+
+
+
+ {children}
+
+ {children}
+
+
+ )
+}
+
+export function Code({ children, ...props }) {
+ let isGrouped = useContext(CodeGroupContext)
+
+ if (isGrouped) {
+ return
+ }
+
+ return {children}
+}
+
+export function Pre({ children, ...props }) {
+ let isGrouped = useContext(CodeGroupContext)
+
+ if (isGrouped) {
+ return children
+ }
+
+ return {children}
+}
diff --git a/src/components/Footer.jsx b/src/components/Footer.jsx
new file mode 100644
index 00000000..7c8ab45a
--- /dev/null
+++ b/src/components/Footer.jsx
@@ -0,0 +1,258 @@
+import {forwardRef, Fragment, useEffect, useState} from 'react'
+import Link from 'next/link'
+import { useRouter } from 'next/router'
+import { Transition } from '@headlessui/react'
+
+import { Button } from '@/components/Button'
+import {apiNavigation} from '@/components/NavigationAPI'
+import {docsNavigation} from "@/components/NavigationDocs";
+
+function CheckIcon(props) {
+ return (
+
+
+
+
+ )
+}
+
+function FeedbackButton(props) {
+ return (
+
+ )
+}
+
+const FeedbackForm = forwardRef(function FeedbackForm({ onSubmit }, ref) {
+ return (
+
+ )
+})
+
+const FeedbackThanks = forwardRef(function FeedbackThanks(_props, ref) {
+ return (
+
+
+
+ Thanks for your feedback!
+
+
+ )
+})
+
+function Feedback() {
+ let [submitted, setSubmitted] = useState(false)
+
+ function onSubmit(event) {
+ event.preventDefault()
+
+ // event.nativeEvent.submitter.dataset.response
+ // => "yes" or "no"
+
+ setSubmitted(true)
+ }
+
+ return (
+
+
+
+
+
+
+
+
+ )
+}
+
+function PageLink({ label, page, previous = false }) {
+ return (
+ <>
+
+ {label}
+
+
+ {page.title}
+
+ >
+ )
+}
+
+function PageNavigation() {
+ let router = useRouter()
+ let allPages = router.route.startsWith('/docs') ? docsNavigation.flatMap((group) => group.links) : apiNavigation.flatMap((group) => group.links)
+ let currentPageIndex = allPages.findIndex(
+ (page) => page.href === router.pathname
+ )
+
+ if (currentPageIndex === -1) {
+ return null
+ }
+
+ let previousPage = allPages[currentPageIndex - 1]
+ let nextPage = allPages[currentPageIndex + 1]
+
+ if (!previousPage && !nextPage) {
+ return null
+ }
+
+ return (
+
+ {previousPage && (
+
+ )}
+ {nextPage && (
+
+ )}
+
+ )
+}
+
+function TwitterIcon(props) {
+ return (
+
+
+
+ )
+}
+
+function GitHubIcon(props) {
+ return (
+
+
+
+ )
+}
+
+function SlackIcon(props) {
+ return (
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ )
+}
+
+function DiscordIcon(props) {
+ return (
+
+
+
+ )
+}
+
+function SocialLink({ href, icon: Icon, children }) {
+ return (
+
+ {children}
+
+
+ )
+}
+
+function SmallPrint() {
+ return (
+
+
+ © Copyright {new Date().getFullYear()}. All rights reserved.
+
+
+
+ Follow us on Twitter
+
+
+ Follow us on GitHub
+
+
+ Join us on Slack
+
+
+
+ )
+}
+
+export function Footer() {
+ let router = useRouter()
+
+ return (
+
+ )
+}
diff --git a/src/components/GridPattern.jsx b/src/components/GridPattern.jsx
new file mode 100644
index 00000000..d8337656
--- /dev/null
+++ b/src/components/GridPattern.jsx
@@ -0,0 +1,42 @@
+import { useId } from 'react'
+
+export function GridPattern({ width, height, x, y, squares, ...props }) {
+ let patternId = useId()
+
+ return (
+
+
+
+
+
+
+
+ {squares && (
+
+ {squares.map(([x, y]) => (
+
+ ))}
+
+ )}
+
+ )
+}
diff --git a/src/components/Guides.jsx b/src/components/Guides.jsx
new file mode 100644
index 00000000..764ee7fe
--- /dev/null
+++ b/src/components/Guides.jsx
@@ -0,0 +1,43 @@
+import { Button } from '@/components/Button'
+import { Heading } from '@/components/Heading'
+
+const guides = [
+ {
+ href: '/ipa/guides/authentication',
+ name: 'Authentication',
+ description: 'Learn how to authenticate your API requests.',
+ },
+ {
+ href: '/ipa/guides/errors',
+ name: 'Errors',
+ description:
+ 'Read about the different types of errors returned by the API.',
+ },
+]
+
+export function Guides() {
+ return (
+
+
+ Guides
+
+
+ {guides.map((guide) => (
+
+
+ {guide.name}
+
+
+ {guide.description}
+
+
+
+ Read more
+
+
+
+ ))}
+
+
+ )
+}
diff --git a/src/components/Header.jsx b/src/components/Header.jsx
new file mode 100644
index 00000000..2a9f9f9f
--- /dev/null
+++ b/src/components/Header.jsx
@@ -0,0 +1,90 @@
+import { forwardRef } from 'react'
+import Link from 'next/link'
+import clsx from 'clsx'
+import { motion, useScroll, useTransform } from 'framer-motion'
+
+import { Button } from '@/components/Button'
+import { Logo } from '@/components/Logo'
+import {
+ MobileNavigation,
+ useIsInsideMobileNavigation,
+} from '@/components/MobileNavigation'
+import { useMobileNavigationStore } from '@/components/MobileNavigation'
+import { ModeToggle } from '@/components/ModeToggle'
+import { MobileSearch, Search } from '@/components/Search'
+
+function TopLevelNavItem({ href, children }) {
+ return (
+
+
+ {children}
+
+
+ )
+}
+
+export const Header = forwardRef(function Header({ className }, ref) {
+ let { isOpen: mobileNavIsOpen } = useMobileNavigationStore()
+ let isInsideMobileNavigation = useIsInsideMobileNavigation()
+
+ let { scrollY } = useScroll()
+ let bgOpacityLight = useTransform(scrollY, [0, 72], [0.5, 0.9])
+ let bgOpacityDark = useTransform(scrollY, [0, 72], [0.2, 0.8])
+
+ return (
+
+
+
+
+
+
+
+
+
+
+
+
+ Home
+ Docs
+ API
+ Blog
+ Github
+ Support
+
+
+
+
+
+
+
+
+ Try NetBird
+
+
+
+ )
+})
diff --git a/src/components/Heading.jsx b/src/components/Heading.jsx
new file mode 100644
index 00000000..997e273b
--- /dev/null
+++ b/src/components/Heading.jsx
@@ -0,0 +1,102 @@
+import { useEffect, useRef } from 'react'
+import Link from 'next/link'
+import { useInView } from 'framer-motion'
+
+import { useSectionStore } from '@/components/SectionProvider'
+import { Tag } from '@/components/Tag'
+import { remToPx } from '@/lib/remToPx'
+
+function AnchorIcon(props) {
+ return (
+
+
+
+ )
+}
+
+function Eyebrow({ tag, label }) {
+ if (!tag && !label) {
+ return null
+ }
+
+ return (
+
+ {tag && {tag} }
+ {tag && label && (
+
+ )}
+ {label && (
+ {label}
+ )}
+
+ )
+}
+
+function Anchor({ id, inView, children }) {
+ return (
+
+ {inView && (
+
+ )}
+ {children}
+
+ )
+}
+
+export function Heading({
+ level = 2,
+ children,
+ id,
+ tag,
+ label,
+ anchor = true,
+ ...props
+}) {
+ let Component = `h${level}`
+ let ref = useRef()
+ // let registerHeading = useSectionStore((s) => s.registerHeading)
+
+ let inView = useInView(ref, {
+ margin: `${remToPx(-3.5)}px 0px 0px 0px`,
+ amount: 'all',
+ })
+
+ // useEffect(() => {
+ // if (level === 2) {
+ // registerHeading({ id, ref, offsetRem: tag || label ? 8 : 6 })
+ // }
+ // })
+
+ return (
+ <>
+
+
+ {anchor ? (
+
+ {children}
+
+ ) : (
+ children
+ )}
+
+ >
+ )
+}
diff --git a/src/components/HeroPattern.jsx b/src/components/HeroPattern.jsx
new file mode 100644
index 00000000..c1b5b086
--- /dev/null
+++ b/src/components/HeroPattern.jsx
@@ -0,0 +1,32 @@
+import { GridPattern } from '@/components/GridPattern'
+
+export function HeroPattern() {
+ return (
+
+ )
+}
diff --git a/src/components/HomepageFeatures.js b/src/components/HomepageFeatures.js
deleted file mode 100644
index 16f820b1..00000000
--- a/src/components/HomepageFeatures.js
+++ /dev/null
@@ -1,64 +0,0 @@
-import React from 'react';
-import clsx from 'clsx';
-import styles from './HomepageFeatures.module.css';
-
-const FeatureList = [
- {
- title: 'Easy to Use',
- Svg: require('../../static/img/undraw_docusaurus_mountain.svg').default,
- description: (
- <>
- Docusaurus was designed from the ground up to be easily installed and
- used to get your website up and running quickly.
- >
- ),
- },
- {
- title: 'Focus on What Matters',
- Svg: require('../../static/img/undraw_docusaurus_tree.svg').default,
- description: (
- <>
- Docusaurus lets you focus on your docs, and we'll do the chores. Go
- ahead and move your docs into the docs directory.
- >
- ),
- },
- {
- title: 'Powered by React',
- Svg: require('../../static/img/undraw_docusaurus_react.svg').default,
- description: (
- <>
- Extend or customize your website layout by reusing React. Docusaurus can
- be extended while reusing the same header and footer.
- >
- ),
- },
-];
-
-function Feature({Svg, title, description}) {
- return (
-
-
-
-
-
-
{title}
-
{description}
-
-
- );
-}
-
-export default function HomepageFeatures() {
- return (
-
-
-
- {FeatureList.map((props, idx) => (
-
- ))}
-
-
-
- );
-}
diff --git a/src/components/HomepageFeatures.module.css b/src/components/HomepageFeatures.module.css
deleted file mode 100644
index b248eb2e..00000000
--- a/src/components/HomepageFeatures.module.css
+++ /dev/null
@@ -1,11 +0,0 @@
-.features {
- display: flex;
- align-items: center;
- padding: 2rem 0;
- width: 100%;
-}
-
-.featureSvg {
- height: 200px;
- width: 200px;
-}
diff --git a/src/components/How-To-Guides.jsx b/src/components/How-To-Guides.jsx
new file mode 100644
index 00000000..e269debd
--- /dev/null
+++ b/src/components/How-To-Guides.jsx
@@ -0,0 +1,66 @@
+import { Button } from '@/components/Button'
+import { Heading } from '@/components/Heading'
+
+const howToGuides = [
+ {
+ href: '/docs/how-to/getting-started',
+ name: 'Quickstart guide',
+ description: 'Start using NetBird in under 5 minutes.',
+ },
+ {
+ href: '/docs/how-to/manage-network-access',
+ name: 'Manage network access',
+ description:
+ 'Learn how to use access controls to manage access to your machines.',
+ },
+ {
+ href: '/docs/how-to/add-users-to-your-network',
+ name: 'Add users to your network',
+ description: 'learn how to add team members to your NetBird network.',
+ },
+ {
+ href: '/docs/how-to/routing-traffic-to-private-networks',
+ name: 'Route traffic to private networks',
+ description:
+ 'Learn how to provide access to LANs, VPS, and corporate private networks.',
+ },
+ {
+ href: '/docs/how-to/monitor-system-and-network-activity',
+ name: 'Log and monitor network activity',
+ description:
+ 'Learn how to keep track of system and network activities in your account.',
+ },
+ {
+ href: '/docs/how-to/manage-dns-in-your-network',
+ name: 'Manage DNS in your network',
+ description:
+ 'Learn how to configure name servers in your private network.',
+ },
+]
+
+export function HowToGuides() {
+ return (
+
+
+ How-To Guides
+
+
+ {howToGuides.map((guide) => (
+
+
+ {guide.name}
+
+
+ {guide.description}
+
+
+
+ Read more
+
+
+
+ ))}
+
+
+ )
+}
diff --git a/src/components/Layout.jsx b/src/components/Layout.jsx
new file mode 100644
index 00000000..687778bd
--- /dev/null
+++ b/src/components/Layout.jsx
@@ -0,0 +1,227 @@
+import { useCallback, useEffect, useState } from 'react'
+import Link from 'next/link'
+import { useRouter } from 'next/router'
+import clsx from 'clsx'
+
+import { Logo, Logomark } from '@/components/Logo'
+import { Prose } from '@/components/Prose'
+import {HeroPattern} from "@/components/HeroPattern";
+import {NavigationDocs} from "@/components/NavigationDocs";
+import {Header} from "@/components/Header";
+import {NavigationAPI} from "@/components/NavigationAPI";
+import {motion} from "framer-motion";
+import {Footer} from "@/components/Footer";
+
+const navigation = [
+ {
+ title: 'Introduction',
+ links: [
+ { title: 'Getting started', href: '/' },
+ { title: 'Installation', href: '/docs/installation' },
+ ],
+ },
+ {
+ title: 'Core concepts',
+ links: [
+ { title: 'Understanding caching', href: '/docs/understanding-caching' },
+ {
+ title: 'Predicting user behavior',
+ href: '/docs/predicting-user-behavior',
+ },
+ { title: 'Basics of time-travel', href: '/docs/basics-of-time-travel' },
+ {
+ title: 'Introduction to string theory',
+ href: '/docs/introduction-to-string-theory',
+ },
+ { title: 'The butterfly effect', href: '/docs/the-butterfly-effect' },
+ ],
+ },
+ {
+ title: 'Advanced guides',
+ links: [
+ { title: 'Writing plugins', href: '/docs/writing-plugins' },
+ { title: 'Neuralink integration', href: '/docs/neuralink-integration' },
+ { title: 'Temporal paradoxes', href: '/docs/temporal-paradoxes' },
+ { title: 'Testing', href: '/docs/testing' },
+ { title: 'Compile-time caching', href: '/docs/compile-time-caching' },
+ {
+ title: 'Predictive data generation',
+ href: '/docs/predictive-data-generation',
+ },
+ ],
+ },
+ {
+ title: 'API reference',
+ links: [
+ { title: 'CacheAdvance.predict()', href: '/docs/cacheadvance-predict' },
+ { title: 'CacheAdvance.flush()', href: '/docs/cacheadvance-flush' },
+ { title: 'CacheAdvance.revert()', href: '/docs/cacheadvance-revert' },
+ { title: 'CacheAdvance.regret()', href: '/docs/cacheadvance-regret' },
+ ],
+ },
+ {
+ title: 'Contributing',
+ links: [
+ { title: 'How to contribute', href: '/docs/how-to-contribute' },
+ { title: 'Architecture guide', href: '/docs/architecture-guide' },
+ { title: 'Design principles', href: '/docs/design-principles' },
+ ],
+ },
+]
+
+function GitHubIcon(props) {
+ return (
+
+
+
+ )
+}
+
+function useTableOfContents(tableOfContents) {
+ let [currentSection, setCurrentSection] = useState(tableOfContents[0]?.id)
+
+ let getHeadings = useCallback((tableOfContents) => {
+ return tableOfContents
+ .flatMap((node) => [node.id, ...node.children.map((child) => child.id)])
+ .map((id) => {
+ let el = document.getElementById(id)
+ if (!el) return
+
+ let style = window.getComputedStyle(el)
+ let scrollMt = parseFloat(style.scrollMarginTop)
+
+ let top = window.scrollY + el.getBoundingClientRect().top - scrollMt
+ return { id, top }
+ })
+ }, [])
+
+ useEffect(() => {
+ if (tableOfContents.length === 0) return
+ let headings = getHeadings(tableOfContents)
+ function onScroll() {
+ let top = window.scrollY
+ let current = headings[0]?.id
+ for (let heading of headings) {
+ if (top >= heading?.top) {
+ current = heading?.id
+ } else {
+ break
+ }
+ }
+ setCurrentSection(current)
+ }
+ window.addEventListener('scroll', onScroll, { passive: true })
+ onScroll()
+ return () => {
+ window.removeEventListener('scroll', onScroll)
+ }
+ }, [getHeadings, tableOfContents])
+
+ return currentSection
+}
+
+export function Layout({ children, title, tableOfContents }) {
+ let router = useRouter()
+ let isHomePage = router.pathname === '/'
+ let allLinks = navigation.flatMap((section) => section.links)
+ let linkIndex = allLinks.findIndex((link) => link.href === router.pathname)
+ let previousPage = allLinks[linkIndex - 1]
+ let nextPage = allLinks[linkIndex + 1]
+ let section = navigation.find((section) =>
+ section.links.find((link) => link.href === router.pathname)
+ )
+
+ let currentSection = useTableOfContents(tableOfContents)
+
+ function isActive(section) {
+ if (section.id === currentSection) {
+ return true
+ }
+ if (!section.children) {
+ return false
+ }
+ return section.children.findIndex(isActive) > -1
+ }
+
+ return (
+ <>
+
+
+
+
+
+
+
+
+
+
+ {router.route.startsWith("/ipa") &&
}
+ {router.route.startsWith("/docs") &&
}
+
+
+
+ {!router.route.startsWith("/ipa/resources") &&
+
+ {tableOfContents.length > 0 && (
+ <>
+
+ On this page
+
+
+ {tableOfContents.map((section) => (
+
+
+
+ {section.title}
+
+
+ {section.children.length > 0 && (
+
+ {section.children.map((subSection) => (
+
+
+ {subSection.title}
+
+
+ ))}
+
+ )}
+
+ ))}
+
+ >
+ )}
+
+
}
+
+ >
+ )
+}
diff --git a/src/components/Libraries.jsx b/src/components/Libraries.jsx
new file mode 100644
index 00000000..c3b452c6
--- /dev/null
+++ b/src/components/Libraries.jsx
@@ -0,0 +1,82 @@
+import Image from 'next/image'
+
+import { Button } from '@/components/Button'
+import { Heading } from '@/components/Heading'
+import logoGo from '@/images/logos/go.svg'
+import logoNode from '@/images/logos/node.svg'
+import logoPhp from '@/images/logos/php.svg'
+import logoPython from '@/images/logos/python.svg'
+import logoRuby from '@/images/logos/ruby.svg'
+
+const libraries = [
+ {
+ href: '#',
+ name: 'PHP',
+ description:
+ 'A popular general-purpose scripting language that is especially suited to web development.',
+ logo: logoPhp,
+ },
+ {
+ href: '#',
+ name: 'Ruby',
+ description:
+ 'A dynamic, open source programming language with a focus on simplicity and productivity.',
+ logo: logoRuby,
+ },
+ {
+ href: '#',
+ name: 'Node.js',
+ description:
+ 'Node.js® is an open-source, cross-platform JavaScript runtime environment.',
+ logo: logoNode,
+ },
+ {
+ href: '#',
+ name: 'Python',
+ description:
+ 'Python is a programming language that lets you work quickly and integrate systems more effectively.',
+ logo: logoPython,
+ },
+ {
+ href: '#',
+ name: 'Go',
+ description:
+ 'An open-source programming language supported by Google with built-in concurrency.',
+ logo: logoGo,
+ },
+]
+
+export function Libraries() {
+ return (
+
+
+ Official libraries
+
+
+ {libraries.map((library) => (
+
+
+
+ {library.name}
+
+
+ {library.description}
+
+
+
+ Read more
+
+
+
+
+
+ ))}
+
+
+ )
+}
diff --git a/src/components/Logo.jsx b/src/components/Logo.jsx
new file mode 100644
index 00000000..9c692ed9
--- /dev/null
+++ b/src/components/Logo.jsx
@@ -0,0 +1,17 @@
+import {useRouter} from "next/router";
+
+export function Logo(props) {
+ let router = useRouter()
+ return (
+
+ {router.route.startsWith('/docs') &&
}
+ {router.route.startsWith('/docs') &&
}
+ {router.route.startsWith('/ipa') &&
}
+ {router.route.startsWith('/ipa') &&
}
+
+ )
+}
diff --git a/src/components/MobileNavigation.jsx b/src/components/MobileNavigation.jsx
new file mode 100644
index 00000000..15539b50
--- /dev/null
+++ b/src/components/MobileNavigation.jsx
@@ -0,0 +1,120 @@
+import { createContext, Fragment, useContext } from 'react'
+import { Dialog, Transition } from '@headlessui/react'
+import { motion } from 'framer-motion'
+import { create } from 'zustand'
+
+import { Header } from '@/components/Header'
+import { NavigationAPI } from '@/components/NavigationAPI'
+import {NavigationDocs} from "@/components/NavigationDocs";
+import {useRouter} from "next/router";
+
+function MenuIcon(props) {
+ return (
+
+
+
+ )
+}
+
+function XIcon(props) {
+ return (
+
+
+
+ )
+}
+
+const IsInsideMobileNavigationContext = createContext(false)
+
+export function useIsInsideMobileNavigation() {
+ return useContext(IsInsideMobileNavigationContext)
+}
+
+export const useMobileNavigationStore = create((set) => ({
+ isOpen: false,
+ open: () => set({ isOpen: true }),
+ close: () => set({ isOpen: false }),
+ toggle: () => set((state) => ({ isOpen: !state.isOpen })),
+}))
+
+export function MobileNavigation() {
+ let isInsideMobileNavigation = useIsInsideMobileNavigation()
+ let { isOpen, toggle, close } = useMobileNavigationStore()
+ let ToggleIcon = isOpen ? XIcon : MenuIcon
+
+ let router = useRouter()
+
+ return (
+
+
+
+
+ {!isInsideMobileNavigation && (
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {router.route.startsWith("/ipa") ? :
+ }
+
+
+
+
+
+ )}
+
+ )
+}
diff --git a/src/components/ModeToggle.jsx b/src/components/ModeToggle.jsx
new file mode 100644
index 00000000..f58c6575
--- /dev/null
+++ b/src/components/ModeToggle.jsx
@@ -0,0 +1,54 @@
+function SunIcon(props) {
+ return (
+
+
+
+
+ )
+}
+
+function MoonIcon(props) {
+ return (
+
+
+
+ )
+}
+
+export function ModeToggle() {
+ function disableTransitionsTemporarily() {
+ document.documentElement.classList.add('[&_*]:!transition-none')
+ window.setTimeout(() => {
+ document.documentElement.classList.remove('[&_*]:!transition-none')
+ }, 0)
+ }
+
+ function toggleMode() {
+ disableTransitionsTemporarily()
+
+ let darkModeMediaQuery = window.matchMedia('(prefers-color-scheme: dark)')
+ let isSystemDarkMode = darkModeMediaQuery.matches
+ let isDarkMode = document.documentElement.classList.toggle('dark')
+
+ if (isDarkMode === isSystemDarkMode) {
+ delete window.localStorage.isDarkMode
+ } else {
+ window.localStorage.isDarkMode = isDarkMode
+ }
+ }
+
+ return (
+
+
+
+
+ )
+}
diff --git a/src/components/NavigationAPI.jsx b/src/components/NavigationAPI.jsx
new file mode 100644
index 00000000..f779b927
--- /dev/null
+++ b/src/components/NavigationAPI.jsx
@@ -0,0 +1,209 @@
+import Link from 'next/link'
+import { useRouter } from 'next/router'
+import clsx from 'clsx'
+import { AnimatePresence, motion, useIsPresent } from 'framer-motion'
+import { Button } from '@/components/Button'
+import { Tag } from '@/components/Tag'
+import { remToPx } from '@/lib/remToPx'
+import {useIsInsideMobileNavigation} from "@/components/MobileNavigation";
+
+export const apiNavigation = [
+ {
+ title: 'Guides',
+ links: [
+ { title: 'Quickstart', href: '/ipa/guides/quickstart' },
+ { title: 'Authentication', href: '/ipa/guides/authentication' },
+ { title: 'Errors', href: '/ipa/guides/errors' },
+ // { title: 'Events', href: '/accounts' },
+ ],
+ },
+ {
+ title: 'Resources',
+ links: [
+ { title: 'Accounts', href: '/ipa/resources/accounts' },
+ { title: 'Users', href: '/ipa/resources/users' },
+ { title: 'Tokens', href: '/ipa/resources/tokens' },
+ { title: 'Peers', href: '/ipa/resources/peers' },
+ { title: 'Setup Keys', href: '/ipa/resources/setup-keys' },
+ { title: 'Groups', href: '/ipa/resources/groups' },
+ { title: 'Rules', href: '/ipa/resources/rules' },
+ { title: 'Policies', href: '/ipa/resources/policies' },
+ { title: 'Routes', href: '/ipa/resources/routes' },
+ { title: 'DNS', href: '/ipa/resources/dns' },
+ { title: 'Events', href: '/ipa/resources/events' },
+ ],
+ },
+]
+
+export function NavigationAPI({tableOfContents, className}) {
+ return (
+
+
+ Home
+ Docs
+ API
+ Blog
+ Github
+ Support
+ {apiNavigation.map((group, groupIndex) => (
+
+ ))}
+
+
+ Sign in
+
+
+
+
+ )
+}
+export function TopLevelNavItem({ href, children }) {
+ return (
+
+
+ {children}
+
+
+ )
+}
+
+export function NavLink({ href, tag, active, isAnchorLink = false, children }) {
+ return (
+
+ {children}
+ {tag && (
+
+ {tag}
+
+ )}
+
+ )
+}
+
+export function VisibleSectionHighlight({ group, pathname }) {
+ let height = remToPx(2)
+ let offset = remToPx(0)
+ let activePageIndex = group.links.findIndex((link) => link.href === pathname)
+ let top = offset + activePageIndex * height
+
+ return (
+
+ )
+}
+
+export function ActivePageMarker({ group, pathname }) {
+ let itemHeight = remToPx(2)
+ let offset = remToPx(0.25)
+ let activePageIndex = group.links.findIndex((link) => link.href === pathname)
+ let top = offset + activePageIndex * itemHeight
+
+ return (
+
+ )
+}
+
+function NavigationGroup({ group, className, tableOfContents }) {
+ let router = useRouter()
+
+ let isActiveGroup =
+ group.links.findIndex((link) => link.href === router.pathname) !== -1
+
+ return (
+
+
+ {group.title}
+
+
+
+ {isActiveGroup && (
+
+ )}
+
+
+
+ {isActiveGroup && (
+
+ )}
+
+
+ {group.links.map((link) => (
+
+
+ {link.title}
+
+
+ {link.href === router.pathname && (
+
+ {router.route.startsWith("/ipa/resources") && tableOfContents?.map((section) => (
+
+
+ {section.title}
+
+
+ ))}
+
+ )}
+
+
+ ))}
+
+
+
+ )
+}
+
+
+
diff --git a/src/components/NavigationDocs.jsx b/src/components/NavigationDocs.jsx
new file mode 100644
index 00000000..0e345a8f
--- /dev/null
+++ b/src/components/NavigationDocs.jsx
@@ -0,0 +1,113 @@
+import { useRouter } from 'next/router'
+import clsx from 'clsx'
+import {ActivePageMarker, NavLink, TopLevelNavItem, VisibleSectionHighlight} from "@/components/NavigationAPI";
+import {AnimatePresence, motion} from "framer-motion";
+import {Button} from "@/components/mdx";
+
+export const docsNavigation = [
+ {
+ title: 'About NetBird',
+ links: [
+ { title: 'Why WireGuard with NetBird?', href: '/docs/about-netbird/why-wireguard-with-netbird' },
+ { title: 'How NetBird works', href: '/docs/about-netbird/how-netbird-works' },
+ { title: 'NetBird vs. traditional VPN', href: '/docs/about-netbird/netbird-vs-traditional-vpn' },
+ { title: 'Other', href: '/docs/about-netbird/other' },
+ { title: 'FAQ', href: '/docs/about-netbird/faq' },
+ ],
+ },
+ {
+ title: 'How-to guides',
+ links: [
+ { title: 'Getting started', href: '/docs/how-to/getting-started' },
+ { title: 'Installation', href: '/docs/how-to/installation' },
+ { title: 'Use setup keys for automation', href: '/docs/how-to/register-machines-using-setup-keys' },
+ { title: 'Manage network access', href: '/docs/how-to/manage-network-access' },
+ { title: 'Add users to your network', href: '/docs/how-to/add-users-to-your-network' },
+ { title: 'Access NetBird API', href: '/docs/how-to/access-netbird-public-api' },
+ { title: 'Enforce periodic authentication', href: '/docs/how-to/enforce-periodic-user-authentication' },
+ { title: 'Monitor system and network activity', href: '/docs/how-to/monitor-system-and-network-activity' },
+ { title: 'Route traffic to private networks', href: '/docs/how-to/routing-traffic-to-private-networks' },
+ { title: 'Manage DNS in your network', href: '/docs/how-to/manage-dns-in-your-network' },
+ { title: 'Examples', href: '/docs/how-to/examples' },
+ { title: 'CLI', href: '/docs/how-to/cli' },
+ ],
+ },
+ {
+ title: 'Self-hosting NetBird',
+ links: [
+ { title: 'Installation guide', href: '/docs/selfhosted/selfhosted-guide' },
+ { title: 'Supported IdPs', href: '/docs/selfhosted/identity-providers' },
+ ],
+ },
+
+]
+
+export function NavigationDocs({className}) {
+ return (
+
+
+ Home
+ Docs
+ API
+ Blog
+ Github
+ Support
+ {docsNavigation.map((group, groupIndex) => (
+
+ ))}
+
+
+ Sign in
+
+
+
+
+ )
+}
+
+function NavigationGroup({ group, className }) {
+ let router = useRouter()
+
+ let isActiveGroup =
+ group.links.findIndex((link) => link.href === router.pathname) !== -1
+
+ return (
+
+
+ {group.title}
+
+
+
+ {isActiveGroup && (
+
+ )}
+
+
+
+ {isActiveGroup && (
+
+ )}
+
+
+ {group.links.map((link) => (
+
+
+ {link.title}
+
+
+ ))}
+
+
+
+ )
+}
diff --git a/src/components/Prose.jsx b/src/components/Prose.jsx
new file mode 100644
index 00000000..9fff2b39
--- /dev/null
+++ b/src/components/Prose.jsx
@@ -0,0 +1,10 @@
+import clsx from 'clsx'
+
+export function Prose({ as: Component = 'div', className, ...props }) {
+ return (
+
+ )
+}
diff --git a/src/components/Resources.jsx b/src/components/Resources.jsx
new file mode 100644
index 00000000..a2ca8f60
--- /dev/null
+++ b/src/components/Resources.jsx
@@ -0,0 +1,236 @@
+import Link from 'next/link'
+import { motion, useMotionTemplate, useMotionValue } from 'framer-motion'
+
+import { GridPattern } from '@/components/GridPattern'
+import { Heading } from '@/components/Heading'
+import { ChatBubbleIcon } from '@/components/icons/ChatBubbleIcon'
+import { EnvelopeIcon } from '@/components/icons/EnvelopeIcon'
+import { UserIcon } from '@/components/icons/UserIcon'
+import { UsersIcon } from '@/components/icons/UsersIcon'
+
+const resources = [
+ {
+ href: '/ipa/resources/accounts',
+ name: 'Accounts',
+ description:
+ 'Learn how to list and update accounts.',
+ icon: UserIcon,
+ pattern: {
+ y: 16,
+ squares: [
+ [0, 1],
+ [1, 3],
+ ],
+ },
+ },
+ {
+ href: '/ipa/resources/users',
+ name: 'Users',
+ description:
+ 'Learn how to create, update, delete, and list users.',
+ icon: ChatBubbleIcon,
+ pattern: {
+ y: -6,
+ squares: [
+ [-1, 2],
+ [1, 3],
+ ],
+ },
+ },
+ {
+ href: '/ipa/resources/tokens',
+ name: 'Tokens',
+ description:
+ 'Learn how to create, retrieve, delete, and list tokens.',
+ icon: ChatBubbleIcon,
+ pattern: {
+ y: -6,
+ squares: [
+ [-1, 2],
+ [1, 3],
+ ],
+ },
+ },
+ {
+ href: '/ipa/resources/peers',
+ name: 'Peers',
+ description:
+ 'Learn how to retrieve, update, delete, and list peers.',
+ icon: EnvelopeIcon,
+ pattern: {
+ y: 32,
+ squares: [
+ [0, 2],
+ [1, 4],
+ ],
+ },
+ },
+ {
+ href: '/ipa/resources/setup-keys',
+ name: 'Setup Keys',
+ description:
+ 'Learn how to create, retrieve, update, and list setup keys.',
+ icon: UsersIcon,
+ pattern: {
+ y: 22,
+ squares: [[0, 1]],
+ },
+ },
+ {
+ href: '/ipa/resources/groups',
+ name: 'Groups',
+ description:
+ 'Learn how to create, retrieve, update, delete, and list groups.',
+ icon: UsersIcon,
+ pattern: {
+ y: 22,
+ squares: [[0, 1]],
+ },
+ },
+ {
+ href: '/ipa/resources/rules',
+ name: 'Rules',
+ description:
+ 'Learn how to create, retrieve, update, delete, and list rules.',
+ icon: UsersIcon,
+ pattern: {
+ y: 22,
+ squares: [[0, 1]],
+ },
+ },
+ {
+ href: '/ipa/resources/policies',
+ name: 'Policies',
+ description:
+ 'Learn how to create, retrieve, update, delete, and list policies.',
+ icon: UsersIcon,
+ pattern: {
+ y: 22,
+ squares: [[0, 1]],
+ },
+ },
+ {
+ href: '/ipa/resources/routes',
+ name: 'Routes',
+ description:
+ 'Learn about how to create, retrieve, update, delete, and list routes.',
+ icon: UsersIcon,
+ pattern: {
+ y: 22,
+ squares: [[0, 1]],
+ },
+ },
+ {
+ href: '/ipa/resources/dns',
+ name: 'DNS',
+ description:
+ 'Learn about how to create, retrieve, update, delete, and list nameserver groups and update and retrieve DNS settings.',
+ icon: UsersIcon,
+ pattern: {
+ y: 22,
+ squares: [[0, 1]],
+ },
+ },
+ {
+ href: '/ipa/resources/events',
+ name: 'Events',
+ description:
+ 'Learn about how to list events.',
+ icon: UsersIcon,
+ pattern: {
+ y: 22,
+ squares: [[0, 1]],
+ },
+ },
+]
+
+function ResourceIcon({ icon: Icon }) {
+ return (
+
+
+
+ )
+}
+
+function ResourcePattern({ mouseX, mouseY, ...gridProps }) {
+ let maskImage = useMotionTemplate`radial-gradient(180px at ${mouseX}px ${mouseY}px, white, transparent)`
+ let style = { maskImage, WebkitMaskImage: maskImage }
+
+ return (
+
+ )
+}
+
+function Resource({ resource }) {
+ let mouseX = useMotionValue(0)
+ let mouseY = useMotionValue(0)
+
+ function onMouseMove({ currentTarget, clientX, clientY }) {
+ let { left, top } = currentTarget.getBoundingClientRect()
+ mouseX.set(clientX - left)
+ mouseY.set(clientY - top)
+ }
+
+ return (
+
+
+
+
+
+
+
+ {resource.name}
+
+
+
+ {resource.description}
+
+
+
+ )
+}
+
+export function Resources() {
+ return (
+
+
+ Resources
+
+
+ {resources.map((resource) => (
+
+ ))}
+
+
+ )
+}
diff --git a/src/components/Search.jsx b/src/components/Search.jsx
new file mode 100644
index 00000000..05863f0c
--- /dev/null
+++ b/src/components/Search.jsx
@@ -0,0 +1,515 @@
+import { forwardRef, Fragment, useEffect, useId, useRef, useState } from 'react'
+import { useRouter } from 'next/router'
+import { createAutocomplete } from '@algolia/autocomplete-core'
+import { getAlgoliaResults } from '@algolia/autocomplete-preset-algolia'
+import { Dialog, Transition } from '@headlessui/react'
+import algoliasearch from 'algoliasearch/lite'
+import clsx from 'clsx'
+
+const searchClient = algoliasearch(
+ process.env.NEXT_PUBLIC_DOCSEARCH_APP_ID,
+ process.env.NEXT_PUBLIC_DOCSEARCH_API_KEY
+)
+
+function useAutocomplete() {
+ let id = useId()
+ let router = useRouter()
+ let [autocompleteState, setAutocompleteState] = useState({})
+
+ let [autocomplete] = useState(() =>
+ createAutocomplete({
+ id,
+ placeholder: 'Find something...',
+ defaultActiveItemId: 0,
+ onStateChange({ state }) {
+ setAutocompleteState(state)
+ },
+ shouldPanelOpen({ state }) {
+ return state.query !== ''
+ },
+ navigator: {
+ navigate({ itemUrl }) {
+ autocomplete.setIsOpen(true)
+ router.push(itemUrl)
+ },
+ },
+ getSources() {
+ return [
+ {
+ sourceId: 'documentation',
+ getItemInputValue({ item }) {
+ return item.query
+ },
+ getItemUrl({ item }) {
+ let url = new URL(item.url)
+ return `${url.pathname}${url.hash}`
+ },
+ onSelect({ itemUrl }) {
+ router.push(itemUrl)
+ },
+ getItems({ query }) {
+ return getAlgoliaResults({
+ searchClient,
+ queries: [
+ {
+ query,
+ indexName: process.env.NEXT_PUBLIC_DOCSEARCH_INDEX_NAME,
+ params: {
+ hitsPerPage: 5,
+ highlightPreTag:
+ '',
+ highlightPostTag: ' ',
+ },
+ },
+ ],
+ })
+ },
+ },
+ ]
+ },
+ })
+ )
+
+ return { autocomplete, autocompleteState }
+}
+
+function resolveResult(result) {
+ let allLevels = Object.keys(result.hierarchy)
+ let hierarchy = Object.entries(result._highlightResult.hierarchy).filter(
+ ([, { value }]) => Boolean(value)
+ )
+ let levels = hierarchy.map(([level]) => level)
+
+ let level =
+ result.type === 'content'
+ ? levels.pop()
+ : levels
+ .filter(
+ (level) =>
+ allLevels.indexOf(level) <= allLevels.indexOf(result.type)
+ )
+ .pop()
+
+ return {
+ titleHtml: result._highlightResult.hierarchy[level].value,
+ hierarchyHtml: hierarchy
+ .slice(0, levels.indexOf(level))
+ .map(([, { value }]) => value),
+ }
+}
+
+function SearchIcon(props) {
+ return (
+
+
+
+ )
+}
+
+function NoResultsIcon(props) {
+ return (
+
+
+
+ )
+}
+
+function LoadingIcon(props) {
+ let id = useId()
+
+ return (
+
+
+
+
+
+
+
+
+
+
+ )
+}
+
+function SearchResult({ result, resultIndex, autocomplete, collection }) {
+ let id = useId()
+ let { titleHtml, hierarchyHtml } = resolveResult(result)
+
+ return (
+ 0 && 'border-t border-zinc-100 dark:border-zinc-800'
+ )}
+ aria-labelledby={`${id}-hierarchy ${id}-title`}
+ {...autocomplete.getItemProps({
+ item: result,
+ source: collection.source,
+ })}
+ >
+
+ {hierarchyHtml.length > 0 && (
+
+ {hierarchyHtml.map((item, itemIndex, items) => (
+
+
+
+ /
+
+
+ ))}
+
+ )}
+
+ )
+}
+
+function SearchResults({ autocomplete, query, collection }) {
+ if (collection.items.length === 0) {
+ return (
+
+
+
+ Nothing found for{' '}
+
+ ‘{query}’
+
+ . Please try again.
+
+
+ )
+ }
+
+ return (
+
+ {collection.items.map((result, resultIndex) => (
+
+ ))}
+
+ )
+}
+
+const SearchInput = forwardRef(function SearchInput(
+ { autocomplete, autocompleteState, onClose },
+ inputRef
+) {
+ let inputProps = autocomplete.getInputProps({})
+
+ return (
+
+
+
{
+ if (
+ event.key === 'Escape' &&
+ !autocompleteState.isOpen &&
+ autocompleteState.query === ''
+ ) {
+ // In Safari, closing the dialog with the escape key can sometimes cause the scroll position to jump to the
+ // bottom of the page. This is a workaround for that until we can figure out a proper fix in Headless UI.
+ document.activeElement?.blur()
+
+ onClose()
+ } else {
+ inputProps.onKeyDown(event)
+ }
+ }}
+ />
+ {autocompleteState.status === 'stalled' && (
+
+
+
+ )}
+
+ )
+})
+
+function AlgoliaLogo(props) {
+ return (
+
+
+
+
+
+
+ )
+}
+
+function SearchButton(props) {
+ let [modifierKey, setModifierKey] = useState()
+
+ useEffect(() => {
+ setModifierKey(
+ /(Mac|iPhone|iPod|iPad)/i.test(navigator.platform) ? '⌘' : 'Ctrl '
+ )
+ }, [])
+
+ return (
+ <>
+
+
+ Find something...
+
+ {modifierKey}
+ K
+
+
+
+
+
+ >
+ )
+}
+
+function SearchDialog({ open, setOpen, className }) {
+ let router = useRouter()
+ let formRef = useRef()
+ let panelRef = useRef()
+ let inputRef = useRef()
+ let { autocomplete, autocompleteState } = useAutocomplete()
+
+ useEffect(() => {
+ if (!open) {
+ return
+ }
+
+ function onRouteChange() {
+ setOpen(false)
+ }
+
+ router.events.on('routeChangeStart', onRouteChange)
+ router.events.on('hashChangeStart', onRouteChange)
+
+ return () => {
+ router.events.off('routeChangeStart', onRouteChange)
+ router.events.off('hashChangeStart', onRouteChange)
+ }
+ }, [open, setOpen, router])
+
+ useEffect(() => {
+ if (open) {
+ return
+ }
+
+ function onKeyDown(event) {
+ if (event.key === 'k' && (event.metaKey || event.ctrlKey)) {
+ event.preventDefault()
+ setOpen(true)
+ }
+ }
+
+ window.addEventListener('keydown', onKeyDown)
+
+ return () => {
+ window.removeEventListener('keydown', onKeyDown)
+ }
+ }, [open, setOpen])
+
+ return (
+ autocomplete.setQuery('')}
+ >
+
+
+
+
+
+
+
+
+ )
+}
+
+function useSearchProps() {
+ let buttonRef = useRef()
+ let [open, setOpen] = useState(false)
+
+ return {
+ buttonProps: {
+ ref: buttonRef,
+ onClick() {
+ setOpen(true)
+ },
+ },
+ dialogProps: {
+ open,
+ setOpen(open) {
+ let { width, height } = buttonRef.current.getBoundingClientRect()
+ if (!open || (width !== 0 && height !== 0)) {
+ setOpen(open)
+ }
+ },
+ },
+ }
+}
+
+export function Search() {
+ let [modifierKey, setModifierKey] = useState()
+ let { buttonProps, dialogProps } = useSearchProps()
+
+ useEffect(() => {
+ setModifierKey(
+ /(Mac|iPhone|iPod|iPad)/i.test(navigator.platform) ? '⌘' : 'Ctrl '
+ )
+ }, [])
+
+ return (
+
+
+
+ Find something...
+
+ {modifierKey}
+ K
+
+
+
+
+ )
+}
+
+export function MobileSearch() {
+ let { buttonProps, dialogProps } = useSearchProps()
+
+ return (
+
+
+
+
+
+
+ )
+}
diff --git a/src/components/SectionProvider.jsx b/src/components/SectionProvider.jsx
new file mode 100644
index 00000000..95f1496c
--- /dev/null
+++ b/src/components/SectionProvider.jsx
@@ -0,0 +1,117 @@
+import {
+ createContext,
+ useContext,
+ useEffect,
+ useLayoutEffect,
+ useState,
+} from 'react'
+import { createStore, useStore } from 'zustand'
+
+import { remToPx } from '@/lib/remToPx'
+
+function createSectionStore(sections) {
+ return createStore((set) => ({
+ sections,
+ visibleSections: [],
+ setVisibleSections: (visibleSections) =>
+ set((state) =>
+ state.visibleSections.join() === visibleSections.join()
+ ? {}
+ : { visibleSections }
+ ),
+ registerHeading: ({ id, ref, offsetRem }) =>
+ set((state) => {
+ return {
+ sections: state.sections.map((section) => {
+ if (section.id === id) {
+ return {
+ ...section,
+ headingRef: ref,
+ offsetRem,
+ }
+ }
+ return section
+ }),
+ }
+ }),
+ }))
+}
+
+function useVisibleSections(sectionStore) {
+ let setVisibleSections = useStore(sectionStore, (s) => s.setVisibleSections)
+ let sections = useStore(sectionStore, (s) => s.sections)
+
+ useEffect(() => {
+ function checkVisibleSections() {
+ let { innerHeight, scrollY } = window
+ let newVisibleSections = []
+
+ for (
+ let sectionIndex = 0;
+ sectionIndex < sections.length;
+ sectionIndex++
+ ) {
+ let { id, headingRef, offsetRem } = sections[sectionIndex]
+ let offset = remToPx(offsetRem)
+ let top = headingRef.current.getBoundingClientRect().top + scrollY
+
+ if (sectionIndex === 0 && top - offset > scrollY) {
+ newVisibleSections.push('_top')
+ }
+
+ let nextSection = sections[sectionIndex + 1]
+ let bottom =
+ (nextSection?.headingRef.current.getBoundingClientRect().top ??
+ Infinity) +
+ scrollY -
+ remToPx(nextSection?.offsetRem ?? 0)
+
+ if (
+ (top > scrollY && top < scrollY + innerHeight) ||
+ (bottom > scrollY && bottom < scrollY + innerHeight) ||
+ (top <= scrollY && bottom >= scrollY + innerHeight)
+ ) {
+ newVisibleSections.push(id)
+ }
+ }
+
+ setVisibleSections(newVisibleSections)
+ }
+
+ let raf = window.requestAnimationFrame(() => checkVisibleSections())
+ window.addEventListener('scroll', checkVisibleSections, { passive: true })
+ window.addEventListener('resize', checkVisibleSections)
+
+ return () => {
+ window.cancelAnimationFrame(raf)
+ window.removeEventListener('scroll', checkVisibleSections)
+ window.removeEventListener('resize', checkVisibleSections)
+ }
+ }, [setVisibleSections, sections])
+}
+
+const SectionStoreContext = createContext()
+
+const useIsomorphicLayoutEffect =
+ typeof window === 'undefined' ? useEffect : useLayoutEffect
+
+export function SectionProvider({ sections, children }) {
+ let [sectionStore] = useState(() => createSectionStore(sections))
+
+ useVisibleSections(sectionStore)
+
+ useIsomorphicLayoutEffect(() => {
+ sectionStore.setState({ sections })
+ }, [sectionStore, sections])
+
+ return (
+
+ {children}
+
+ )
+}
+
+export function useSectionStore(selector) {
+ let store = useContext(SectionStoreContext)
+ return useStore(store, selector)
+}
diff --git a/src/components/Tag.jsx b/src/components/Tag.jsx
new file mode 100644
index 00000000..902cb8f5
--- /dev/null
+++ b/src/components/Tag.jsx
@@ -0,0 +1,58 @@
+import clsx from 'clsx'
+
+const variantStyles = {
+ medium: 'rounded-lg px-1.5 ring-1 ring-inset',
+}
+
+const colorStyles = {
+ emerald: {
+ small: 'text-emerald-500 dark:text-emerald-400',
+ medium:
+ 'ring-emerald-300 dark:ring-emerald-400/30 bg-emerald-400/10 text-emerald-500 dark:text-emerald-400',
+ },
+ sky: {
+ small: 'text-sky-500',
+ medium:
+ 'ring-sky-300 bg-sky-400/10 text-sky-500 dark:ring-sky-400/30 dark:bg-sky-400/10 dark:text-sky-400',
+ },
+ amber: {
+ small: 'text-amber-500',
+ medium:
+ 'ring-amber-300 bg-amber-400/10 text-amber-500 dark:ring-amber-400/30 dark:bg-amber-400/10 dark:text-amber-400',
+ },
+ rose: {
+ small: 'text-red-500 dark:text-rose-500',
+ medium:
+ 'ring-rose-200 bg-rose-50 text-red-500 dark:ring-rose-500/20 dark:bg-rose-400/10 dark:text-rose-400',
+ },
+ zinc: {
+ small: 'text-zinc-400 dark:text-zinc-500',
+ medium:
+ 'ring-zinc-200 bg-zinc-50 text-zinc-500 dark:ring-zinc-500/20 dark:bg-zinc-400/10 dark:text-zinc-400',
+ },
+}
+
+const valueColorMap = {
+ get: 'emerald',
+ post: 'sky',
+ put: 'amber',
+ delete: 'rose',
+}
+
+export function Tag({
+ children,
+ variant = 'medium',
+ color = valueColorMap[children.toLowerCase()] ?? 'emerald',
+}) {
+ return (
+
+ {children}
+
+ )
+}
diff --git a/src/components/icons/BellIcon.jsx b/src/components/icons/BellIcon.jsx
new file mode 100644
index 00000000..09062dd9
--- /dev/null
+++ b/src/components/icons/BellIcon.jsx
@@ -0,0 +1,17 @@
+export function BellIcon(props) {
+ return (
+
+
+
+
+ )
+}
diff --git a/src/components/icons/BoltIcon.jsx b/src/components/icons/BoltIcon.jsx
new file mode 100644
index 00000000..1278a7fe
--- /dev/null
+++ b/src/components/icons/BoltIcon.jsx
@@ -0,0 +1,11 @@
+export function BoltIcon(props) {
+ return (
+
+
+
+ )
+}
diff --git a/src/components/icons/BookIcon.jsx b/src/components/icons/BookIcon.jsx
new file mode 100644
index 00000000..d560f41c
--- /dev/null
+++ b/src/components/icons/BookIcon.jsx
@@ -0,0 +1,17 @@
+export function BookIcon(props) {
+ return (
+
+
+
+
+ )
+}
diff --git a/src/components/icons/CalendarIcon.jsx b/src/components/icons/CalendarIcon.jsx
new file mode 100644
index 00000000..8d0a57c8
--- /dev/null
+++ b/src/components/icons/CalendarIcon.jsx
@@ -0,0 +1,23 @@
+export function CalendarIcon(props) {
+ return (
+
+
+
+
+
+ )
+}
diff --git a/src/components/icons/CartIcon.jsx b/src/components/icons/CartIcon.jsx
new file mode 100644
index 00000000..e4246246
--- /dev/null
+++ b/src/components/icons/CartIcon.jsx
@@ -0,0 +1,15 @@
+export function CartIcon(props) {
+ return (
+
+
+
+
+ )
+}
diff --git a/src/components/icons/ChatBubbleIcon.jsx b/src/components/icons/ChatBubbleIcon.jsx
new file mode 100644
index 00000000..b929ec64
--- /dev/null
+++ b/src/components/icons/ChatBubbleIcon.jsx
@@ -0,0 +1,17 @@
+export function ChatBubbleIcon(props) {
+ return (
+
+
+
+
+ )
+}
diff --git a/src/components/icons/CheckIcon.jsx b/src/components/icons/CheckIcon.jsx
new file mode 100644
index 00000000..33d2b249
--- /dev/null
+++ b/src/components/icons/CheckIcon.jsx
@@ -0,0 +1,17 @@
+export function CheckIcon(props) {
+ return (
+
+
+
+
+ )
+}
diff --git a/src/components/icons/ChevronRightLeftIcon.jsx b/src/components/icons/ChevronRightLeftIcon.jsx
new file mode 100644
index 00000000..2dbaa18c
--- /dev/null
+++ b/src/components/icons/ChevronRightLeftIcon.jsx
@@ -0,0 +1,17 @@
+export function ChevronRightLeftIcon(props) {
+ return (
+
+
+
+
+ )
+}
diff --git a/src/components/icons/ClipboardIcon.jsx b/src/components/icons/ClipboardIcon.jsx
new file mode 100644
index 00000000..9c8c55ce
--- /dev/null
+++ b/src/components/icons/ClipboardIcon.jsx
@@ -0,0 +1,17 @@
+export function ClipboardIcon(props) {
+ return (
+
+
+
+
+ )
+}
diff --git a/src/components/icons/CogIcon.jsx b/src/components/icons/CogIcon.jsx
new file mode 100644
index 00000000..57023fc7
--- /dev/null
+++ b/src/components/icons/CogIcon.jsx
@@ -0,0 +1,19 @@
+export function CogIcon(props) {
+ return (
+
+
+
+
+
+ )
+}
diff --git a/src/components/icons/CopyIcon.jsx b/src/components/icons/CopyIcon.jsx
new file mode 100644
index 00000000..aadede17
--- /dev/null
+++ b/src/components/icons/CopyIcon.jsx
@@ -0,0 +1,17 @@
+export function CopyIcon(props) {
+ return (
+
+
+
+
+ )
+}
diff --git a/src/components/icons/DocumentIcon.jsx b/src/components/icons/DocumentIcon.jsx
new file mode 100644
index 00000000..b576db04
--- /dev/null
+++ b/src/components/icons/DocumentIcon.jsx
@@ -0,0 +1,17 @@
+export function DocumentIcon(props) {
+ return (
+
+
+
+
+ )
+}
diff --git a/src/components/icons/EnvelopeIcon.jsx b/src/components/icons/EnvelopeIcon.jsx
new file mode 100644
index 00000000..17ab4fa9
--- /dev/null
+++ b/src/components/icons/EnvelopeIcon.jsx
@@ -0,0 +1,17 @@
+export function EnvelopeIcon(props) {
+ return (
+
+
+
+
+ )
+}
diff --git a/src/components/icons/FaceSmileIcon.jsx b/src/components/icons/FaceSmileIcon.jsx
new file mode 100644
index 00000000..4c01755a
--- /dev/null
+++ b/src/components/icons/FaceSmileIcon.jsx
@@ -0,0 +1,17 @@
+export function FaceSmileIcon(props) {
+ return (
+
+
+
+
+ )
+}
diff --git a/src/components/icons/FolderIcon.jsx b/src/components/icons/FolderIcon.jsx
new file mode 100644
index 00000000..c59b6e0a
--- /dev/null
+++ b/src/components/icons/FolderIcon.jsx
@@ -0,0 +1,22 @@
+export function FolderIcon(props) {
+ return (
+
+
+
+
+
+ )
+}
diff --git a/src/components/icons/LinkIcon.jsx b/src/components/icons/LinkIcon.jsx
new file mode 100644
index 00000000..2dace231
--- /dev/null
+++ b/src/components/icons/LinkIcon.jsx
@@ -0,0 +1,12 @@
+export function LinkIcon(props) {
+ return (
+
+
+
+ )
+}
diff --git a/src/components/icons/ListIcon.jsx b/src/components/icons/ListIcon.jsx
new file mode 100644
index 00000000..ea45c0a6
--- /dev/null
+++ b/src/components/icons/ListIcon.jsx
@@ -0,0 +1,17 @@
+export function ListIcon(props) {
+ return (
+
+
+
+
+ )
+}
diff --git a/src/components/icons/MagnifyingGlassIcon.jsx b/src/components/icons/MagnifyingGlassIcon.jsx
new file mode 100644
index 00000000..309359c2
--- /dev/null
+++ b/src/components/icons/MagnifyingGlassIcon.jsx
@@ -0,0 +1,13 @@
+export function MagnifyingGlassIcon(props) {
+ return (
+
+
+
+
+ )
+}
diff --git a/src/components/icons/MapPinIcon.jsx b/src/components/icons/MapPinIcon.jsx
new file mode 100644
index 00000000..b581a6d6
--- /dev/null
+++ b/src/components/icons/MapPinIcon.jsx
@@ -0,0 +1,19 @@
+export function MapPinIcon(props) {
+ return (
+
+
+
+
+
+ )
+}
diff --git a/src/components/icons/PackageIcon.jsx b/src/components/icons/PackageIcon.jsx
new file mode 100644
index 00000000..cb0bc98d
--- /dev/null
+++ b/src/components/icons/PackageIcon.jsx
@@ -0,0 +1,16 @@
+export function PackageIcon(props) {
+ return (
+
+
+
+
+ )
+}
diff --git a/src/components/icons/PaperAirplaneIcon.jsx b/src/components/icons/PaperAirplaneIcon.jsx
new file mode 100644
index 00000000..6f96ea84
--- /dev/null
+++ b/src/components/icons/PaperAirplaneIcon.jsx
@@ -0,0 +1,17 @@
+export function PaperAirplaneIcon(props) {
+ return (
+
+
+
+
+ )
+}
diff --git a/src/components/icons/PaperClipIcon.jsx b/src/components/icons/PaperClipIcon.jsx
new file mode 100644
index 00000000..cdd72437
--- /dev/null
+++ b/src/components/icons/PaperClipIcon.jsx
@@ -0,0 +1,12 @@
+export function PaperClipIcon(props) {
+ return (
+
+
+
+ )
+}
diff --git a/src/components/icons/ShapesIcon.jsx b/src/components/icons/ShapesIcon.jsx
new file mode 100644
index 00000000..5dd29fd0
--- /dev/null
+++ b/src/components/icons/ShapesIcon.jsx
@@ -0,0 +1,17 @@
+export function ShapesIcon(props) {
+ return (
+
+
+
+
+ )
+}
diff --git a/src/components/icons/ShirtIcon.jsx b/src/components/icons/ShirtIcon.jsx
new file mode 100644
index 00000000..30c67b92
--- /dev/null
+++ b/src/components/icons/ShirtIcon.jsx
@@ -0,0 +1,11 @@
+export function ShirtIcon(props) {
+ return (
+
+
+
+ )
+}
diff --git a/src/components/icons/SquaresPlusIcon.jsx b/src/components/icons/SquaresPlusIcon.jsx
new file mode 100644
index 00000000..39a507a4
--- /dev/null
+++ b/src/components/icons/SquaresPlusIcon.jsx
@@ -0,0 +1,17 @@
+export function SquaresPlusIcon(props) {
+ return (
+
+
+
+
+ )
+}
diff --git a/src/components/icons/TagIcon.jsx b/src/components/icons/TagIcon.jsx
new file mode 100644
index 00000000..c7e57b03
--- /dev/null
+++ b/src/components/icons/TagIcon.jsx
@@ -0,0 +1,19 @@
+export function TagIcon(props) {
+ return (
+
+
+
+
+
+ )
+}
diff --git a/src/components/icons/UserIcon.jsx b/src/components/icons/UserIcon.jsx
new file mode 100644
index 00000000..350e3c42
--- /dev/null
+++ b/src/components/icons/UserIcon.jsx
@@ -0,0 +1,24 @@
+export function UserIcon(props) {
+ return (
+
+
+
+
+
+ )
+}
diff --git a/src/components/icons/UsersIcon.jsx b/src/components/icons/UsersIcon.jsx
new file mode 100644
index 00000000..68ef1312
--- /dev/null
+++ b/src/components/icons/UsersIcon.jsx
@@ -0,0 +1,28 @@
+export function UsersIcon(props) {
+ return (
+
+
+
+
+
+
+ )
+}
diff --git a/src/components/mdx.jsx b/src/components/mdx.jsx
new file mode 100644
index 00000000..3d81159f
--- /dev/null
+++ b/src/components/mdx.jsx
@@ -0,0 +1,124 @@
+import Link from 'next/link'
+import clsx from 'clsx'
+
+import { Heading } from '@/components/Heading'
+
+export const a = Link
+export { Button } from '@/components/Button'
+export { CodeGroup, Code as code, Pre as pre } from '@/components/Code'
+
+export const h2 = function H2(props) {
+ return
+}
+
+export const h3 = function H3(props) {
+ return
+}
+
+export const h4 = function H4(props) {
+ return
+}
+
+export const h5 = function H5(props) {
+ return
+}
+
+function InfoIcon(props) {
+ return (
+
+
+
+
+
+ )
+}
+
+export function Note({ children }) {
+ return (
+
+ )
+}
+
+export function Row({ children }) {
+ return (
+
+ {children}
+
+ )
+}
+
+export function Col({ children, sticky = false }) {
+ return (
+ :first-child]:mt-0 [&>:last-child]:mb-0',
+ sticky && 'xl:sticky xl:top-24'
+ )}
+ >
+ {children}
+
+ )
+}
+
+export function Properties({ children }) {
+ return (
+
+ )
+}
+
+export function Property({ name, type, required, min, max, minLen, maxLen, enumList, children }) {
+ return (
+
+
+ Name
+
+ {name}
+
+ Type
+
+ {type}
+
+ Required
+
+ {required && 'required'}
+
+
+ {!required && 'optional'}
+
+ Enum
+
+ {/*{enumList && "Possible values: [" + enumList.split(',').forEach((type) => ({type} )) + "]"}*/}
+ {/* {enumList && Possible Values: [
}enumList.split(',').map(type => ''+ type + '')}*/}
+ {min && !max && Possible Values: >={min}
}
+ {max && !min && Possible Values: <={max}
}
+ {min && max && Possible Values: >={min} and <={max}
}
+ {minLen && !maxLen && Possible Values: >={minLen} {type === "string" ? "characters" : "objects"}
}
+ {maxLen && !minLen && Possible Values: <={maxLen} {type === "string" ? "characters" : "objects"}
}
+ {minLen && maxLen && Possible Values: >={minLen} {type === "string" ? "characters" : "objects"} and <={maxLen} {type === "string" ? "characters" : "objects"}
}
+
+ Description
+
+ {children}
+
+
+
+ )
+}
diff --git a/src/css/custom.css b/src/css/custom.css
deleted file mode 100644
index f1b663f9..00000000
--- a/src/css/custom.css
+++ /dev/null
@@ -1,147 +0,0 @@
-/**
- * Any CSS included here will be global. The classic template
- * bundles Infima by default. Infima is a CSS framework designed to
- * work well for content-centric websites.
- */
-
-:root {
- --site-primary-hue-saturation: 100%;
- --ifm-color-primary: #2e2e2e;
- --ifm-color-primary-dark: #585656;
- --ifm-color-primary-darker: #535252;
- --ifm-color-primary-darkest: #454343;
- --ifm-color-primary-light: #6c6a6a;
- --ifm-color-primary-lighter: #716e6e;
- --ifm-color-primary-lightest: #7f7d7d;
-}
-
-.markdown {
- --ifm-link-color: #0aa6c2;
-}
-
-.table-of-contents {
- --ifm-color-primary: #0aa6c2;
-}
-
-.docusaurus-highlight-code-line {
- background-color: rgba(0, 0, 0, 0.1);
- display: block;
- margin: 0 calc(-1 * var(--ifm-pre-padding));
- padding: 0 var(--ifm-pre-padding);
-}
-
-html[data-theme='dark'] .docusaurus-highlight-code-line {
- background-color: rgba(0, 0, 0, 0.3);
-}
-[data-theme='dark'] {
- --ifm-color-primary: hsl(var(--site-primary-hue-saturation) 90%);
-}
-
-.videowrapper {
- float: none;
- clear: both;
- width: 100%;
- position: relative;
- padding-bottom: 56.25%;
- padding-top: 25px;
- height: 0;
-}
-.videowrapper iframe {
- position: absolute;
- top: 0;
- left: 0;
- width: 100%;
- height: 100%;
-}
-
-/* CSS */
-.button-5 {
- align-items: center;
- background-clip: padding-box;
- background-color: darkorange;
- border: 1px solid transparent;
- border-radius: .25rem;
- box-shadow: rgba(0, 0, 0, 0.02) 0 1px 3px 0;
- box-sizing: border-box;
- color: #fff;
- cursor: pointer;
- display: inline-flex;
- font-family: system-ui, -apple-system, system-ui, "Helvetica Neue", Helvetica, Arial, sans-serif;
- font-size: 16px;
- font-weight: 400;
- justify-content: center;
- line-height: 1.25;
- margin: 0;
- min-height: 2.5rem;
- padding: calc(.875rem - 1px) calc(1.5rem - 1px);
- position: relative;
- text-decoration: none;
- transition: all 250ms;
- user-select: none;
- -webkit-user-select: none;
- touch-action: manipulation;
- vertical-align: baseline;
- width: auto;
-}
-
-.button-5:hover,
-.button-5:focus {
- background-color: #fb8332;
- box-shadow: rgba(0, 0, 0, 0.1) 0 4px 12px;
-}
-
-.button-5:hover {
- transform: translateY(-1px);
-}
-
-.button-5:active {
- background-color: #c85000;
- box-shadow: rgba(0, 0, 0, .06) 0 2px 4px;
- transform: translateY(0);
-}
-
-.button-6 {
- align-items: center;
- background-clip: padding-box;
- background-color: #1890ff;
- border: 1px solid transparent;
- border-radius: .25rem;
- box-shadow: rgba(0, 0, 0, 0.02) 0 1px 3px 0;
- box-sizing: border-box;
- color: #fff;
- cursor: pointer;
- display: inline-flex;
- font-family: system-ui, -apple-system, system-ui, "Helvetica Neue", Helvetica, Arial, sans-serif;
- font-size: 14px;
- font-weight: 400;
- justify-content: center;
- line-height: 1.25;
- margin: 0;
- /*min-height: 2rem;*/
- height: 1rem;
- padding: calc(.875rem - 1px) calc(1.5rem - 1px);
- position: relative;
- text-decoration: none;
- transition: all 250ms;
- user-select: none;
- -webkit-user-select: none;
- touch-action: manipulation;
- vertical-align: baseline;
- width: auto;
-}
-
-.button-6:hover,
-.button-6:focus {
- background-color: #85a5ff;
- box-shadow: rgba(0, 0, 0, 0.1) 0 4px 12px;
-}
-
-.button-6:hover {
- transform: translateY(-1px);
-}
-
-.button-6:active {
- background-color: #85a5ff;
- box-shadow: rgba(0, 0, 0, .06) 0 2px 4px;
- transform: translateY(0);
-}
diff --git a/src/images/logos/go.svg b/src/images/logos/go.svg
new file mode 100644
index 00000000..7f7b19de
--- /dev/null
+++ b/src/images/logos/go.svg
@@ -0,0 +1,14 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/images/logos/node.svg b/src/images/logos/node.svg
new file mode 100644
index 00000000..1d09de22
--- /dev/null
+++ b/src/images/logos/node.svg
@@ -0,0 +1,4 @@
+
+
+
diff --git a/src/images/logos/php.svg b/src/images/logos/php.svg
new file mode 100644
index 00000000..0a9ac462
--- /dev/null
+++ b/src/images/logos/php.svg
@@ -0,0 +1,10 @@
+
+
+
+
+
diff --git a/src/images/logos/python.svg b/src/images/logos/python.svg
new file mode 100644
index 00000000..9bceb587
--- /dev/null
+++ b/src/images/logos/python.svg
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/images/logos/ruby.svg b/src/images/logos/ruby.svg
new file mode 100644
index 00000000..b22a5bf1
--- /dev/null
+++ b/src/images/logos/ruby.svg
@@ -0,0 +1,4 @@
+
+
+
diff --git a/src/images/static/.nojekyll b/src/images/static/.nojekyll
new file mode 100644
index 00000000..e69de29b
diff --git a/src/lib/remToPx.js b/src/lib/remToPx.js
new file mode 100644
index 00000000..9ae9628d
--- /dev/null
+++ b/src/lib/remToPx.js
@@ -0,0 +1,8 @@
+export function remToPx(remValue) {
+ let rootFontSize =
+ typeof window === 'undefined'
+ ? 16
+ : parseFloat(window.getComputedStyle(document.documentElement).fontSize)
+
+ return parseFloat(remValue) * rootFontSize
+}
diff --git a/src/pages/_app.jsx b/src/pages/_app.jsx
new file mode 100644
index 00000000..3284dcdf
--- /dev/null
+++ b/src/pages/_app.jsx
@@ -0,0 +1,74 @@
+import Head from 'next/head'
+import { Router, useRouter } from 'next/router'
+import { MDXProvider } from '@mdx-js/react'
+
+import * as mdxComponents from '@/components/mdx'
+import { useMobileNavigationStore } from '@/components/MobileNavigation'
+
+import '@/styles/tailwind.css'
+import 'focus-visible'
+import {Layout} from "@/components/Layout";
+import {slugifyWithCounter} from "@sindresorhus/slugify";
+
+function onRouteChange() {
+ useMobileNavigationStore.getState().close()
+}
+
+Router.events.on('routeChangeStart', onRouteChange)
+Router.events.on('hashChangeStart', onRouteChange)
+
+export default function App({ Component, pageProps }) {
+ let router = useRouter()
+ let tableOfContents = collectHeadings(pageProps.sections)
+ return (
+ <>
+
+ {router.pathname === '/' ? (
+ NetBird Docs
+ ) : (
+ router.pathname.startsWith('/docs') ?
+ {`${pageProps.title} - NetBird Docs`} : {`${pageProps.title} - NetBird API`}
+ )}
+
+
+
+
+
+
+
+ >
+ )
+}
+
+function collectHeadings(sections, slugify = slugifyWithCounter()) {
+ let output = []
+
+ if (sections === undefined) {
+ return []
+ }
+ for (let section of sections) {
+ if (section.tagName === 'h2' || section.tagName === 'h3') {
+ let title = section.title
+ let id = section.id
+ let tag = section.tag
+ if (section.tagName === 'h3') {
+ if (!output[output.length - 1]) {
+ throw new Error(
+ 'Cannot add `h3` to table of contents without a preceding `h2`'
+ )
+ }
+ output[output.length - 1].children.push({
+ id,
+ title,
+ tag,
+ })
+ } else {
+ output.push({ id, title, tag, children: [] })
+ }
+ }
+
+ output.push(...collectHeadings(output.children ?? [], slugify))
+ }
+
+ return output
+}
diff --git a/src/pages/_document.jsx b/src/pages/_document.jsx
new file mode 100644
index 00000000..db198263
--- /dev/null
+++ b/src/pages/_document.jsx
@@ -0,0 +1,50 @@
+import { Head, Html, Main, NextScript } from 'next/document'
+
+const modeScript = `
+ let darkModeMediaQuery = window.matchMedia('(prefers-color-scheme: dark)')
+
+ updateMode()
+ darkModeMediaQuery.addEventListener('change', updateModeWithoutTransitions)
+ window.addEventListener('storage', updateModeWithoutTransitions)
+
+ function updateMode() {
+ let isSystemDarkMode = darkModeMediaQuery.matches
+ let isDarkMode = window.localStorage.isDarkMode === 'true' || (!('isDarkMode' in window.localStorage) && isSystemDarkMode)
+
+ if (isDarkMode) {
+ document.documentElement.classList.add('dark')
+ } else {
+ document.documentElement.classList.remove('dark')
+ }
+
+ if (isDarkMode === isSystemDarkMode) {
+ delete window.localStorage.isDarkMode
+ }
+ }
+
+ function disableTransitionsTemporarily() {
+ document.documentElement.classList.add('[&_*]:!transition-none')
+ window.setTimeout(() => {
+ document.documentElement.classList.remove('[&_*]:!transition-none')
+ }, 0)
+ }
+
+ function updateModeWithoutTransitions() {
+ disableTransitionsTemporarily()
+ updateMode()
+ }
+`
+
+export default function Document() {
+ return (
+
+
+
+
+
+
+
+
+
+ )
+}
diff --git a/docs/FAQ/metrics-collection.md b/src/pages/docs/about-netbird/faq.mdx
similarity index 56%
rename from docs/FAQ/metrics-collection.md
rename to src/pages/docs/about-netbird/faq.mdx
index 79984495..7b7bdda6 100644
--- a/docs/FAQ/metrics-collection.md
+++ b/src/pages/docs/about-netbird/faq.mdx
@@ -1,14 +1,35 @@
----
-id: metrics-collection
-title: Why and what are the anonymous usage metrics?
-sidebar_position: 2
----
+import {Note} from "@/components/mdx";
+
+export const title = 'FAQ'
+
+## What firewall ports should I open to use NetBird?
+
+### Incoming ports
+NetBird's agent doesn't require any incoming port to be open; It negotiates the connection with the support of the signal and relay services.
+### Outgoing ports
+NetBird usually won't need open ports, but sometimes you or your IT team needs to secure and verify
+all outgoing traffic, and that may affect how NetBird clients connect to the [control layer](/docs/about-netbird/how-netbird-works)
+and negotiate the peer-to-peer connections.
+
+Below is the list of NetBird hosted endpoints and ports they listen to:
+* Management service:
+* **Endpoint**: api.wiretrustee.com
+* **Port**: TCP/443
+* Signal service:
+ * **Endpoint**: signal2.wiretrustee.com
+ * **Port**: TCP/443
+* Relay (TURN) service:
+ * **Endpoint**: turn.netbird.io
+ * **Port range**: UDP/5555-65535
+
+## Why and what are the anonymous usage metrics?
+
### Why we added metrics collection?
As an open-source project and business, making decisions based on data is essential. We will know our adoption rate, feature usage, and client type with anonymous metrics.
-:::info
+
The collection is strict to our management system.
-:::
+
If the metric collection infringes any internal regulation or policy, it can be disabled by setting the flag `--disable-anonymous-metrics=true` to the management service startup command.
diff --git a/src/pages/docs/about-netbird/how-netbird-works.mdx b/src/pages/docs/about-netbird/how-netbird-works.mdx
new file mode 100644
index 00000000..f70c6396
--- /dev/null
+++ b/src/pages/docs/about-netbird/how-netbird-works.mdx
@@ -0,0 +1,140 @@
+import {Note} from "@/components/mdx";
+
+export const title = 'How NetBird Works'
+
+## Architecture
+
+### Overview
+NetBird is an open source platform consisting of a collection of components, responsible for handling peer-to-peer connections, tunneling, authentication, and network management (IPs, keys, ACLs, etc).
+
+It uses open-source technologies like [WireGuard®](https://www.wireguard.com/), [Pion ICE (WebRTC)](https://github.com/pion/ice), [Coturn](https://github.com/coturn/coturn),
+and [software](https://github.com/netbirdio/netbird) developed by NetBird authors to make secure private networks deployment and management simple.
+
+NetBird relies on four components - **Client** application (or agent), **Management**, **Signal** and **Relay** services.
+
+The combination of these elements ensures that direct point-to-point connections are established and only authenticated users (or machines) have access to the resources for which they are authorized.
+
+A **Peer** is a machine or any device that is connected to the network.
+It can be a Linux server running in the cloud or on-premises, a personal laptop, or even a Raspberry PI.
+
+
+
+
+
+With NetBird clients installed and authorized on the Management service, machines form a mesh network connecting to each other directly via an encrypted point-to-point Wireguard tunnel.
+
+
+
+
+
+While it is possible to create a full mesh network, it might be not a desirable outcome. In this case, [ACLs](/docs/how-to/restrict-access-to-peers) can be utilized to limit the access to certain machines.
+
+Let's now take a closer look at each of NetBird's components.
+
+### Management Service
+
+The Management service is the central coordination component for NetBird with a UI dashboard.
+It keeps the network state, public Wireguard keys of the peers, authenticates and distributes network changes to peers.
+
+The Management Service's responsibilities include:
+
+* **Registering and authenticating new peers.** Every new machine has to register itself in the network in order to connect to other machines.
+After installation, NetBird client requires login that can be done through Identity Provider (IDP) or with a [setup key](/docs/how-to/register-peers-using-setup-keys).
+* **Keeping the network map.** The Management service stores information about all the registered peers including Wireguard public key that was sent during the registration process.
+* **Managing private IP addresses.** Each peer receives a unique private IP with which it can be identified in the network.
+We use [Carrier Grade NAT](https://en.wikipedia.org/wiki/Carrier-grade_NAT) address space with an allocated address block 100.64.0.0/10 .
+* **Synchronizing network changes to peers.** The Management Service keeps a control channel open to each peer sending network updates.
+Whenever a new peer joins the network, all other peers that are authorized to connect to it receive an update.
+After that, they are able to establish a connection to the new peer.
+* **Creating and managing ACLs.** ACL is a list of peers that a given peer has access to. Coming Soon .
+* **Managing private DNS.** [DNS](docs/how-to/manage-dns-in-your-network) allows referring to each of the peers with a fully qualified domain name (FQDN). Coming Soon .
+* **Monitoring network activity.** Coming Soon .
+* **Wireguard key rotation.** Coming Soon .
+
+The Management service runs in the cloud NetBird-managed. It can also be self-hosted.
+
+
+
+
+
+### Client Application
+
+The NetBird Client application (or agent) is a software that is installed on your machines.
+It is an entry point to you private network that makes it possible for machines to communicate with each other.
+Once installed and registered, a machine becomes a peer in the network.
+
+The Client's roles are the following:
+
+* **Generating private and public Wireguard keys.** These keys are used for packet encryption between peers and for [Wireguard Cryptokey Routing](https://www.wireguard.com/#cryptokey-routing).
+To accept the incoming connections, peers have to know each other, therefore, the generated public keys have to be pre-shared on the machines. The client application sends its public key to the Management service which then distributes it to the authorized peers.
+* **Handling peer registration and authentication.** Each peer has to be authenticated and registered in the system. The client application requests a user to log in with an Identity Provider (IDP) or a [setup key](/overview/setup-keys) so that the peer can be associated with the organization's account.
+* **Receiving network updates from the Management service.**
+Each peer receives initial configuration and a list of peers with corresponding public keys and IP addresses so that it can establish a peer-to-peer connection.
+* **Establishing peer-to-peer Wireguard connection.** To establish a connection with a remote peer, the Client first discovers the most suitable connection candidate, or simply address (IP:port) that other peer can use to connect to it.
+Then sends it to the remote peer via Signal. This message is encrypted with the peer's private key and a public key of the remote peer.
+The remote peer does the same and once the peers can reach each other, they establish an encrypted Wireguard tunnel.
+
+
+The **private key**, generated by the Client, **never leaves the machine**, ensuring that only the machine that owns the key can decrypt traffic addressed to it.
+
+
+### Signal Service
+
+The Signal Service or simply Signal is a lightweight piece of software that helps peers to negotiate direct connections.
+It does not store any data and no traffic passes through it.
+
+The only Signal's responsibility is:
+* **Serve as a notification mechanism for peers.** Before a connection can be established, peers need to find each other and exchange the most suitable connection candidates.
+This is done through Signal. After a connection has been established, Signal steps out.
+
+
+
+
+
+
+ Messages that are sent over Signal are **peer-to-peer encrypted**, so Signal can't see the contents.
+
+
+NetBird Signal is very similar to the signaling servers used in [WebRTC](https://developer.mozilla.org/en-US/docs/Web/API/WebRTC_API/Signaling_and_video_calling#the_signaling_server).
+It runs in the cloud NetBird-managed and can be self-hosted.
+
+### Relay Service
+
+The Relay service is a [TURN server](https://webrtc.org/getting-started/turn-server) in WebRTC terminology.
+In fact, we use an open-source implementation called [Coturn](https://github.com/coturn/coturn).
+The purpose of this service is to be a "plan B" and relay traffic between peers in case a peer-to-peer connection isn't possible.
+
+
+
+
+
+
+ Similar to Signal, traffic that flows through the Relay can't be decrypted due to the **Wireguard peer-to-peer encryption**.
+
+
+It runs in the cloud or can be self-hosted.
+
+[//]: # (### STUN (NAT Traversal))
+
+
+## General Flow Overview
+
+Below is a high level, step-by-step overview of the flow of communications within NetBird.
+
+1. Administrator creates an account at [app.netbird.io](https://app.netbird.io/).
+2. The system automatically generates a new network with an allocated address block 100.64.0.0/10 .
+3. The system automatically generates 2 [setup keys](/docs/how-to/register-peers-using-setup-keys) that can be used for authenticating new machines.
+4. Administrator (or a user) installs NetBird client and runs ```netbird up``` command providing one of the setup keys.
+5. NetBird client generates Wireguard private and public keys along with the initial configuration.
+6. NetBird client sends a registration request to the NetBird Management service calling Login gRPC endpoint, providing setup key, Wireguard public key and additional information about the machine.
+7. NetBird Management service checks the provided setup key, registers the machine and returns initial configuration to the NetBird client.
+8. NetBird client receives initial configuration and starts the engine configuring Wireguard, connecting to the Signal Service channel, and the Management Service network updates channel.
+9. NetBird client receives network map update from the Management Service that includes a list of peers/machines to connect to, and a private IP address.
+10. For each peer NetBird client initiates a connection process by sending a connection offer message through the Signal service indicating its intent to connect, and a Wireguard public key.
+11. If the client wasn't the initiator of the connection and receives an offer message, it checks whether the initiator is in the allowed peers list and sends an acknowledgement message through Signal.
+12. Once the acknowledgement message has been received, NetBird Client (on both ends) starts a connection negotiation process using [Interactive Connectivity Establishment protocol (ICE)](https://datatracker.ietf.org/doc/html/rfc8445).
+13. Once the direct connection between peers has been established successfully, NetBird Client starts proxying data to Wireguard.
+14. In case a direct Wireguard connection is possible (e.g., peers are in the same network or one of the peers has a public IP), NetBird Client establishes a direct Wireguard connection avoiding proxy.
+15. NetBird Client keeps a connection to the Management service receiving network updates such as new peers joining the network or peers deleted from the network.
+16. When a new peer joins the network, the NetBird client receives an update and triggers connection (see #10).
+17. When network administrator removes a peer, the NetBird client receives an update and removes the connection.
diff --git a/docs/netbird-vs-traditional-vpn.md b/src/pages/docs/about-netbird/netbird-vs-traditional-vpn.mdx
similarity index 89%
rename from docs/netbird-vs-traditional-vpn.md
rename to src/pages/docs/about-netbird/netbird-vs-traditional-vpn.mdx
index ef2fa0ed..300b0de0 100644
--- a/docs/netbird-vs-traditional-vpn.md
+++ b/src/pages/docs/about-netbird/netbird-vs-traditional-vpn.mdx
@@ -1,12 +1,7 @@
----
-id: netbird-vs-traditional-vpn
-title: NetBird vs. Traditional VPN
-sidebar_position: 5
----
# NetBird vs. Traditional VPN
-### Traditional VPN challenges
+## Traditional VPN challenges
In the traditional VPN model, everything converges on a centralized, protected network where all the clients are connecting to a central VPN server.
An increasing amount of connections can easily overload the VPN server.
@@ -20,7 +15,7 @@ Configuring firewalls, setting up NATs, SSO integration, and managing access con
Traditional centralized VPNs are often compared to a [castle-and-moat](https://en.wikipedia.org/wiki/Moat) model
in which once accessed, user is trusted and can access critical infrastructure and resources without any restrictions.
-### NetBird benefits
+## NetBird benefits
NetBird decentralizes networks using direct point-to-point connections, as opposed to traditional models.
Consequently, network performance is increased since traffic flows directly between the machines bypassing VPN servers or gateways.
@@ -28,7 +23,7 @@ To achieve this, NetBird client applications employ signalling servers to find o
These are similar to the signaling servers used in [WebRTC](https://developer.mozilla.org/en-US/docs/Web/API/WebRTC_API/Signaling_and_video_calling#the_signaling_server)
Thanks to [NAT traversal techniques](https://en.wikipedia.org/wiki/NAT_traversal),
-outlined in the [Why Wireguard with NetBird](/wireguard-plus-netbird) section,
+outlined in the [Why Wireguard with NetBird](/docs/about-netbird/why-wireguard-with-netbird) section,
NetBird installation doesn't require complex network and firewall configuration.
It just works, minimising the maintenance effort.
diff --git a/docs/other/gsoc-2022.md b/src/pages/docs/about-netbird/other.mdx
similarity index 89%
rename from docs/other/gsoc-2022.md
rename to src/pages/docs/about-netbird/other.mdx
index 69b98c5e..269378e6 100644
--- a/docs/other/gsoc-2022.md
+++ b/src/pages/docs/about-netbird/other.mdx
@@ -1,50 +1,50 @@
----
-sidebar_position: 1
----
+import {Note} from "@/components/mdx";
-# Google Summer of Code Ideas - 2022
+export const title = 'Other'
+
+## Google Summer of Code Ideas - 2022
This page lists the all project ideas for [Google Summer of Code 2022](https://summerofcode.withgoogle.com/).
We require all applicants to complete a [task](#task).
-Join our [Slack channel](https://join.slack.com/t/wiretrustee/shared_invite/zt-vrahf41g-ik1v7fV8du6t0RwxSrJ96A) and talk to your potential mentors!
+Join our [Slack channel](https://join.slack.com/t/wiretrustee/shared_invite/zt-vrahf41g-ik1v7fV8du6t0RwxSrJ96A) and talk to your potential mentors!
### Task
-The goal of the task is to get familiar with the system by setting up a self-hosted version of Netbrid.
+The goal of the task is to get familiar with the system by setting up a self-hosted version of Netbrid.
1. Carefully review projects' documentation.
2. Deploy a self-hosted version of NetBird.
3. Register at least 2 peers in the system (can be a laptop, server or even Raspberry PI).
- :::tip multiple peers on a single machine
- It is possible to set up multiple peers on the same machine. Find out how!
- :::
+
+It is possible to set up multiple peers on the same machine. Find out how!
+
4. Ping machines and make sure that they are reachable.
-5. We might ask you to provide a generated [setup key](/overview/setup-keys) so that we could test your setup.
+5. We might ask you to provide a generated [setup key](/docs/how-to/setup-keys) so that we could test your setup.
Please reach out to us with any questions. We believe you will have some! :)
-In case this task seems to be difficult, no worries!
+In case this task seems to be difficult, no worries!
You could skip #1 and #2 starting with #3 using managed version of NetBird (https://app.netbird.io).
### Project Ideas
There are a few categories that our ideas fall into:
-* **UI** - mostly around our Management service Dashboard ([Github repo](https://github.com/netbirdio/dashboard))
+* **UI** - mostly around our Management service Dashboard ([Github repo](https://github.com/netbirdio/dashboard))
* **Client** - our client application ([Github Repo](https://github.com/netbirdio/netbird/tree/main/client))
-* **Server** - our Management and Signal server applications ([Management Github Repo](https://github.com/netbirdio/netbird/tree/main/management) and [Signal Github Repo](https://github.com/netbirdio/netbird/tree/main/signal))
+* **Server** - our Management and Signal server applications ([Management Github Repo](https://github.com/netbirdio/netbird/tree/main/management) and [Signal Github Repo](https://github.com/netbirdio/netbird/tree/main/signal))
* **Portability** - ability to run client and server applications on different platforms (e.g. OpenWRT)
* **Infrastructure** - deployment, CI/CD, scaling, infrastructure as code improvements, etc.
* **Integrations** - integration between the project and different platforms, like CI/CD, Kubernetes or specific cloud providers.
### Idea: Make NetBird run on routers
-:::note
+
OpenWrt is an open-source project for embedded operating systems based on Linux, primarily used on embedded devices to route network traffic.
https://openwrt.org/
-:::
+
NetBird runs on different platforms and can also be compiled to run on routers. For that, we are thinking to work on this support for the popular wireless router OpenWRT.
@@ -52,7 +52,7 @@ We are already building, but we lack packaging and repository for distribution a
> **Category:** Portability/Infrastructure
>
-> **Goal:** Create OpenWRT package (ipk) for one of the popular routers. Setup CI/CD ipk build flow with Github Actions.
+> **Goal:** Create OpenWRT package (ipk) for one of the popular routers. Setup CI/CD ipk build flow with Github Actions.
>
> **Skills:** Golang, Linux, bash, OpenWRT, cmake
>
@@ -61,26 +61,26 @@ We are already building, but we lack packaging and repository for distribution a
> **Rating:** easy
>
> **Possible mentor:** [Maycon Santos](https://github.com/mlsmaycon)
->
+>
> **Reference:** https://medium.com/@theshemul/make-golang-program-for-router-39bf18529b18
>
> **Reference:** https://openwrt.org/docs/guide-developer/packages
### Idea: Software Firewall with eBPF
-:::note
+
eBPF is a revolutionary technology with origins in the Linux kernel that can run sandboxed programs in an operating system kernel.
https://ebpf.io/
-:::
+
When running on machines NetBird client application tries to be as efficient as possible.
On Linux machines NetBird can use kernel modules like Wireguard and features like eBPF to be the most efficient.
-Besides connectivity, NetBird can control access. Right now it is achieved on a connection level -
-if a peer is in the allowed list, it can connect. If not, the connection is rejected.
+Besides connectivity, NetBird can control access. Right now it is achieved on a connection level -
+if a peer is in the allowed list, it can connect. If not, the connection is rejected.
It is more advantageous to work on a finer level - defining what packets to allow/block and on which ports.
-For that eBPF can be integrated into the client application.
+For that eBPF can be integrated into the client application.
The flow could be the following: client receives rules from the Management service and creates ePBF.
> **Category:** Client/Server
@@ -92,24 +92,24 @@ The flow could be the following: client receives rules from the Management servi
> **Project Size:** 350 hours
>
> **Rating:** hard
->
+>
> **Possible mentor:** [Mikhail Bragin](https://github.com/braginini)
>
> **Reference:** https://ebpf.io/
### Idea: NetBird client running in the browser
-:::note
+
WebAssembly (abbreviated Wasm) is a binary instruction format for a stack-based virtual machine.
-Wasm is designed as a portable compilation target for programming languages, enabling deployment on the web for client
+Wasm is designed as a portable compilation target for programming languages, enabling deployment on the web for client
and server applications.
-:::
+
NetBird requires a client application installed to connect machines to each other.
In some environments it might not be possible or forbidden to install applications.
But there always might be an option to run a browser!
-The idea of this project is to make NetBird run in the browser using WASM and WebRTC.
+The idea of this project is to make NetBird run in the browser using WASM and WebRTC.
A user would log in to the Management Dashboard and open a virtual terminal (e.g. https://xtermjs.org/).
Browser will then establish a connection to the network and user would be able to access remote servers.
@@ -126,20 +126,20 @@ Browser will then establish a connection to the network and user would be able t
> **Possible mentor:** [Mikhail Bragin](https://github.com/braginini) / [Maycon Santos](https://github.com/mlsmaycon)
>
> **Reference:** https://webassembly.org/
->
+>
> **Reference:** https://webrtc.org/
->
+>
> **Reference:** https://xtermjs.org/
### Idea: Integrate NetBird with Kubernetes
-:::note
+
Kubernetes, also known as K8s, is an open-source system for automating deployment, scaling, and management of containerized applications.
-:::
+
-Having a private Kubernetes cluster is a best practices that come with some connectivity challenges,
+Having a private Kubernetes cluster is a best practices that come with some connectivity challenges,
especially to operators and developers that need to access resources running within the cluster like services,
-pods and the Kubernetes API.
+pods and the Kubernetes API.
The idea of this project is to integrate NetBird with Kubernetes by creating a controller that would add an agent
per cluster node and would handle the login process of the agent and store the states in form of Kubernetes secrets.
@@ -159,18 +159,18 @@ different network controllers, and different cloud environments.
> **Possible mentor:** [Maycon Santos](https://github.com/mlsmaycon), [Sang Woo Bae](https://github.com/shatoboar)
>
> **Reference:** https://kubernetes.io/
->
+>
> **Reference:** https://kubernetes.io/docs/concepts/architecture/controller/
->
+>
> **Reference:** https://kubernetes.io/blog/2021/06/21/writing-a-controller-for-pod-labels/
### Idea: NetBird Github Action
-:::note
-GitHub Actions makes it easy to automate all your software workflows, now with world-class CI/CD. Build, test, and deploy your code right from GitHub.
+
+GitHub Actions makes it easy to automate all your software workflows, now with world-class CI/CD. Build, test, and deploy your code right from GitHub.
Make code reviews, branch management, and issue triaging work the way you want.
-:::
+
We love Github Actions, because of its primary concept, Actions. They allow us to automate complex workflows and provide a simple interface
to be configured and executed before building or testing our code.
@@ -191,9 +191,9 @@ could be great as it would allow many users that rely on the public runners to a
> **Possible mentor:** [Maycon Santos](https://github.com/mlsmaycon)
>
> **Reference:** https://docs.github.com/en/actions
->
+>
> **Reference:** https://docs.netbird.io/getting-started/quickstart
->
+>
> **Reference:** https://docs.github.com/en/actions/creating-actions/about-custom-actions
### Idea: Mobile Client APPs
@@ -215,8 +215,8 @@ Initially we think to export our Go APIs using GoMobile that would help with a g
>
> **Possible mentor:** [Mikhail Bragin](https://github.com/braginini)
>
->
+>
> **Reference:** https://github.com/golang/mobile
->
+>
> **Reference:** https://medium.com/stack-me-up/meet-the-coolest-tech-marriage-flutter-go-369cf11367c9
diff --git a/docs/wireguard-plus-netbird.md b/src/pages/docs/about-netbird/why-wireguard-with-netbird.mdx
similarity index 94%
rename from docs/wireguard-plus-netbird.md
rename to src/pages/docs/about-netbird/why-wireguard-with-netbird.mdx
index 2a0fdaf9..0fb833d6 100644
--- a/docs/wireguard-plus-netbird.md
+++ b/src/pages/docs/about-netbird/why-wireguard-with-netbird.mdx
@@ -1,8 +1,5 @@
----
-id: wireguard-plus-netbird
-title: Why Wireguard with NetBird?
-sidebar_position: 6
----
+
+# Why Wireguard with NetBird?
WireGuard is a modern and extremely fast VPN tunnel utilizing state-of-the-art [cryptography](https://www.wireguard.com/protocol/)
and NetBird uses Wireguard to establish a secure tunnel between machines.
@@ -30,7 +27,7 @@ So only the machine that owns the key can decrypt traffic addressed to it.
The same applies also to the relayed traffic mentioned below.
Furthermore, NetBird ensures connectivity by leveraging advanced [NAT traversal techniques](https://en.wikipedia.org/wiki/NAT_traversal)
-and removing the necessity of port forwarding, opening holes in the firewall, and having a public static IP address.
+and removing the necessity of port forwarding, opening holes in the firewall, and having a public static IP address.
In cases when a direct peer-to-peer connection isn't possible, all traffic is relayed securely between peers.
NetBird also monitors the connection health and restarts broken connections.
diff --git a/src/pages/docs/how-to/access-netbird-public-api.mdx b/src/pages/docs/how-to/access-netbird-public-api.mdx
new file mode 100644
index 00000000..13ae531e
--- /dev/null
+++ b/src/pages/docs/how-to/access-netbird-public-api.mdx
@@ -0,0 +1,70 @@
+
+# Use service users and tokens to access NetBird's public API
+
+## Service Users
+
+Service users are non-interactive accounts that are used to create tokens to access resources and perform actions within your organization's network using NetBird's public API.
+
+Service users provide additional security by allowing you to limit the scope of access granted to the service user and void losing automated access to critical systems when employees leave the company.
+
+### What can you use NetBird service users and access tokens for?
+
+
+Most network management operations administrators do in the [NetBird Dashboard](https://app.netbird.io) can also be done via NetBird API using service users' access tokens.
+
+The most common usage scenarios:
+
+- **Automated scripts**: if you need to run automated scripts or infrastructure as code tools like Ansible or Terraform that configure your NetBird network.
+- **Third-party integrations**: if you want to integrate NetBird with a third-party service, you can use a service user to provide access to your data without giving the third-party service access to your personal account.
+**Command-line tools**: if you use command-line tools like cUrl to interact with your NetBird network.
+
+### Creating a service user
+
+To create a service user, you'll need to log in to your organization's account at https://app.netbird.io and navigate to the "Users" -> "Service Users" section of your account.
+
+
+
+
+From there, you can create a new service user and specify a role that the user should have.
+User role allows read-only access, use the admin for write access.
+
+
+
+
+
+
+ It's important to keep your service users secure, as they can provide access to sensitive data and actions within your organization. You should treat your service users like you would treat your own personal account and limit the scope of access granted to the service user.
+
+
+### Creating an access token
+
+To create an access token, you'll need to log in to your account and navigate to the "Users" section and look for your user or create a [service user](#service-users) to use for your API requests.
+
+
+
+
+
+From there, you can create a new token and specify expiration for the token. You won't be able to modify your token.
+
+
+
+
+
+After the token was generated successfully you will see a plain version of your token to copy and store in a secure place.
+Be aware that once you close the popup it is impossible to see the plain version of the token again as NetBird only stores a hashed version of the token.
+
+
+
+
+
+
+ It's important to keep your personal access tokens secure, as they can provide access to sensitive data and actions within your account. You should treat your personal access tokens like you would treat your password and never share them with anyone else.
+
+
+### Using access tokens
+
+Once you have created an access token, you can use it to authenticate API requests to NetBird. See [NetBird API](/ipa/introduction) documentation for detailed usage.
+
+For example, if you were using the GitHub API, you might include your personal access token like this:
+
+With this header included, the GitHub API would authenticate your request using your personal access token and grant you access to the resources that the token has been authorized to access.
diff --git a/docs/how-to-guides/adding-users-to-netbird.md b/src/pages/docs/how-to/add-users-to-your-network.mdx
similarity index 57%
rename from docs/how-to-guides/adding-users-to-netbird.md
rename to src/pages/docs/how-to/add-users-to-your-network.mdx
index 87113e03..7df23c5d 100644
--- a/docs/how-to-guides/adding-users-to-netbird.md
+++ b/src/pages/docs/how-to/add-users-to-your-network.mdx
@@ -1,55 +1,53 @@
----
-sidebar_position: 2
----
-# Add Users to your network
-Whether you have a network for personal use or manage your company's corporate network, you'd probably want to invite
+# Add users to your network
+
+Whether you have a network for personal use or manage your company's corporate network, you'd probably want to invite
people to your account and join your NetBird network.
There are two ways of adding users to a NetBird account - indirect and direct.
-### Indirect user invites
-This way of adding users is managed by the NetBird system and doesn't require administrator input.
+## Indirect user invites
+This way of adding users is managed by the NetBird system and doesn't require administrator input.
It works only for organizations with private domains.
-Whenever a new user signs up with a private domain (e.g., @netbird.io),
+Whenever a new user signs up with a private domain (e.g., @netbird.io),
NetBird creates a new account and associates it with the netbird.io organization (domain) automatically. Every consequent user signup with the same @netbird.io domain in their email address will end up under the same organization.
-How does it work? Every time a previously unknown user registers at [app.netbird.io](https://app.netbird.io/),
-the system classifies the domain part of the email.
-The domain can fall into one of the following categories - `public`, `private`, or `unclassified`.
-The domains of the private category are the ones that are automatically grouped under the same account.
-Public domains are the ones of the public email providers like Gmail.
+How does it work? Every time a previously unknown user registers at [app.netbird.io](https://app.netbird.io/),
+the system classifies the domain part of the email.
+The domain can fall into one of the following categories - `public`, `private`, or `unclassified`.
+The domains of the private category are the ones that are automatically grouped under the same account.
+Public domains are the ones of the public email providers like Gmail.
-:::info
-It might happen (unlikely) that the domain classification system didn't classify your company's domain as private.
-Our system was unsure about your domain and assigned an unclassified or public category to be on the safe side.
-Just email us at [hello@netbird.io](mailto:hello@netbird.io) or ping us on [Slack](https://join.slack.com/t/netbirdio/shared_invite/zt-vrahf41g-ik1v7fV8du6t0RwxSrJ96A) to fix this.
-:::
+
+ It might happen (unlikely) that the domain classification system didn't classify your company's domain as private.
+ Our system was unsure about your domain and assigned an unclassified or public category to be on the safe side.
+ Just email us at [hello@netbird.io](mailto:hello@netbird.io) or ping us on [Slack](https://join.slack.com/t/netbirdio/shared_invite/zt-vrahf41g-ik1v7fV8du6t0RwxSrJ96A) to fix this.
+
-### Direct user invites
+## Direct user invites
As the name stands, this way of inviting users is straightforward and works through the web UI.
-To invite a new user, proceed to the `Users` tab and click the Invite User button.
+To invite a new user, proceed to the `Users` tab and click the Invite User button.
A user window will pop up where you can specify the name and email address of the invited user. Optionally, you could select a set of groups with which you want this user to be associated.
The invited users will receive an email invitation that they have to confirm.
After logging in to the system, they will join your network automatically.
-
-
+
+
-:::info
-If a user already has a NetBird account, you can't invite them.
-This is a limitation that is likely to be removed in future versions.
-:::
+
+ If a user already has a NetBird account, you can't invite them.
+ This is a limitation that is likely to be removed in future versions.
+
-### Get started
+## Get started
- window.open("https://netbird.io/pricing")}>Use NetBird
+ window.open("https://netbird.io/pricing")}>Use NetBird
- Make sure to [star us on GitHub](https://github.com/netbirdio/netbird)
- Follow us [on Twitter](https://twitter.com/netbird)
- Join our [Slack Channel](https://join.slack.com/t/netbirdio/shared_invite/zt-vrahf41g-ik1v7fV8du6t0RwxSrJ96A)
-- NetBird [latest release](https://github.com/netbirdio/netbird/releases) on GitHub
\ No newline at end of file
+- NetBird [latest release](https://github.com/netbirdio/netbird/releases) on GitHub
diff --git a/docs/reference/netbird-commands.md b/src/pages/docs/how-to/cli.mdx
similarity index 96%
rename from docs/reference/netbird-commands.md
rename to src/pages/docs/how-to/cli.mdx
index 2e4478eb..24f4f80f 100644
--- a/docs/reference/netbird-commands.md
+++ b/src/pages/docs/how-to/cli.mdx
@@ -1,11 +1,6 @@
----
-id: netbird-commands
-title: NetBird commands
-sidebar_position: 1
-tags:
-- client
-- how-to
----
+
+# NetBird Agent command line interface (CLI)
+
The NetBird client installation adds a binary called `netbird` to your system. This binary runs as a daemon service to connect
your computer or server to the NetBirt network as a peer. But it can also be used as a client to control the daemon service.
@@ -19,9 +14,9 @@ netbird [command] [subcommand] [flags]
* `subcommand`: Specifies the operation to be executed for a top-level command like `service`: `install`, `uninstall`, `start`, and `stop`
* `flags`: Specifies optional flags. For example, you can use the `--setup-key` flag to specify the setup key to be used in the commands `login` and `up`
-:::info Help
-To see detailed command information, use the flag `--help` after each command
-:::
+
+ To see detailed command information, use the flag `--help` after each command
+
## Global flags
`netbird` has a set of global flags that are available in every command. They specify settings that are core or shared between two or more commands, e.g. `--setup-key` is used by `login` and `up` to authenticate the client against a management service.
@@ -38,7 +33,7 @@ Below is the list of global flags:
-k, --setup-key string Setup key obtained from the Management Service Dashboard (used to register peer)
```
-## Environment Variables
+### Environment Variables
Every flag of a `netbird` command can be passed as an environment variable. We are using the following rule for the environment variables composition:
* `PREFIX_FLAGNAME` and for flags with multiple parts: `PREFIX_FLAGNAMEPART1_FLAGNAMEPART2`
* The prefix is always **NB**
@@ -77,9 +72,9 @@ if you want to run in the foreground, you can use "console" as the value for `--
```shell
sudo netbird up --log-file console
```
-:::info
-On Windows, you may need to run the command from an elevated terminal session.
-:::
+
+ On Windows, you may need to run the command from an elevated terminal session.
+
In case you need to use a setup key, use the `--setup-key` flag :
```shell
netbird up --setup-key AAAA-BBB-CCC-DDDDDD
@@ -263,9 +258,9 @@ NetBird IP: 100.119.62.6/16
Interface type: Kernel
Peers count: 2/3 Connected
```
-:::info Filtered
-The peer with IP `100.119.85.4` wasn't returned because it was not connected
-:::
+
+ The peer with IP `100.119.85.4` wasn't returned because it was not connected
+
### ssh
Command to connect using ssh to a remote peer in your NetBird network.
diff --git a/docs/how-to-guides/periodic-authentication.md b/src/pages/docs/how-to/enforce-periodic-user-authentication.mdx
similarity index 52%
rename from docs/how-to-guides/periodic-authentication.md
rename to src/pages/docs/how-to/enforce-periodic-user-authentication.mdx
index b381cfe1..b23031df 100644
--- a/docs/how-to-guides/periodic-authentication.md
+++ b/src/pages/docs/how-to/enforce-periodic-user-authentication.mdx
@@ -1,49 +1,47 @@
----
-sidebar_position: 4
----
-# Configure periodic user authentication
+
+# Enforce periodic user authentication
To ensure a high level of security, NetBird offers a peer login expiration feature that requires users to periodically reauthenticate their devices.
Every new network has this feature enabled, and the expiration period is set to 24 hours by default. You can disable this feature and configure the expiration period in the account settings in the web UI https://app.netbird.io/settings.
-:::tip
-This feature is only applied to peers added with the [interactive SSO login feature](/getting-started/installation#running-netbird-with-sso-login). Peers, added with a setup key, won't be affected.
-:::
+
+ This feature is only applied to peers added with the [interactive SSO login feature](/getting-started/installation#running-netbird-with-sso-login). Peers, added with a setup key, won't be affected.
+
Expired peers will appear in the peers' view with the status `needs login`.
-
-
+
+
-### Configure and disable expiration
+## Configure and disable expiration
The expiration period can be set to anything between one hour and 180 days.
-Go to the Web UI Settings tab and set the desired period in the Authentication section.
+Go to the Web UI Settings tab and set the desired period in the Authentication section.
You can also disable the expiration for the whole network in the same section.
-
-
+
+
-:::danger
-Enabling peer expiration or changing the expiration period will cause some peers added with the SSO login to disconnect,
-and re-authentication will be required.
-:::
+
+ Enabling peer expiration or changing the expiration period will cause some peers added with the SSO login to disconnect,
+ and re-authentication will be required.
+
-### Disable expiration individually per peer
+## Disable expiration individually per peer
Sometimes, you might want to disable peer expiration for some peers.
With NetBird you can disable login expiration per peer without disabling expiration globally.
In the Peers tab of the web UI click on the peer you want to disable expiration for and use the Login Expiration switch.
Peers with `expiration disabled` will be marked with a corresponding label in the peers' table.
-
-
+
+
## Get started
- window.open("https://netbird.io/pricing")}>Use NetBird
+ window.open("https://netbird.io/pricing")}>Use NetBird
- Make sure to [star us on GitHub](https://github.com/netbirdio/netbird)
diff --git a/docs/examples/aws-ecs-client-daemon.md b/src/pages/docs/how-to/examples.mdx
similarity index 74%
rename from docs/examples/aws-ecs-client-daemon.md
rename to src/pages/docs/how-to/examples.mdx
index ed539e88..96c646b5 100644
--- a/docs/examples/aws-ecs-client-daemon.md
+++ b/src/pages/docs/how-to/examples.mdx
@@ -1,15 +1,14 @@
----
-sidebar_position: 1
----
-# NetBird Client on AWS ECS (Terraform)
+export const title = 'Examples'
-
-
+## NetBird Client on AWS ECS (Terraform)
+
+
+
A common way to run containers in the AWS cloud is to use Elastic Container Service (ECS).
-ECS is a fully managed container orchestration service that makes it easy to deploy, manage, and scale containerized applications.
+ECS is a fully managed container orchestration service that makes it easy to deploy, manage, and scale containerized applications.
It is best practice and common to run this infrastructure behind security guardrails like strict security groups and private subnets.
@@ -33,17 +32,17 @@ This allows you to:
* Connect to EC2 running on private subnets without the need to open firewall rules or configure bastion servers.
* Access other services connected to your NetBird network and running anywhere.
-## Requirements
+### Requirements
* Terraform > 1.0.
* A NetBird account with a Setup Key.
* Another NetBird client in your network to validate the connection (possibly your laptop or a machine you are running this example on).
* The [AWS CLI](https://docs.aws.amazon.com/cli/latest/userguide/install-cliv2.html) installed.
* An [AWS account](https://aws.amazon.com/free/).
* Your AWS credentials. You can [create a new Access Key on this page](https://console.aws.amazon.com/iam/home?#/security_credentials).
-## Notice
+### Notice
> Before getting started with this example, be aware that creating the resources from it may incur charges from AWS.
-## Getting started
+### Getting started
Clone this repository, download, and install Terraform following the guide [here](https://learn.hashicorp.com/tutorials/terraform/install-cli?in=terraform/aws-get-started).
@@ -53,7 +52,7 @@ Using a text editor, edit the [variables.tf](https://github.com/wiretrustee/wire
Before continuing, you may also update the [provider.tf](https://github.com/wiretrustee/wiretrustee-examples/tree/master/ecs-client-daemon/provider.tf) to configure proper AWS region and default tags.
-### Creating the resources with Terraform
+#### Creating the resources with Terraform
Follow the steps below to run terraform and create your test environment:
1. From the root of the cloned repository, enter the ecs-client-daemon folder and run terraform init to download the modules and providers used in this example.
@@ -68,19 +67,19 @@ terraform plan -out plan.tf
3. Run terraform apply to create your infrastructure
```shell
terraform apply plan.tf
-```
+```
-### Validating the deployment
+#### Validating the deployment
After a few minutes, the autoscaling group will launch an EC2 instance and there you will find the NetBird's ECS Daemon service running. With that, we can go to our [NetBird dashboard](https://app.netbird.io) and pick the IP of the node that is running NetBird, then we can connect to the node via ssh. For Unix(s) systems:
```shell
ssh ec2-user@100.64.0.200
-```
+```
Once you've login, you should be able to see the containers running by using the docker command:
```shell
sudo docker ps
```
-### Deleting the infrastructure resources used in the example
+#### Deleting the infrastructure resources used in the example
Once you are done validating the example, you can remove the resources with the following steps:
1. Run terraform plan with the flag `-destroy`
```shell
@@ -89,4 +88,28 @@ terraform plan -out plan.tf -destroy
2. Then execute the apply command:
```shell
terraform apply plan.tf
-```
\ No newline at end of file
+```
+
+## NetBird Client in Docker
+
+One of the simplest ways of running NetBird client application is to use a pre-built [Docker image](https://hub.docker.com/r/netbirdio/netbird).
+
+**Prerequisites:**
+* **Docker installed.**
+ If you don't have docker installed, please refer to the installation guide on the official [Docker website](https://docs.docker.com/get-docker/).
+* **NetBird account.**
+ Register one at [app.netbird.io](https://app.netbird.io/).
+
+You would need to obtain a [setup key](/docs/how-to/register-peers-using-setup-keys) to associate NetBird client with your account.
+
+The setup key could be found in the NetBird Management dashboard under the Setup Keys tab - [https://app.netbird.io/setup-keys](https://app.netbird.io/setup-keys).
+
+Set the ```NB_SETUP_KEY``` environment variable and run the command.
+
+```bash
+docker run --rm --name PEER_NAME --hostname PEER_NAME --cap-add=NET_ADMIN -d -e NB_SETUP_KEY= -v netbird-client:/etc/netbird netbirdio/netbird:latest
+```
+
+That is it! Enjoy using NetBird.
+
+If you would like to learn how to run NetBird Client as an ECS agent on AWS, please refer to [this guide](#net-bird-client-on-aws-ecs-terraform).
diff --git a/src/pages/docs/how-to/getting-started.mdx b/src/pages/docs/how-to/getting-started.mdx
new file mode 100644
index 00000000..f59ecb4a
--- /dev/null
+++ b/src/pages/docs/how-to/getting-started.mdx
@@ -0,0 +1,361 @@
+import {Note} from "@/components/mdx";
+
+export const title = 'Getting Started'
+
+## Quickstart Guide
+
+Step-by-step video guide on YouTube:
+
+
+ VIDEO
+
+
+This guide describes how to quickly get started with NetBird and create a secure private network with two connected machines.
+
+One machine is a Linux laptop, and the other one a EC2 node running on AWS.
+Both machines are running Linux but NetBird also works on Windows, MacOS nad popular mobile platforms like Android and iOS.
+
+1. Sign-up at [https://app.netbird.io/](https://app.netbird.io/)
+
+You can use your Google, GitHub or Microsoft account.
+
+
+
+
+
+2. After a successful login you will be redirected to the ```Peers``` screen which is empty because you don't have any peers yet.
+
+The `Add peer` window should automatically pop up, but if it doesn't, click ```Add new peer``` to add a new machine.
+
+
+
+
+
+3. Choose your machine operating system (in our case it is ```Linux```) and proceed with the installation steps.
+
+
+
+
+
+4. If you installed NetBird Desktop UI you can use it to connect to the network instead of running `netbird up` command. Look for `NetBird` in your application list, run it, and click `Connect`.
+>
+
+
+
+
+5. At this point a browser window pops up starting a device registration process. Click confirm and follow the steps if required.
+
+
+
+
+
+6. On the EC2 node repeat the installation steps and run `netbird up` command.
+
+```bash
+sudo netbird up
+ ```
+7. Copy the verification URL from the terminal output and paste it in your browser. Repeat step #5
+
+
+
+
+
+8. Return to ```Peers``` and you should notice 2 new machines with status ```online```
+
+
+
+
+
+9. To test the connection you could try pinging devices:
+
+On your laptop:
+```bash
+ping 100.64.0.2
+ ```
+
+On the EC2 node:
+ ```bash
+ping 100.64.0.1
+ ```
+10. Done! You now have a secure peer-to-peer private network configured.
+
+
+
+- Make sure to [star us on GitHub](https://github.com/netbirdio/netbird)
+- Follow us [on Twitter](https://twitter.com/netbird)
+- Join our [Slack Channel](https://join.slack.com/t/netbirdio/shared_invite/zt-vrahf41g-ik1v7fV8du6t0RwxSrJ96A)
+- NetBird release page on GitHub: [releases](https://github.com/netbirdio/netbird/releases/latest)
+
+## Installation
+
+### Linux
+
+**APT/Debian**
+1. Add the repository:
+
+ ```bash
+ sudo apt-get update
+ sudo apt-get install ca-certificates curl gnupg -y
+ curl -sSL https://pkgs.wiretrustee.com/debian/public.key | sudo gpg --dearmor --output /usr/share/keyrings/wiretrustee-archive-keyring.gpg
+ echo 'deb [signed-by=/usr/share/keyrings/wiretrustee-archive-keyring.gpg] https://pkgs.wiretrustee.com/debian stable main' | sudo tee /etc/apt/sources.list.d/wiretrustee.list
+```
+2. Update APT's cache
+
+```bash
+ sudo apt-get update
+```
+3. Install the package
+
+```bash
+ # for CLI only
+ sudo apt-get install netbird
+ # for GUI package
+ sudo apt-get install netbird-ui
+```
+
+**RPM/Red hat**
+
+1. Add the repository:
+```bash
+ cat < netbird will copy any existing configuration from the Wiretrustee's default configuration paths to the new NetBird's default location
+
+3. Install the client
+```bash
+ # for CLI only
+ brew install netbirdio/tap/netbird
+ # for GUI package
+ brew install --cask netbirdio/tap/netbird-ui
+```
+4. If you installed CLI only, you need to install and start the client daemon service:
+ ```bash
+ sudo netbird service install
+ sudo netbird service start
+```
+
+### Windows
+1. Checkout NetBird [releases](https://github.com/netbirdio/netbird/releases/latest)
+2. Download the latest Windows release installer ```netbird_installer__windows_amd64.exe``` (**Switch VERSION to the latest**):
+3. Proceed with the installation steps
+4. This will install the UI client in the C:\\Program Files\\NetBird and add the daemon service
+5. After installing, you can follow the steps from [Running NetBird with SSO Login](#Running-NetBird-with-SSO-Login) steps.
+> To uninstall the client and service, you can use Add/Remove programs
+
+⚠️ In case of any issues with the connection on Windows check the firewall settings. With default Windows 11 firewall setup there could be connectivity issue related to egress traffic.
+
+Recommended way is to add NetBird in firewall settings:
+
+1. Go to "Control panel".
+2. Select "Windows Defender Firewall".
+3. Select "Advanced settings".
+4. Select "Outbound Rules" -> "New rule".
+5. In the new rule select "Program" and click "Next".
+6. Point to the NetBird installation exe file (usually in `C:\Program Files\NetBird\netbird.exe`) and click "Next".
+7. Select "Allow the connection" and click "Next".
+8. Select the network in which rule should be applied (Domain, Private, Public) according to your needs and click "Next".
+9. Provide rule name (e.g. "Netbird Egress Traffic") and click "Finish".
+10. Disconnect and connect to NetBird.
+
+
+### Binary Install
+**Installation from binary (CLI only)**
+
+1. Checkout NetBird [releases](https://github.com/netbirdio/netbird/releases/latest)
+2. Download the latest release:
+```bash
+ curl -L -o ./netbird_.tar.gz https://github.com/netbirdio/netbird/releases/download/v/netbird___.tar.gz
+```
+
+
+
+ You need to replace some variables from the URL above:
+
+ - Replace **VERSION** with the latest released verion.
+ - Replace **OS** with "linux", "darwin" for MacOS or "windows"
+ - Replace **Arch** with your target system CPU archtecture
+
+
+
+3. Decompress
+```bash
+ tar xcf ./netbird_.tar.gz
+ sudo mv netbird /usr/bin/netbird
+ sudo chown root:root /usr/bin/netbird
+ sudo chmod +x /usr/bin/netbird
+```
+After that you may need to add /usr/bin in your PATH environment variable:
+````bash
+ export PATH=$PATH:/usr/bin
+````
+4. Install and run the service
+```bash
+ sudo netbird service install
+ sudo netbird service start
+```
+
+### Running NetBird with SSO Login
+#### Desktop UI Application
+If you installed the Desktop UI client, you can launch it and click on Connect.
+> It will open your browser, and you will be prompt for email and password. Follow the instructions.
+
+
+
+
+
+#### CLI
+Alternatively, you could use command line. Simply run
+ ```bash
+ netbird up
+ ```
+> It will open your browser, and you will be prompt for email and password. Follow the instructions.
+
+
+
+
+
+Check connection status:
+```bash
+ netbird status
+```
+
+### Running NetBird with a Setup Key
+In case you are activating a server peer, you can use a [setup key](/docs/how-to/register-peers-using-setup-keys) as described in the steps below.
+> This is especially helpful when you are running multiple server instances with infrastructure-as-code tools like ansible and terraform.
+
+1. Login to the Management Service. You need to have a `setup key` in hand (see [setup keys](/docs/how-to/register-peers-using-setup-keys)).
+
+For all systems:
+```bash
+ netbird up --setup-key
+```
+
+For **Docker**, you can run with the following command:
+```bash
+docker run --network host --privileged --rm -d -e NB_SETUP_KEY= -v netbird-client:/etc/netbird netbirdio/netbird:
+```
+> TAG > 0.6.0 version
+
+Alternatively, if you are hosting your own Management Service provide `--management-url` property pointing to your Management Service:
+```bash
+ netbird up --setup-key --management-url http://localhost:33073
+```
+
+> You could also omit the `--setup-key` property. In this case, the tool will prompt for the key.
+
+2. Check connection status:
+```bash
+ netbird status
+```
+
+3. Check your IP:
+
+On **macOS** :
+````bash
+ sudo ifconfig utun100
+````
+On **Linux**:
+```bash
+ ip addr show wt0
+ ```
+On **Windows**:
+```bash
+ netsh interface ip show config name="wt0"
+```
+
+### Running NetBird in Docker
+
+Set the ```NB_SETUP_KEY``` environment variable and run the command.
+
+ You can pass other settings as environment variables. See [Environment variables](reference/netbird-commands.md#environment-variables) for details.
+
+```bash
+docker run --rm --name PEER_NAME --hostname PEER_NAME --cap-add=NET_ADMIN -d -e NB_SETUP_KEY= -v netbird-client:/etc/netbird netbirdio/netbird:latest
+```
+
+See [Docker example](examples/netbird-docker.md) for details.
+
+### Troubleshooting
+1. If you are using self-hosted version and haven't specified `--management-url`, the client app will use the default URL
+which is ```https://api.wiretrustee.com:33073```.
+
+2. If you have specified a wrong `--management-url` (e.g., just by mistake when self-hosting)
+to override it you can do the following:
+
+```bash
+netbird down
+netbird up --management-url https:///
+```
+
+To override it see the solution #1 above.
diff --git a/docs/getting-started/installation.md b/src/pages/docs/how-to/installation.mdx
similarity index 52%
rename from docs/getting-started/installation.md
rename to src/pages/docs/how-to/installation.mdx
index 13d661f4..f64ae71a 100644
--- a/docs/getting-started/installation.md
+++ b/src/pages/docs/how-to/installation.mdx
@@ -1,128 +1,125 @@
----
-sidebar_position: 2
-title: Installation
-tags:
-- client
-- how-to
-- install
----
+import {Note} from "@/components/mdx";
+
+export const title = 'Installation'
+
+## Installation
### Linux
**APT/Debian**
1. Add the repository:
- ```bash
- sudo apt-get update
- sudo apt-get install ca-certificates curl gnupg -y
- curl -sSL https://pkgs.wiretrustee.com/debian/public.key | sudo gpg --dearmor --output /usr/share/keyrings/wiretrustee-archive-keyring.gpg
- echo 'deb [signed-by=/usr/share/keyrings/wiretrustee-archive-keyring.gpg] https://pkgs.wiretrustee.com/debian stable main' | sudo tee /etc/apt/sources.list.d/wiretrustee.list
- ```
+ ```bash
+ sudo apt-get update
+ sudo apt-get install ca-certificates curl gnupg -y
+ curl -sSL https://pkgs.wiretrustee.com/debian/public.key | sudo gpg --dearmor --output /usr/share/keyrings/wiretrustee-archive-keyring.gpg
+ echo 'deb [signed-by=/usr/share/keyrings/wiretrustee-archive-keyring.gpg] https://pkgs.wiretrustee.com/debian stable main' | sudo tee /etc/apt/sources.list.d/wiretrustee.list
+```
2. Update APT's cache
- ```bash
- sudo apt-get update
- ```
+```bash
+ sudo apt-get update
+```
3. Install the package
- ```bash
- # for CLI only
- sudo apt-get install netbird
- # for GUI package
- sudo apt-get install netbird-ui
- ```
-
+```bash
+ # for CLI only
+ sudo apt-get install netbird
+ # for GUI package
+ sudo apt-get install netbird-ui
+```
+
**RPM/Red hat**
1. Add the repository:
- ```bash
- cat < netbird will copy any existing configuration from the Wiretrustee's default configuration paths to the new NetBird's default location
3. Install the client
- ```bash
+```bash
# for CLI only
brew install netbirdio/tap/netbird
# for GUI package
brew install --cask netbirdio/tap/netbird-ui
- ```
+```
4. If you installed CLI only, you need to install and start the client daemon service:
- ```bash
+ ```bash
sudo netbird service install
sudo netbird service start
- ```
+```
### Windows
1. Checkout NetBird [releases](https://github.com/netbirdio/netbird/releases/latest)
@@ -153,36 +150,36 @@ Recommended way is to add NetBird in firewall settings:
1. Checkout NetBird [releases](https://github.com/netbirdio/netbird/releases/latest)
2. Download the latest release:
- ```bash
+```bash
curl -L -o ./netbird_.tar.gz https://github.com/netbirdio/netbird/releases/download/v/netbird___.tar.gz
- ```
-
-:::note
+```
-You need to replace some variables from the URL above:
+
-- Replace **VERSION** with the latest released verion.
-- Replace **OS** with "linux", "darwin" for MacOS or "windows"
-- Replace **Arch** with your target system CPU archtecture
+ You need to replace some variables from the URL above:
-:::
+ - Replace **VERSION** with the latest released verion.
+ - Replace **OS** with "linux", "darwin" for MacOS or "windows"
+ - Replace **Arch** with your target system CPU archtecture
+
+
3. Decompress
- ```bash
+```bash
tar xcf ./netbird_.tar.gz
sudo mv netbird /usr/bin/netbird
sudo chown root:root /usr/bin/netbird
sudo chmod +x /usr/bin/netbird
- ```
+```
After that you may need to add /usr/bin in your PATH environment variable:
- ````bash
+````bash
export PATH=$PATH:/usr/bin
- ````
+````
4. Install and run the service
- ```bash
+```bash
sudo netbird service install
sudo netbird service start
- ```
+```
### Running NetBird with SSO Login
#### Desktop UI Application
@@ -190,8 +187,8 @@ If you installed the Desktop UI client, you can launch it and click on Connect.
> It will open your browser, and you will be prompt for email and password. Follow the instructions.
-
-
+
+
#### CLI
Alternatively, you could use command line. Simply run
@@ -201,8 +198,8 @@ Alternatively, you could use command line. Simply run
> It will open your browser, and you will be prompt for email and password. Follow the instructions.
-
-
+
+
Check connection status:
```bash
@@ -210,55 +207,55 @@ Check connection status:
```
### Running NetBird with a Setup Key
-In case you are activating a server peer, you can use a [setup key](/overview/setup-keys) as described in the steps below.
+In case you are activating a server peer, you can use a [setup key](/docs/how-to/register-peers-using-setup-keys) as described in the steps below.
> This is especially helpful when you are running multiple server instances with infrastructure-as-code tools like ansible and terraform.
-1. Login to the Management Service. You need to have a `setup key` in hand (see [setup keys](/overview/setup-keys)).
+1. Login to the Management Service. You need to have a `setup key` in hand (see [setup keys](/docs/how-to/register-peers-using-setup-keys)).
- For all systems:
- ```bash
- netbird up --setup-key
- ```
+For all systems:
+```bash
+ netbird up --setup-key
+```
- For **Docker**, you can run with the following command:
- ```bash
- docker run --network host --privileged --rm -d -e NB_SETUP_KEY= -v netbird-client:/etc/netbird netbirdio/netbird:
- ```
- > TAG > 0.6.0 version
+For **Docker**, you can run with the following command:
+```bash
+docker run --network host --privileged --rm -d -e NB_SETUP_KEY= -v netbird-client:/etc/netbird netbirdio/netbird:
+```
+> TAG > 0.6.0 version
- Alternatively, if you are hosting your own Management Service provide `--management-url` property pointing to your Management Service:
- ```bash
- netbird up --setup-key --management-url http://localhost:33073
- ```
-
- > You could also omit the `--setup-key` property. In this case, the tool will prompt for the key.
+Alternatively, if you are hosting your own Management Service provide `--management-url` property pointing to your Management Service:
+```bash
+ netbird up --setup-key --management-url http://localhost:33073
+```
+
+> You could also omit the `--setup-key` property. In this case, the tool will prompt for the key.
2. Check connection status:
- ```bash
- netbird status
- ```
+```bash
+ netbird status
+```
3. Check your IP:
- On **macOS** :
- ````bash
- sudo ifconfig utun100
- ````
- On **Linux**:
- ```bash
- ip addr show wt0
- ```
- On **Windows**:
- ```bash
- netsh interface ip show config name="wt0"
+On **macOS** :
+````bash
+ sudo ifconfig utun100
+````
+On **Linux**:
+```bash
+ ip addr show wt0
```
+On **Windows**:
+```bash
+ netsh interface ip show config name="wt0"
+```
### Running NetBird in Docker
Set the ```NB_SETUP_KEY``` environment variable and run the command.
-:::tip Environment variables
-You can pass other settings as environment variables. See [Environment variables](reference/netbird-commands.md#environment-variables) for details.
-:::
+
+ You can pass other settings as environment variables. See [Environment variables](reference/netbird-commands.md#environment-variables) for details.
+
```bash
docker run --rm --name PEER_NAME --hostname PEER_NAME --cap-add=NET_ADMIN -d -e NB_SETUP_KEY= -v netbird-client:/etc/netbird netbirdio/netbird:latest
```
@@ -267,14 +264,14 @@ See [Docker example](examples/netbird-docker.md) for details.
### Troubleshooting
1. If you are using self-hosted version and haven't specified `--management-url`, the client app will use the default URL
- which is ```https://api.wiretrustee.com:33073```.
+which is ```https://api.wiretrustee.com:33073```.
2. If you have specified a wrong `--management-url` (e.g., just by mistake when self-hosting)
- to override it you can do the following:
+to override it you can do the following:
- ```bash
- netbird down
- netbird up --management-url https:///
- ```
+```bash
+netbird down
+netbird up --management-url https:///
+```
- To override it see the solution #1 above.
+To override it see the solution #1 above.
diff --git a/docs/how-to-guides/nameservers.md b/src/pages/docs/how-to/manage-dns-in-your-network.mdx
similarity index 66%
rename from docs/how-to-guides/nameservers.md
rename to src/pages/docs/how-to/manage-dns-in-your-network.mdx
index c25c82c1..0bce99a6 100644
--- a/docs/how-to-guides/nameservers.md
+++ b/src/pages/docs/how-to/manage-dns-in-your-network.mdx
@@ -1,30 +1,28 @@
----
-sidebar_position: 3
----
+
# Manage DNS in your network
-VIDEO
+ VIDEO
-You don't need to design a network or configure [DHCP](https://en.wikipedia.org/wiki/Dynamic_Host_Configuration_Protocol)
-as it is automatically done in a single place - the NetBird Management service.
+You don't need to design a network or configure [DHCP](https://en.wikipedia.org/wiki/Dynamic_Host_Configuration_Protocol)
+as it is automatically done in a single place - the NetBird Management service.
NetBird assigns and automatically distributes IP addresses to your peers.
-Once peers have IPs, they can communicate with one another and establish direct encrypted WireGuard® tunnels.
-You can use these IPs to access the services running on the connected peers (e.g., SSH).
-Even though we trust our memory capacity, there is a limit to what we can remember,
+Once peers have IPs, they can communicate with one another and establish direct encrypted WireGuard® tunnels.
+You can use these IPs to access the services running on the connected peers (e.g., SSH).
+Even though we trust our memory capacity, there is a limit to what we can remember,
especially when it comes to IP addresses like this one, 100.128.185.34.
Starting [v0.11.0](https://github.com/netbirdio/netbird/releases), NetBird automatically assigns a domain name
to each peer in a private `netbird.cloud` space that can be used to access the machines. E.g., `my-server.netbird.cloud`.
-Besides accessing machines by their domain names, you can configure NetBird to use your private nameservers,
-control what nameservers a specific [peer group](https://netbird.io/docs/overview/acls#groups) should use, and set up split DNS.
-
-:::info
-Nameservers is available for NetBird [v0.11.0](https://github.com/netbirdio/netbird/releases) or later.
-:::
+Besides accessing machines by their domain names, you can configure NetBird to use your private nameservers,
+control what nameservers a specific [peer group](/docs/how-to/access-control#concepts) should use, and set up split DNS.
+
+
+ Nameservers feature is available in NetBird [v0.11.0](https://github.com/netbirdio/netbird/releases) or later.
+
## Concepts
### Local resolver
@@ -33,35 +31,35 @@ To minimize the number of changes in your system, NetBird will spin up a local D
This local resolver will be responsible for queries to the domain names of peers registered in your network and forwarding queries to upstream nameservers you configure in the system.
It listens on the peer's IP, and usually, it will use the default port 53, but if it is in use, it will use the 5053 port.
-:::info
-Custom port support is not builtin into most operating systems. At the time of release, the supported systems are:
-- MacOS
-- Linux with systemd-resolved
-:::
-### Nameserver
+
+ Custom port support is not builtin into most operating systems. At the time of release, the supported systems are:
+ - MacOS
+ - Linux with systemd-resolved
+
+#### Nameserver
Nameserver is an upstream DNS server for name resolution, if a query comes and is not a peer domain name, it will be resolved by one of the upstream servers. You can assign private and public IPs and custom ports. Remember that you might need a network route for private addresses to allow peers to connect to it.
-### Match domains
+#### Match domains
Match domains allow you to route queries of names, matching them to specific nameservers. This is useful when you have an internal DNS configuration that only internal servers can resolve.
-### All domains option
+#### All domains option
The all domains option defines a default nameserver configuration to resolve all domains that don't have a match domain setting. Because not all operating systems support match domain configuration, we recommend configuring at least one nameserver set with this option enabled per distribution group. You may also consider using the group All for distribution, so you don't have to define multiple sets of nameservers to resolve all domains.
-:::info
-A nameserver set may only be configured with either All domains or match domains, you can have both settings in a single configuration as they overlap.
-:::
-### Distribution groups
+
+ A nameserver set may only be configured with either All domains or match domains, you can have both settings in a single configuration as they overlap.
+
+#### Distribution groups
Distribution defines that peers that belong to groups set in this field will receive the nameserver configuration.
-:::info
-When using private nameservers, you may use these groups to link routing peers and clients of the private servers.
-:::
+
+ When using private nameservers, you may use these groups to link routing peers and clients of the private servers.
+
## Managing nameserver groups
A nameserver group defines up to 2 nameservers to resolve DNS to a set of peers in distribution groups.
### Creating a nameserver group
Access the `DNS` tab and click the `Add Nameserver` button to create a new nameserver.
-
-
+
+
-That will open a nameserver selection configuration screen where you can choose between using three predefined public
+That will open a nameserver selection configuration screen where you can choose between using three predefined public
nameservers or using a custom setup.
#### Selecting predefined nameservers
@@ -69,14 +67,14 @@ If you choose a predefined public nameserver option, you can select the followin
- [Google DNS servers](https://developers.google.com/speed/public-dns/docs/using)
- [Cloudflare DNS servers](https://one.one.one.one/dns/)
- [Quad9 DNS servers](https://www.quad9.net/)
-
-
+
+
-After selecting one of the three options, you need to assign a peer group for which this nameserver will be effective.
+After selecting one of the three options, you need to assign a peer group for which this nameserver will be effective.
In the example below, we chose the "All" group:
-
-
+
+
#### Creating custom nameservers
@@ -89,33 +87,33 @@ In the example below, we are creating a nameserver with the following informatio
- Add at least one nameserver: `192.168.0.32` with port `53`
- Match mode: `All domains`
- Distribution group: `Remote developers`
-
-
+
+
### Creating a nameserver for specific domains
Sometimes we want to forward DNS queries to specific nameservers but only for particular domains that match a setting.
Taking the example of custom nameservers above, you could select a match mode for only domains listed there.
Below you can see the same nameserver setup but only for the `berlinoffice.com` domain:
-
-
+
+
-:::info
-Currently, only MacOS, Windows 10+, and Linux running systemd-resolved support nameservers without an all domains resolver. For a better experience, we recommend setting at least one all domain resolver to be applied to all groups.
-:::
+
+ Currently, only MacOS, Windows 10+, and Linux running systemd-resolved support nameservers without an all domains resolver. For a better experience, we recommend setting at least one all domain resolver to be applied to all groups.
+
### Distributing the settings with groups
You can select as many distribution groups as you want for your nameserver setup. Keep in mind to link them to peers and, if required, to add access control rules when using private nameservers.
### Adding remote private DNS servers
To add a private DNS server that is running behind routing peers, you need to create resources to ensure communication between your nameserver clients can communicate. In the Berlin office example from previous steps, we have a peer from the `Office network` that can route traffic to the `192.168.0.32` IP, so we need to ensure that a similar network route exists:
-
-
+
+
Then we need to confirm that an access rule exists to connect `Remote developers` to `Office network` group:
-
-
+
+
## Testing configuration
@@ -146,10 +144,10 @@ resolvectl query peer-a.netbird.cloud
```
## Get started
- window.open("https://netbird.io/pricing")}>Use NetBird
+ window.open("https://netbird.io/pricing")}>Use NetBird
- Make sure to [star us on GitHub](https://github.com/netbirdio/netbird)
- Follow us [on Twitter](https://twitter.com/netbird)
- Join our [Slack Channel](https://join.slack.com/t/netbirdio/shared_invite/zt-vrahf41g-ik1v7fV8du6t0RwxSrJ96A)
-- NetBird [latest release](https://github.com/netbirdio/netbird/releases) on GitHub
\ No newline at end of file
+- NetBird [latest release](https://github.com/netbirdio/netbird/releases) on GitHub
diff --git a/docs/overview/acls.md b/src/pages/docs/how-to/manage-network-access.mdx
similarity index 63%
rename from docs/overview/acls.md
rename to src/pages/docs/how-to/manage-network-access.mdx
index 46c191d0..3f2c01e9 100644
--- a/docs/overview/acls.md
+++ b/src/pages/docs/how-to/manage-network-access.mdx
@@ -1,13 +1,12 @@
----
-sidebar_position: 4
----
-# Access Control
+# Manage network access
NetBird allows administrators to restrict access to resources (peers) by creating access rules and
defining what peer groups are permitted to establish connections with one another.
-VIDEO
+
+ VIDEO
+
## Introduction
@@ -30,9 +29,9 @@ Some characteristics of groups:
- They can only be deleted via API.
- There is a default group called `All`.
-:::tip peer auto-grouping
-You can assign groups automatically with the [peer auto-grouping feature](/overview/setup-keys#peer-auto-grouping).
-:::
+
+ You can assign groups automatically with the [peer auto-grouping feature](/overview/setup-keys#peer-auto-grouping).
+
### The All Group
The `All` group is a default group to which every peer in your network is automatically added to. This group cannot be modified or deleted.
@@ -46,72 +45,72 @@ meaning that destinations can also initiate connections to a group of peers list
The behavior of a network without any rules is to deny traffic. No peers will be able to communicate with each other.
-:::tip
-If you need to allow peers from the same group to communicate with each other, just add the same group to the `Source` and `Destination` lists.
-:::
+
+ If you need to allow peers from the same group to communicate with each other, just add the same group to the `Source` and `Destination` lists.
+
### The Default Rule
-The `Default` rule is created when you first create your account. This rule is very permissive because it allows communication between all peers in your network.
-It uses the [`All`](#the-all-group) group as a source and destination. If you want to have better
+The `Default` rule is created when you first create your account. This rule is very permissive because it allows communication between all peers in your network.
+It uses the [`All`](#the-all-group) group as a source and destination. If you want to have better
control over your network, it is recommended that you delete this rule and create more restricted rules with custom groups.
-:::tip
-If you need to restrict communication within your network, you can create new rules and use different groups, and then remove the default rule to achieve the desired behavior.
-:::
+
+ If you need to restrict communication within your network, you can create new rules and use different groups, and then remove the default rule to achieve the desired behavior.
+
### Multiple Mesh Networks
-As mentioned above, rules are bidirectional, which is basically the control of how your network will behave as a mesh network.
+As mentioned above, rules are bidirectional, which is basically the control of how your network will behave as a mesh network.
-There is a `Default` rule, which configures a Default mesh connection between all peers of your network. With rules, you can define smaller mesh networks by grouping peers and adding these groups to `Source` and `Destination` lists.
+There is a `Default` rule, which configures a Default mesh connection between all peers of your network. With rules, you can define smaller mesh networks by grouping peers and adding these groups to `Source` and `Destination` lists.
## Managing Rules
### Creating Rules
-After accessing the `Access Control` tab, you can click on the `Add Rule` button to create a new rule. This will open a screen
+After accessing the `Access Control` tab, you can click on the `Add Rule` button to create a new rule. This will open a screen
where you need to name the rule, set its status, and add groups to the source and destination lists.
-
-
+
+
If required, you can create new groups by simply entering new names in the input box for either source or destination lists.
-
-
+
+
Once you are done configuring the rule, click the `Create` button to save it. You will then see your new rule in the table.
-
-
+
+
-:::caution Reminder
-Because of its permissiveness, new rules will take effect once you remove the `Default` rule.
-:::
+
+ Because of its permissiveness, new rules will take effect once you remove the `Default` rule.
+
-#### Adding peers to groups
-If you create a new group when defining a rule, you will need to associate peers with this group.
-You can do it by accessing the `Peers` tab and clicking the `Groups` column of any peer you want to associate with the new group.
+### Adding peers to groups
+If you create a new group when defining a rule, you will need to associate peers with this group.
+You can do it by accessing the `Peers` tab and clicking the `Groups` column of any peer you want to associate with the new group.
-
-
+
+
-:::tip peer auto-grouping
-You can assign groups automatically with the [peer auto-grouping feature](/overview/setup-keys#peer-auto-grouping).
-:::
+
+ You can assign groups automatically with the [peer auto-grouping feature](/overview/setup-keys#peer-auto-grouping).
+
### Updating Rules
-To update a rule, you can click on the rule's `Name` or on either `Sources` and `Destinations` columns. You could also click the menu
+To update a rule, you can click on the rule's `Name` or on either `Sources` and `Destinations` columns. You could also click the menu
button of a rule and select `View`. This will open the same screen where you can update rule groups, description, or status.
### Disabling Rules
To disable a rule, you should follow the steps of [updating rules](#updating-rules) changing its status, and then click on Save.
### Deleting Rules
To delete a rule, you should click on the rule's menu and choose `Delete`. A confirmation window will pop up.
-
-
+
+
-
-
-
+
+
+
\ No newline at end of file
diff --git a/docs/how-to-guides/activity-monitoring.md b/src/pages/docs/how-to/monitor-system-and-network-activity.mdx
similarity index 51%
rename from docs/how-to-guides/activity-monitoring.md
rename to src/pages/docs/how-to/monitor-system-and-network-activity.mdx
index 8264a77f..d7d9382a 100644
--- a/docs/how-to-guides/activity-monitoring.md
+++ b/src/pages/docs/how-to/monitor-system-and-network-activity.mdx
@@ -1,29 +1,29 @@
----
-sidebar_position: 4
----
+
# Monitor system and network activity
-The activity monitoring feature lets you quickly see what's happening with your network.
+The activity monitoring feature lets you quickly see what's happening with your network.
Whether a new machine or user joined your network or the access control policy has been modified, the activity log allows you to track the changes to your network.
-Activity monitoring is enabled by default for every network, and you can access it in the web UI under the [Activity tab](https://app.netbird.io/activity).
+## Access activity monitoring view
+
+Activity monitoring is enabled by default for every network, and you can access it in the web UI under the [Activity tab](https://app.netbird.io/activity).
You can also use the search bar to filter events by activity type.
-
-
+
+
-:::info
-The current version of NetBird tracks network changes that occur in the Management server. E.g., changes related to the list of peers, groups, system settings, setup keys, access control, etc.
-The future versions will support connection events that occur in NetBird agents (e.g., peer A connected to peer B).
-:::
+
+ The current version of NetBird tracks network changes that occur in the Management server. E.g., changes related to the list of peers, groups, system settings, setup keys, access control, etc.
+ The future versions will support connection events that occur in NetBird agents (e.g., peer A connected to peer B).
+
## Get started
- window.open("https://netbird.io/pricing")}>Use NetBird
+ window.open("https://netbird.io/pricing")}>Use NetBird
- Make sure to [star us on GitHub](https://github.com/netbirdio/netbird)
- Follow us [on Twitter](https://twitter.com/netbird)
- Join our [Slack Channel](https://join.slack.com/t/netbirdio/shared_invite/zt-vrahf41g-ik1v7fV8du6t0RwxSrJ96A)
-- NetBird [latest release](https://github.com/netbirdio/netbird/releases) on GitHub
\ No newline at end of file
+- NetBird [latest release](https://github.com/netbirdio/netbird/releases) on GitHub
diff --git a/docs/overview/setup-keys.md b/src/pages/docs/how-to/register-machines-using-setup-keys.mdx
similarity index 54%
rename from docs/overview/setup-keys.md
rename to src/pages/docs/how-to/register-machines-using-setup-keys.mdx
index ee0b4e6d..e61e716d 100644
--- a/docs/overview/setup-keys.md
+++ b/src/pages/docs/how-to/register-machines-using-setup-keys.mdx
@@ -1,63 +1,61 @@
----
-sidebar_position: 3
----
-# Setup Keys
+# Use setup keys to run automated deployments and add machines to your network at scale
-Setup key is a pre-authentication key that allows to register new machines in your network.
+Setup key is a pre-authentication key that allows to register new machines in your network.
It simply associates a machine with an account on a first run.
-The setup key can be provided as a parameter to the ```netbird up``` command.
+The setup key can be provided as a parameter to the ```netbird up``` command.
This makes it possible to run automated deployments with infrastructure-as-code software like Ansible, Cloudformation or Terraform.
-```bash
+```bash {{ title: 'Starting NetBird Client' }}
sudo netbird up --setup-key
```
-### Types of Setup Keys
+## Types of Setup Keys
There are 2 types of setup keys:
* **One-off key**. This type of key can be used only once to authenticate a machine.
* **Reusable key**. This type of key can be used multiple times to authenticate machines.
-### Using Setup Keys
+## Using Setup Keys
Setup keys are available in the NetBird Management dashboard under the Setup Keys tab [https://app.netbird.io/setup-keys](https://app.netbird.io/setup-keys).
By default, we generate 2 setup keys right after account creation. You can easily add new or revoke keys.
-
-
-
+
+
+
-:::tip revoking a key
-When revoking a key, all machines authenticated with this key will remain connected in the network. The same logic applies when the key expires.
-:::
+
+ When revoking a key, all machines authenticated with this key will remain connected in the network. The same logic applies when the key expires.
+
### Expiration
Setup keys are set to expire after 30 days. When expired, the setup key can't be used anymore.
-### Peer Auto-grouping
+## Peer Auto-grouping
-
-
+
+
-NetBird offers a powerful [Access Control feature](/overview/acls) that allows easy access management of your resources.
-In a basic scenario, you would create multiple groups of peers and create access rules to define what groups can access each other.
+NetBird offers a powerful [Access Control feature](/docs/how-to/restrict-access-to-peers) that allows easy access management of your resources.
+In a basic scenario, you would create multiple groups of peers and create access rules to define what groups can access each other.
Adding peers to groups might become time-consuming in large networks with dozens of machines.
-Starting NetBird [v0.9.2](https://github.com/netbirdio/netbird/releases), when creating or updating a setup key,
-it is possible to specify a list of auto-assign groups. Every peer registered with this key will be automatically added
+Starting NetBird [v0.9.2](https://github.com/netbirdio/netbird/releases), when creating or updating a setup key,
+it is possible to specify a list of auto-assign groups. Every peer registered with this key will be automatically added
to these groups. All the access control rules enabled for these groups will apply automatically.
-To add `Auto-assign groups`, open the `Setup Keys` tab and create or update any existing setup key.
+To add `Auto-assign groups`, open the `Setup Keys` tab and create or update any existing setup key.
Then use this key to enroll new machine.
-
-
+
+
-:::note
-Auto-assign groups will apply only to newly registered machines.
-:::
\ No newline at end of file
+
+ Auto-assign groups will apply only to newly registered machines.
+
+
diff --git a/docs/how-to-guides/network-routes.md b/src/pages/docs/how-to/routing-traffic-to-private-networks.mdx
similarity index 69%
rename from docs/how-to-guides/network-routes.md
rename to src/pages/docs/how-to/routing-traffic-to-private-networks.mdx
index 840fc605..52eb43b7 100644
--- a/docs/how-to-guides/network-routes.md
+++ b/src/pages/docs/how-to/routing-traffic-to-private-networks.mdx
@@ -1,10 +1,8 @@
----
-sidebar_position: 1
----
+
# Routing traffic to private networks
-VIDEO
+ VIDEO
@@ -16,33 +14,33 @@ NetBird provides fast and reliable end-to-end encryption between peers in your n
In these cases, you can configure network routes assigning routing peers to connect existing infrastructure. Routing peers will forward packets between your NetBird peers and your other networks; they can masquerade traffic going to your data centers or embedded devices, reducing the need for external route configuration and agent installation.
-
-
+
+
-:::tip try it
-If you want to see the Network Routes feature in action, try our managed version at https://app.netbird.io/routes.
+
+ If you want to see the Network Routes feature in action, try our managed version at https://app.netbird.io/routes.
-It's free and simple! :)
-:::
+ It's free and simple! :)
+
## Concepts
### Network routes
A network route describes the network you want to connect with your NetBird peers. It has an identifier, a network range, a routing peer, and some parameters available for managing priority and masquerading.
-:::info
-Network routes is available for NetBird [v0.9.0](https://github.com/netbirdio/netbird/releases) or later.
-:::
-### Network identifiers and ranges
+
+ Network routes is available for NetBird [v0.9.0](https://github.com/netbirdio/netbird/releases) or later.
+
+#### Network identifiers and ranges
Network identifiers are names for each network you want to route traffic from your peers, and ranges are IP ranges declared in CIDR notation which refers to an external network. The combination of identifiers and these ranges makes a single network.
-### Routing peer
+#### Routing peer
A routing peer is a node that will route packets between your routed network and the other NetBird peers.
-:::info
-Only Linux OS nodes can be assigned as routing peers.
-:::
-### High availability routes
+
+ Only Linux OS nodes can be assigned as routing peers.
+
+#### High availability routes
A highly available route is a combination of multiple routes with the same network identifier and ranges. They have different routing peers offering high-available paths for communication between your peers and external networks.
Nodes connected to routing peers will choose one of them to route packets to external networks based on connection type and defined metrics.
-### Masquerade
+#### Masquerade
Masquerade hides other NetBird network IPs behind the routing peer local address when accessing the target Network range. This option allows access to your private networks without configuring routes on your local routers or other devices.
If you don't enable this option, you must configure a route to your NetBird network in your external network infrastructure.
@@ -51,18 +49,18 @@ Metric defines prioritization when choosing the main routing peer in a high avai
### Distribution groups
Distribution groups define that peers that belong to groups set in this field will receive the network route.
-:::info
-It doesn't remove the need for the routing peer to be connected to these peers
-:::
+
+ It doesn't remove the need for the routing peer to be connected to these peers
+
## Managing network routes
A network route describes a network you want to connect with your NetBird peers. It has an identifier, a network range, a routing peer, and some parameters available for managing priority and masquerading.
### Creating a network route
-Access the `Network Routes` tab and click the `Add Route` button to create a new route.
+Access the `Network Routes` tab and click the `Add Route` button to create a new route.
That will open a route configuration screen where you can add the information about the network you want to route:
-
-
+
+
Now you can enter the details of your route.
@@ -74,59 +72,59 @@ In the example below, we are creating a route with the following information:
- Routing peer: `aws-nb-europe-router-az-a`
- Distribution Groups: `All`
-
-
+
+
Once you fill in the route information, you can click on the `Save` button to save your new route.
-
-
+
+
Done! Now every peer connected to your routing peer will be able to send traffic to your external network.
### Creating highly available routes
-To avoid a single point of failure when managing your network, we recommend installing NetBird on every resource.
+To avoid a single point of failure when managing your network, we recommend installing NetBird on every resource.
However, you still want to ensure a reliable connection to your private network when running NetBird on every machine is not feasible.
-NetBird Network Routes feature has a High Availability (HA) mode,
+NetBird Network Routes feature has a High Availability (HA) mode,
allowing one or more NetBird peers to serve as routing peers for the same private network.
To enable high-available mode, you can click on `Configure` and select a new peer in the `Add additional routing peer` field, then select the distribution groups and click on `Save`.
In the following screenshot, we are adding the peer `aws-nb-europe-router-az-b` to the `aws-eu-central-1-vpc` route:
-
-
+
+
This way, nodes connected to both peer `aws-nb-europe-router-az-a` and peer `aws-nb-europe-router-az-b` would have a highly available connection with the network `172.31.0.0/16`.
-
-
+
+
-:::info
-Currently, there is no limitation in the number of routes that form a highly available route. Each connected peer will pick one routing peer to use as the router for a network; this decision is based on metric prioritization and connection attributes like direct or relayed connections.
-:::
+
+ Currently, there is no limitation in the number of routes that form a highly available route. Each connected peer will pick one routing peer to use as the router for a network; this decision is based on metric prioritization and connection attributes like direct or relayed connections.
+
### Filtering routes distribution with groups
You can select as many distribution groups as you want for your network route. You can update them at the routing peer or high-availability group level. Keep in mind to link them to peers and, if required, to add access control rules ensuring connectivity between these peers and the routing peers of your route
### Routes without masquerading
-If you want more transparency and would like to manage your external network routers, you may choose to disable masquerade for your network routes.
+If you want more transparency and would like to manage your external network routers, you may choose to disable masquerade for your network routes.
In this case, the routing peer won't hide any NetBird peer IP and will forward the packets to the target network transparently.
-That will require a routing configuration on your external network router pointing your NetBird network back to your routing peer.
+That will require a routing configuration on your external network router pointing your NetBird network back to your routing peer.
This way, devices that don't have the agent installed can communicate with your NetBird peers.
-
-
+
+
## Get started
- window.open("https://netbird.io/pricing")}>Use NetBird
+ window.open("https://netbird.io/pricing")}>Use NetBird
- Make sure to [star us on GitHub](https://github.com/netbirdio/netbird)
- Follow us [on Twitter](https://twitter.com/netbird)
- Join our [Slack Channel](https://join.slack.com/t/netbirdio/shared_invite/zt-vrahf41g-ik1v7fV8du6t0RwxSrJ96A)
-- NetBird [latest release](https://github.com/netbirdio/netbird/releases) on GitHub
\ No newline at end of file
+- NetBird [latest release](https://github.com/netbirdio/netbird/releases) on GitHub
diff --git a/src/pages/docs/introduction.mdx b/src/pages/docs/introduction.mdx
new file mode 100644
index 00000000..188e736b
--- /dev/null
+++ b/src/pages/docs/introduction.mdx
@@ -0,0 +1,30 @@
+import {Note} from "@/components/mdx"
+import {HowToGuides} from "@/components/How-To-Guides"
+import {AboutNetbird} from "@/components/AboutNetbird"
+
+export const description =
+ 'Learn everything there is to know about NetBird.'
+
+# Introduction to NetBird
+
+NetBird is a simple and fast alternative to corporate VPNs built on top of [WireGuard®](https://www.wireguard.com/) making it easy to create secure private networks for your organization or home.
+It requires near zero configuration effort leaving behind the hassle of opening ports, complex firewall rules, vpn gateways, and so forth. {{ className: 'lead' }}
+
+
+ NetBird is an **open-source** project and can be self-hosted
+
+
+There is no centralized VPN server with NetBird - your computers, devices, machines, and servers connect to each other directly over a fast encrypted tunnel.
+NetBird can connect machines running anywhere in just a few clicks.
+It literally takes less than 5 minutes to deploy a secure peer-to-peer VPN with NetBird. {{ className: 'lead' }}
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/pages/docs/selfhosted/identity-providers.mdx b/src/pages/docs/selfhosted/identity-providers.mdx
new file mode 100644
index 00000000..7ee8fd3e
--- /dev/null
+++ b/src/pages/docs/selfhosted/identity-providers.mdx
@@ -0,0 +1,700 @@
+import {Note} from "@/components/mdx";
+
+# Identity Providers
+
+There are a few Identity Provider options that you can choose to run a self-hosted version NetBird.
+
+
+ NetBird supports generic OpenID (OIDC) protocol allowing for the integration with any IDP that follows the specification.
+
+
+## Auth0
+
+This guide is a part of the [NetBird Self-hosting Guide](/docs/selfhosted/selfhosted-guide) and explains how to integrate **self-hosted** NetBird with [Auth0](https://auth0.com/).
+
+Auth0 is a flexible, drop-in solution to add authentication and authorization services to your applications.
+It is a 3rd party managed service and can't be self-hosted. Auth0 is the right choice if you don't want to manage an Identity Provider (IDP)
+instance on your own.
+
+
+ If you prefer to have full control over authentication and authorization of your NetBird network, there are good
+ self-hosted alternatives to the managed Auth0 service like [Keycloak](/integrations/identity-providers/self-hosted/using-netbird-with-keycloak).
+
+
+### Step 1: Create Auth0 account
+To create an Auth0 account, sign up at [https://auth0.com](https://auth0.com/).
+
+There are five properties of the **`setup.env`** file that we will configure in this guide:
+- `NETBIRD_AUTH_CLIENT_ID`
+- `NETBIRD_AUTH_OIDC_CONFIGURATION_ENDPOINT`
+- `NETBIRD_USE_AUTH0`
+- `NETBIRD_AUTH_AUDIENCE`
+- `NETBIRD_AUTH_DEVICE_AUTH_CLIENT_ID` (Optional)
+
+### Step 2: Create and configure Auth0 application
+
+This Auth0 application will be used to authorize access to NetBird Dashboard (Web UI).
+
+- Follow the steps in the [Auth0 React SDK Guide](https://auth0.com/docs/quickstart/spa/react/01-login#configure-auth0)
+up until "Install the Auth0 React SDK".
+- Use **`https://YOUR DOMAIN`** as: `Allowed Callback URLs`, `Allowed Logout URLs`, `Allowed Web Origins`, `Allowed Origins (CORS)`
+
+ Make sure that **`Token Endpoint Authentication Method`** is set to **`None`**.
+
+
+- Use **`Client ID`** to set ```NETBIRD_AUTH_CLIENT_ID``` property in the `setup.env` file.
+- Use **`Domain`** to configure ```NETBIRD_AUTH_OIDC_CONFIGURATION_ENDPOINT``` property in the `setup.env` file like so:
+```
+ https:///.well-known/openid-configuration
+```
+
+Double-check if the endpoint returns a JSON response by calling it from your browser.
+
+
+### Step 3: Create and configure Auth0 API
+
+This Auth0 API will be used to access NetBird Management Service API.
+
+- Follow the steps in the [Auth0 Create An API](https://auth0.com/docs/quickstart/backend/golang#create-an-api).
+- Use API **`Identifier`** to set ```NETBIRD_AUTH_AUDIENCE``` property in the `setup.env` file.
+- Set ```NETBIRD_USE_AUTH0``` to `true`in the `setup.env` file.
+
+### Step 4: Enable Interactive SSO Login (Optional)
+
+The [Interactive SSO Login feature](/getting-started/installation#running-netbird-with-sso-login) allows for machine
+authorization with your Identity Provider. This feature can be used as an alternative to [setup keys](docs/how-to/register-peers-using-setup-keys)
+and is optional.
+
+You can enable it by following these steps:
+- Log in to your Auth0 account https://manage.auth0.com/
+- Go to `Applications` (left-hand menu)
+- Click `Create Application` button (top right)
+- Fill in the form with the following values:
+- Name: `Interactive Login`
+- Application type: `Native`
+- Click `Create`
+
+
+
+
+
+- Click `Settings` tab
+- Copy **`Client ID`** to `NETBIRD_AUTH_DEVICE_AUTH_CLIENT_ID` in the `setup.env` file
+
+
+
+
+
+- Scroll down to the `Advanced Settings` section
+- Enable **`Device Code`**
+- Click `Save Changes`
+
+
+
+
+
+
+### Step 4: Continue with the self-hosting guide
+You can now continue with the [NetBird Self-hosting Guide](/docs/selfhosted/selfhosted-guide#step-3-configure-identity-provider).
+
+## Keycloak
+
+This guide is a part of the [NetBird Self-hosting Guide](/docs/selfhosted/selfhosted-guide) and explains how to integrate
+**self-hosted** NetBird with [Keycloak](https://www.keycloak.org/).
+
+Keycloak is an open source software product to allow single sign-on with Identity and Access Management aimed at modern applications and services.
+
+
+ If you prefer not to self-host an Identity and Access Management solution, then you could use a managed alternative like
+ [Auth0](/integrations/identity-providers/self-hosted/using-netbird-with-auth0).
+
+
+The following guide is an adapted version of the original
+[Keycloak on Docker](https://www.keycloak.org/getting-started/getting-started-docker) guide from the official website.
+
+### Expected Result
+
+After completing this guide, you can log in to your self-hosted NetBird Dashboard and add your machines
+to your network using the [Interactive SSO Login feature](/docs/how-to/getting-started#running-net-bird-with-sso-login)
+over Keycloak.
+
+
+
+
+
+### Step 1: Check your Keycloak Instance
+
+For this guide, you need a fully configured Keycloak instance running with SSL.
+
+We assume that your Keycloak instance is available at **`https://YOUR-KEYCLOAK-HOST-AND_PORT`**.
+Feel free to change the port if you have configured Keycloak with a different one.
+
+Most of the OIDC software requires SSL for production use.
+We encourage you to comply with this requirement to make the world more secure 😊.
+
+### Step 2: Create a realm
+
+To create a realm you need to:
+
+- Open the Keycloak Admin Console
+- Hover the mouse over the dropdown in the top-left corner where it says `Master`, then click on `Create Realm`
+- Fill in the form with the following values:
+- Realm name: `netbird`
+- Click `Create`
+
+
+
+
+
+
+### Step 3: Create a user
+
+In this step we will create a NetBird administrator user.
+
+- Open the Keycloak Admin Console
+- Make sure, that the selected realm is `Netbird`
+- Click `Users` (left-hand menu)
+- Click `Create new user`
+- Fill in the form with the following values:
+- Username: `netbird`
+- Click `Create`
+
+
+
+
+
+The user will need an initial password set to be able to log in. To do this:
+- Click `Credentials` tab
+- Click `Set password` button
+- Fill in the password form with a password
+- Set the `Temporary` field to `Off` to prevent having to update password on first login
+- Click `Save`
+
+
+
+
+
+### Step 4: Create a NetBird client
+
+In this step we will create NetBird application client and register with the Keycloak instance.
+
+- Open the Keycloak Admin Console
+- Make sure, that the selected realm is `Netbird`
+- Click `Clients`
+- Click `Create client` button
+- Fill in the form with the following values and click Next:
+- Client Type: `OpenID Connect`
+- Client ID: `netbird-client`
+- Your newly client `netbird-client` will be used later to set `NETBIRD_AUTH_CLIENT_ID` in the `setup.env`
+
+
+
+
+
+
+- Check the checkboxes as on the screenshot below and click Save
+
+
+
+
+
+### Step 5: Adjust NetBird client access settings
+
+In this step we will configure NetBird application client access with the NetBird URLs.
+
+- Open the Keycloak Admin Console
+- Make sure, that the selected realm is `Netbird`
+- Click `Clients`
+- Choose `netbird-client` from the list
+- Go to `Access Settings` section
+- Fill in the fields with the following values:
+- Root URL: `https://YOUR DOMAIN/` (this is the NetBird Dashboard root URL)
+- Valid redirect URIs: `https://YOUR DOMAIN/*`
+- Valid post logout redirect URIs: `https://YOUR DOMAIN/*`
+- Web origins: `+`
+- Click `Save`
+
+
+
+
+
+### Step 6: Create a NetBird client scope
+
+In this step, we will create and configure the NetBird client audience for Keycloak to add it to the generated JWT tokens.
+
+- Open the Keycloak Admin Console
+- Make sure, that the selected realm is `Netbird`
+- Click `Client scopes` (left-hand menu)
+- Click `Create client scope` button
+- Fill in the form with the following values:
+- Name: `api`
+- Type: `Default`
+- Protocol: `OpenID Connect`
+- Click `Save`
+
+
+
+
+
+- While in the newly created Client Scope, switch to the `Mappers` tab
+- Click `Configure a new mapper`
+- Choose the `Audience` mapping
+
+
+
+
+
+- Fill in the form with the following values:
+- Name: `Audience for NetBird Management API`
+- Included Client Audience: `netbird-client`
+- Add to access token: `On`
+- Click `Save`
+
+
+
+
+
+### Step 7: Add client scope to NetBird client
+
+- Open the Keycloak Admin Console
+- Make sure, that the selected realm is `Netbird`
+- Click `Clients`
+- Choose `netbird-client` from the list
+- Switch to `Client scopes` tab
+- Click `Add client scope` button
+- Choose `api`
+- Click `Add` choosing `Default`
+- The value `netbird-client` will be used as audience
+
+
+
+
+
+### Step 8: Create a NetBird-Backend client
+
+In this step we will create NetBird backend client and register with the Keycloak instance.
+
+- Open the Keycloak Admin Console
+- Make sure, that the selected realm is `Netbird`
+- Click `Clients`
+- Click `Create client` button
+- Fill in the form with the following values and click Next:
+- Client Type: `OpenID Connect`
+- Client ID: `netbird-backend`
+- Your newly client `netbird-backend` will be used later to set `KeycloakClientCredentials` in the `management.json`
+
+
+
+
+
+- Check the checkboxes as on the screenshot below and click Save
+
+
+
+
+
+The client will need secret to authenticate. To do this:
+- Click `Credentials` tab
+- Copy `client secret` will be used later to set `ClientSecret` in the `management.json`
+
+
+
+
+
+### Step 9: Add manage-users role to netbird-backend
+
+- Open the Keycloak Admin Console
+- Make sure, that the selected realm is `Netbird`
+- Click `Clients`
+- Choose `netbird-backend` from the list
+- Switch to `Service accounts roles` tab
+- Click `Assign roles` button
+- Select `Filter by clients` and search for `manage-users`
+
+
+
+
+
+- Check the role checkbox and click assign
+
+
+
+
+
+Your authority OIDC configuration will be available under:
+```
+https:///realms/netbird/.well-known/openid-configuration
+```
+
+ Double-check if the endpoint returns a JSON response by calling it from your browser.
+
+
+- Set properties in the `setup.env` file:
+- NETBIRD_AUTH_OIDC_CONFIGURATION_ENDPOINT=`https:///realms/netbird/.well-known/openid-configuration`.
+- NETBIRD_AUTH_CLIENT_ID=`netbird-client`
+- NETBIRD_AUTH_AUDIENCE=`netbird-client`
+- NETBIRD_AUTH_DEVICE_AUTH_CLIENT_ID=`netbird-client`. Optional,
+it enables the [Interactive SSO Login feature](/docs/how-to/getting-started#running-net-bird-with-sso-login) (Oauth 2.0 Device Authorization Flow)
+
+- You can now continue with the [NetBird Self-hosting Guide](/docs/selfhosted/selfhosted-guide#step-3-configure-identity-provider).
+
+- Set property `IdpManagerConfig` in the `management.json` file with:
+
+ The file management.json is created automatically. Please refer [here](/getting-started/self-hosting#step-5-run-configuration-script) for more information.
+
+
+```json
+{
+ "ManagerType": "keycloak",
+ "KeycloakClientCredentials": {
+ "ClientID": "netbird-backend",
+ "ClientSecret": "",
+ "GrantType": "client_credentials",
+ "TokenEndpoint": "https:///realms/netbird/protocol/openid-connect/token",
+ "AdminEndpoint": "https:///admin/realms/netbird"
+ }
+}
+ ```
+
+
+ Make sure that your Keycloak instance use HTTPS. Otherwise, the setup won't work.
+
+
+## Azure AD
+
+This guide is a part of the [NetBird Self-hosting Guide](/docs/selfhosted/selfhosted-guide) and explains how to integrate **self-hosted** NetBird with [Azure AD](https://azure.microsoft.com/en-us/products/active-directory/).
+
+Azure AD is a an enterprise identity service that provides single sign-on and multifactor authentication to your applications.
+It is a 3rd party managed service and can't be self-hosted.
+
+
+ If you prefer to have full control over authentication and authorization of your NetBird network, there are good
+ self-hosted alternatives to the managed Auth0 service like [Keycloak](/integrations/identity-providers/self-hosted/using-netbird-with-keycloak).
+
+
+Before you start creating and configuring an Azure AD application, ensure that you have the following:
+- An Azure account: To create an Azure AD application, you must have an Azure account. If you don't have one, sign up for a free account at https://azure.microsoft.com/free/.
+
+- User account with appropriate permissions: You must have an Azure AD user account with the appropriate permissions to create and manage Azure AD applications. If you don't have the required permissions, ask your Azure AD administrator to grant them to you.
+
+
+### Step 1. Create and configure Azure AD application
+In this step, we will create and configure Netbird application in azure AD.
+- Navigate to [Azure Active Directory](https://portal.azure.com/#view/Microsoft_AAD_IAM/ActiveDirectoryMenuBlade/~/Overview)
+- Click `App Registrations` in the left menu then click on the `+ New registration` button to create a new application.
+- Fill in the form with the following values and click Register
+- Name: `Netbird`
+- Account Types: `Accounts in this organizational directory only (Default Directory only - Single tenant)`
+- Redirect URI: select `Single-page application (SPA)` and URI as `https:///silent-auth`
+
+
+
+
+
+### Step 2. Platform configurations
+- Click `Authentication` on the left side menu
+- Under the `Single-page application` Section, add another URI `https:///auth`
+
+
+
+
+
+- Scroll down and setup other options as on the screenshot below and click Save
+
+
+
+
+
+### Step 3. Create a NetBird application scope
+- Click `Expose an API` on the left menu
+- Under `Application ID URI` click `Set` and then `Save`
+- Click `+ Add a Scope`
+- Fill in the form with the following values and click `Add scope`
+- Scope name: `api`
+
+
+
+
+
+- Under `Authorized client Applications`, click on `+ add a client application` and enter the following:
+- Fill in the form with the following values and click `Add application`
+- Client ID: same as your Application ID URI minus the `api://`
+
+
+
+
+
+
+### Step 4. Add API permissions
+- Add `Netbird` permissions
+- Click `API permissions` on the left menu
+- Click `Add a permission`
+- Click `My APIs` tab, and select `Netbird`. Next check `api` permission checkbox and click `Add permissions`.
+
+
+
+
+
+- Add `Delagated permissions` to Microsoft Graph
+- Click `Add a permission`
+- Click `Microsoft Graph` and then click `Delagated permissions` tab and check all permissions under the `OpenId permissions` section and click `Add permissions`
+
+
+
+
+
+
+- Add `Application permissions` to Microsoft Graph
+- Click `Add a permission`
+- Click `Microsoft Graph` and then click `Application permissions` tab
+- Search for `User.ReadWrite.All` and under `User` sections and check `User.ReadWrite.All` checkbox section
+
+
+
+
+
+- Search for `Application.ReadWrite.All` and under `Application` sections and check `Application.ReadWrite.All` checkbox section and click `Add permissions`
+
+
+
+
+
+- Click `Grant admin conset for Default Directory` and click `Yes`
+
+
+
+
+
+### Step 5. Update token version
+- Click `Manifest` on left menu
+- Search for `accessTokenAcceptedVersion` and change the value from `null` to `2`
+- Click `Save`
+
+### Step 6. Generate client secret
+- Click `Certificates & secrets` on left menu
+- Click `New client secret`
+- Fill in the form with the following values and click `Add`
+- Description: `Netbird`
+- Copy `Value` and save it as it can be viewed only once after creation.
+
+
+
+
+
+Your authority OIDC configuration will be available under:
+```
+https://login.microsoftonline.com//v2.0/.well-known/openid-configuration
+```
+
+ Double-check if the endpoint returns a JSON response by calling it from your browser.
+
+
+- Set properties in the `setup.env` file:
+```json
+NETBIRD_AUTH_OIDC_CONFIGURATION_ENDPOINT="https://login.microsoftonline.com//v2.0/.well-known/openid-configuration"
+NETBIRD_USE_AUTH0=false
+NETBIRD_AUTH_CLIENT_ID=""
+NETBIRD_AUTH_AUDIENCE=""
+NETBIRD_AUTH_DEVICE_AUTH_CLIENT_ID=""
+NETBIRD_AUTH_REDIRECT_URI="/auth"
+NETBIRD_AUTH_SILENT_REDIRECT_URI="/silent-auth"
+NETBIRD_AUTH_USER_ID_CLAIM="oid"
+```
+
+- You can now continue with the [NetBird Self-hosting Guide](/docs/selfhosted/selfhosted-guide#step-3-configure-identity-provider/docs/selfhosted/selfhosted-guide#step-3-configure-identity-provider).
+
+- Set property `IdpManagerConfig` in the `management.json` file with:
+
+ The file management.json is created automatically. Please refer [here](/getting-started/self-hosting#step-5-run-configuration-script) for more information.
+
+
+```json
+{
+ "ManagerType": "azure",
+ "AzureClientCredentials": {
+ "ClientID": "",
+ "ClientSecret": "",
+ "GrantType": "client_credentials",
+ "ObjectID": "",
+ "TokenEndpoint": "https://login.microsoftonline.com//oauth2/v2.0/token",
+ "GraphAPIEndpoint": "https://graph.microsoft.com/v1.0"
+ }
+}
+```
+
+- Modify the value of the `AUTH_SUPPORTED_SCOPES` environment variable for the dashboard service in the docker-compose.yml file to `openid profile email offline_access api:///api`.
+
+- Modify `Scope` value in `DeviceAuthorizationFlow` within the `management.json` to `api:///api`.
+
+## Zitadel
+
+This guide is a part of the [NetBird Self-hosting Guide](/docs/selfhosted/selfhosted-guide) and explains how to integrate
+**self-hosted** NetBird with [Zitadel](https://zitadel.com).
+
+
+ If you prefer not to self-host an Identity and Access Management solution, then you could use a managed alternative like
+ [Auth0](/integrations/identity-providers/self-hosted/using-netbird-with-auth0).
+
+
+### Step 1. Create and configure Zitadel application
+In this step, we will create and configure Netbird application in zitadel.
+
+Create new zitadel project
+- Navigate to zitadel console
+- Click `Projects` at the top menu, then click `Create New Project` to create a new project
+- Fill in the form with the following values and click `Continue`
+- Name: `NETBIRD`
+
+
+
+
+
+Create new zitadel application
+- Click `Projects` in the top menu and select `NETBIRD` project from the list
+- Click `New` in `APPLICATIONS` section to create a new application
+- Fill in the form with the following values and click `Continue`
+- Name: `netbird`
+- TYPE OF APPLICATION: `User Agent`
+
+
+
+
+
+- Fill in the form with the following values and click `Continue`
+- Authentication Method: `PKCE`
+
+
+
+
+
+- Fill in the form with the following values and click `Continue`
+- Redirect URIs: `https:///auth` and click `+`
+- Post Logout URIs: `https:///silent-auth` and click `+`
+
+
+
+
+
+- Verify applications details and Click `Create` and then click `Close`
+- Check `Refresh Token` checkbox and click `Save`
+
+
+
+
+
+- Copy `Client ID` will be used later in the `setup.env`
+
+### Step 2: Application Token Configuration
+
+To configure `netbird` application token you need to:
+
+- Click `Projects` in the top menu and select `NETBIRD` project from the list
+- Select `netbird` application from `APPLICATIONS` section
+- Click `Token Settings` in the left menu
+- Fill in the form with the following values:
+- Auth Token Type: `JWT`
+- Check `Add user roles to the access token` checkbox
+- Click `Save`
+
+
+
+
+
+### Step 3: Application Redirect Configuration
+
+:::caution
+This step is intended for setup running in development mode with no SSL
+:::
+
+To configure `netbird` application redirect you need to:
+
+- Click `Projects` in the top menu and select `NETBIRD` project from the list
+- Select `netbird` application from `APPLICATIONS` section
+- Click `Redirect Settings` in the left menu
+- Fill in the form with the following values:
+- Toggle `Development Mode`
+- Click `Save`
+
+
+
+
+
+### Step 4: Create a Service User
+
+In this step we will create a `netbird` service user.
+
+- Click `Users` in the top menu
+- Select `Service Users` tab
+- Click `New`
+- Fill in the form with the following values:
+- User Name: `netbird`
+- Name: `netbird`
+- Description: `Netbird Service User`
+- Access Token Type: `JWT`
+- Click `Create`
+
+
+
+
+
+In this step we will generate `ClientSecret` for the `netbird` service user.
+
+- Click `Actions` in the top right corner and click `Generate Client Secret`
+- Copy `ClientSecret` from the dialog will be used later to set `ClientSecret` in the `management.json`
+
+
+
+
+
+### Step 5: Grant manage-users role to netbird service user
+
+In this step we will grant `Org User Manager` role to `netbird` service user.
+
+- Click `Organization` in the top menu
+- Click `+` in the top right corner
+- Search for `netbird` service user
+- Check `Org User Manager` checkbox
+- Click `Add`
+
+
+
+
+
+Your authority OIDC configuration will be available under:
+```
+https:///.well-known/openid-configuration
+```
+:::caution
+Double-check if the endpoint returns a JSON response by calling it from your browser.
+:::
+
+- Set properties in the `setup.env` file:
+```json
+NETBIRD_AUTH_OIDC_CONFIGURATION_ENDPOINT="https:///.well-known/openid-configuration"
+NETBIRD_USE_AUTH0=false
+NETBIRD_AUTH_CLIENT_ID=""
+NETBIRD_AUTH_AUDIENCE=""
+NETBIRD_AUTH_DEVICE_AUTH_CLIENT_ID=""
+NETBIRD_AUTH_REDIRECT_URI="/auth"
+NETBIRD_AUTH_SILENT_REDIRECT_URI="/silent-auth"
+```
+
+- You can now continue with the [NetBird Self-hosting Guide](/docs/selfhosted/selfhosted-guide#step-3-configure-identity-provider).
+
+- Set property `IdpManagerConfig` in the `management.json` file with:
+:::caution
+The file management.json is created automatically. Please refer [here](/docs/selfhosted/selfhosted-guide#step-5-run-configuration-script) for more information.
+:::
+
+```json
+{
+ "ManagerType": "zitadel",
+ "ZitadelClientCredentials": {
+ "ClientID": "netbird",
+ "ClientSecret": "",
+ "GrantType": "client_credentials",
+ "TokenEndpoint": "https:///oauth/v2/token",
+ "ManagementEndpoint": "https:///management/v1"
+ }
+}
+ ```
diff --git a/docs/getting-started/self-hosting.md b/src/pages/docs/selfhosted/selfhosted-guide.mdx
similarity index 75%
rename from docs/getting-started/self-hosting.md
rename to src/pages/docs/selfhosted/selfhosted-guide.mdx
index ce1d672e..1c565806 100644
--- a/docs/getting-started/self-hosting.md
+++ b/src/pages/docs/selfhosted/selfhosted-guide.mdx
@@ -1,6 +1,3 @@
----
-sidebar_position: 2
----
# Self-hosting Guide
@@ -11,12 +8,12 @@ a 3rd party open-source STUN/TURN service [Coturn](https://github.com/coturn/cot
If you would like to learn more about the architecture please refer to the [Architecture section](/overview/architecture).
-:::tip netbird as a service
-It might be a good idea to try NetBird before self-hosting.
-We run NetBird in the cloud, and it will take less than 5 minutes to get started with our managed version. [Check it out!](https://netbird.io/pricing)
-:::
+
+ It might be a good idea to try NetBird before self-hosting.
+ We run NetBird in the cloud, and it will take less than 5 minutes to get started with our managed version. [Check it out!](https://netbird.io/pricing)
+
-### Requirements
+## Requirements
- Virtual machine offered by any cloud provider (e.g., AWS, DigitalOcean, Hetzner, Google Cloud, Azure ...).
- Any Linux OS.
@@ -28,9 +25,9 @@ We run NetBird in the cloud, and it will take less than 5 minutes to get started
For this tutorial we will be using domain ```demo.netbird.io``` which points to our Ubuntu 22.04 machine hosted at Hetzner.
-### Step 1: Get the latest stable NetBird code
+## Step 1: Get the latest stable NetBird code
-```bash
+```bash
#!/bin/bash
REPO="https://github.com/netbirdio/netbird/"
# this command will fetch the latest release e.g. v0.8.7
@@ -43,10 +40,10 @@ git clone --depth 1 --branch $LATEST_TAG $REPO
Then switch to the infra folder that contains docker-compose file:
-```bash
+```bash
cd netbird/infrastructure_files/
```
-### Step 2: Prepare configuration files
+## Step 2: Prepare configuration files
To simplify the setup we have prepared a script to substitute required properties in the [docker-compose.yml.tmpl](https://github.com/netbirdio/netbird/tree/main/infrastructure_files/docker-compose.yml.tmpl) and [management.json.tmpl](https://github.com/netbirdio/netbird/tree/main/infrastructure_files/management.json.tmpl) files.
@@ -73,17 +70,17 @@ NETBIRD_LETSENCRYPT_EMAIL=""
- Set ```NETBIRD_DOMAIN``` to your domain, e.g. `demo.netbird.io`
- Configure ```NETBIRD_LETSENCRYPT_EMAIL``` property.
- This can be any email address. [Let's Encrypt](https://letsencrypt.org/) will create an account while generating a new certificate.
+This can be any email address. [Let's Encrypt](https://letsencrypt.org/) will create an account while generating a new certificate.
-:::tip
-Let's Encrypt will notify you via this email when certificates are about to expire. NetBird supports automatic renewal by default.
-:::
+
+ Let's Encrypt will notify you via this email when certificates are about to expire. NetBird supports automatic renewal by default.
+
-:::info
-If you want to setup netbird with your own reverse-Proxy and without using the integrated letsencrypt, follow [this step here instead](#advanced-running-netbird-behind-an-existing-reverse-proxy).
-:::
+
+ If you want to setup netbird with your own reverse-Proxy and without using the integrated letsencrypt, follow [this step here instead](#advanced-running-netbird-behind-an-existing-reverse-proxy).
+
-### Step 3: Configure Identity Provider
+## Step 3: Configure Identity Provider
NetBird supports generic OpenID (OIDC) protocol allowing for the integration with any IDP that follows the specification.
Pick the one that suits your needs, follow the steps, and continue with this guide:
@@ -91,49 +88,49 @@ Pick the one that suits your needs, follow the steps, and continue with this gui
- Continue with [Auth0](/integrations/identity-providers/self-hosted/using-netbird-with-auth0) (managed service).
- Continue with [Keycloak](/integrations/identity-providers/self-hosted/using-netbird-with-keycloak).
-### Step 4: Disable single account mode (optional)
+## Step 4: Disable single account mode (optional)
-NetBird Management service runs in a single account mode by default since version v0.10.1.
-Management service was creating a separate account for each registered user before v0.10.1.
+NetBird Management service runs in a single account mode by default since version v0.10.1.
+Management service was creating a separate account for each registered user before v0.10.1.
Single account mode ensures that all the users signing up for your self-hosted installation will join the same account/network.
-In most cases, this is the desired behavior.
+In most cases, this is the desired behavior.
-If you want to disable the single-account mode, set `--disable-single-account-mode` flag in the
-[docker-compose.yml.tmpl](https://github.com/netbirdio/netbird/tree/main/infrastructure_files/docker-compose.yml.tmpl)
+If you want to disable the single-account mode, set `--disable-single-account-mode` flag in the
+[docker-compose.yml.tmpl](https://github.com/netbirdio/netbird/tree/main/infrastructure_files/docker-compose.yml.tmpl)
`command` section of the `management` service.
-### Step 5: Run configuration script
+## Step 5: Run configuration script
Make sure all the required properties set in the ```setup.env``` file and run:
- ```bash
- ./configure.sh
- ```
+```bash
+./configure.sh
+```
This will export all the properties as environment variables and generate ```docker-compose.yml``` and ```management.json``` files substituting required variables.
-### Step 6: Run docker compose:
+## Step 6: Run docker compose:
```bash
docker-compose up -d
```
-### Step 7: Check docker logs (Optional)
+## Step 7: Check docker logs (Optional)
- ```bash
- docker-compose logs signal
- docker-compose logs management
- docker-compose logs coturn
- docker-compose logs dashboard
+```bash
+docker-compose logs signal
+docker-compose logs management
+docker-compose logs coturn
+docker-compose logs dashboard
```
-### Advanced: Running netbird behind an existing reverse-proxy
+## Advanced: Running netbird behind an existing reverse-proxy
If you want to run netbird behind your own reverse-proxy, some additional configuration-steps have to be taken to [Step 2](#step-2--prepare-configuration-files).
-:::info
-Not all reverse-proxies are supported as netbird uses *gRPC* for various components.
-:::
+
+ Not all reverse-proxies are supported as netbird uses *gRPC* for various components.
+
-#### Configuration for netbird
+### Configuration for netbird
In `setup.env`:
- Set ```NETBIRD_DOMAIN``` to your domain, e.g. `demo.netbird.io`
@@ -144,13 +141,13 @@ In `setup.env`:
Optional:
- Add ```TURN_MIN_PORT``` and ```TURN_MAX_PORT``` to configure the port-range used by the Turn-server
-:::tip info
-The `coturn`-service still needs to be directly accessible under your set-domain as it uses UDP for communication.
-:::
+
+ The `coturn`-service still needs to be directly accessible under your set-domain as it uses UDP for communication.
+
Now you can continue with [Step 3](#step-3-configure-identity-provider).
-#### Configuration for your reverse-proxy
+### Configuration for your reverse-proxy
Depending on your port-mappings and choice of reverse-proxy, how you configure the forwards differs greatly.
@@ -165,12 +162,12 @@ Endpoint | Protocol | Target service and internal-port
Make sure your reverse-Proxy is setup to use the HTTP2-Protocol when forwarding.
-:::tip
-You can find helpful templates with the reverse-proxy-name as suffix (e.g. `docker-compose.yml.tmpl.traefik`)
-Simply replace the file `docker-compose.yml.tmpl` with the chosen version.
-:::
+
+ You can find helpful templates with the reverse-proxy-name as suffix (e.g. `docker-compose.yml.tmpl.traefik`)
+ Simply replace the file `docker-compose.yml.tmpl` with the chosen version.
+
-### Get in touch
+## Get in touch
Feel free to ping us on [Slack](https://join.slack.com/t/netbirdio/shared_invite/zt-vrahf41g-ik1v7fV8du6t0RwxSrJ96A) if you have any questions
diff --git a/src/pages/ipa/guides/authentication.mdx b/src/pages/ipa/guides/authentication.mdx
new file mode 100644
index 00000000..b8c6c7a3
--- /dev/null
+++ b/src/pages/ipa/guides/authentication.mdx
@@ -0,0 +1,33 @@
+export const description =
+ 'In this guide, we’ll look at how authentication works. NetBird offers two ways to authenticate your API requests: OAuth2 and personal access tokens.'
+
+# Authentication
+
+You'll need to authenticate your requests to access any of the endpoints in the NetBird API. In this guide, we'll look at how authentication works. Netbird offers two ways to authenticate your API requests: OAuth2 and personal access tokens (PAT). {{ className: 'lead' }}
+
+## OAuth2 with bearer token
+
+When establishing a connection using OAuth2, you will need your access token — you can retrieve one from your IDP manager. Here's how to add the token to the request header using cURL:
+
+```bash {{ title: 'Example request with bearer token' }}
+curl https://api.netbird.io/api/users \
+ -H "Authorization: Bearer {token}"
+```
+
+Always keep your token safe and reset it if you suspect it has been compromised.
+
+## Using personal access tokens
+
+When establishing a connection using [PATs](/docs/how-to/access-netbird-public-api), you will need your access token — you can create one in the [Netbird dashboard](https://app.netbird.io/users) under User settings. It is recommended to use [service users](/docs/how-to/access-netbird-public-api) for all organization wide flows calling the API. Here's how to add the token to the request header using cURL:
+
+```bash {{ title: 'Example request with personal access token' }}
+curl https://api.netbird.io/api/users \
+ -H "Authorization: Token {token}"
+```
+
+Always keep your token safe and reset it if you suspect it has been compromised.
+
+
+
+
+
diff --git a/src/pages/ipa/guides/errors.mdx b/src/pages/ipa/guides/errors.mdx
new file mode 100644
index 00000000..6a21737c
--- /dev/null
+++ b/src/pages/ipa/guides/errors.mdx
@@ -0,0 +1,34 @@
+import {Note} from "@/components/mdx";
+export const description =
+ 'In this guide, we will talk about what happens when something goes wrong while you work with the API.'
+
+# Errors
+
+When working with APIs, it's important to understand the different types of HTTP errors that you might encounter. These errors can help you diagnose issues with your API requests and determine how to resolve them. {{ className: 'lead' }}
+
+You can tell if your request was successful by checking the status code when receiving an API response. If a response comes back unsuccessful, you can use the error type and error message to figure out what has gone wrong and do some rudimentary debugging.
+
+
+ The API is still in Beta state so some errors might not be handled properly yet.
+
+
+---
+
+## Status codes
+
+Here is a list of the different categories of status codes returned by the NetBird API. Use these to understand if a request was successful.
+
+
+
+ A 2xx status code indicates a successful response.
+
+
+ A 4xx status code indicates a client error - those are mostly related to missing permissions or invalid parameters inside the request.
+
+
+ A 5xx status code indicates a server error - in this case please reach out to us via [Slack](https://join.slack.com/t/netbirdio/shared_invite/zt-vrahf41g-ik1v7fV8du6t0RwxSrJ96A) or [GitHub](https://github.com/netbirdio/netbird/issues).
+
+
+
+---
+
diff --git a/src/pages/ipa/guides/quickstart.mdx b/src/pages/ipa/guides/quickstart.mdx
new file mode 100644
index 00000000..4f944dc6
--- /dev/null
+++ b/src/pages/ipa/guides/quickstart.mdx
@@ -0,0 +1,48 @@
+export const description =
+ 'This guide will get you all set up and ready to use the NetBird API. We’ll cover how to get started and how to make your first API request.'
+
+
+# Quickstart
+
+This guide will get you all set up and ready to use the NetBird API. We'll cover how to get started using cURL and how to make your first API request. We'll also look at where to go next to find all the information you need to take full advantage of our powerful REST API. {{ className: 'lead' }}
+
+## Install cURL
+
+For this guide, we'll be using cURL to make our first API request. If you don't already have cURL installed, you can download it from the [cURL website](https://curl.se/download.html).
+
+## Get an access token
+
+Before making your first API request, you need to create an access token to authenticate requests to the API. You can create an access token in the [Netbird dashboard](https://app.netbird.io) under [Users » Me](https://app.netbird.io/users).
+After the token was created successfully make sure to store it as we need it for the next step.
+
+## Making your first API request
+
+After creating your access token, you are ready to make your first call to the NetBird API. Below, you can see how to send a GET request to the peers endpoint to get a list of all peers in your network.
+
+
+
+```bash {{ title: 'cURL' }}
+curl -X GET https://api.netbird.io/api/peers \
+ -H 'Accept: application/json' \
+ -H 'Authorization: Token '
+```
+
+
+
+
+
+
+
+
+## What's next?
+
+Great, you're now set up with an API client and have made your first request to the API. Here are a few links that might be handy as you venture further into the NetBird API:
+
+- [Read how to properly authenticate against the NetBird API](/authentication)
+- [Check out the users endpoint](/users)
+- [Learn about the different error types](/errors)
diff --git a/src/pages/ipa/introduction.mdx b/src/pages/ipa/introduction.mdx
new file mode 100644
index 00000000..1e5a9e1a
--- /dev/null
+++ b/src/pages/ipa/introduction.mdx
@@ -0,0 +1,31 @@
+import { Guides } from '@/components/Guides'
+import { Resources } from '@/components/Resources'
+
+export const description =
+ 'Learn everything there is to know about the NetBird Public API.'
+
+# NetBird REST API
+
+Use the NetBird Public API to manage users, peers, network rules and more from inside your application or scripts to automate the setup of your mesh network. {{ className: 'lead' }}
+
+
+
+
+
+## Getting started {{ anchor: false }}
+
+To get started, it is recommended to create a [service user](/docs/how-to/use-service-users-with-access-token#service-users), that can later be used to communicate with the NetBird API.
+To be able to send requests to our API you need to [authenticate](/ipa/guides/authentication) on each request. This can be done either by Bearer token from your identity provider or by creating a [personal access token](/ipa/guides/authentication#using-personal-access-tokens) in the NetBird dashboard.{{ className: 'lead' }}
+
+
+
+
+
+
+
+
diff --git a/src/pages/ipa/resources/accounts.mdx b/src/pages/ipa/resources/accounts.mdx
new file mode 100644
index 00000000..7accbe63
--- /dev/null
+++ b/src/pages/ipa/resources/accounts.mdx
@@ -0,0 +1,443 @@
+
+export const title = 'Accounts'
+
+
+
+## List all Accounts {{ tag: 'GET' , label: '/api/accounts' }}
+
+
+
+ Returns a list of accounts of a user. Always returns a list of one account.
+
+
+
+
+```bash {{ title: 'cURL' }}
+curl -X GET https://api.netbird.io/api/accounts \
+-H 'Accept: application/json' \
+-H 'Authorization: Token '
+```
+
+```js
+const axios = require('axios');
+
+let config = {
+ method: 'get',
+ maxBodyLength: Infinity,
+ url: '/api/accounts',
+ headers: {
+ 'Accept': 'application/json',
+ 'Authorization': 'Token '
+ }
+};
+
+axios(config)
+.then((response) => {
+ console.log(JSON.stringify(response.data));
+})
+.catch((error) => {
+ console.log(error);
+});
+```
+
+```python
+import requests
+import json
+
+url = "https://api.netbird.io/api/accounts"
+
+headers: {
+ 'Accept': 'application/json',
+ 'Authorization': 'Token '
+}
+
+response = requests.request("GET", url, headers=headers)
+
+print(response.text)
+```
+
+```go
+package main
+
+import (
+ "fmt"
+ "strings"
+ "net/http"
+ "io/ioutil"
+)
+
+func main() {
+
+ url := "https://api.netbird.io/api/accounts"
+ method := "GET"
+
+ client := &http.Client {
+ }
+ req, err := http.NewRequest(method, url, nil)
+
+ if err != nil {
+ fmt.Println(err)
+ return
+ {
+
+ req.Header.Add("Accept", "application/json")
+ req.Header.Add("Authorization", "Token ")
+
+ res, err := client.Do(req)
+ if err != nil {
+ fmt.Println(err)
+ return
+ }
+ defer res.Body.Close()
+
+ body, err := ioutil.ReadAll(res.Body)
+ if err != nil {
+ fmt.Println(err)
+ return
+ }
+ fmt.Println(string(body))
+}
+```
+
+```ruby
+require "uri"
+require "json"
+require "net/http"
+
+url = URI("https://api.netbird.io/api/accounts")
+
+https = Net::HTTP.new(url.host, url.port)
+https.use_ssl = true
+
+request = Net::HTTP::Get.new(url)
+request["Accept"] = "application/json"
+request["Authorization"] = "Token "
+
+response = https.request(request)
+puts response.read_body
+```
+
+```java
+OkHttpClient client = new OkHttpClient().newBuilder()
+ .build();
+
+Request request = new Request.Builder()
+ .url("https://api.netbird.io/api/accounts")
+ .method("GET")
+ .addHeader("Accept", "application/json")
+ .addHeader("Authorization: Token ")
+ .build();
+Response response = client.newCall(request).execute();
+```
+
+```php
+ 'https://api.netbird.io/api/accounts',
+ CURLOPT_RETURNTRANSFER => true,
+ CURLOPT_ENCODING => '',
+ CURLOPT_MAXREDIRS => 10,
+ CURLOPT_TIMEOUT => 0,
+ CURLOPT_FOLLOWLOCATION => true,
+ CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
+ CURLOPT_CUSTOMREQUEST => 'GET',
+ CURLOPT_HTTPHEADER => array(
+ 'Accept: application/json',
+ 'Authorization: Token '
+ ),
+));
+
+$response = curl_exec($curl);
+
+curl_close($curl);
+echo $response;
+```
+
+
+
+
+
+
+```json {{ title: 'Example' }}
+[
+ {
+ "id": "ch8i4ug6lnn4g9hqv7l0",
+ "settings": {
+ "peer_login_expiration_enabled": true,
+ "peer_login_expiration": 43200
+ }
+ }
+]
+```
+```json {{ title: 'Schema' }}
+[
+ {
+ "id": "string",
+ "settings": {
+ "peer_login_expiration_enabled": "boolean",
+ "peer_login_expiration": "integer"
+ }
+ }
+]
+```
+
+
+
+
+
+
+
+
+
+---
+
+
+## Update an Account {{ tag: 'PUT' , label: '/api/accounts/{accountId}' }}
+
+
+
+ Update information about an account
+
+ #### Path Parameters
+
+
+
+ The unique identifier of an account
+
+
+
+ #### Request-Body Parameters
+
+
+
+ Enables or disables peer login expiration globally. After peer's login has expired the user has to log in (authenticate). Applies only to peers that were added by a user (interactive SSO login).
+
+
+
+ Period of time after which peer login expires (seconds).
+
+
+
+
+
+
+```bash {{ title: 'cURL' }}
+curl -X PUT https://api.netbird.io/api/accounts/{accountId} \
+-H 'Accept: application/json' \
+-H 'Content-Type: application/json' \
+-H 'Authorization: Token ' \
+--data-raw '{
+ "peer_login_expiration_enabled": true,
+ "peer_login_expiration": 43200
+}'
+```
+
+```js
+const axios = require('axios');
+let data = JSON.stringify({
+ "peer_login_expiration_enabled": true,
+ "peer_login_expiration": 43200
+});
+let config = {
+ method: 'put',
+ maxBodyLength: Infinity,
+ url: '/api/accounts/{accountId}',
+ headers: {
+ 'Accept': 'application/json',
+ 'Content-Type': 'application/json',
+ 'Authorization': 'Token '
+ },
+ data : data
+};
+
+axios(config)
+.then((response) => {
+ console.log(JSON.stringify(response.data));
+})
+.catch((error) => {
+ console.log(error);
+});
+```
+
+```python
+import requests
+import json
+
+url = "https://api.netbird.io/api/accounts/{accountId}"
+payload = json.dumps({
+ "peer_login_expiration_enabled": true,
+ "peer_login_expiration": 43200
+})
+headers: {
+ 'Content-Type': 'application/json',
+ 'Accept': 'application/json',
+ 'Authorization': 'Token '
+}
+
+response = requests.request("PUT", url, headers=headers, data=payload)
+
+print(response.text)
+```
+
+```go
+package main
+
+import (
+ "fmt"
+ "strings"
+ "net/http"
+ "io/ioutil"
+)
+
+func main() {
+
+ url := "https://api.netbird.io/api/accounts/{accountId}"
+ method := "PUT"
+
+ payload := strings.NewReader(`{
+ "peer_login_expiration_enabled": true,
+ "peer_login_expiration": 43200
+}`)
+ client := &http.Client {
+ }
+ req, err := http.NewRequest(method, url, payload)
+
+ if err != nil {
+ fmt.Println(err)
+ return
+ {
+
+ req.Header.Add("Content-Type", "application/json")
+ req.Header.Add("Accept", "application/json")
+ req.Header.Add("Authorization", "Token ")
+
+ res, err := client.Do(req)
+ if err != nil {
+ fmt.Println(err)
+ return
+ }
+ defer res.Body.Close()
+
+ body, err := ioutil.ReadAll(res.Body)
+ if err != nil {
+ fmt.Println(err)
+ return
+ }
+ fmt.Println(string(body))
+}
+```
+
+```ruby
+require "uri"
+require "json"
+require "net/http"
+
+url = URI("https://api.netbird.io/api/accounts/{accountId}")
+
+https = Net::HTTP.new(url.host, url.port)
+https.use_ssl = true
+
+request = Net::HTTP::Put.new(url)
+request["Content-Type"] = "application/json"
+request["Accept"] = "application/json"
+request["Authorization"] = "Token "
+
+request.body = JSON.dump({
+ "peer_login_expiration_enabled": true,
+ "peer_login_expiration": 43200
+})
+response = https.request(request)
+puts response.read_body
+```
+
+```java
+OkHttpClient client = new OkHttpClient().newBuilder()
+ .build();
+MediaType mediaType = MediaType.parse("application/json");
+RequestBody body = RequestBody.create(mediaType, '{
+ "peer_login_expiration_enabled": true,
+ "peer_login_expiration": 43200
+}');
+Request request = new Request.Builder()
+ .url("https://api.netbird.io/api/accounts/{accountId}")
+ .method("PUT", body)
+ .addHeader("Content-Type", "application/json")
+ .addHeader("Accept", "application/json")
+ .addHeader("Authorization: Token ")
+ .build();
+Response response = client.newCall(request).execute();
+```
+
+```php
+ 'https://api.netbird.io/api/accounts/{accountId}',
+ CURLOPT_RETURNTRANSFER => true,
+ CURLOPT_ENCODING => '',
+ CURLOPT_MAXREDIRS => 10,
+ CURLOPT_TIMEOUT => 0,
+ CURLOPT_FOLLOWLOCATION => true,
+ CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
+ CURLOPT_CUSTOMREQUEST => 'PUT',
+ CURLOPT_POSTFIELDS => '{
+ "peer_login_expiration_enabled": true,
+ "peer_login_expiration": 43200
+}',
+ CURLOPT_HTTPHEADER => array(
+ 'Content-Type: application/json',
+ 'Accept: application/json',
+ 'Authorization: Token '
+ ),
+));
+
+$response = curl_exec($curl);
+
+curl_close($curl);
+echo $response;
+```
+
+
+
+
+
+
+```json {{ title: 'Example' }}
+{
+ "id": "ch8i4ug6lnn4g9hqv7l0",
+ "settings": {
+ "peer_login_expiration_enabled": true,
+ "peer_login_expiration": 43200
+ }
+}
+```
+```json {{ title: 'Schema' }}
+{
+ "id": "string",
+ "settings": {
+ "peer_login_expiration_enabled": "boolean",
+ "peer_login_expiration": "integer"
+ }
+}
+```
+
+
+
+
+
+
+
+
+
+---
diff --git a/src/pages/ipa/resources/dns.mdx b/src/pages/ipa/resources/dns.mdx
new file mode 100644
index 00000000..0976c5f8
--- /dev/null
+++ b/src/pages/ipa/resources/dns.mdx
@@ -0,0 +1,1869 @@
+
+export const title = 'DNS'
+
+
+
+## List all Nameserver Groups {{ tag: 'GET' , label: '/api/dns/nameservers' }}
+
+
+
+ Returns a list of all Nameserver Groups
+
+
+
+
+```bash {{ title: 'cURL' }}
+curl -X GET https://api.netbird.io/api/dns/nameservers \
+-H 'Accept: application/json' \
+-H 'Authorization: Token '
+```
+
+```js
+const axios = require('axios');
+
+let config = {
+ method: 'get',
+ maxBodyLength: Infinity,
+ url: '/api/dns/nameservers',
+ headers: {
+ 'Accept': 'application/json',
+ 'Authorization': 'Token '
+ }
+};
+
+axios(config)
+.then((response) => {
+ console.log(JSON.stringify(response.data));
+})
+.catch((error) => {
+ console.log(error);
+});
+```
+
+```python
+import requests
+import json
+
+url = "https://api.netbird.io/api/dns/nameservers"
+
+headers: {
+ 'Accept': 'application/json',
+ 'Authorization': 'Token '
+}
+
+response = requests.request("GET", url, headers=headers)
+
+print(response.text)
+```
+
+```go
+package main
+
+import (
+ "fmt"
+ "strings"
+ "net/http"
+ "io/ioutil"
+)
+
+func main() {
+
+ url := "https://api.netbird.io/api/dns/nameservers"
+ method := "GET"
+
+ client := &http.Client {
+ }
+ req, err := http.NewRequest(method, url, nil)
+
+ if err != nil {
+ fmt.Println(err)
+ return
+ {
+
+ req.Header.Add("Accept", "application/json")
+ req.Header.Add("Authorization", "Token ")
+
+ res, err := client.Do(req)
+ if err != nil {
+ fmt.Println(err)
+ return
+ }
+ defer res.Body.Close()
+
+ body, err := ioutil.ReadAll(res.Body)
+ if err != nil {
+ fmt.Println(err)
+ return
+ }
+ fmt.Println(string(body))
+}
+```
+
+```ruby
+require "uri"
+require "json"
+require "net/http"
+
+url = URI("https://api.netbird.io/api/dns/nameservers")
+
+https = Net::HTTP.new(url.host, url.port)
+https.use_ssl = true
+
+request = Net::HTTP::Get.new(url)
+request["Accept"] = "application/json"
+request["Authorization"] = "Token "
+
+response = https.request(request)
+puts response.read_body
+```
+
+```java
+OkHttpClient client = new OkHttpClient().newBuilder()
+ .build();
+
+Request request = new Request.Builder()
+ .url("https://api.netbird.io/api/dns/nameservers")
+ .method("GET")
+ .addHeader("Accept", "application/json")
+ .addHeader("Authorization: Token ")
+ .build();
+Response response = client.newCall(request).execute();
+```
+
+```php
+ 'https://api.netbird.io/api/dns/nameservers',
+ CURLOPT_RETURNTRANSFER => true,
+ CURLOPT_ENCODING => '',
+ CURLOPT_MAXREDIRS => 10,
+ CURLOPT_TIMEOUT => 0,
+ CURLOPT_FOLLOWLOCATION => true,
+ CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
+ CURLOPT_CUSTOMREQUEST => 'GET',
+ CURLOPT_HTTPHEADER => array(
+ 'Accept: application/json',
+ 'Authorization: Token '
+ ),
+));
+
+$response = curl_exec($curl);
+
+curl_close($curl);
+echo $response;
+```
+
+
+
+
+
+
+```json {{ title: 'Example' }}
+[
+ {
+ "id": "ch8i4ug6lnn4g9hqv7m0",
+ "name": "Google DNS",
+ "description": "Google DNS servers",
+ "nameservers": [
+ {
+ "ip": "8.8.8.8",
+ "ns_type": "udp",
+ "port": 53
+ }
+ ],
+ "enabled": true,
+ "groups": [
+ "ch8i4ug6lnn4g9hqv7m0"
+ ],
+ "primary": true,
+ "domains": [
+ "example.com"
+ ]
+ }
+]
+```
+```json {{ title: 'Schema' }}
+[
+ {
+ "id": "string",
+ "name": "string",
+ "description": "string",
+ "nameservers": [
+ {
+ "ip": "string",
+ "ns_type": "string",
+ "port": "integer"
+ }
+ ],
+ "enabled": "boolean",
+ "groups": [
+ "string"
+ ],
+ "primary": "boolean",
+ "domains": [
+ "string"
+ ]
+ }
+]
+```
+
+
+
+
+
+
+
+
+
+---
+
+
+## Create a Nameserver Group {{ tag: 'POST' , label: '/api/dns/nameservers' }}
+
+
+
+ Creates a Nameserver Group
+
+ #### Request-Body Parameters
+
+
+
+ Nameserver group name
+
+
+
+ Nameserver group description
+
+
+
+ Nameserver group
+
+
+
+ Nameserver group status
+
+
+
+ Nameserver group tag groups
+
+
+
+ Nameserver group primary status
+
+
+
+ Nameserver group domain list
+
+
+
+
+
+
+```bash {{ title: 'cURL' }}
+curl -X POST https://api.netbird.io/api/dns/nameservers \
+-H 'Accept: application/json' \
+-H 'Content-Type: application/json' \
+-H 'Authorization: Token ' \
+--data-raw '{
+ "name": "Google DNS",
+ "description": "Google DNS servers",
+ "nameservers": [
+ {
+ "ip": "8.8.8.8",
+ "ns_type": "udp",
+ "port": 53
+ }
+ ],
+ "enabled": true,
+ "groups": [
+ "ch8i4ug6lnn4g9hqv7m0"
+ ],
+ "primary": true,
+ "domains": [
+ "example.com"
+ ]
+}'
+```
+
+```js
+const axios = require('axios');
+let data = JSON.stringify({
+ "name": "Google DNS",
+ "description": "Google DNS servers",
+ "nameservers": [
+ {
+ "ip": "8.8.8.8",
+ "ns_type": "udp",
+ "port": 53
+ }
+ ],
+ "enabled": true,
+ "groups": [
+ "ch8i4ug6lnn4g9hqv7m0"
+ ],
+ "primary": true,
+ "domains": [
+ "example.com"
+ ]
+});
+let config = {
+ method: 'post',
+ maxBodyLength: Infinity,
+ url: '/api/dns/nameservers',
+ headers: {
+ 'Accept': 'application/json',
+ 'Content-Type': 'application/json',
+ 'Authorization': 'Token '
+ },
+ data : data
+};
+
+axios(config)
+.then((response) => {
+ console.log(JSON.stringify(response.data));
+})
+.catch((error) => {
+ console.log(error);
+});
+```
+
+```python
+import requests
+import json
+
+url = "https://api.netbird.io/api/dns/nameservers"
+payload = json.dumps({
+ "name": "Google DNS",
+ "description": "Google DNS servers",
+ "nameservers": [
+ {
+ "ip": "8.8.8.8",
+ "ns_type": "udp",
+ "port": 53
+ }
+ ],
+ "enabled": true,
+ "groups": [
+ "ch8i4ug6lnn4g9hqv7m0"
+ ],
+ "primary": true,
+ "domains": [
+ "example.com"
+ ]
+})
+headers: {
+ 'Content-Type': 'application/json',
+ 'Accept': 'application/json',
+ 'Authorization': 'Token '
+}
+
+response = requests.request("POST", url, headers=headers, data=payload)
+
+print(response.text)
+```
+
+```go
+package main
+
+import (
+ "fmt"
+ "strings"
+ "net/http"
+ "io/ioutil"
+)
+
+func main() {
+
+ url := "https://api.netbird.io/api/dns/nameservers"
+ method := "POST"
+
+ payload := strings.NewReader(`{
+ "name": "Google DNS",
+ "description": "Google DNS servers",
+ "nameservers": [
+ {
+ "ip": "8.8.8.8",
+ "ns_type": "udp",
+ "port": 53
+ }
+ ],
+ "enabled": true,
+ "groups": [
+ "ch8i4ug6lnn4g9hqv7m0"
+ ],
+ "primary": true,
+ "domains": [
+ "example.com"
+ ]
+}`)
+ client := &http.Client {
+ }
+ req, err := http.NewRequest(method, url, payload)
+
+ if err != nil {
+ fmt.Println(err)
+ return
+ {
+
+ req.Header.Add("Content-Type", "application/json")
+ req.Header.Add("Accept", "application/json")
+ req.Header.Add("Authorization", "Token ")
+
+ res, err := client.Do(req)
+ if err != nil {
+ fmt.Println(err)
+ return
+ }
+ defer res.Body.Close()
+
+ body, err := ioutil.ReadAll(res.Body)
+ if err != nil {
+ fmt.Println(err)
+ return
+ }
+ fmt.Println(string(body))
+}
+```
+
+```ruby
+require "uri"
+require "json"
+require "net/http"
+
+url = URI("https://api.netbird.io/api/dns/nameservers")
+
+https = Net::HTTP.new(url.host, url.port)
+https.use_ssl = true
+
+request = Net::HTTP::Post.new(url)
+request["Content-Type"] = "application/json"
+request["Accept"] = "application/json"
+request["Authorization"] = "Token "
+
+request.body = JSON.dump({
+ "name": "Google DNS",
+ "description": "Google DNS servers",
+ "nameservers": [
+ {
+ "ip": "8.8.8.8",
+ "ns_type": "udp",
+ "port": 53
+ }
+ ],
+ "enabled": true,
+ "groups": [
+ "ch8i4ug6lnn4g9hqv7m0"
+ ],
+ "primary": true,
+ "domains": [
+ "example.com"
+ ]
+})
+response = https.request(request)
+puts response.read_body
+```
+
+```java
+OkHttpClient client = new OkHttpClient().newBuilder()
+ .build();
+MediaType mediaType = MediaType.parse("application/json");
+RequestBody body = RequestBody.create(mediaType, '{
+ "name": "Google DNS",
+ "description": "Google DNS servers",
+ "nameservers": [
+ {
+ "ip": "8.8.8.8",
+ "ns_type": "udp",
+ "port": 53
+ }
+ ],
+ "enabled": true,
+ "groups": [
+ "ch8i4ug6lnn4g9hqv7m0"
+ ],
+ "primary": true,
+ "domains": [
+ "example.com"
+ ]
+}');
+Request request = new Request.Builder()
+ .url("https://api.netbird.io/api/dns/nameservers")
+ .method("POST", body)
+ .addHeader("Content-Type", "application/json")
+ .addHeader("Accept", "application/json")
+ .addHeader("Authorization: Token ")
+ .build();
+Response response = client.newCall(request).execute();
+```
+
+```php
+ 'https://api.netbird.io/api/dns/nameservers',
+ CURLOPT_RETURNTRANSFER => true,
+ CURLOPT_ENCODING => '',
+ CURLOPT_MAXREDIRS => 10,
+ CURLOPT_TIMEOUT => 0,
+ CURLOPT_FOLLOWLOCATION => true,
+ CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
+ CURLOPT_CUSTOMREQUEST => 'POST',
+ CURLOPT_POSTFIELDS => '{
+ "name": "Google DNS",
+ "description": "Google DNS servers",
+ "nameservers": [
+ {
+ "ip": "8.8.8.8",
+ "ns_type": "udp",
+ "port": 53
+ }
+ ],
+ "enabled": true,
+ "groups": [
+ "ch8i4ug6lnn4g9hqv7m0"
+ ],
+ "primary": true,
+ "domains": [
+ "example.com"
+ ]
+}',
+ CURLOPT_HTTPHEADER => array(
+ 'Content-Type: application/json',
+ 'Accept: application/json',
+ 'Authorization: Token '
+ ),
+));
+
+$response = curl_exec($curl);
+
+curl_close($curl);
+echo $response;
+```
+
+
+
+
+
+
+```json {{ title: 'Example' }}
+{
+ "id": "ch8i4ug6lnn4g9hqv7m0",
+ "name": "Google DNS",
+ "description": "Google DNS servers",
+ "nameservers": [
+ {
+ "ip": "8.8.8.8",
+ "ns_type": "udp",
+ "port": 53
+ }
+ ],
+ "enabled": true,
+ "groups": [
+ "ch8i4ug6lnn4g9hqv7m0"
+ ],
+ "primary": true,
+ "domains": [
+ "example.com"
+ ]
+}
+```
+```json {{ title: 'Schema' }}
+{
+ "id": "string",
+ "name": "string",
+ "description": "string",
+ "nameservers": [
+ {
+ "ip": "string",
+ "ns_type": "string",
+ "port": "integer"
+ }
+ ],
+ "enabled": "boolean",
+ "groups": [
+ "string"
+ ],
+ "primary": "boolean",
+ "domains": [
+ "string"
+ ]
+}
+```
+
+
+
+
+
+
+
+
+
+---
+
+
+## Retrieve a Nameserver Group {{ tag: 'GET' , label: '/api/dns/nameservers/{nsgroupId}' }}
+
+
+
+ Get information about a Nameserver Groups
+
+ #### Path Parameters
+
+
+
+ The unique identifier of a Nameserver Group
+
+
+
+
+
+
+```bash {{ title: 'cURL' }}
+curl -X GET https://api.netbird.io/api/dns/nameservers/{nsgroupId} \
+-H 'Accept: application/json' \
+-H 'Authorization: Token '
+```
+
+```js
+const axios = require('axios');
+
+let config = {
+ method: 'get',
+ maxBodyLength: Infinity,
+ url: '/api/dns/nameservers/{nsgroupId}',
+ headers: {
+ 'Accept': 'application/json',
+ 'Authorization': 'Token '
+ }
+};
+
+axios(config)
+.then((response) => {
+ console.log(JSON.stringify(response.data));
+})
+.catch((error) => {
+ console.log(error);
+});
+```
+
+```python
+import requests
+import json
+
+url = "https://api.netbird.io/api/dns/nameservers/{nsgroupId}"
+
+headers: {
+ 'Accept': 'application/json',
+ 'Authorization': 'Token '
+}
+
+response = requests.request("GET", url, headers=headers)
+
+print(response.text)
+```
+
+```go
+package main
+
+import (
+ "fmt"
+ "strings"
+ "net/http"
+ "io/ioutil"
+)
+
+func main() {
+
+ url := "https://api.netbird.io/api/dns/nameservers/{nsgroupId}"
+ method := "GET"
+
+ client := &http.Client {
+ }
+ req, err := http.NewRequest(method, url, nil)
+
+ if err != nil {
+ fmt.Println(err)
+ return
+ {
+
+ req.Header.Add("Accept", "application/json")
+ req.Header.Add("Authorization", "Token ")
+
+ res, err := client.Do(req)
+ if err != nil {
+ fmt.Println(err)
+ return
+ }
+ defer res.Body.Close()
+
+ body, err := ioutil.ReadAll(res.Body)
+ if err != nil {
+ fmt.Println(err)
+ return
+ }
+ fmt.Println(string(body))
+}
+```
+
+```ruby
+require "uri"
+require "json"
+require "net/http"
+
+url = URI("https://api.netbird.io/api/dns/nameservers/{nsgroupId}")
+
+https = Net::HTTP.new(url.host, url.port)
+https.use_ssl = true
+
+request = Net::HTTP::Get.new(url)
+request["Accept"] = "application/json"
+request["Authorization"] = "Token "
+
+response = https.request(request)
+puts response.read_body
+```
+
+```java
+OkHttpClient client = new OkHttpClient().newBuilder()
+ .build();
+
+Request request = new Request.Builder()
+ .url("https://api.netbird.io/api/dns/nameservers/{nsgroupId}")
+ .method("GET")
+ .addHeader("Accept", "application/json")
+ .addHeader("Authorization: Token ")
+ .build();
+Response response = client.newCall(request).execute();
+```
+
+```php
+ 'https://api.netbird.io/api/dns/nameservers/{nsgroupId}',
+ CURLOPT_RETURNTRANSFER => true,
+ CURLOPT_ENCODING => '',
+ CURLOPT_MAXREDIRS => 10,
+ CURLOPT_TIMEOUT => 0,
+ CURLOPT_FOLLOWLOCATION => true,
+ CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
+ CURLOPT_CUSTOMREQUEST => 'GET',
+ CURLOPT_HTTPHEADER => array(
+ 'Accept: application/json',
+ 'Authorization: Token '
+ ),
+));
+
+$response = curl_exec($curl);
+
+curl_close($curl);
+echo $response;
+```
+
+
+
+
+
+
+```json {{ title: 'Example' }}
+{
+ "id": "ch8i4ug6lnn4g9hqv7m0",
+ "name": "Google DNS",
+ "description": "Google DNS servers",
+ "nameservers": [
+ {
+ "ip": "8.8.8.8",
+ "ns_type": "udp",
+ "port": 53
+ }
+ ],
+ "enabled": true,
+ "groups": [
+ "ch8i4ug6lnn4g9hqv7m0"
+ ],
+ "primary": true,
+ "domains": [
+ "example.com"
+ ]
+}
+```
+```json {{ title: 'Schema' }}
+{
+ "id": "string",
+ "name": "string",
+ "description": "string",
+ "nameservers": [
+ {
+ "ip": "string",
+ "ns_type": "string",
+ "port": "integer"
+ }
+ ],
+ "enabled": "boolean",
+ "groups": [
+ "string"
+ ],
+ "primary": "boolean",
+ "domains": [
+ "string"
+ ]
+}
+```
+
+
+
+
+
+
+
+
+
+---
+
+
+## Update a Nameserver Group {{ tag: 'PUT' , label: '/api/dns/nameservers/{nsgroupId}' }}
+
+
+
+ Update/Replace a Nameserver Group
+
+ #### Path Parameters
+
+
+
+ The unique identifier of a Nameserver Group
+
+
+
+ #### Request-Body Parameters
+
+
+
+ Nameserver group name
+
+
+
+ Nameserver group description
+
+
+
+ Nameserver group
+
+
+
+ Nameserver group status
+
+
+
+ Nameserver group tag groups
+
+
+
+ Nameserver group primary status
+
+
+
+ Nameserver group domain list
+
+
+
+
+
+
+```bash {{ title: 'cURL' }}
+curl -X PUT https://api.netbird.io/api/dns/nameservers/{nsgroupId} \
+-H 'Accept: application/json' \
+-H 'Content-Type: application/json' \
+-H 'Authorization: Token ' \
+--data-raw '{
+ "name": "Google DNS",
+ "description": "Google DNS servers",
+ "nameservers": [
+ {
+ "ip": "8.8.8.8",
+ "ns_type": "udp",
+ "port": 53
+ }
+ ],
+ "enabled": true,
+ "groups": [
+ "ch8i4ug6lnn4g9hqv7m0"
+ ],
+ "primary": true,
+ "domains": [
+ "example.com"
+ ]
+}'
+```
+
+```js
+const axios = require('axios');
+let data = JSON.stringify({
+ "name": "Google DNS",
+ "description": "Google DNS servers",
+ "nameservers": [
+ {
+ "ip": "8.8.8.8",
+ "ns_type": "udp",
+ "port": 53
+ }
+ ],
+ "enabled": true,
+ "groups": [
+ "ch8i4ug6lnn4g9hqv7m0"
+ ],
+ "primary": true,
+ "domains": [
+ "example.com"
+ ]
+});
+let config = {
+ method: 'put',
+ maxBodyLength: Infinity,
+ url: '/api/dns/nameservers/{nsgroupId}',
+ headers: {
+ 'Accept': 'application/json',
+ 'Content-Type': 'application/json',
+ 'Authorization': 'Token '
+ },
+ data : data
+};
+
+axios(config)
+.then((response) => {
+ console.log(JSON.stringify(response.data));
+})
+.catch((error) => {
+ console.log(error);
+});
+```
+
+```python
+import requests
+import json
+
+url = "https://api.netbird.io/api/dns/nameservers/{nsgroupId}"
+payload = json.dumps({
+ "name": "Google DNS",
+ "description": "Google DNS servers",
+ "nameservers": [
+ {
+ "ip": "8.8.8.8",
+ "ns_type": "udp",
+ "port": 53
+ }
+ ],
+ "enabled": true,
+ "groups": [
+ "ch8i4ug6lnn4g9hqv7m0"
+ ],
+ "primary": true,
+ "domains": [
+ "example.com"
+ ]
+})
+headers: {
+ 'Content-Type': 'application/json',
+ 'Accept': 'application/json',
+ 'Authorization': 'Token '
+}
+
+response = requests.request("PUT", url, headers=headers, data=payload)
+
+print(response.text)
+```
+
+```go
+package main
+
+import (
+ "fmt"
+ "strings"
+ "net/http"
+ "io/ioutil"
+)
+
+func main() {
+
+ url := "https://api.netbird.io/api/dns/nameservers/{nsgroupId}"
+ method := "PUT"
+
+ payload := strings.NewReader(`{
+ "name": "Google DNS",
+ "description": "Google DNS servers",
+ "nameservers": [
+ {
+ "ip": "8.8.8.8",
+ "ns_type": "udp",
+ "port": 53
+ }
+ ],
+ "enabled": true,
+ "groups": [
+ "ch8i4ug6lnn4g9hqv7m0"
+ ],
+ "primary": true,
+ "domains": [
+ "example.com"
+ ]
+}`)
+ client := &http.Client {
+ }
+ req, err := http.NewRequest(method, url, payload)
+
+ if err != nil {
+ fmt.Println(err)
+ return
+ {
+
+ req.Header.Add("Content-Type", "application/json")
+ req.Header.Add("Accept", "application/json")
+ req.Header.Add("Authorization", "Token ")
+
+ res, err := client.Do(req)
+ if err != nil {
+ fmt.Println(err)
+ return
+ }
+ defer res.Body.Close()
+
+ body, err := ioutil.ReadAll(res.Body)
+ if err != nil {
+ fmt.Println(err)
+ return
+ }
+ fmt.Println(string(body))
+}
+```
+
+```ruby
+require "uri"
+require "json"
+require "net/http"
+
+url = URI("https://api.netbird.io/api/dns/nameservers/{nsgroupId}")
+
+https = Net::HTTP.new(url.host, url.port)
+https.use_ssl = true
+
+request = Net::HTTP::Put.new(url)
+request["Content-Type"] = "application/json"
+request["Accept"] = "application/json"
+request["Authorization"] = "Token "
+
+request.body = JSON.dump({
+ "name": "Google DNS",
+ "description": "Google DNS servers",
+ "nameservers": [
+ {
+ "ip": "8.8.8.8",
+ "ns_type": "udp",
+ "port": 53
+ }
+ ],
+ "enabled": true,
+ "groups": [
+ "ch8i4ug6lnn4g9hqv7m0"
+ ],
+ "primary": true,
+ "domains": [
+ "example.com"
+ ]
+})
+response = https.request(request)
+puts response.read_body
+```
+
+```java
+OkHttpClient client = new OkHttpClient().newBuilder()
+ .build();
+MediaType mediaType = MediaType.parse("application/json");
+RequestBody body = RequestBody.create(mediaType, '{
+ "name": "Google DNS",
+ "description": "Google DNS servers",
+ "nameservers": [
+ {
+ "ip": "8.8.8.8",
+ "ns_type": "udp",
+ "port": 53
+ }
+ ],
+ "enabled": true,
+ "groups": [
+ "ch8i4ug6lnn4g9hqv7m0"
+ ],
+ "primary": true,
+ "domains": [
+ "example.com"
+ ]
+}');
+Request request = new Request.Builder()
+ .url("https://api.netbird.io/api/dns/nameservers/{nsgroupId}")
+ .method("PUT", body)
+ .addHeader("Content-Type", "application/json")
+ .addHeader("Accept", "application/json")
+ .addHeader("Authorization: Token ")
+ .build();
+Response response = client.newCall(request).execute();
+```
+
+```php
+ 'https://api.netbird.io/api/dns/nameservers/{nsgroupId}',
+ CURLOPT_RETURNTRANSFER => true,
+ CURLOPT_ENCODING => '',
+ CURLOPT_MAXREDIRS => 10,
+ CURLOPT_TIMEOUT => 0,
+ CURLOPT_FOLLOWLOCATION => true,
+ CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
+ CURLOPT_CUSTOMREQUEST => 'PUT',
+ CURLOPT_POSTFIELDS => '{
+ "name": "Google DNS",
+ "description": "Google DNS servers",
+ "nameservers": [
+ {
+ "ip": "8.8.8.8",
+ "ns_type": "udp",
+ "port": 53
+ }
+ ],
+ "enabled": true,
+ "groups": [
+ "ch8i4ug6lnn4g9hqv7m0"
+ ],
+ "primary": true,
+ "domains": [
+ "example.com"
+ ]
+}',
+ CURLOPT_HTTPHEADER => array(
+ 'Content-Type: application/json',
+ 'Accept: application/json',
+ 'Authorization: Token '
+ ),
+));
+
+$response = curl_exec($curl);
+
+curl_close($curl);
+echo $response;
+```
+
+
+
+
+
+
+```json {{ title: 'Example' }}
+{
+ "id": "ch8i4ug6lnn4g9hqv7m0",
+ "name": "Google DNS",
+ "description": "Google DNS servers",
+ "nameservers": [
+ {
+ "ip": "8.8.8.8",
+ "ns_type": "udp",
+ "port": 53
+ }
+ ],
+ "enabled": true,
+ "groups": [
+ "ch8i4ug6lnn4g9hqv7m0"
+ ],
+ "primary": true,
+ "domains": [
+ "example.com"
+ ]
+}
+```
+```json {{ title: 'Schema' }}
+{
+ "id": "string",
+ "name": "string",
+ "description": "string",
+ "nameservers": [
+ {
+ "ip": "string",
+ "ns_type": "string",
+ "port": "integer"
+ }
+ ],
+ "enabled": "boolean",
+ "groups": [
+ "string"
+ ],
+ "primary": "boolean",
+ "domains": [
+ "string"
+ ]
+}
+```
+
+
+
+
+
+
+
+
+
+---
+
+
+## Delete a Nameserver Group {{ tag: 'DELETE' , label: '/api/dns/nameservers/{nsgroupId}' }}
+
+
+
+ Delete a Nameserver Group
+
+ #### Path Parameters
+
+
+
+ The unique identifier of a Nameserver Group
+
+
+
+
+
+
+```bash {{ title: 'cURL' }}
+curl -X DELETE https://api.netbird.io/api/dns/nameservers/{nsgroupId} \
+-H 'Authorization: Token '
+```
+
+```js
+const axios = require('axios');
+
+let config = {
+ method: 'delete',
+ maxBodyLength: Infinity,
+ url: '/api/dns/nameservers/{nsgroupId}',
+ headers: {
+ 'Authorization': 'Token '
+ }
+};
+
+axios(config)
+.then((response) => {
+ console.log(JSON.stringify(response.data));
+})
+.catch((error) => {
+ console.log(error);
+});
+```
+
+```python
+import requests
+import json
+
+url = "https://api.netbird.io/api/dns/nameservers/{nsgroupId}"
+
+headers: {
+ 'Authorization': 'Token '
+}
+
+response = requests.request("DELETE", url, headers=headers)
+
+print(response.text)
+```
+
+```go
+package main
+
+import (
+ "fmt"
+ "strings"
+ "net/http"
+ "io/ioutil"
+)
+
+func main() {
+
+ url := "https://api.netbird.io/api/dns/nameservers/{nsgroupId}"
+ method := "DELETE"
+
+ client := &http.Client {
+ }
+ req, err := http.NewRequest(method, url, nil)
+
+ if err != nil {
+ fmt.Println(err)
+ return
+ {
+
+ req.Header.Add("Authorization", "Token ")
+
+ res, err := client.Do(req)
+ if err != nil {
+ fmt.Println(err)
+ return
+ }
+ defer res.Body.Close()
+
+ body, err := ioutil.ReadAll(res.Body)
+ if err != nil {
+ fmt.Println(err)
+ return
+ }
+ fmt.Println(string(body))
+}
+```
+
+```ruby
+require "uri"
+require "json"
+require "net/http"
+
+url = URI("https://api.netbird.io/api/dns/nameservers/{nsgroupId}")
+
+https = Net::HTTP.new(url.host, url.port)
+https.use_ssl = true
+
+request = Net::HTTP::Delete.new(url)
+request["Authorization"] = "Token "
+
+response = https.request(request)
+puts response.read_body
+```
+
+```java
+OkHttpClient client = new OkHttpClient().newBuilder()
+ .build();
+
+Request request = new Request.Builder()
+ .url("https://api.netbird.io/api/dns/nameservers/{nsgroupId}")
+ .method("DELETE")
+ .addHeader("Authorization: Token ")
+ .build();
+Response response = client.newCall(request).execute();
+```
+
+```php
+ 'https://api.netbird.io/api/dns/nameservers/{nsgroupId}',
+ CURLOPT_RETURNTRANSFER => true,
+ CURLOPT_ENCODING => '',
+ CURLOPT_MAXREDIRS => 10,
+ CURLOPT_TIMEOUT => 0,
+ CURLOPT_FOLLOWLOCATION => true,
+ CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
+ CURLOPT_CUSTOMREQUEST => 'DELETE',
+ CURLOPT_HTTPHEADER => array(
+ 'Authorization: Token '
+ ),
+));
+
+$response = curl_exec($curl);
+
+curl_close($curl);
+echo $response;
+```
+
+
+
+
+
+
+
+
+
+
+---
+
+
+## Retrieve DNS Settings {{ tag: 'GET' , label: '/api/dns/settings' }}
+
+
+
+ Returns a DNS settings object
+
+
+
+
+```bash {{ title: 'cURL' }}
+curl -X GET https://api.netbird.io/api/dns/settings \
+-H 'Accept: application/json' \
+-H 'Authorization: Token '
+```
+
+```js
+const axios = require('axios');
+
+let config = {
+ method: 'get',
+ maxBodyLength: Infinity,
+ url: '/api/dns/settings',
+ headers: {
+ 'Accept': 'application/json',
+ 'Authorization': 'Token '
+ }
+};
+
+axios(config)
+.then((response) => {
+ console.log(JSON.stringify(response.data));
+})
+.catch((error) => {
+ console.log(error);
+});
+```
+
+```python
+import requests
+import json
+
+url = "https://api.netbird.io/api/dns/settings"
+
+headers: {
+ 'Accept': 'application/json',
+ 'Authorization': 'Token '
+}
+
+response = requests.request("GET", url, headers=headers)
+
+print(response.text)
+```
+
+```go
+package main
+
+import (
+ "fmt"
+ "strings"
+ "net/http"
+ "io/ioutil"
+)
+
+func main() {
+
+ url := "https://api.netbird.io/api/dns/settings"
+ method := "GET"
+
+ client := &http.Client {
+ }
+ req, err := http.NewRequest(method, url, nil)
+
+ if err != nil {
+ fmt.Println(err)
+ return
+ {
+
+ req.Header.Add("Accept", "application/json")
+ req.Header.Add("Authorization", "Token ")
+
+ res, err := client.Do(req)
+ if err != nil {
+ fmt.Println(err)
+ return
+ }
+ defer res.Body.Close()
+
+ body, err := ioutil.ReadAll(res.Body)
+ if err != nil {
+ fmt.Println(err)
+ return
+ }
+ fmt.Println(string(body))
+}
+```
+
+```ruby
+require "uri"
+require "json"
+require "net/http"
+
+url = URI("https://api.netbird.io/api/dns/settings")
+
+https = Net::HTTP.new(url.host, url.port)
+https.use_ssl = true
+
+request = Net::HTTP::Get.new(url)
+request["Accept"] = "application/json"
+request["Authorization"] = "Token "
+
+response = https.request(request)
+puts response.read_body
+```
+
+```java
+OkHttpClient client = new OkHttpClient().newBuilder()
+ .build();
+
+Request request = new Request.Builder()
+ .url("https://api.netbird.io/api/dns/settings")
+ .method("GET")
+ .addHeader("Accept", "application/json")
+ .addHeader("Authorization: Token ")
+ .build();
+Response response = client.newCall(request).execute();
+```
+
+```php
+ 'https://api.netbird.io/api/dns/settings',
+ CURLOPT_RETURNTRANSFER => true,
+ CURLOPT_ENCODING => '',
+ CURLOPT_MAXREDIRS => 10,
+ CURLOPT_TIMEOUT => 0,
+ CURLOPT_FOLLOWLOCATION => true,
+ CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
+ CURLOPT_CUSTOMREQUEST => 'GET',
+ CURLOPT_HTTPHEADER => array(
+ 'Accept: application/json',
+ 'Authorization: Token '
+ ),
+));
+
+$response = curl_exec($curl);
+
+curl_close($curl);
+echo $response;
+```
+
+
+
+
+
+
+```json {{ title: 'Example' }}
+[
+ {
+ "disabled_management_groups": [
+ "ch8i4ug6lnn4g9hqv7m0"
+ ]
+ }
+]
+```
+```json {{ title: 'Schema' }}
+[
+ {
+ "disabled_management_groups": [
+ "string"
+ ]
+ }
+]
+```
+
+
+
+
+
+
+
+
+
+---
+
+
+## Update DNS Settings {{ tag: 'PUT' , label: '/api/dns/settings' }}
+
+
+
+ Updates a DNS settings object
+
+ #### Request-Body Parameters
+
+
+
+ Groups whose DNS management is disabled
+
+
+
+
+
+
+```bash {{ title: 'cURL' }}
+curl -X PUT https://api.netbird.io/api/dns/settings \
+-H 'Accept: application/json' \
+-H 'Content-Type: application/json' \
+-H 'Authorization: Token ' \
+--data-raw '{
+ "disabled_management_groups": [
+ "ch8i4ug6lnn4g9hqv7m0"
+ ]
+}'
+```
+
+```js
+const axios = require('axios');
+let data = JSON.stringify({
+ "disabled_management_groups": [
+ "ch8i4ug6lnn4g9hqv7m0"
+ ]
+});
+let config = {
+ method: 'put',
+ maxBodyLength: Infinity,
+ url: '/api/dns/settings',
+ headers: {
+ 'Accept': 'application/json',
+ 'Content-Type': 'application/json',
+ 'Authorization': 'Token '
+ },
+ data : data
+};
+
+axios(config)
+.then((response) => {
+ console.log(JSON.stringify(response.data));
+})
+.catch((error) => {
+ console.log(error);
+});
+```
+
+```python
+import requests
+import json
+
+url = "https://api.netbird.io/api/dns/settings"
+payload = json.dumps({
+ "disabled_management_groups": [
+ "ch8i4ug6lnn4g9hqv7m0"
+ ]
+})
+headers: {
+ 'Content-Type': 'application/json',
+ 'Accept': 'application/json',
+ 'Authorization': 'Token '
+}
+
+response = requests.request("PUT", url, headers=headers, data=payload)
+
+print(response.text)
+```
+
+```go
+package main
+
+import (
+ "fmt"
+ "strings"
+ "net/http"
+ "io/ioutil"
+)
+
+func main() {
+
+ url := "https://api.netbird.io/api/dns/settings"
+ method := "PUT"
+
+ payload := strings.NewReader(`{
+ "disabled_management_groups": [
+ "ch8i4ug6lnn4g9hqv7m0"
+ ]
+}`)
+ client := &http.Client {
+ }
+ req, err := http.NewRequest(method, url, payload)
+
+ if err != nil {
+ fmt.Println(err)
+ return
+ {
+
+ req.Header.Add("Content-Type", "application/json")
+ req.Header.Add("Accept", "application/json")
+ req.Header.Add("Authorization", "Token ")
+
+ res, err := client.Do(req)
+ if err != nil {
+ fmt.Println(err)
+ return
+ }
+ defer res.Body.Close()
+
+ body, err := ioutil.ReadAll(res.Body)
+ if err != nil {
+ fmt.Println(err)
+ return
+ }
+ fmt.Println(string(body))
+}
+```
+
+```ruby
+require "uri"
+require "json"
+require "net/http"
+
+url = URI("https://api.netbird.io/api/dns/settings")
+
+https = Net::HTTP.new(url.host, url.port)
+https.use_ssl = true
+
+request = Net::HTTP::Put.new(url)
+request["Content-Type"] = "application/json"
+request["Accept"] = "application/json"
+request["Authorization"] = "Token "
+
+request.body = JSON.dump({
+ "disabled_management_groups": [
+ "ch8i4ug6lnn4g9hqv7m0"
+ ]
+})
+response = https.request(request)
+puts response.read_body
+```
+
+```java
+OkHttpClient client = new OkHttpClient().newBuilder()
+ .build();
+MediaType mediaType = MediaType.parse("application/json");
+RequestBody body = RequestBody.create(mediaType, '{
+ "disabled_management_groups": [
+ "ch8i4ug6lnn4g9hqv7m0"
+ ]
+}');
+Request request = new Request.Builder()
+ .url("https://api.netbird.io/api/dns/settings")
+ .method("PUT", body)
+ .addHeader("Content-Type", "application/json")
+ .addHeader("Accept", "application/json")
+ .addHeader("Authorization: Token ")
+ .build();
+Response response = client.newCall(request).execute();
+```
+
+```php
+ 'https://api.netbird.io/api/dns/settings',
+ CURLOPT_RETURNTRANSFER => true,
+ CURLOPT_ENCODING => '',
+ CURLOPT_MAXREDIRS => 10,
+ CURLOPT_TIMEOUT => 0,
+ CURLOPT_FOLLOWLOCATION => true,
+ CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
+ CURLOPT_CUSTOMREQUEST => 'PUT',
+ CURLOPT_POSTFIELDS => '{
+ "disabled_management_groups": [
+ "ch8i4ug6lnn4g9hqv7m0"
+ ]
+}',
+ CURLOPT_HTTPHEADER => array(
+ 'Content-Type: application/json',
+ 'Accept: application/json',
+ 'Authorization: Token '
+ ),
+));
+
+$response = curl_exec($curl);
+
+curl_close($curl);
+echo $response;
+```
+
+
+
+
+
+
+```json {{ title: 'Example' }}
+{
+ "disabled_management_groups": [
+ "ch8i4ug6lnn4g9hqv7m0"
+ ]
+}
+```
+```json {{ title: 'Schema' }}
+{
+ "disabled_management_groups": [
+ "string"
+ ]
+}
+```
+
+
+
+
+
+
+
+
+
+---
diff --git a/src/pages/ipa/resources/events.mdx b/src/pages/ipa/resources/events.mdx
new file mode 100644
index 00000000..feb88055
--- /dev/null
+++ b/src/pages/ipa/resources/events.mdx
@@ -0,0 +1,203 @@
+
+export const title = 'Events'
+
+
+
+## List all Events {{ tag: 'GET' , label: '/api/events' }}
+
+
+
+ Returns a list of all events
+
+
+
+
+```bash {{ title: 'cURL' }}
+curl -X GET https://api.netbird.io/api/events \
+-H 'Accept: application/json' \
+-H 'Authorization: Token '
+```
+
+```js
+const axios = require('axios');
+
+let config = {
+ method: 'get',
+ maxBodyLength: Infinity,
+ url: '/api/events',
+ headers: {
+ 'Accept': 'application/json',
+ 'Authorization': 'Token '
+ }
+};
+
+axios(config)
+.then((response) => {
+ console.log(JSON.stringify(response.data));
+})
+.catch((error) => {
+ console.log(error);
+});
+```
+
+```python
+import requests
+import json
+
+url = "https://api.netbird.io/api/events"
+
+headers: {
+ 'Accept': 'application/json',
+ 'Authorization': 'Token '
+}
+
+response = requests.request("GET", url, headers=headers)
+
+print(response.text)
+```
+
+```go
+package main
+
+import (
+ "fmt"
+ "strings"
+ "net/http"
+ "io/ioutil"
+)
+
+func main() {
+
+ url := "https://api.netbird.io/api/events"
+ method := "GET"
+
+ client := &http.Client {
+ }
+ req, err := http.NewRequest(method, url, nil)
+
+ if err != nil {
+ fmt.Println(err)
+ return
+ {
+
+ req.Header.Add("Accept", "application/json")
+ req.Header.Add("Authorization", "Token ")
+
+ res, err := client.Do(req)
+ if err != nil {
+ fmt.Println(err)
+ return
+ }
+ defer res.Body.Close()
+
+ body, err := ioutil.ReadAll(res.Body)
+ if err != nil {
+ fmt.Println(err)
+ return
+ }
+ fmt.Println(string(body))
+}
+```
+
+```ruby
+require "uri"
+require "json"
+require "net/http"
+
+url = URI("https://api.netbird.io/api/events")
+
+https = Net::HTTP.new(url.host, url.port)
+https.use_ssl = true
+
+request = Net::HTTP::Get.new(url)
+request["Accept"] = "application/json"
+request["Authorization"] = "Token "
+
+response = https.request(request)
+puts response.read_body
+```
+
+```java
+OkHttpClient client = new OkHttpClient().newBuilder()
+ .build();
+
+Request request = new Request.Builder()
+ .url("https://api.netbird.io/api/events")
+ .method("GET")
+ .addHeader("Accept", "application/json")
+ .addHeader("Authorization: Token ")
+ .build();
+Response response = client.newCall(request).execute();
+```
+
+```php
+ 'https://api.netbird.io/api/events',
+ CURLOPT_RETURNTRANSFER => true,
+ CURLOPT_ENCODING => '',
+ CURLOPT_MAXREDIRS => 10,
+ CURLOPT_TIMEOUT => 0,
+ CURLOPT_FOLLOWLOCATION => true,
+ CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
+ CURLOPT_CUSTOMREQUEST => 'GET',
+ CURLOPT_HTTPHEADER => array(
+ 'Accept: application/json',
+ 'Authorization: Token '
+ ),
+));
+
+$response = curl_exec($curl);
+
+curl_close($curl);
+echo $response;
+```
+
+
+
+
+
+
+```json {{ title: 'Example' }}
+[
+ {
+ "id": "10",
+ "timestamp": "2023-05-05T10:04:37.473542Z",
+ "activity": "Route created",
+ "activity_code": "route.add",
+ "initiator_id": "google-oauth2|123456789012345678901",
+ "target_id": "chad9d86lnnc59g18ou0",
+ "meta": {
+ "name": "my route",
+ "network_range": "10.64.0.0/24",
+ "peer_id": "chacbco6lnnbn6cg5s91"
+ }
+ }
+]
+```
+```json {{ title: 'Schema' }}
+[
+ {
+ "id": "string",
+ "timestamp": "string",
+ "activity": "string",
+ "activity_code": "string",
+ "initiator_id": "string",
+ "target_id": "string",
+ "meta": "object"
+ }
+]
+```
+
+
+
+
+
+
+
+
+
+---
diff --git a/src/pages/ipa/resources/groups.mdx b/src/pages/ipa/resources/groups.mdx
new file mode 100644
index 00000000..d4fa4902
--- /dev/null
+++ b/src/pages/ipa/resources/groups.mdx
@@ -0,0 +1,1105 @@
+
+export const title = 'Groups'
+
+
+
+## List all Groups {{ tag: 'GET' , label: '/api/groups' }}
+
+
+
+ Returns a list of all Groups
+
+
+
+
+```bash {{ title: 'cURL' }}
+curl -X GET https://api.netbird.io/api/groups \
+-H 'Accept: application/json' \
+-H 'Authorization: Token '
+```
+
+```js
+const axios = require('axios');
+
+let config = {
+ method: 'get',
+ maxBodyLength: Infinity,
+ url: '/api/groups',
+ headers: {
+ 'Accept': 'application/json',
+ 'Authorization': 'Token '
+ }
+};
+
+axios(config)
+.then((response) => {
+ console.log(JSON.stringify(response.data));
+})
+.catch((error) => {
+ console.log(error);
+});
+```
+
+```python
+import requests
+import json
+
+url = "https://api.netbird.io/api/groups"
+
+headers: {
+ 'Accept': 'application/json',
+ 'Authorization': 'Token '
+}
+
+response = requests.request("GET", url, headers=headers)
+
+print(response.text)
+```
+
+```go
+package main
+
+import (
+ "fmt"
+ "strings"
+ "net/http"
+ "io/ioutil"
+)
+
+func main() {
+
+ url := "https://api.netbird.io/api/groups"
+ method := "GET"
+
+ client := &http.Client {
+ }
+ req, err := http.NewRequest(method, url, nil)
+
+ if err != nil {
+ fmt.Println(err)
+ return
+ {
+
+ req.Header.Add("Accept", "application/json")
+ req.Header.Add("Authorization", "Token ")
+
+ res, err := client.Do(req)
+ if err != nil {
+ fmt.Println(err)
+ return
+ }
+ defer res.Body.Close()
+
+ body, err := ioutil.ReadAll(res.Body)
+ if err != nil {
+ fmt.Println(err)
+ return
+ }
+ fmt.Println(string(body))
+}
+```
+
+```ruby
+require "uri"
+require "json"
+require "net/http"
+
+url = URI("https://api.netbird.io/api/groups")
+
+https = Net::HTTP.new(url.host, url.port)
+https.use_ssl = true
+
+request = Net::HTTP::Get.new(url)
+request["Accept"] = "application/json"
+request["Authorization"] = "Token "
+
+response = https.request(request)
+puts response.read_body
+```
+
+```java
+OkHttpClient client = new OkHttpClient().newBuilder()
+ .build();
+
+Request request = new Request.Builder()
+ .url("https://api.netbird.io/api/groups")
+ .method("GET")
+ .addHeader("Accept", "application/json")
+ .addHeader("Authorization: Token ")
+ .build();
+Response response = client.newCall(request).execute();
+```
+
+```php
+ 'https://api.netbird.io/api/groups',
+ CURLOPT_RETURNTRANSFER => true,
+ CURLOPT_ENCODING => '',
+ CURLOPT_MAXREDIRS => 10,
+ CURLOPT_TIMEOUT => 0,
+ CURLOPT_FOLLOWLOCATION => true,
+ CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
+ CURLOPT_CUSTOMREQUEST => 'GET',
+ CURLOPT_HTTPHEADER => array(
+ 'Accept: application/json',
+ 'Authorization: Token '
+ ),
+));
+
+$response = curl_exec($curl);
+
+curl_close($curl);
+echo $response;
+```
+
+
+
+
+
+
+```json {{ title: 'Example' }}
+[
+ {
+ "id": "ch8i4ug6lnn4g9hqv7m0",
+ "name": "devs",
+ "peers_count": 2,
+ "peers": [
+ {
+ "id": "chacbco6lnnbn6cg5s90",
+ "name": "stage-host-1"
+ }
+ ]
+ }
+]
+```
+```json {{ title: 'Schema' }}
+[
+ {
+ "id": "string",
+ "name": "string",
+ "peers_count": "integer",
+ "peers": [
+ {
+ "id": "string",
+ "name": "string"
+ }
+ ]
+ }
+]
+```
+
+
+
+
+
+
+
+
+
+---
+
+
+## Create a Group {{ tag: 'POST' , label: '/api/groups' }}
+
+
+
+ Creates a Group
+
+ #### Request-Body Parameters
+
+
+
+ Group name identifier
+
+
+
+ List of peers ids
+
+
+
+
+
+
+```bash {{ title: 'cURL' }}
+curl -X POST https://api.netbird.io/api/groups \
+-H 'Accept: application/json' \
+-H 'Content-Type: application/json' \
+-H 'Authorization: Token ' \
+--data-raw '{
+ "name": "devs",
+ "peers": [
+ null
+ ]
+}'
+```
+
+```js
+const axios = require('axios');
+let data = JSON.stringify({
+ "name": "devs",
+ "peers": [
+ null
+ ]
+});
+let config = {
+ method: 'post',
+ maxBodyLength: Infinity,
+ url: '/api/groups',
+ headers: {
+ 'Accept': 'application/json',
+ 'Content-Type': 'application/json',
+ 'Authorization': 'Token '
+ },
+ data : data
+};
+
+axios(config)
+.then((response) => {
+ console.log(JSON.stringify(response.data));
+})
+.catch((error) => {
+ console.log(error);
+});
+```
+
+```python
+import requests
+import json
+
+url = "https://api.netbird.io/api/groups"
+payload = json.dumps({
+ "name": "devs",
+ "peers": [
+ null
+ ]
+})
+headers: {
+ 'Content-Type': 'application/json',
+ 'Accept': 'application/json',
+ 'Authorization': 'Token '
+}
+
+response = requests.request("POST", url, headers=headers, data=payload)
+
+print(response.text)
+```
+
+```go
+package main
+
+import (
+ "fmt"
+ "strings"
+ "net/http"
+ "io/ioutil"
+)
+
+func main() {
+
+ url := "https://api.netbird.io/api/groups"
+ method := "POST"
+
+ payload := strings.NewReader(`{
+ "name": "devs",
+ "peers": [
+ null
+ ]
+}`)
+ client := &http.Client {
+ }
+ req, err := http.NewRequest(method, url, payload)
+
+ if err != nil {
+ fmt.Println(err)
+ return
+ {
+
+ req.Header.Add("Content-Type", "application/json")
+ req.Header.Add("Accept", "application/json")
+ req.Header.Add("Authorization", "Token ")
+
+ res, err := client.Do(req)
+ if err != nil {
+ fmt.Println(err)
+ return
+ }
+ defer res.Body.Close()
+
+ body, err := ioutil.ReadAll(res.Body)
+ if err != nil {
+ fmt.Println(err)
+ return
+ }
+ fmt.Println(string(body))
+}
+```
+
+```ruby
+require "uri"
+require "json"
+require "net/http"
+
+url = URI("https://api.netbird.io/api/groups")
+
+https = Net::HTTP.new(url.host, url.port)
+https.use_ssl = true
+
+request = Net::HTTP::Post.new(url)
+request["Content-Type"] = "application/json"
+request["Accept"] = "application/json"
+request["Authorization"] = "Token "
+
+request.body = JSON.dump({
+ "name": "devs",
+ "peers": [
+ null
+ ]
+})
+response = https.request(request)
+puts response.read_body
+```
+
+```java
+OkHttpClient client = new OkHttpClient().newBuilder()
+ .build();
+MediaType mediaType = MediaType.parse("application/json");
+RequestBody body = RequestBody.create(mediaType, '{
+ "name": "devs",
+ "peers": [
+ null
+ ]
+}');
+Request request = new Request.Builder()
+ .url("https://api.netbird.io/api/groups")
+ .method("POST", body)
+ .addHeader("Content-Type", "application/json")
+ .addHeader("Accept", "application/json")
+ .addHeader("Authorization: Token ")
+ .build();
+Response response = client.newCall(request).execute();
+```
+
+```php
+ 'https://api.netbird.io/api/groups',
+ CURLOPT_RETURNTRANSFER => true,
+ CURLOPT_ENCODING => '',
+ CURLOPT_MAXREDIRS => 10,
+ CURLOPT_TIMEOUT => 0,
+ CURLOPT_FOLLOWLOCATION => true,
+ CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
+ CURLOPT_CUSTOMREQUEST => 'POST',
+ CURLOPT_POSTFIELDS => '{
+ "name": "devs",
+ "peers": [
+ null
+ ]
+}',
+ CURLOPT_HTTPHEADER => array(
+ 'Content-Type: application/json',
+ 'Accept: application/json',
+ 'Authorization: Token '
+ ),
+));
+
+$response = curl_exec($curl);
+
+curl_close($curl);
+echo $response;
+```
+
+
+
+
+
+
+```json {{ title: 'Example' }}
+{
+ "id": "ch8i4ug6lnn4g9hqv7m0",
+ "name": "devs",
+ "peers_count": 2,
+ "peers": [
+ {
+ "id": "chacbco6lnnbn6cg5s90",
+ "name": "stage-host-1"
+ }
+ ]
+}
+```
+```json {{ title: 'Schema' }}
+{
+ "id": "string",
+ "name": "string",
+ "peers_count": "integer",
+ "peers": [
+ {
+ "id": "string",
+ "name": "string"
+ }
+ ]
+}
+```
+
+
+
+
+
+
+
+
+
+---
+
+
+## Retrieve a Group {{ tag: 'GET' , label: '/api/groups/{groupId}' }}
+
+
+
+ Get information about a Group
+
+ #### Path Parameters
+
+
+
+ The unique identifier of a group
+
+
+
+
+
+
+```bash {{ title: 'cURL' }}
+curl -X GET https://api.netbird.io/api/groups/{groupId} \
+-H 'Accept: application/json' \
+-H 'Authorization: Token '
+```
+
+```js
+const axios = require('axios');
+
+let config = {
+ method: 'get',
+ maxBodyLength: Infinity,
+ url: '/api/groups/{groupId}',
+ headers: {
+ 'Accept': 'application/json',
+ 'Authorization': 'Token '
+ }
+};
+
+axios(config)
+.then((response) => {
+ console.log(JSON.stringify(response.data));
+})
+.catch((error) => {
+ console.log(error);
+});
+```
+
+```python
+import requests
+import json
+
+url = "https://api.netbird.io/api/groups/{groupId}"
+
+headers: {
+ 'Accept': 'application/json',
+ 'Authorization': 'Token '
+}
+
+response = requests.request("GET", url, headers=headers)
+
+print(response.text)
+```
+
+```go
+package main
+
+import (
+ "fmt"
+ "strings"
+ "net/http"
+ "io/ioutil"
+)
+
+func main() {
+
+ url := "https://api.netbird.io/api/groups/{groupId}"
+ method := "GET"
+
+ client := &http.Client {
+ }
+ req, err := http.NewRequest(method, url, nil)
+
+ if err != nil {
+ fmt.Println(err)
+ return
+ {
+
+ req.Header.Add("Accept", "application/json")
+ req.Header.Add("Authorization", "Token ")
+
+ res, err := client.Do(req)
+ if err != nil {
+ fmt.Println(err)
+ return
+ }
+ defer res.Body.Close()
+
+ body, err := ioutil.ReadAll(res.Body)
+ if err != nil {
+ fmt.Println(err)
+ return
+ }
+ fmt.Println(string(body))
+}
+```
+
+```ruby
+require "uri"
+require "json"
+require "net/http"
+
+url = URI("https://api.netbird.io/api/groups/{groupId}")
+
+https = Net::HTTP.new(url.host, url.port)
+https.use_ssl = true
+
+request = Net::HTTP::Get.new(url)
+request["Accept"] = "application/json"
+request["Authorization"] = "Token "
+
+response = https.request(request)
+puts response.read_body
+```
+
+```java
+OkHttpClient client = new OkHttpClient().newBuilder()
+ .build();
+
+Request request = new Request.Builder()
+ .url("https://api.netbird.io/api/groups/{groupId}")
+ .method("GET")
+ .addHeader("Accept", "application/json")
+ .addHeader("Authorization: Token ")
+ .build();
+Response response = client.newCall(request).execute();
+```
+
+```php
+ 'https://api.netbird.io/api/groups/{groupId}',
+ CURLOPT_RETURNTRANSFER => true,
+ CURLOPT_ENCODING => '',
+ CURLOPT_MAXREDIRS => 10,
+ CURLOPT_TIMEOUT => 0,
+ CURLOPT_FOLLOWLOCATION => true,
+ CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
+ CURLOPT_CUSTOMREQUEST => 'GET',
+ CURLOPT_HTTPHEADER => array(
+ 'Accept: application/json',
+ 'Authorization: Token '
+ ),
+));
+
+$response = curl_exec($curl);
+
+curl_close($curl);
+echo $response;
+```
+
+
+
+
+
+
+```json {{ title: 'Example' }}
+{
+ "id": "ch8i4ug6lnn4g9hqv7m0",
+ "name": "devs",
+ "peers_count": 2,
+ "peers": [
+ {
+ "id": "chacbco6lnnbn6cg5s90",
+ "name": "stage-host-1"
+ }
+ ]
+}
+```
+```json {{ title: 'Schema' }}
+{
+ "id": "string",
+ "name": "string",
+ "peers_count": "integer",
+ "peers": [
+ {
+ "id": "string",
+ "name": "string"
+ }
+ ]
+}
+```
+
+
+
+
+
+
+
+
+
+---
+
+
+## Update a Group {{ tag: 'PUT' , label: '/api/groups/{groupId}' }}
+
+
+
+ Update/Replace a Group
+
+ #### Path Parameters
+
+
+
+ The unique identifier of a group
+
+
+
+ #### Request-Body Parameters
+
+
+
+ Group name identifier
+
+
+
+ List of peers ids
+
+
+
+
+
+
+```bash {{ title: 'cURL' }}
+curl -X PUT https://api.netbird.io/api/groups/{groupId} \
+-H 'Accept: application/json' \
+-H 'Content-Type: application/json' \
+-H 'Authorization: Token ' \
+--data-raw '{
+ "name": "devs",
+ "peers": [
+ null
+ ]
+}'
+```
+
+```js
+const axios = require('axios');
+let data = JSON.stringify({
+ "name": "devs",
+ "peers": [
+ null
+ ]
+});
+let config = {
+ method: 'put',
+ maxBodyLength: Infinity,
+ url: '/api/groups/{groupId}',
+ headers: {
+ 'Accept': 'application/json',
+ 'Content-Type': 'application/json',
+ 'Authorization': 'Token '
+ },
+ data : data
+};
+
+axios(config)
+.then((response) => {
+ console.log(JSON.stringify(response.data));
+})
+.catch((error) => {
+ console.log(error);
+});
+```
+
+```python
+import requests
+import json
+
+url = "https://api.netbird.io/api/groups/{groupId}"
+payload = json.dumps({
+ "name": "devs",
+ "peers": [
+ null
+ ]
+})
+headers: {
+ 'Content-Type': 'application/json',
+ 'Accept': 'application/json',
+ 'Authorization': 'Token '
+}
+
+response = requests.request("PUT", url, headers=headers, data=payload)
+
+print(response.text)
+```
+
+```go
+package main
+
+import (
+ "fmt"
+ "strings"
+ "net/http"
+ "io/ioutil"
+)
+
+func main() {
+
+ url := "https://api.netbird.io/api/groups/{groupId}"
+ method := "PUT"
+
+ payload := strings.NewReader(`{
+ "name": "devs",
+ "peers": [
+ null
+ ]
+}`)
+ client := &http.Client {
+ }
+ req, err := http.NewRequest(method, url, payload)
+
+ if err != nil {
+ fmt.Println(err)
+ return
+ {
+
+ req.Header.Add("Content-Type", "application/json")
+ req.Header.Add("Accept", "application/json")
+ req.Header.Add("Authorization", "Token ")
+
+ res, err := client.Do(req)
+ if err != nil {
+ fmt.Println(err)
+ return
+ }
+ defer res.Body.Close()
+
+ body, err := ioutil.ReadAll(res.Body)
+ if err != nil {
+ fmt.Println(err)
+ return
+ }
+ fmt.Println(string(body))
+}
+```
+
+```ruby
+require "uri"
+require "json"
+require "net/http"
+
+url = URI("https://api.netbird.io/api/groups/{groupId}")
+
+https = Net::HTTP.new(url.host, url.port)
+https.use_ssl = true
+
+request = Net::HTTP::Put.new(url)
+request["Content-Type"] = "application/json"
+request["Accept"] = "application/json"
+request["Authorization"] = "Token "
+
+request.body = JSON.dump({
+ "name": "devs",
+ "peers": [
+ null
+ ]
+})
+response = https.request(request)
+puts response.read_body
+```
+
+```java
+OkHttpClient client = new OkHttpClient().newBuilder()
+ .build();
+MediaType mediaType = MediaType.parse("application/json");
+RequestBody body = RequestBody.create(mediaType, '{
+ "name": "devs",
+ "peers": [
+ null
+ ]
+}');
+Request request = new Request.Builder()
+ .url("https://api.netbird.io/api/groups/{groupId}")
+ .method("PUT", body)
+ .addHeader("Content-Type", "application/json")
+ .addHeader("Accept", "application/json")
+ .addHeader("Authorization: Token ")
+ .build();
+Response response = client.newCall(request).execute();
+```
+
+```php
+ 'https://api.netbird.io/api/groups/{groupId}',
+ CURLOPT_RETURNTRANSFER => true,
+ CURLOPT_ENCODING => '',
+ CURLOPT_MAXREDIRS => 10,
+ CURLOPT_TIMEOUT => 0,
+ CURLOPT_FOLLOWLOCATION => true,
+ CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
+ CURLOPT_CUSTOMREQUEST => 'PUT',
+ CURLOPT_POSTFIELDS => '{
+ "name": "devs",
+ "peers": [
+ null
+ ]
+}',
+ CURLOPT_HTTPHEADER => array(
+ 'Content-Type: application/json',
+ 'Accept: application/json',
+ 'Authorization: Token '
+ ),
+));
+
+$response = curl_exec($curl);
+
+curl_close($curl);
+echo $response;
+```
+
+
+
+
+
+
+```json {{ title: 'Example' }}
+{
+ "id": "ch8i4ug6lnn4g9hqv7m0",
+ "name": "devs",
+ "peers_count": 2,
+ "peers": [
+ {
+ "id": "chacbco6lnnbn6cg5s90",
+ "name": "stage-host-1"
+ }
+ ]
+}
+```
+```json {{ title: 'Schema' }}
+{
+ "id": "string",
+ "name": "string",
+ "peers_count": "integer",
+ "peers": [
+ {
+ "id": "string",
+ "name": "string"
+ }
+ ]
+}
+```
+
+
+
+
+
+
+
+
+
+---
+
+
+## Delete a Group {{ tag: 'DELETE' , label: '/api/groups/{groupId}' }}
+
+
+
+ Delete a Group
+
+ #### Path Parameters
+
+
+
+ The unique identifier of a group
+
+
+
+
+
+
+```bash {{ title: 'cURL' }}
+curl -X DELETE https://api.netbird.io/api/groups/{groupId} \
+-H 'Authorization: Token '
+```
+
+```js
+const axios = require('axios');
+
+let config = {
+ method: 'delete',
+ maxBodyLength: Infinity,
+ url: '/api/groups/{groupId}',
+ headers: {
+ 'Authorization': 'Token '
+ }
+};
+
+axios(config)
+.then((response) => {
+ console.log(JSON.stringify(response.data));
+})
+.catch((error) => {
+ console.log(error);
+});
+```
+
+```python
+import requests
+import json
+
+url = "https://api.netbird.io/api/groups/{groupId}"
+
+headers: {
+ 'Authorization': 'Token '
+}
+
+response = requests.request("DELETE", url, headers=headers)
+
+print(response.text)
+```
+
+```go
+package main
+
+import (
+ "fmt"
+ "strings"
+ "net/http"
+ "io/ioutil"
+)
+
+func main() {
+
+ url := "https://api.netbird.io/api/groups/{groupId}"
+ method := "DELETE"
+
+ client := &http.Client {
+ }
+ req, err := http.NewRequest(method, url, nil)
+
+ if err != nil {
+ fmt.Println(err)
+ return
+ {
+
+ req.Header.Add("Authorization", "Token ")
+
+ res, err := client.Do(req)
+ if err != nil {
+ fmt.Println(err)
+ return
+ }
+ defer res.Body.Close()
+
+ body, err := ioutil.ReadAll(res.Body)
+ if err != nil {
+ fmt.Println(err)
+ return
+ }
+ fmt.Println(string(body))
+}
+```
+
+```ruby
+require "uri"
+require "json"
+require "net/http"
+
+url = URI("https://api.netbird.io/api/groups/{groupId}")
+
+https = Net::HTTP.new(url.host, url.port)
+https.use_ssl = true
+
+request = Net::HTTP::Delete.new(url)
+request["Authorization"] = "Token "
+
+response = https.request(request)
+puts response.read_body
+```
+
+```java
+OkHttpClient client = new OkHttpClient().newBuilder()
+ .build();
+
+Request request = new Request.Builder()
+ .url("https://api.netbird.io/api/groups/{groupId}")
+ .method("DELETE")
+ .addHeader("Authorization: Token ")
+ .build();
+Response response = client.newCall(request).execute();
+```
+
+```php
+ 'https://api.netbird.io/api/groups/{groupId}',
+ CURLOPT_RETURNTRANSFER => true,
+ CURLOPT_ENCODING => '',
+ CURLOPT_MAXREDIRS => 10,
+ CURLOPT_TIMEOUT => 0,
+ CURLOPT_FOLLOWLOCATION => true,
+ CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
+ CURLOPT_CUSTOMREQUEST => 'DELETE',
+ CURLOPT_HTTPHEADER => array(
+ 'Authorization: Token '
+ ),
+));
+
+$response = curl_exec($curl);
+
+curl_close($curl);
+echo $response;
+```
+
+
+
+
+
+
+
+
+
+
+---
diff --git a/src/pages/ipa/resources/peers.mdx b/src/pages/ipa/resources/peers.mdx
new file mode 100644
index 00000000..a48aa303
--- /dev/null
+++ b/src/pages/ipa/resources/peers.mdx
@@ -0,0 +1,921 @@
+
+export const title = 'Peers'
+
+
+
+## List all Peers {{ tag: 'GET' , label: '/api/peers' }}
+
+
+
+ Returns a list of all peers
+
+
+
+
+```bash {{ title: 'cURL' }}
+curl -X GET https://api.netbird.io/api/peers \
+-H 'Accept: application/json' \
+-H 'Authorization: Token '
+```
+
+```js
+const axios = require('axios');
+
+let config = {
+ method: 'get',
+ maxBodyLength: Infinity,
+ url: '/api/peers',
+ headers: {
+ 'Accept': 'application/json',
+ 'Authorization': 'Token '
+ }
+};
+
+axios(config)
+.then((response) => {
+ console.log(JSON.stringify(response.data));
+})
+.catch((error) => {
+ console.log(error);
+});
+```
+
+```python
+import requests
+import json
+
+url = "https://api.netbird.io/api/peers"
+
+headers: {
+ 'Accept': 'application/json',
+ 'Authorization': 'Token '
+}
+
+response = requests.request("GET", url, headers=headers)
+
+print(response.text)
+```
+
+```go
+package main
+
+import (
+ "fmt"
+ "strings"
+ "net/http"
+ "io/ioutil"
+)
+
+func main() {
+
+ url := "https://api.netbird.io/api/peers"
+ method := "GET"
+
+ client := &http.Client {
+ }
+ req, err := http.NewRequest(method, url, nil)
+
+ if err != nil {
+ fmt.Println(err)
+ return
+ {
+
+ req.Header.Add("Accept", "application/json")
+ req.Header.Add("Authorization", "Token ")
+
+ res, err := client.Do(req)
+ if err != nil {
+ fmt.Println(err)
+ return
+ }
+ defer res.Body.Close()
+
+ body, err := ioutil.ReadAll(res.Body)
+ if err != nil {
+ fmt.Println(err)
+ return
+ }
+ fmt.Println(string(body))
+}
+```
+
+```ruby
+require "uri"
+require "json"
+require "net/http"
+
+url = URI("https://api.netbird.io/api/peers")
+
+https = Net::HTTP.new(url.host, url.port)
+https.use_ssl = true
+
+request = Net::HTTP::Get.new(url)
+request["Accept"] = "application/json"
+request["Authorization"] = "Token "
+
+response = https.request(request)
+puts response.read_body
+```
+
+```java
+OkHttpClient client = new OkHttpClient().newBuilder()
+ .build();
+
+Request request = new Request.Builder()
+ .url("https://api.netbird.io/api/peers")
+ .method("GET")
+ .addHeader("Accept", "application/json")
+ .addHeader("Authorization: Token ")
+ .build();
+Response response = client.newCall(request).execute();
+```
+
+```php
+ 'https://api.netbird.io/api/peers',
+ CURLOPT_RETURNTRANSFER => true,
+ CURLOPT_ENCODING => '',
+ CURLOPT_MAXREDIRS => 10,
+ CURLOPT_TIMEOUT => 0,
+ CURLOPT_FOLLOWLOCATION => true,
+ CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
+ CURLOPT_CUSTOMREQUEST => 'GET',
+ CURLOPT_HTTPHEADER => array(
+ 'Accept: application/json',
+ 'Authorization: Token '
+ ),
+));
+
+$response = curl_exec($curl);
+
+curl_close($curl);
+echo $response;
+```
+
+
+
+
+
+
+```json {{ title: 'Example' }}
+[
+ {
+ "id": "chacbco6lnnbn6cg5s90",
+ "name": "stage-host-1",
+ "ip": "10.64.0.1",
+ "connected": true,
+ "last_seen": "2023-05-05T10:05:26.420578Z",
+ "os": "Darwin 13.2.1",
+ "version": "0.14.0",
+ "groups": [
+ {
+ "id": "ch8i4ug6lnn4g9hqv7m0",
+ "name": "devs",
+ "peers_count": 2
+ }
+ ],
+ "ssh_enabled": true,
+ "user_id": "google-oauth2|277474792786460067937",
+ "hostname": "stage-host-1",
+ "ui_version": "0.14.0",
+ "dns_label": "stage-host-1.netbird.cloud",
+ "login_expiration_enabled": false,
+ "login_expired": false,
+ "last_login": "2023-05-05T09:00:35.477782Z"
+ }
+]
+```
+```json {{ title: 'Schema' }}
+[
+ {
+ "id": "string",
+ "name": "string",
+ "ip": "string",
+ "connected": "boolean",
+ "last_seen": "string",
+ "os": "string",
+ "version": "string",
+ "groups": [
+ {
+ "id": "string",
+ "name": "string",
+ "peers_count": "integer"
+ }
+ ],
+ "ssh_enabled": "boolean",
+ "user_id": "string",
+ "hostname": "string",
+ "ui_version": "string",
+ "dns_label": "string",
+ "login_expiration_enabled": "boolean",
+ "login_expired": "boolean",
+ "last_login": "string"
+ }
+]
+```
+
+
+
+
+
+
+
+
+
+---
+
+
+## Retrieve a Peer {{ tag: 'GET' , label: '/api/peers/{peerId}' }}
+
+
+
+ Get information about a peer
+
+ #### Path Parameters
+
+
+
+ The unique identifier of a peer
+
+
+
+
+
+
+```bash {{ title: 'cURL' }}
+curl -X GET https://api.netbird.io/api/peers/{peerId} \
+-H 'Accept: application/json' \
+-H 'Authorization: Token '
+```
+
+```js
+const axios = require('axios');
+
+let config = {
+ method: 'get',
+ maxBodyLength: Infinity,
+ url: '/api/peers/{peerId}',
+ headers: {
+ 'Accept': 'application/json',
+ 'Authorization': 'Token '
+ }
+};
+
+axios(config)
+.then((response) => {
+ console.log(JSON.stringify(response.data));
+})
+.catch((error) => {
+ console.log(error);
+});
+```
+
+```python
+import requests
+import json
+
+url = "https://api.netbird.io/api/peers/{peerId}"
+
+headers: {
+ 'Accept': 'application/json',
+ 'Authorization': 'Token '
+}
+
+response = requests.request("GET", url, headers=headers)
+
+print(response.text)
+```
+
+```go
+package main
+
+import (
+ "fmt"
+ "strings"
+ "net/http"
+ "io/ioutil"
+)
+
+func main() {
+
+ url := "https://api.netbird.io/api/peers/{peerId}"
+ method := "GET"
+
+ client := &http.Client {
+ }
+ req, err := http.NewRequest(method, url, nil)
+
+ if err != nil {
+ fmt.Println(err)
+ return
+ {
+
+ req.Header.Add("Accept", "application/json")
+ req.Header.Add("Authorization", "Token ")
+
+ res, err := client.Do(req)
+ if err != nil {
+ fmt.Println(err)
+ return
+ }
+ defer res.Body.Close()
+
+ body, err := ioutil.ReadAll(res.Body)
+ if err != nil {
+ fmt.Println(err)
+ return
+ }
+ fmt.Println(string(body))
+}
+```
+
+```ruby
+require "uri"
+require "json"
+require "net/http"
+
+url = URI("https://api.netbird.io/api/peers/{peerId}")
+
+https = Net::HTTP.new(url.host, url.port)
+https.use_ssl = true
+
+request = Net::HTTP::Get.new(url)
+request["Accept"] = "application/json"
+request["Authorization"] = "Token "
+
+response = https.request(request)
+puts response.read_body
+```
+
+```java
+OkHttpClient client = new OkHttpClient().newBuilder()
+ .build();
+
+Request request = new Request.Builder()
+ .url("https://api.netbird.io/api/peers/{peerId}")
+ .method("GET")
+ .addHeader("Accept", "application/json")
+ .addHeader("Authorization: Token ")
+ .build();
+Response response = client.newCall(request).execute();
+```
+
+```php
+ 'https://api.netbird.io/api/peers/{peerId}',
+ CURLOPT_RETURNTRANSFER => true,
+ CURLOPT_ENCODING => '',
+ CURLOPT_MAXREDIRS => 10,
+ CURLOPT_TIMEOUT => 0,
+ CURLOPT_FOLLOWLOCATION => true,
+ CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
+ CURLOPT_CUSTOMREQUEST => 'GET',
+ CURLOPT_HTTPHEADER => array(
+ 'Accept: application/json',
+ 'Authorization: Token '
+ ),
+));
+
+$response = curl_exec($curl);
+
+curl_close($curl);
+echo $response;
+```
+
+
+
+
+
+
+```json {{ title: 'Example' }}
+{
+ "id": "chacbco6lnnbn6cg5s90",
+ "name": "stage-host-1",
+ "ip": "10.64.0.1",
+ "connected": true,
+ "last_seen": "2023-05-05T10:05:26.420578Z",
+ "os": "Darwin 13.2.1",
+ "version": "0.14.0",
+ "groups": [
+ {
+ "id": "ch8i4ug6lnn4g9hqv7m0",
+ "name": "devs",
+ "peers_count": 2
+ }
+ ],
+ "ssh_enabled": true,
+ "user_id": "google-oauth2|277474792786460067937",
+ "hostname": "stage-host-1",
+ "ui_version": "0.14.0",
+ "dns_label": "stage-host-1.netbird.cloud",
+ "login_expiration_enabled": false,
+ "login_expired": false,
+ "last_login": "2023-05-05T09:00:35.477782Z"
+}
+```
+```json {{ title: 'Schema' }}
+{
+ "id": "string",
+ "name": "string",
+ "ip": "string",
+ "connected": "boolean",
+ "last_seen": "string",
+ "os": "string",
+ "version": "string",
+ "groups": [
+ {
+ "id": "string",
+ "name": "string",
+ "peers_count": "integer"
+ }
+ ],
+ "ssh_enabled": "boolean",
+ "user_id": "string",
+ "hostname": "string",
+ "ui_version": "string",
+ "dns_label": "string",
+ "login_expiration_enabled": "boolean",
+ "login_expired": "boolean",
+ "last_login": "string"
+}
+```
+
+
+
+
+
+
+
+
+
+---
+
+
+## Update a Peer {{ tag: 'PUT' , label: '/api/peers/{peerId}' }}
+
+
+
+ Update information about a peer
+
+ #### Path Parameters
+
+
+
+ The unique identifier of a peer
+
+
+
+ #### Request-Body Parameters
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+```bash {{ title: 'cURL' }}
+curl -X PUT https://api.netbird.io/api/peers/{peerId} \
+-H 'Accept: application/json' \
+-H 'Content-Type: application/json' \
+-H 'Authorization: Token ' \
+--data-raw '{
+ "name": "stage-host-1",
+ "ssh_enabled": true,
+ "login_expiration_enabled": false
+}'
+```
+
+```js
+const axios = require('axios');
+let data = JSON.stringify({
+ "name": "stage-host-1",
+ "ssh_enabled": true,
+ "login_expiration_enabled": false
+});
+let config = {
+ method: 'put',
+ maxBodyLength: Infinity,
+ url: '/api/peers/{peerId}',
+ headers: {
+ 'Accept': 'application/json',
+ 'Content-Type': 'application/json',
+ 'Authorization': 'Token '
+ },
+ data : data
+};
+
+axios(config)
+.then((response) => {
+ console.log(JSON.stringify(response.data));
+})
+.catch((error) => {
+ console.log(error);
+});
+```
+
+```python
+import requests
+import json
+
+url = "https://api.netbird.io/api/peers/{peerId}"
+payload = json.dumps({
+ "name": "stage-host-1",
+ "ssh_enabled": true,
+ "login_expiration_enabled": false
+})
+headers: {
+ 'Content-Type': 'application/json',
+ 'Accept': 'application/json',
+ 'Authorization': 'Token '
+}
+
+response = requests.request("PUT", url, headers=headers, data=payload)
+
+print(response.text)
+```
+
+```go
+package main
+
+import (
+ "fmt"
+ "strings"
+ "net/http"
+ "io/ioutil"
+)
+
+func main() {
+
+ url := "https://api.netbird.io/api/peers/{peerId}"
+ method := "PUT"
+
+ payload := strings.NewReader(`{
+ "name": "stage-host-1",
+ "ssh_enabled": true,
+ "login_expiration_enabled": false
+}`)
+ client := &http.Client {
+ }
+ req, err := http.NewRequest(method, url, payload)
+
+ if err != nil {
+ fmt.Println(err)
+ return
+ {
+
+ req.Header.Add("Content-Type", "application/json")
+ req.Header.Add("Accept", "application/json")
+ req.Header.Add("Authorization", "Token ")
+
+ res, err := client.Do(req)
+ if err != nil {
+ fmt.Println(err)
+ return
+ }
+ defer res.Body.Close()
+
+ body, err := ioutil.ReadAll(res.Body)
+ if err != nil {
+ fmt.Println(err)
+ return
+ }
+ fmt.Println(string(body))
+}
+```
+
+```ruby
+require "uri"
+require "json"
+require "net/http"
+
+url = URI("https://api.netbird.io/api/peers/{peerId}")
+
+https = Net::HTTP.new(url.host, url.port)
+https.use_ssl = true
+
+request = Net::HTTP::Put.new(url)
+request["Content-Type"] = "application/json"
+request["Accept"] = "application/json"
+request["Authorization"] = "Token "
+
+request.body = JSON.dump({
+ "name": "stage-host-1",
+ "ssh_enabled": true,
+ "login_expiration_enabled": false
+})
+response = https.request(request)
+puts response.read_body
+```
+
+```java
+OkHttpClient client = new OkHttpClient().newBuilder()
+ .build();
+MediaType mediaType = MediaType.parse("application/json");
+RequestBody body = RequestBody.create(mediaType, '{
+ "name": "stage-host-1",
+ "ssh_enabled": true,
+ "login_expiration_enabled": false
+}');
+Request request = new Request.Builder()
+ .url("https://api.netbird.io/api/peers/{peerId}")
+ .method("PUT", body)
+ .addHeader("Content-Type", "application/json")
+ .addHeader("Accept", "application/json")
+ .addHeader("Authorization: Token ")
+ .build();
+Response response = client.newCall(request).execute();
+```
+
+```php
+ 'https://api.netbird.io/api/peers/{peerId}',
+ CURLOPT_RETURNTRANSFER => true,
+ CURLOPT_ENCODING => '',
+ CURLOPT_MAXREDIRS => 10,
+ CURLOPT_TIMEOUT => 0,
+ CURLOPT_FOLLOWLOCATION => true,
+ CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
+ CURLOPT_CUSTOMREQUEST => 'PUT',
+ CURLOPT_POSTFIELDS => '{
+ "name": "stage-host-1",
+ "ssh_enabled": true,
+ "login_expiration_enabled": false
+}',
+ CURLOPT_HTTPHEADER => array(
+ 'Content-Type: application/json',
+ 'Accept: application/json',
+ 'Authorization: Token '
+ ),
+));
+
+$response = curl_exec($curl);
+
+curl_close($curl);
+echo $response;
+```
+
+
+
+
+
+
+```json {{ title: 'Example' }}
+{
+ "id": "chacbco6lnnbn6cg5s90",
+ "name": "stage-host-1",
+ "ip": "10.64.0.1",
+ "connected": true,
+ "last_seen": "2023-05-05T10:05:26.420578Z",
+ "os": "Darwin 13.2.1",
+ "version": "0.14.0",
+ "groups": [
+ {
+ "id": "ch8i4ug6lnn4g9hqv7m0",
+ "name": "devs",
+ "peers_count": 2
+ }
+ ],
+ "ssh_enabled": true,
+ "user_id": "google-oauth2|277474792786460067937",
+ "hostname": "stage-host-1",
+ "ui_version": "0.14.0",
+ "dns_label": "stage-host-1.netbird.cloud",
+ "login_expiration_enabled": false,
+ "login_expired": false,
+ "last_login": "2023-05-05T09:00:35.477782Z"
+}
+```
+```json {{ title: 'Schema' }}
+{
+ "id": "string",
+ "name": "string",
+ "ip": "string",
+ "connected": "boolean",
+ "last_seen": "string",
+ "os": "string",
+ "version": "string",
+ "groups": [
+ {
+ "id": "string",
+ "name": "string",
+ "peers_count": "integer"
+ }
+ ],
+ "ssh_enabled": "boolean",
+ "user_id": "string",
+ "hostname": "string",
+ "ui_version": "string",
+ "dns_label": "string",
+ "login_expiration_enabled": "boolean",
+ "login_expired": "boolean",
+ "last_login": "string"
+}
+```
+
+
+
+
+
+
+
+
+
+---
+
+
+## Delete a Peer {{ tag: 'DELETE' , label: '/api/peers/{peerId}' }}
+
+
+
+ Delete a peer
+
+ #### Path Parameters
+
+
+
+ The unique identifier of a peer
+
+
+
+
+
+
+```bash {{ title: 'cURL' }}
+curl -X DELETE https://api.netbird.io/api/peers/{peerId} \
+-H 'Authorization: Token '
+```
+
+```js
+const axios = require('axios');
+
+let config = {
+ method: 'delete',
+ maxBodyLength: Infinity,
+ url: '/api/peers/{peerId}',
+ headers: {
+ 'Authorization': 'Token '
+ }
+};
+
+axios(config)
+.then((response) => {
+ console.log(JSON.stringify(response.data));
+})
+.catch((error) => {
+ console.log(error);
+});
+```
+
+```python
+import requests
+import json
+
+url = "https://api.netbird.io/api/peers/{peerId}"
+
+headers: {
+ 'Authorization': 'Token '
+}
+
+response = requests.request("DELETE", url, headers=headers)
+
+print(response.text)
+```
+
+```go
+package main
+
+import (
+ "fmt"
+ "strings"
+ "net/http"
+ "io/ioutil"
+)
+
+func main() {
+
+ url := "https://api.netbird.io/api/peers/{peerId}"
+ method := "DELETE"
+
+ client := &http.Client {
+ }
+ req, err := http.NewRequest(method, url, nil)
+
+ if err != nil {
+ fmt.Println(err)
+ return
+ {
+
+ req.Header.Add("Authorization", "Token ")
+
+ res, err := client.Do(req)
+ if err != nil {
+ fmt.Println(err)
+ return
+ }
+ defer res.Body.Close()
+
+ body, err := ioutil.ReadAll(res.Body)
+ if err != nil {
+ fmt.Println(err)
+ return
+ }
+ fmt.Println(string(body))
+}
+```
+
+```ruby
+require "uri"
+require "json"
+require "net/http"
+
+url = URI("https://api.netbird.io/api/peers/{peerId}")
+
+https = Net::HTTP.new(url.host, url.port)
+https.use_ssl = true
+
+request = Net::HTTP::Delete.new(url)
+request["Authorization"] = "Token "
+
+response = https.request(request)
+puts response.read_body
+```
+
+```java
+OkHttpClient client = new OkHttpClient().newBuilder()
+ .build();
+
+Request request = new Request.Builder()
+ .url("https://api.netbird.io/api/peers/{peerId}")
+ .method("DELETE")
+ .addHeader("Authorization: Token ")
+ .build();
+Response response = client.newCall(request).execute();
+```
+
+```php
+ 'https://api.netbird.io/api/peers/{peerId}',
+ CURLOPT_RETURNTRANSFER => true,
+ CURLOPT_ENCODING => '',
+ CURLOPT_MAXREDIRS => 10,
+ CURLOPT_TIMEOUT => 0,
+ CURLOPT_FOLLOWLOCATION => true,
+ CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
+ CURLOPT_CUSTOMREQUEST => 'DELETE',
+ CURLOPT_HTTPHEADER => array(
+ 'Authorization: Token '
+ ),
+));
+
+$response = curl_exec($curl);
+
+curl_close($curl);
+echo $response;
+```
+
+
+
+
+
+
+
+
+
+
+---
diff --git a/src/pages/ipa/resources/policies.mdx b/src/pages/ipa/resources/policies.mdx
new file mode 100644
index 00000000..24db1374
--- /dev/null
+++ b/src/pages/ipa/resources/policies.mdx
@@ -0,0 +1,1617 @@
+
+export const title = 'Policies'
+
+
+
+## List all Policies {{ tag: 'GET' , label: '/api/policies' }}
+
+
+
+ Returns a list of all Policies
+
+
+
+
+```bash {{ title: 'cURL' }}
+curl -X GET https://api.netbird.io/api/policies \
+-H 'Accept: application/json' \
+-H 'Authorization: Token '
+```
+
+```js
+const axios = require('axios');
+
+let config = {
+ method: 'get',
+ maxBodyLength: Infinity,
+ url: '/api/policies',
+ headers: {
+ 'Accept': 'application/json',
+ 'Authorization': 'Token '
+ }
+};
+
+axios(config)
+.then((response) => {
+ console.log(JSON.stringify(response.data));
+})
+.catch((error) => {
+ console.log(error);
+});
+```
+
+```python
+import requests
+import json
+
+url = "https://api.netbird.io/api/policies"
+
+headers: {
+ 'Accept': 'application/json',
+ 'Authorization': 'Token '
+}
+
+response = requests.request("GET", url, headers=headers)
+
+print(response.text)
+```
+
+```go
+package main
+
+import (
+ "fmt"
+ "strings"
+ "net/http"
+ "io/ioutil"
+)
+
+func main() {
+
+ url := "https://api.netbird.io/api/policies"
+ method := "GET"
+
+ client := &http.Client {
+ }
+ req, err := http.NewRequest(method, url, nil)
+
+ if err != nil {
+ fmt.Println(err)
+ return
+ {
+
+ req.Header.Add("Accept", "application/json")
+ req.Header.Add("Authorization", "Token ")
+
+ res, err := client.Do(req)
+ if err != nil {
+ fmt.Println(err)
+ return
+ }
+ defer res.Body.Close()
+
+ body, err := ioutil.ReadAll(res.Body)
+ if err != nil {
+ fmt.Println(err)
+ return
+ }
+ fmt.Println(string(body))
+}
+```
+
+```ruby
+require "uri"
+require "json"
+require "net/http"
+
+url = URI("https://api.netbird.io/api/policies")
+
+https = Net::HTTP.new(url.host, url.port)
+https.use_ssl = true
+
+request = Net::HTTP::Get.new(url)
+request["Accept"] = "application/json"
+request["Authorization"] = "Token "
+
+response = https.request(request)
+puts response.read_body
+```
+
+```java
+OkHttpClient client = new OkHttpClient().newBuilder()
+ .build();
+
+Request request = new Request.Builder()
+ .url("https://api.netbird.io/api/policies")
+ .method("GET")
+ .addHeader("Accept", "application/json")
+ .addHeader("Authorization: Token ")
+ .build();
+Response response = client.newCall(request).execute();
+```
+
+```php
+ 'https://api.netbird.io/api/policies',
+ CURLOPT_RETURNTRANSFER => true,
+ CURLOPT_ENCODING => '',
+ CURLOPT_MAXREDIRS => 10,
+ CURLOPT_TIMEOUT => 0,
+ CURLOPT_FOLLOWLOCATION => true,
+ CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
+ CURLOPT_CUSTOMREQUEST => 'GET',
+ CURLOPT_HTTPHEADER => array(
+ 'Accept: application/json',
+ 'Authorization: Token '
+ ),
+));
+
+$response = curl_exec($curl);
+
+curl_close($curl);
+echo $response;
+```
+
+
+
+
+
+
+```json {{ title: 'Example' }}
+[
+ {
+ "name": "ch8i4ug6lnn4g9hqv7mg",
+ "description": "This is a default policy that allows connections between all the resources",
+ "enabled": true,
+ "query": "package netbird\\n\\nall[rule] {\\n is_peer_in_any_group([\\\"ch8i4ug6lnn4g9hqv7m0\\\",\\\"ch8i4ug6lnn4g9hqv7m0\\\"])\\n rule := {\\n rules_from_group(\\\"ch8i4ug6lnn4g9hqv7m0\\\", \\\"dst\\\", \\\"accept\\\", \\\"\\\"),\\n rules_from_group(\\\"ch8i4ug6lnn4g9hqv7m0\\\", \\\"src\\\", \\\"accept\\\", \\\"\\\"),\\n }[_][_]\\n}\\n",
+ "rules": [
+ {
+ "id": "ch8i4ug6lnn4g9hqv7mg",
+ "name": "Default",
+ "description": "This is a default rule that allows connections between all the resources",
+ "enabled": true,
+ "sources": [
+ {
+ "id": "ch8i4ug6lnn4g9hqv7m0",
+ "name": "devs",
+ "peers_count": 2
+ }
+ ],
+ "destinations": [
+ {
+ "id": "ch8i4ug6lnn4g9hqv7m0",
+ "name": "devs",
+ "peers_count": 2
+ }
+ ],
+ "action": "accept"
+ }
+ ],
+ "id": "ch8i4ug6lnn4g9hqv7mg"
+ }
+]
+```
+```json {{ title: 'Schema' }}
+[
+ {
+ "name": "string",
+ "description": "string",
+ "enabled": "boolean",
+ "query": "string",
+ "rules": [
+ {
+ "id": "string",
+ "name": "string",
+ "description": "string",
+ "enabled": "boolean",
+ "sources": [
+ {
+ "id": "string",
+ "name": "string",
+ "peers_count": "integer"
+ }
+ ],
+ "destinations": [
+ {
+ "id": "string",
+ "name": "string",
+ "peers_count": "integer"
+ }
+ ],
+ "action": "string"
+ }
+ ],
+ "id": "string"
+ }
+]
+```
+
+
+
+
+
+
+
+
+
+---
+
+
+## Create a Policy {{ tag: 'POST' , label: '/api/policies' }}
+
+
+
+ Creates a Policy
+
+ #### Request-Body Parameters
+
+
+
+ Policy name identifier
+
+
+
+ Policy friendly description
+
+
+
+ Policy status
+
+
+
+ Policy Rego query
+
+
+
+ Policy rule object for policy UI editor
+
+
+
+
+
+
+```bash {{ title: 'cURL' }}
+curl -X POST https://api.netbird.io/api/policies \
+-H 'Accept: application/json' \
+-H 'Content-Type: application/json' \
+-H 'Authorization: Token ' \
+--data-raw '{
+ "name": "ch8i4ug6lnn4g9hqv7mg",
+ "description": "This is a default policy that allows connections between all the resources",
+ "enabled": true,
+ "query": "package netbird\\n\\nall[rule] {\\n is_peer_in_any_group([\\\"ch8i4ug6lnn4g9hqv7m0\\\",\\\"ch8i4ug6lnn4g9hqv7m0\\\"])\\n rule := {\\n rules_from_group(\\\"ch8i4ug6lnn4g9hqv7m0\\\", \\\"dst\\\", \\\"accept\\\", \\\"\\\"),\\n rules_from_group(\\\"ch8i4ug6lnn4g9hqv7m0\\\", \\\"src\\\", \\\"accept\\\", \\\"\\\"),\\n }[_][_]\\n}\\n",
+ "rules": [
+ {
+ "id": "ch8i4ug6lnn4g9hqv7mg",
+ "name": "Default",
+ "description": "This is a default rule that allows connections between all the resources",
+ "enabled": true,
+ "sources": [
+ {
+ "id": "ch8i4ug6lnn4g9hqv7m0",
+ "name": "devs",
+ "peers_count": 2
+ }
+ ],
+ "destinations": [
+ {
+ "id": "ch8i4ug6lnn4g9hqv7m0",
+ "name": "devs",
+ "peers_count": 2
+ }
+ ],
+ "action": "accept"
+ }
+ ]
+}'
+```
+
+```js
+const axios = require('axios');
+let data = JSON.stringify({
+ "name": "ch8i4ug6lnn4g9hqv7mg",
+ "description": "This is a default policy that allows connections between all the resources",
+ "enabled": true,
+ "query": "package netbird\\n\\nall[rule] {\\n is_peer_in_any_group([\\\"ch8i4ug6lnn4g9hqv7m0\\\",\\\"ch8i4ug6lnn4g9hqv7m0\\\"])\\n rule := {\\n rules_from_group(\\\"ch8i4ug6lnn4g9hqv7m0\\\", \\\"dst\\\", \\\"accept\\\", \\\"\\\"),\\n rules_from_group(\\\"ch8i4ug6lnn4g9hqv7m0\\\", \\\"src\\\", \\\"accept\\\", \\\"\\\"),\\n }[_][_]\\n}\\n",
+ "rules": [
+ {
+ "id": "ch8i4ug6lnn4g9hqv7mg",
+ "name": "Default",
+ "description": "This is a default rule that allows connections between all the resources",
+ "enabled": true,
+ "sources": [
+ {
+ "id": "ch8i4ug6lnn4g9hqv7m0",
+ "name": "devs",
+ "peers_count": 2
+ }
+ ],
+ "destinations": [
+ {
+ "id": "ch8i4ug6lnn4g9hqv7m0",
+ "name": "devs",
+ "peers_count": 2
+ }
+ ],
+ "action": "accept"
+ }
+ ]
+});
+let config = {
+ method: 'post',
+ maxBodyLength: Infinity,
+ url: '/api/policies',
+ headers: {
+ 'Accept': 'application/json',
+ 'Content-Type': 'application/json',
+ 'Authorization': 'Token '
+ },
+ data : data
+};
+
+axios(config)
+.then((response) => {
+ console.log(JSON.stringify(response.data));
+})
+.catch((error) => {
+ console.log(error);
+});
+```
+
+```python
+import requests
+import json
+
+url = "https://api.netbird.io/api/policies"
+payload = json.dumps({
+ "name": "ch8i4ug6lnn4g9hqv7mg",
+ "description": "This is a default policy that allows connections between all the resources",
+ "enabled": true,
+ "query": "package netbird\\n\\nall[rule] {\\n is_peer_in_any_group([\\\"ch8i4ug6lnn4g9hqv7m0\\\",\\\"ch8i4ug6lnn4g9hqv7m0\\\"])\\n rule := {\\n rules_from_group(\\\"ch8i4ug6lnn4g9hqv7m0\\\", \\\"dst\\\", \\\"accept\\\", \\\"\\\"),\\n rules_from_group(\\\"ch8i4ug6lnn4g9hqv7m0\\\", \\\"src\\\", \\\"accept\\\", \\\"\\\"),\\n }[_][_]\\n}\\n",
+ "rules": [
+ {
+ "id": "ch8i4ug6lnn4g9hqv7mg",
+ "name": "Default",
+ "description": "This is a default rule that allows connections between all the resources",
+ "enabled": true,
+ "sources": [
+ {
+ "id": "ch8i4ug6lnn4g9hqv7m0",
+ "name": "devs",
+ "peers_count": 2
+ }
+ ],
+ "destinations": [
+ {
+ "id": "ch8i4ug6lnn4g9hqv7m0",
+ "name": "devs",
+ "peers_count": 2
+ }
+ ],
+ "action": "accept"
+ }
+ ]
+})
+headers: {
+ 'Content-Type': 'application/json',
+ 'Accept': 'application/json',
+ 'Authorization': 'Token '
+}
+
+response = requests.request("POST", url, headers=headers, data=payload)
+
+print(response.text)
+```
+
+```go
+package main
+
+import (
+ "fmt"
+ "strings"
+ "net/http"
+ "io/ioutil"
+)
+
+func main() {
+
+ url := "https://api.netbird.io/api/policies"
+ method := "POST"
+
+ payload := strings.NewReader(`{
+ "name": "ch8i4ug6lnn4g9hqv7mg",
+ "description": "This is a default policy that allows connections between all the resources",
+ "enabled": true,
+ "query": "package netbird\\n\\nall[rule] {\\n is_peer_in_any_group([\\\"ch8i4ug6lnn4g9hqv7m0\\\",\\\"ch8i4ug6lnn4g9hqv7m0\\\"])\\n rule := {\\n rules_from_group(\\\"ch8i4ug6lnn4g9hqv7m0\\\", \\\"dst\\\", \\\"accept\\\", \\\"\\\"),\\n rules_from_group(\\\"ch8i4ug6lnn4g9hqv7m0\\\", \\\"src\\\", \\\"accept\\\", \\\"\\\"),\\n }[_][_]\\n}\\n",
+ "rules": [
+ {
+ "id": "ch8i4ug6lnn4g9hqv7mg",
+ "name": "Default",
+ "description": "This is a default rule that allows connections between all the resources",
+ "enabled": true,
+ "sources": [
+ {
+ "id": "ch8i4ug6lnn4g9hqv7m0",
+ "name": "devs",
+ "peers_count": 2
+ }
+ ],
+ "destinations": [
+ {
+ "id": "ch8i4ug6lnn4g9hqv7m0",
+ "name": "devs",
+ "peers_count": 2
+ }
+ ],
+ "action": "accept"
+ }
+ ]
+}`)
+ client := &http.Client {
+ }
+ req, err := http.NewRequest(method, url, payload)
+
+ if err != nil {
+ fmt.Println(err)
+ return
+ {
+
+ req.Header.Add("Content-Type", "application/json")
+ req.Header.Add("Accept", "application/json")
+ req.Header.Add("Authorization", "Token ")
+
+ res, err := client.Do(req)
+ if err != nil {
+ fmt.Println(err)
+ return
+ }
+ defer res.Body.Close()
+
+ body, err := ioutil.ReadAll(res.Body)
+ if err != nil {
+ fmt.Println(err)
+ return
+ }
+ fmt.Println(string(body))
+}
+```
+
+```ruby
+require "uri"
+require "json"
+require "net/http"
+
+url = URI("https://api.netbird.io/api/policies")
+
+https = Net::HTTP.new(url.host, url.port)
+https.use_ssl = true
+
+request = Net::HTTP::Post.new(url)
+request["Content-Type"] = "application/json"
+request["Accept"] = "application/json"
+request["Authorization"] = "Token "
+
+request.body = JSON.dump({
+ "name": "ch8i4ug6lnn4g9hqv7mg",
+ "description": "This is a default policy that allows connections between all the resources",
+ "enabled": true,
+ "query": "package netbird\\n\\nall[rule] {\\n is_peer_in_any_group([\\\"ch8i4ug6lnn4g9hqv7m0\\\",\\\"ch8i4ug6lnn4g9hqv7m0\\\"])\\n rule := {\\n rules_from_group(\\\"ch8i4ug6lnn4g9hqv7m0\\\", \\\"dst\\\", \\\"accept\\\", \\\"\\\"),\\n rules_from_group(\\\"ch8i4ug6lnn4g9hqv7m0\\\", \\\"src\\\", \\\"accept\\\", \\\"\\\"),\\n }[_][_]\\n}\\n",
+ "rules": [
+ {
+ "id": "ch8i4ug6lnn4g9hqv7mg",
+ "name": "Default",
+ "description": "This is a default rule that allows connections between all the resources",
+ "enabled": true,
+ "sources": [
+ {
+ "id": "ch8i4ug6lnn4g9hqv7m0",
+ "name": "devs",
+ "peers_count": 2
+ }
+ ],
+ "destinations": [
+ {
+ "id": "ch8i4ug6lnn4g9hqv7m0",
+ "name": "devs",
+ "peers_count": 2
+ }
+ ],
+ "action": "accept"
+ }
+ ]
+})
+response = https.request(request)
+puts response.read_body
+```
+
+```java
+OkHttpClient client = new OkHttpClient().newBuilder()
+ .build();
+MediaType mediaType = MediaType.parse("application/json");
+RequestBody body = RequestBody.create(mediaType, '{
+ "name": "ch8i4ug6lnn4g9hqv7mg",
+ "description": "This is a default policy that allows connections between all the resources",
+ "enabled": true,
+ "query": "package netbird\\n\\nall[rule] {\\n is_peer_in_any_group([\\\"ch8i4ug6lnn4g9hqv7m0\\\",\\\"ch8i4ug6lnn4g9hqv7m0\\\"])\\n rule := {\\n rules_from_group(\\\"ch8i4ug6lnn4g9hqv7m0\\\", \\\"dst\\\", \\\"accept\\\", \\\"\\\"),\\n rules_from_group(\\\"ch8i4ug6lnn4g9hqv7m0\\\", \\\"src\\\", \\\"accept\\\", \\\"\\\"),\\n }[_][_]\\n}\\n",
+ "rules": [
+ {
+ "id": "ch8i4ug6lnn4g9hqv7mg",
+ "name": "Default",
+ "description": "This is a default rule that allows connections between all the resources",
+ "enabled": true,
+ "sources": [
+ {
+ "id": "ch8i4ug6lnn4g9hqv7m0",
+ "name": "devs",
+ "peers_count": 2
+ }
+ ],
+ "destinations": [
+ {
+ "id": "ch8i4ug6lnn4g9hqv7m0",
+ "name": "devs",
+ "peers_count": 2
+ }
+ ],
+ "action": "accept"
+ }
+ ]
+}');
+Request request = new Request.Builder()
+ .url("https://api.netbird.io/api/policies")
+ .method("POST", body)
+ .addHeader("Content-Type", "application/json")
+ .addHeader("Accept", "application/json")
+ .addHeader("Authorization: Token ")
+ .build();
+Response response = client.newCall(request).execute();
+```
+
+```php
+ 'https://api.netbird.io/api/policies',
+ CURLOPT_RETURNTRANSFER => true,
+ CURLOPT_ENCODING => '',
+ CURLOPT_MAXREDIRS => 10,
+ CURLOPT_TIMEOUT => 0,
+ CURLOPT_FOLLOWLOCATION => true,
+ CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
+ CURLOPT_CUSTOMREQUEST => 'POST',
+ CURLOPT_POSTFIELDS => '{
+ "name": "ch8i4ug6lnn4g9hqv7mg",
+ "description": "This is a default policy that allows connections between all the resources",
+ "enabled": true,
+ "query": "package netbird\\n\\nall[rule] {\\n is_peer_in_any_group([\\\"ch8i4ug6lnn4g9hqv7m0\\\",\\\"ch8i4ug6lnn4g9hqv7m0\\\"])\\n rule := {\\n rules_from_group(\\\"ch8i4ug6lnn4g9hqv7m0\\\", \\\"dst\\\", \\\"accept\\\", \\\"\\\"),\\n rules_from_group(\\\"ch8i4ug6lnn4g9hqv7m0\\\", \\\"src\\\", \\\"accept\\\", \\\"\\\"),\\n }[_][_]\\n}\\n",
+ "rules": [
+ {
+ "id": "ch8i4ug6lnn4g9hqv7mg",
+ "name": "Default",
+ "description": "This is a default rule that allows connections between all the resources",
+ "enabled": true,
+ "sources": [
+ {
+ "id": "ch8i4ug6lnn4g9hqv7m0",
+ "name": "devs",
+ "peers_count": 2
+ }
+ ],
+ "destinations": [
+ {
+ "id": "ch8i4ug6lnn4g9hqv7m0",
+ "name": "devs",
+ "peers_count": 2
+ }
+ ],
+ "action": "accept"
+ }
+ ]
+}',
+ CURLOPT_HTTPHEADER => array(
+ 'Content-Type: application/json',
+ 'Accept: application/json',
+ 'Authorization: Token '
+ ),
+));
+
+$response = curl_exec($curl);
+
+curl_close($curl);
+echo $response;
+```
+
+
+
+
+
+
+```json {{ title: 'Example' }}
+{
+ "name": "ch8i4ug6lnn4g9hqv7mg",
+ "description": "This is a default policy that allows connections between all the resources",
+ "enabled": true,
+ "query": "package netbird\\n\\nall[rule] {\\n is_peer_in_any_group([\\\"ch8i4ug6lnn4g9hqv7m0\\\",\\\"ch8i4ug6lnn4g9hqv7m0\\\"])\\n rule := {\\n rules_from_group(\\\"ch8i4ug6lnn4g9hqv7m0\\\", \\\"dst\\\", \\\"accept\\\", \\\"\\\"),\\n rules_from_group(\\\"ch8i4ug6lnn4g9hqv7m0\\\", \\\"src\\\", \\\"accept\\\", \\\"\\\"),\\n }[_][_]\\n}\\n",
+ "rules": [
+ {
+ "id": "ch8i4ug6lnn4g9hqv7mg",
+ "name": "Default",
+ "description": "This is a default rule that allows connections between all the resources",
+ "enabled": true,
+ "sources": [
+ {
+ "id": "ch8i4ug6lnn4g9hqv7m0",
+ "name": "devs",
+ "peers_count": 2
+ }
+ ],
+ "destinations": [
+ {
+ "id": "ch8i4ug6lnn4g9hqv7m0",
+ "name": "devs",
+ "peers_count": 2
+ }
+ ],
+ "action": "accept"
+ }
+ ],
+ "id": "ch8i4ug6lnn4g9hqv7mg"
+}
+```
+```json {{ title: 'Schema' }}
+{
+ "name": "string",
+ "description": "string",
+ "enabled": "boolean",
+ "query": "string",
+ "rules": [
+ {
+ "id": "string",
+ "name": "string",
+ "description": "string",
+ "enabled": "boolean",
+ "sources": [
+ {
+ "id": "string",
+ "name": "string",
+ "peers_count": "integer"
+ }
+ ],
+ "destinations": [
+ {
+ "id": "string",
+ "name": "string",
+ "peers_count": "integer"
+ }
+ ],
+ "action": "string"
+ }
+ ],
+ "id": "string"
+}
+```
+
+
+
+
+
+---
+
+
+## Retrieve a Policy {{ tag: 'GET' , label: '/api/policies/{policyId}' }}
+
+
+
+ Get information about a Policies
+
+ #### Path Parameters
+
+
+
+ The unique identifier of a policy
+
+
+
+
+
+
+```bash {{ title: 'cURL' }}
+curl -X GET https://api.netbird.io/api/policies/{policyId} \
+-H 'Accept: application/json' \
+-H 'Authorization: Token '
+```
+
+```js
+const axios = require('axios');
+
+let config = {
+ method: 'get',
+ maxBodyLength: Infinity,
+ url: '/api/policies/{policyId}',
+ headers: {
+ 'Accept': 'application/json',
+ 'Authorization': 'Token '
+ }
+};
+
+axios(config)
+.then((response) => {
+ console.log(JSON.stringify(response.data));
+})
+.catch((error) => {
+ console.log(error);
+});
+```
+
+```python
+import requests
+import json
+
+url = "https://api.netbird.io/api/policies/{policyId}"
+
+headers: {
+ 'Accept': 'application/json',
+ 'Authorization': 'Token '
+}
+
+response = requests.request("GET", url, headers=headers)
+
+print(response.text)
+```
+
+```go
+package main
+
+import (
+ "fmt"
+ "strings"
+ "net/http"
+ "io/ioutil"
+)
+
+func main() {
+
+ url := "https://api.netbird.io/api/policies/{policyId}"
+ method := "GET"
+
+ client := &http.Client {
+ }
+ req, err := http.NewRequest(method, url, nil)
+
+ if err != nil {
+ fmt.Println(err)
+ return
+ {
+
+ req.Header.Add("Accept", "application/json")
+ req.Header.Add("Authorization", "Token ")
+
+ res, err := client.Do(req)
+ if err != nil {
+ fmt.Println(err)
+ return
+ }
+ defer res.Body.Close()
+
+ body, err := ioutil.ReadAll(res.Body)
+ if err != nil {
+ fmt.Println(err)
+ return
+ }
+ fmt.Println(string(body))
+}
+```
+
+```ruby
+require "uri"
+require "json"
+require "net/http"
+
+url = URI("https://api.netbird.io/api/policies/{policyId}")
+
+https = Net::HTTP.new(url.host, url.port)
+https.use_ssl = true
+
+request = Net::HTTP::Get.new(url)
+request["Accept"] = "application/json"
+request["Authorization"] = "Token "
+
+response = https.request(request)
+puts response.read_body
+```
+
+```java
+OkHttpClient client = new OkHttpClient().newBuilder()
+ .build();
+
+Request request = new Request.Builder()
+ .url("https://api.netbird.io/api/policies/{policyId}")
+ .method("GET")
+ .addHeader("Accept", "application/json")
+ .addHeader("Authorization: Token ")
+ .build();
+Response response = client.newCall(request).execute();
+```
+
+```php
+ 'https://api.netbird.io/api/policies/{policyId}',
+ CURLOPT_RETURNTRANSFER => true,
+ CURLOPT_ENCODING => '',
+ CURLOPT_MAXREDIRS => 10,
+ CURLOPT_TIMEOUT => 0,
+ CURLOPT_FOLLOWLOCATION => true,
+ CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
+ CURLOPT_CUSTOMREQUEST => 'GET',
+ CURLOPT_HTTPHEADER => array(
+ 'Accept: application/json',
+ 'Authorization: Token '
+ ),
+));
+
+$response = curl_exec($curl);
+
+curl_close($curl);
+echo $response;
+```
+
+
+
+
+
+
+```json {{ title: 'Example' }}
+{
+ "name": "ch8i4ug6lnn4g9hqv7mg",
+ "description": "This is a default policy that allows connections between all the resources",
+ "enabled": true,
+ "query": "package netbird\\n\\nall[rule] {\\n is_peer_in_any_group([\\\"ch8i4ug6lnn4g9hqv7m0\\\",\\\"ch8i4ug6lnn4g9hqv7m0\\\"])\\n rule := {\\n rules_from_group(\\\"ch8i4ug6lnn4g9hqv7m0\\\", \\\"dst\\\", \\\"accept\\\", \\\"\\\"),\\n rules_from_group(\\\"ch8i4ug6lnn4g9hqv7m0\\\", \\\"src\\\", \\\"accept\\\", \\\"\\\"),\\n }[_][_]\\n}\\n",
+ "rules": [
+ {
+ "id": "ch8i4ug6lnn4g9hqv7mg",
+ "name": "Default",
+ "description": "This is a default rule that allows connections between all the resources",
+ "enabled": true,
+ "sources": [
+ {
+ "id": "ch8i4ug6lnn4g9hqv7m0",
+ "name": "devs",
+ "peers_count": 2
+ }
+ ],
+ "destinations": [
+ {
+ "id": "ch8i4ug6lnn4g9hqv7m0",
+ "name": "devs",
+ "peers_count": 2
+ }
+ ],
+ "action": "accept"
+ }
+ ],
+ "id": "ch8i4ug6lnn4g9hqv7mg"
+}
+```
+```json {{ title: 'Schema' }}
+{
+ "name": "string",
+ "description": "string",
+ "enabled": "boolean",
+ "query": "string",
+ "rules": [
+ {
+ "id": "string",
+ "name": "string",
+ "description": "string",
+ "enabled": "boolean",
+ "sources": [
+ {
+ "id": "string",
+ "name": "string",
+ "peers_count": "integer"
+ }
+ ],
+ "destinations": [
+ {
+ "id": "string",
+ "name": "string",
+ "peers_count": "integer"
+ }
+ ],
+ "action": "string"
+ }
+ ],
+ "id": "string"
+}
+```
+
+
+
+
+
+
+
+
+
+---
+
+
+## Update a Policy {{ tag: 'PUT' , label: '/api/policies/{policyId}' }}
+
+
+
+ Update/Replace a Policy
+
+ #### Path Parameters
+
+
+
+ The unique identifier of a policy
+
+
+
+ #### Request-Body Parameters
+
+
+
+ Policy name identifier
+
+
+
+ Policy friendly description
+
+
+
+ Policy status
+
+
+
+ Policy Rego query
+
+
+
+ Policy rule object for policy UI editor
+
+
+
+
+
+
+```bash {{ title: 'cURL' }}
+curl -X PUT https://api.netbird.io/api/policies/{policyId} \
+-H 'Accept: application/json' \
+-H 'Content-Type: application/json' \
+-H 'Authorization: Token ' \
+--data-raw '{
+ "name": "ch8i4ug6lnn4g9hqv7mg",
+ "description": "This is a default policy that allows connections between all the resources",
+ "enabled": true,
+ "query": "package netbird\\n\\nall[rule] {\\n is_peer_in_any_group([\\\"ch8i4ug6lnn4g9hqv7m0\\\",\\\"ch8i4ug6lnn4g9hqv7m0\\\"])\\n rule := {\\n rules_from_group(\\\"ch8i4ug6lnn4g9hqv7m0\\\", \\\"dst\\\", \\\"accept\\\", \\\"\\\"),\\n rules_from_group(\\\"ch8i4ug6lnn4g9hqv7m0\\\", \\\"src\\\", \\\"accept\\\", \\\"\\\"),\\n }[_][_]\\n}\\n",
+ "rules": [
+ {
+ "id": "ch8i4ug6lnn4g9hqv7mg",
+ "name": "Default",
+ "description": "This is a default rule that allows connections between all the resources",
+ "enabled": true,
+ "sources": [
+ {
+ "id": "ch8i4ug6lnn4g9hqv7m0",
+ "name": "devs",
+ "peers_count": 2
+ }
+ ],
+ "destinations": [
+ {
+ "id": "ch8i4ug6lnn4g9hqv7m0",
+ "name": "devs",
+ "peers_count": 2
+ }
+ ],
+ "action": "accept"
+ }
+ ]
+}'
+```
+
+```js
+const axios = require('axios');
+let data = JSON.stringify({
+ "name": "ch8i4ug6lnn4g9hqv7mg",
+ "description": "This is a default policy that allows connections between all the resources",
+ "enabled": true,
+ "query": "package netbird\\n\\nall[rule] {\\n is_peer_in_any_group([\\\"ch8i4ug6lnn4g9hqv7m0\\\",\\\"ch8i4ug6lnn4g9hqv7m0\\\"])\\n rule := {\\n rules_from_group(\\\"ch8i4ug6lnn4g9hqv7m0\\\", \\\"dst\\\", \\\"accept\\\", \\\"\\\"),\\n rules_from_group(\\\"ch8i4ug6lnn4g9hqv7m0\\\", \\\"src\\\", \\\"accept\\\", \\\"\\\"),\\n }[_][_]\\n}\\n",
+ "rules": [
+ {
+ "id": "ch8i4ug6lnn4g9hqv7mg",
+ "name": "Default",
+ "description": "This is a default rule that allows connections between all the resources",
+ "enabled": true,
+ "sources": [
+ {
+ "id": "ch8i4ug6lnn4g9hqv7m0",
+ "name": "devs",
+ "peers_count": 2
+ }
+ ],
+ "destinations": [
+ {
+ "id": "ch8i4ug6lnn4g9hqv7m0",
+ "name": "devs",
+ "peers_count": 2
+ }
+ ],
+ "action": "accept"
+ }
+ ]
+});
+let config = {
+ method: 'put',
+ maxBodyLength: Infinity,
+ url: '/api/policies/{policyId}',
+ headers: {
+ 'Accept': 'application/json',
+ 'Content-Type': 'application/json',
+ 'Authorization': 'Token '
+ },
+ data : data
+};
+
+axios(config)
+.then((response) => {
+ console.log(JSON.stringify(response.data));
+})
+.catch((error) => {
+ console.log(error);
+});
+```
+
+```python
+import requests
+import json
+
+url = "https://api.netbird.io/api/policies/{policyId}"
+payload = json.dumps({
+ "name": "ch8i4ug6lnn4g9hqv7mg",
+ "description": "This is a default policy that allows connections between all the resources",
+ "enabled": true,
+ "query": "package netbird\\n\\nall[rule] {\\n is_peer_in_any_group([\\\"ch8i4ug6lnn4g9hqv7m0\\\",\\\"ch8i4ug6lnn4g9hqv7m0\\\"])\\n rule := {\\n rules_from_group(\\\"ch8i4ug6lnn4g9hqv7m0\\\", \\\"dst\\\", \\\"accept\\\", \\\"\\\"),\\n rules_from_group(\\\"ch8i4ug6lnn4g9hqv7m0\\\", \\\"src\\\", \\\"accept\\\", \\\"\\\"),\\n }[_][_]\\n}\\n",
+ "rules": [
+ {
+ "id": "ch8i4ug6lnn4g9hqv7mg",
+ "name": "Default",
+ "description": "This is a default rule that allows connections between all the resources",
+ "enabled": true,
+ "sources": [
+ {
+ "id": "ch8i4ug6lnn4g9hqv7m0",
+ "name": "devs",
+ "peers_count": 2
+ }
+ ],
+ "destinations": [
+ {
+ "id": "ch8i4ug6lnn4g9hqv7m0",
+ "name": "devs",
+ "peers_count": 2
+ }
+ ],
+ "action": "accept"
+ }
+ ]
+})
+headers: {
+ 'Content-Type': 'application/json',
+ 'Accept': 'application/json',
+ 'Authorization': 'Token '
+}
+
+response = requests.request("PUT", url, headers=headers, data=payload)
+
+print(response.text)
+```
+
+```go
+package main
+
+import (
+ "fmt"
+ "strings"
+ "net/http"
+ "io/ioutil"
+)
+
+func main() {
+
+ url := "https://api.netbird.io/api/policies/{policyId}"
+ method := "PUT"
+
+ payload := strings.NewReader(`{
+ "name": "ch8i4ug6lnn4g9hqv7mg",
+ "description": "This is a default policy that allows connections between all the resources",
+ "enabled": true,
+ "query": "package netbird\\n\\nall[rule] {\\n is_peer_in_any_group([\\\"ch8i4ug6lnn4g9hqv7m0\\\",\\\"ch8i4ug6lnn4g9hqv7m0\\\"])\\n rule := {\\n rules_from_group(\\\"ch8i4ug6lnn4g9hqv7m0\\\", \\\"dst\\\", \\\"accept\\\", \\\"\\\"),\\n rules_from_group(\\\"ch8i4ug6lnn4g9hqv7m0\\\", \\\"src\\\", \\\"accept\\\", \\\"\\\"),\\n }[_][_]\\n}\\n",
+ "rules": [
+ {
+ "id": "ch8i4ug6lnn4g9hqv7mg",
+ "name": "Default",
+ "description": "This is a default rule that allows connections between all the resources",
+ "enabled": true,
+ "sources": [
+ {
+ "id": "ch8i4ug6lnn4g9hqv7m0",
+ "name": "devs",
+ "peers_count": 2
+ }
+ ],
+ "destinations": [
+ {
+ "id": "ch8i4ug6lnn4g9hqv7m0",
+ "name": "devs",
+ "peers_count": 2
+ }
+ ],
+ "action": "accept"
+ }
+ ]
+}`)
+ client := &http.Client {
+ }
+ req, err := http.NewRequest(method, url, payload)
+
+ if err != nil {
+ fmt.Println(err)
+ return
+ {
+
+ req.Header.Add("Content-Type", "application/json")
+ req.Header.Add("Accept", "application/json")
+ req.Header.Add("Authorization", "Token ")
+
+ res, err := client.Do(req)
+ if err != nil {
+ fmt.Println(err)
+ return
+ }
+ defer res.Body.Close()
+
+ body, err := ioutil.ReadAll(res.Body)
+ if err != nil {
+ fmt.Println(err)
+ return
+ }
+ fmt.Println(string(body))
+}
+```
+
+```ruby
+require "uri"
+require "json"
+require "net/http"
+
+url = URI("https://api.netbird.io/api/policies/{policyId}")
+
+https = Net::HTTP.new(url.host, url.port)
+https.use_ssl = true
+
+request = Net::HTTP::Put.new(url)
+request["Content-Type"] = "application/json"
+request["Accept"] = "application/json"
+request["Authorization"] = "Token "
+
+request.body = JSON.dump({
+ "name": "ch8i4ug6lnn4g9hqv7mg",
+ "description": "This is a default policy that allows connections between all the resources",
+ "enabled": true,
+ "query": "package netbird\\n\\nall[rule] {\\n is_peer_in_any_group([\\\"ch8i4ug6lnn4g9hqv7m0\\\",\\\"ch8i4ug6lnn4g9hqv7m0\\\"])\\n rule := {\\n rules_from_group(\\\"ch8i4ug6lnn4g9hqv7m0\\\", \\\"dst\\\", \\\"accept\\\", \\\"\\\"),\\n rules_from_group(\\\"ch8i4ug6lnn4g9hqv7m0\\\", \\\"src\\\", \\\"accept\\\", \\\"\\\"),\\n }[_][_]\\n}\\n",
+ "rules": [
+ {
+ "id": "ch8i4ug6lnn4g9hqv7mg",
+ "name": "Default",
+ "description": "This is a default rule that allows connections between all the resources",
+ "enabled": true,
+ "sources": [
+ {
+ "id": "ch8i4ug6lnn4g9hqv7m0",
+ "name": "devs",
+ "peers_count": 2
+ }
+ ],
+ "destinations": [
+ {
+ "id": "ch8i4ug6lnn4g9hqv7m0",
+ "name": "devs",
+ "peers_count": 2
+ }
+ ],
+ "action": "accept"
+ }
+ ]
+})
+response = https.request(request)
+puts response.read_body
+```
+
+```java
+OkHttpClient client = new OkHttpClient().newBuilder()
+ .build();
+MediaType mediaType = MediaType.parse("application/json");
+RequestBody body = RequestBody.create(mediaType, '{
+ "name": "ch8i4ug6lnn4g9hqv7mg",
+ "description": "This is a default policy that allows connections between all the resources",
+ "enabled": true,
+ "query": "package netbird\\n\\nall[rule] {\\n is_peer_in_any_group([\\\"ch8i4ug6lnn4g9hqv7m0\\\",\\\"ch8i4ug6lnn4g9hqv7m0\\\"])\\n rule := {\\n rules_from_group(\\\"ch8i4ug6lnn4g9hqv7m0\\\", \\\"dst\\\", \\\"accept\\\", \\\"\\\"),\\n rules_from_group(\\\"ch8i4ug6lnn4g9hqv7m0\\\", \\\"src\\\", \\\"accept\\\", \\\"\\\"),\\n }[_][_]\\n}\\n",
+ "rules": [
+ {
+ "id": "ch8i4ug6lnn4g9hqv7mg",
+ "name": "Default",
+ "description": "This is a default rule that allows connections between all the resources",
+ "enabled": true,
+ "sources": [
+ {
+ "id": "ch8i4ug6lnn4g9hqv7m0",
+ "name": "devs",
+ "peers_count": 2
+ }
+ ],
+ "destinations": [
+ {
+ "id": "ch8i4ug6lnn4g9hqv7m0",
+ "name": "devs",
+ "peers_count": 2
+ }
+ ],
+ "action": "accept"
+ }
+ ]
+}');
+Request request = new Request.Builder()
+ .url("https://api.netbird.io/api/policies/{policyId}")
+ .method("PUT", body)
+ .addHeader("Content-Type", "application/json")
+ .addHeader("Accept", "application/json")
+ .addHeader("Authorization: Token ")
+ .build();
+Response response = client.newCall(request).execute();
+```
+
+```php
+ 'https://api.netbird.io/api/policies/{policyId}',
+ CURLOPT_RETURNTRANSFER => true,
+ CURLOPT_ENCODING => '',
+ CURLOPT_MAXREDIRS => 10,
+ CURLOPT_TIMEOUT => 0,
+ CURLOPT_FOLLOWLOCATION => true,
+ CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
+ CURLOPT_CUSTOMREQUEST => 'PUT',
+ CURLOPT_POSTFIELDS => '{
+ "name": "ch8i4ug6lnn4g9hqv7mg",
+ "description": "This is a default policy that allows connections between all the resources",
+ "enabled": true,
+ "query": "package netbird\\n\\nall[rule] {\\n is_peer_in_any_group([\\\"ch8i4ug6lnn4g9hqv7m0\\\",\\\"ch8i4ug6lnn4g9hqv7m0\\\"])\\n rule := {\\n rules_from_group(\\\"ch8i4ug6lnn4g9hqv7m0\\\", \\\"dst\\\", \\\"accept\\\", \\\"\\\"),\\n rules_from_group(\\\"ch8i4ug6lnn4g9hqv7m0\\\", \\\"src\\\", \\\"accept\\\", \\\"\\\"),\\n }[_][_]\\n}\\n",
+ "rules": [
+ {
+ "id": "ch8i4ug6lnn4g9hqv7mg",
+ "name": "Default",
+ "description": "This is a default rule that allows connections between all the resources",
+ "enabled": true,
+ "sources": [
+ {
+ "id": "ch8i4ug6lnn4g9hqv7m0",
+ "name": "devs",
+ "peers_count": 2
+ }
+ ],
+ "destinations": [
+ {
+ "id": "ch8i4ug6lnn4g9hqv7m0",
+ "name": "devs",
+ "peers_count": 2
+ }
+ ],
+ "action": "accept"
+ }
+ ]
+}',
+ CURLOPT_HTTPHEADER => array(
+ 'Content-Type: application/json',
+ 'Accept: application/json',
+ 'Authorization: Token '
+ ),
+));
+
+$response = curl_exec($curl);
+
+curl_close($curl);
+echo $response;
+```
+
+
+
+
+
+
+```json {{ title: 'Example' }}
+{
+ "name": "ch8i4ug6lnn4g9hqv7mg",
+ "description": "This is a default policy that allows connections between all the resources",
+ "enabled": true,
+ "query": "package netbird\\n\\nall[rule] {\\n is_peer_in_any_group([\\\"ch8i4ug6lnn4g9hqv7m0\\\",\\\"ch8i4ug6lnn4g9hqv7m0\\\"])\\n rule := {\\n rules_from_group(\\\"ch8i4ug6lnn4g9hqv7m0\\\", \\\"dst\\\", \\\"accept\\\", \\\"\\\"),\\n rules_from_group(\\\"ch8i4ug6lnn4g9hqv7m0\\\", \\\"src\\\", \\\"accept\\\", \\\"\\\"),\\n }[_][_]\\n}\\n",
+ "rules": [
+ {
+ "id": "ch8i4ug6lnn4g9hqv7mg",
+ "name": "Default",
+ "description": "This is a default rule that allows connections between all the resources",
+ "enabled": true,
+ "sources": [
+ {
+ "id": "ch8i4ug6lnn4g9hqv7m0",
+ "name": "devs",
+ "peers_count": 2
+ }
+ ],
+ "destinations": [
+ {
+ "id": "ch8i4ug6lnn4g9hqv7m0",
+ "name": "devs",
+ "peers_count": 2
+ }
+ ],
+ "action": "accept"
+ }
+ ],
+ "id": "ch8i4ug6lnn4g9hqv7mg"
+}
+```
+```json {{ title: 'Schema' }}
+{
+ "name": "string",
+ "description": "string",
+ "enabled": "boolean",
+ "query": "string",
+ "rules": [
+ {
+ "id": "string",
+ "name": "string",
+ "description": "string",
+ "enabled": "boolean",
+ "sources": [
+ {
+ "id": "string",
+ "name": "string",
+ "peers_count": "integer"
+ }
+ ],
+ "destinations": [
+ {
+ "id": "string",
+ "name": "string",
+ "peers_count": "integer"
+ }
+ ],
+ "action": "string"
+ }
+ ],
+ "id": "string"
+}
+```
+
+
+
+
+
+
+
+
+
+---
+
+
+## Delete a Policy {{ tag: 'DELETE' , label: '/api/policies/{policyId}' }}
+
+
+
+ Delete a Policy
+
+ #### Path Parameters
+
+
+
+ The unique identifier of a policy
+
+
+
+
+
+
+```bash {{ title: 'cURL' }}
+curl -X DELETE https://api.netbird.io/api/policies/{policyId} \
+-H 'Authorization: Token '
+```
+
+```js
+const axios = require('axios');
+
+let config = {
+ method: 'delete',
+ maxBodyLength: Infinity,
+ url: '/api/policies/{policyId}',
+ headers: {
+ 'Authorization': 'Token '
+ }
+};
+
+axios(config)
+.then((response) => {
+ console.log(JSON.stringify(response.data));
+})
+.catch((error) => {
+ console.log(error);
+});
+```
+
+```python
+import requests
+import json
+
+url = "https://api.netbird.io/api/policies/{policyId}"
+
+headers: {
+ 'Authorization': 'Token '
+}
+
+response = requests.request("DELETE", url, headers=headers)
+
+print(response.text)
+```
+
+```go
+package main
+
+import (
+ "fmt"
+ "strings"
+ "net/http"
+ "io/ioutil"
+)
+
+func main() {
+
+ url := "https://api.netbird.io/api/policies/{policyId}"
+ method := "DELETE"
+
+ client := &http.Client {
+ }
+ req, err := http.NewRequest(method, url, nil)
+
+ if err != nil {
+ fmt.Println(err)
+ return
+ {
+
+ req.Header.Add("Authorization", "Token ")
+
+ res, err := client.Do(req)
+ if err != nil {
+ fmt.Println(err)
+ return
+ }
+ defer res.Body.Close()
+
+ body, err := ioutil.ReadAll(res.Body)
+ if err != nil {
+ fmt.Println(err)
+ return
+ }
+ fmt.Println(string(body))
+}
+```
+
+```ruby
+require "uri"
+require "json"
+require "net/http"
+
+url = URI("https://api.netbird.io/api/policies/{policyId}")
+
+https = Net::HTTP.new(url.host, url.port)
+https.use_ssl = true
+
+request = Net::HTTP::Delete.new(url)
+request["Authorization"] = "Token "
+
+response = https.request(request)
+puts response.read_body
+```
+
+```java
+OkHttpClient client = new OkHttpClient().newBuilder()
+ .build();
+
+Request request = new Request.Builder()
+ .url("https://api.netbird.io/api/policies/{policyId}")
+ .method("DELETE")
+ .addHeader("Authorization: Token ")
+ .build();
+Response response = client.newCall(request).execute();
+```
+
+```php
+ 'https://api.netbird.io/api/policies/{policyId}',
+ CURLOPT_RETURNTRANSFER => true,
+ CURLOPT_ENCODING => '',
+ CURLOPT_MAXREDIRS => 10,
+ CURLOPT_TIMEOUT => 0,
+ CURLOPT_FOLLOWLOCATION => true,
+ CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
+ CURLOPT_CUSTOMREQUEST => 'DELETE',
+ CURLOPT_HTTPHEADER => array(
+ 'Authorization: Token '
+ ),
+));
+
+$response = curl_exec($curl);
+
+curl_close($curl);
+echo $response;
+```
+
+
+
+
+
+
+
+
+
+
+---
diff --git a/src/pages/ipa/resources/routes.mdx b/src/pages/ipa/resources/routes.mdx
new file mode 100644
index 00000000..e032eb84
--- /dev/null
+++ b/src/pages/ipa/resources/routes.mdx
@@ -0,0 +1,1313 @@
+
+export const title = 'Routes'
+
+
+
+## List all Routes {{ tag: 'GET' , label: '/api/routes' }}
+
+
+
+ Returns a list of all routes
+
+
+
+
+```bash {{ title: 'cURL' }}
+curl -X GET https://api.netbird.io/api/routes \
+-H 'Accept: application/json' \
+-H 'Authorization: Token '
+```
+
+```js
+const axios = require('axios');
+
+let config = {
+ method: 'get',
+ maxBodyLength: Infinity,
+ url: '/api/routes',
+ headers: {
+ 'Accept': 'application/json',
+ 'Authorization': 'Token '
+ }
+};
+
+axios(config)
+.then((response) => {
+ console.log(JSON.stringify(response.data));
+})
+.catch((error) => {
+ console.log(error);
+});
+```
+
+```python
+import requests
+import json
+
+url = "https://api.netbird.io/api/routes"
+
+headers: {
+ 'Accept': 'application/json',
+ 'Authorization': 'Token '
+}
+
+response = requests.request("GET", url, headers=headers)
+
+print(response.text)
+```
+
+```go
+package main
+
+import (
+ "fmt"
+ "strings"
+ "net/http"
+ "io/ioutil"
+)
+
+func main() {
+
+ url := "https://api.netbird.io/api/routes"
+ method := "GET"
+
+ client := &http.Client {
+ }
+ req, err := http.NewRequest(method, url, nil)
+
+ if err != nil {
+ fmt.Println(err)
+ return
+ {
+
+ req.Header.Add("Accept", "application/json")
+ req.Header.Add("Authorization", "Token ")
+
+ res, err := client.Do(req)
+ if err != nil {
+ fmt.Println(err)
+ return
+ }
+ defer res.Body.Close()
+
+ body, err := ioutil.ReadAll(res.Body)
+ if err != nil {
+ fmt.Println(err)
+ return
+ }
+ fmt.Println(string(body))
+}
+```
+
+```ruby
+require "uri"
+require "json"
+require "net/http"
+
+url = URI("https://api.netbird.io/api/routes")
+
+https = Net::HTTP.new(url.host, url.port)
+https.use_ssl = true
+
+request = Net::HTTP::Get.new(url)
+request["Accept"] = "application/json"
+request["Authorization"] = "Token "
+
+response = https.request(request)
+puts response.read_body
+```
+
+```java
+OkHttpClient client = new OkHttpClient().newBuilder()
+ .build();
+
+Request request = new Request.Builder()
+ .url("https://api.netbird.io/api/routes")
+ .method("GET")
+ .addHeader("Accept", "application/json")
+ .addHeader("Authorization: Token ")
+ .build();
+Response response = client.newCall(request).execute();
+```
+
+```php
+ 'https://api.netbird.io/api/routes',
+ CURLOPT_RETURNTRANSFER => true,
+ CURLOPT_ENCODING => '',
+ CURLOPT_MAXREDIRS => 10,
+ CURLOPT_TIMEOUT => 0,
+ CURLOPT_FOLLOWLOCATION => true,
+ CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
+ CURLOPT_CUSTOMREQUEST => 'GET',
+ CURLOPT_HTTPHEADER => array(
+ 'Accept: application/json',
+ 'Authorization: Token '
+ ),
+));
+
+$response = curl_exec($curl);
+
+curl_close($curl);
+echo $response;
+```
+
+
+
+
+
+
+```json {{ title: 'Example' }}
+[
+ {
+ "id": "chacdk86lnnboviihd7g",
+ "network_type": "IPv4",
+ "description": "My first route",
+ "network_id": "Route 1",
+ "enabled": true,
+ "peer": "chacbco6lnnbn6cg5s91",
+ "network": "10.64.0.0/24",
+ "metric": 9999,
+ "masquerade": true,
+ "groups": [
+ "chacdk86lnnboviihd70"
+ ]
+ }
+]
+```
+```json {{ title: 'Schema' }}
+[
+ {
+ "id": "string",
+ "network_type": "string",
+ "description": "string",
+ "network_id": "string",
+ "enabled": "boolean",
+ "peer": "string",
+ "network": "string",
+ "metric": "integer",
+ "masquerade": "boolean",
+ "groups": [
+ "string"
+ ]
+ }
+]
+```
+
+
+
+
+
+
+
+
+
+---
+
+
+## Create a Route {{ tag: 'POST' , label: '/api/routes' }}
+
+
+
+ Creates a Route
+
+ #### Request-Body Parameters
+
+
+
+ Route description
+
+
+
+ Route network identifier, to group HA routes
+
+
+
+ Route status
+
+
+
+ Peer Identifier associated with route
+
+
+
+ Network range in CIDR format
+
+
+
+ Route metric number. Lowest number has higher priority
+
+
+
+ Indicate if peer should masquerade traffic to this route's prefix
+
+
+
+ Route group tag groups
+
+
+
+
+
+
+```bash {{ title: 'cURL' }}
+curl -X POST https://api.netbird.io/api/routes \
+-H 'Accept: application/json' \
+-H 'Content-Type: application/json' \
+-H 'Authorization: Token ' \
+--data-raw '{
+ "description": "My first route",
+ "network_id": "Route 1",
+ "enabled": true,
+ "peer": "chacbco6lnnbn6cg5s91",
+ "network": "10.64.0.0/24",
+ "metric": 9999,
+ "masquerade": true,
+ "groups": [
+ "chacdk86lnnboviihd70"
+ ]
+}'
+```
+
+```js
+const axios = require('axios');
+let data = JSON.stringify({
+ "description": "My first route",
+ "network_id": "Route 1",
+ "enabled": true,
+ "peer": "chacbco6lnnbn6cg5s91",
+ "network": "10.64.0.0/24",
+ "metric": 9999,
+ "masquerade": true,
+ "groups": [
+ "chacdk86lnnboviihd70"
+ ]
+});
+let config = {
+ method: 'post',
+ maxBodyLength: Infinity,
+ url: '/api/routes',
+ headers: {
+ 'Accept': 'application/json',
+ 'Content-Type': 'application/json',
+ 'Authorization': 'Token '
+ },
+ data : data
+};
+
+axios(config)
+.then((response) => {
+ console.log(JSON.stringify(response.data));
+})
+.catch((error) => {
+ console.log(error);
+});
+```
+
+```python
+import requests
+import json
+
+url = "https://api.netbird.io/api/routes"
+payload = json.dumps({
+ "description": "My first route",
+ "network_id": "Route 1",
+ "enabled": true,
+ "peer": "chacbco6lnnbn6cg5s91",
+ "network": "10.64.0.0/24",
+ "metric": 9999,
+ "masquerade": true,
+ "groups": [
+ "chacdk86lnnboviihd70"
+ ]
+})
+headers: {
+ 'Content-Type': 'application/json',
+ 'Accept': 'application/json',
+ 'Authorization': 'Token '
+}
+
+response = requests.request("POST", url, headers=headers, data=payload)
+
+print(response.text)
+```
+
+```go
+package main
+
+import (
+ "fmt"
+ "strings"
+ "net/http"
+ "io/ioutil"
+)
+
+func main() {
+
+ url := "https://api.netbird.io/api/routes"
+ method := "POST"
+
+ payload := strings.NewReader(`{
+ "description": "My first route",
+ "network_id": "Route 1",
+ "enabled": true,
+ "peer": "chacbco6lnnbn6cg5s91",
+ "network": "10.64.0.0/24",
+ "metric": 9999,
+ "masquerade": true,
+ "groups": [
+ "chacdk86lnnboviihd70"
+ ]
+}`)
+ client := &http.Client {
+ }
+ req, err := http.NewRequest(method, url, payload)
+
+ if err != nil {
+ fmt.Println(err)
+ return
+ {
+
+ req.Header.Add("Content-Type", "application/json")
+ req.Header.Add("Accept", "application/json")
+ req.Header.Add("Authorization", "Token ")
+
+ res, err := client.Do(req)
+ if err != nil {
+ fmt.Println(err)
+ return
+ }
+ defer res.Body.Close()
+
+ body, err := ioutil.ReadAll(res.Body)
+ if err != nil {
+ fmt.Println(err)
+ return
+ }
+ fmt.Println(string(body))
+}
+```
+
+```ruby
+require "uri"
+require "json"
+require "net/http"
+
+url = URI("https://api.netbird.io/api/routes")
+
+https = Net::HTTP.new(url.host, url.port)
+https.use_ssl = true
+
+request = Net::HTTP::Post.new(url)
+request["Content-Type"] = "application/json"
+request["Accept"] = "application/json"
+request["Authorization"] = "Token "
+
+request.body = JSON.dump({
+ "description": "My first route",
+ "network_id": "Route 1",
+ "enabled": true,
+ "peer": "chacbco6lnnbn6cg5s91",
+ "network": "10.64.0.0/24",
+ "metric": 9999,
+ "masquerade": true,
+ "groups": [
+ "chacdk86lnnboviihd70"
+ ]
+})
+response = https.request(request)
+puts response.read_body
+```
+
+```java
+OkHttpClient client = new OkHttpClient().newBuilder()
+ .build();
+MediaType mediaType = MediaType.parse("application/json");
+RequestBody body = RequestBody.create(mediaType, '{
+ "description": "My first route",
+ "network_id": "Route 1",
+ "enabled": true,
+ "peer": "chacbco6lnnbn6cg5s91",
+ "network": "10.64.0.0/24",
+ "metric": 9999,
+ "masquerade": true,
+ "groups": [
+ "chacdk86lnnboviihd70"
+ ]
+}');
+Request request = new Request.Builder()
+ .url("https://api.netbird.io/api/routes")
+ .method("POST", body)
+ .addHeader("Content-Type", "application/json")
+ .addHeader("Accept", "application/json")
+ .addHeader("Authorization: Token ")
+ .build();
+Response response = client.newCall(request).execute();
+```
+
+```php
+ 'https://api.netbird.io/api/routes',
+ CURLOPT_RETURNTRANSFER => true,
+ CURLOPT_ENCODING => '',
+ CURLOPT_MAXREDIRS => 10,
+ CURLOPT_TIMEOUT => 0,
+ CURLOPT_FOLLOWLOCATION => true,
+ CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
+ CURLOPT_CUSTOMREQUEST => 'POST',
+ CURLOPT_POSTFIELDS => '{
+ "description": "My first route",
+ "network_id": "Route 1",
+ "enabled": true,
+ "peer": "chacbco6lnnbn6cg5s91",
+ "network": "10.64.0.0/24",
+ "metric": 9999,
+ "masquerade": true,
+ "groups": [
+ "chacdk86lnnboviihd70"
+ ]
+}',
+ CURLOPT_HTTPHEADER => array(
+ 'Content-Type: application/json',
+ 'Accept: application/json',
+ 'Authorization: Token '
+ ),
+));
+
+$response = curl_exec($curl);
+
+curl_close($curl);
+echo $response;
+```
+
+
+
+
+
+
+```json {{ title: 'Example' }}
+{
+ "id": "chacdk86lnnboviihd7g",
+ "network_type": "IPv4",
+ "description": "My first route",
+ "network_id": "Route 1",
+ "enabled": true,
+ "peer": "chacbco6lnnbn6cg5s91",
+ "network": "10.64.0.0/24",
+ "metric": 9999,
+ "masquerade": true,
+ "groups": [
+ "chacdk86lnnboviihd70"
+ ]
+}
+```
+```json {{ title: 'Schema' }}
+{
+ "id": "string",
+ "network_type": "string",
+ "description": "string",
+ "network_id": "string",
+ "enabled": "boolean",
+ "peer": "string",
+ "network": "string",
+ "metric": "integer",
+ "masquerade": "boolean",
+ "groups": [
+ "string"
+ ]
+}
+```
+
+
+
+
+
+
+
+
+
+---
+
+
+## Retrieve a Route {{ tag: 'GET' , label: '/api/routes/{routeId}' }}
+
+
+
+ Get information about a Routes
+
+ #### Path Parameters
+
+
+
+ The unique identifier of a route
+
+
+
+
+
+
+```bash {{ title: 'cURL' }}
+curl -X GET https://api.netbird.io/api/routes/{routeId} \
+-H 'Accept: application/json' \
+-H 'Authorization: Token '
+```
+
+```js
+const axios = require('axios');
+
+let config = {
+ method: 'get',
+ maxBodyLength: Infinity,
+ url: '/api/routes/{routeId}',
+ headers: {
+ 'Accept': 'application/json',
+ 'Authorization': 'Token '
+ }
+};
+
+axios(config)
+.then((response) => {
+ console.log(JSON.stringify(response.data));
+})
+.catch((error) => {
+ console.log(error);
+});
+```
+
+```python
+import requests
+import json
+
+url = "https://api.netbird.io/api/routes/{routeId}"
+
+headers: {
+ 'Accept': 'application/json',
+ 'Authorization': 'Token '
+}
+
+response = requests.request("GET", url, headers=headers)
+
+print(response.text)
+```
+
+```go
+package main
+
+import (
+ "fmt"
+ "strings"
+ "net/http"
+ "io/ioutil"
+)
+
+func main() {
+
+ url := "https://api.netbird.io/api/routes/{routeId}"
+ method := "GET"
+
+ client := &http.Client {
+ }
+ req, err := http.NewRequest(method, url, nil)
+
+ if err != nil {
+ fmt.Println(err)
+ return
+ {
+
+ req.Header.Add("Accept", "application/json")
+ req.Header.Add("Authorization", "Token ")
+
+ res, err := client.Do(req)
+ if err != nil {
+ fmt.Println(err)
+ return
+ }
+ defer res.Body.Close()
+
+ body, err := ioutil.ReadAll(res.Body)
+ if err != nil {
+ fmt.Println(err)
+ return
+ }
+ fmt.Println(string(body))
+}
+```
+
+```ruby
+require "uri"
+require "json"
+require "net/http"
+
+url = URI("https://api.netbird.io/api/routes/{routeId}")
+
+https = Net::HTTP.new(url.host, url.port)
+https.use_ssl = true
+
+request = Net::HTTP::Get.new(url)
+request["Accept"] = "application/json"
+request["Authorization"] = "Token "
+
+response = https.request(request)
+puts response.read_body
+```
+
+```java
+OkHttpClient client = new OkHttpClient().newBuilder()
+ .build();
+
+Request request = new Request.Builder()
+ .url("https://api.netbird.io/api/routes/{routeId}")
+ .method("GET")
+ .addHeader("Accept", "application/json")
+ .addHeader("Authorization: Token ")
+ .build();
+Response response = client.newCall(request).execute();
+```
+
+```php
+ 'https://api.netbird.io/api/routes/{routeId}',
+ CURLOPT_RETURNTRANSFER => true,
+ CURLOPT_ENCODING => '',
+ CURLOPT_MAXREDIRS => 10,
+ CURLOPT_TIMEOUT => 0,
+ CURLOPT_FOLLOWLOCATION => true,
+ CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
+ CURLOPT_CUSTOMREQUEST => 'GET',
+ CURLOPT_HTTPHEADER => array(
+ 'Accept: application/json',
+ 'Authorization: Token '
+ ),
+));
+
+$response = curl_exec($curl);
+
+curl_close($curl);
+echo $response;
+```
+
+
+
+
+
+
+```json {{ title: 'Example' }}
+{
+ "id": "chacdk86lnnboviihd7g",
+ "network_type": "IPv4",
+ "description": "My first route",
+ "network_id": "Route 1",
+ "enabled": true,
+ "peer": "chacbco6lnnbn6cg5s91",
+ "network": "10.64.0.0/24",
+ "metric": 9999,
+ "masquerade": true,
+ "groups": [
+ "chacdk86lnnboviihd70"
+ ]
+}
+```
+```json {{ title: 'Schema' }}
+{
+ "id": "string",
+ "network_type": "string",
+ "description": "string",
+ "network_id": "string",
+ "enabled": "boolean",
+ "peer": "string",
+ "network": "string",
+ "metric": "integer",
+ "masquerade": "boolean",
+ "groups": [
+ "string"
+ ]
+}
+```
+
+
+
+
+
+
+
+
+
+---
+
+
+## Update a Route {{ tag: 'PUT' , label: '/api/routes/{routeId}' }}
+
+
+
+ Update/Replace a Route
+
+ #### Path Parameters
+
+
+
+ The unique identifier of a route
+
+
+
+ #### Request-Body Parameters
+
+
+
+ Route description
+
+
+
+ Route network identifier, to group HA routes
+
+
+
+ Route status
+
+
+
+ Peer Identifier associated with route
+
+
+
+ Network range in CIDR format
+
+
+
+ Route metric number. Lowest number has higher priority
+
+
+
+ Indicate if peer should masquerade traffic to this route's prefix
+
+
+
+ Route group tag groups
+
+
+
+
+
+
+```bash {{ title: 'cURL' }}
+curl -X PUT https://api.netbird.io/api/routes/{routeId} \
+-H 'Accept: application/json' \
+-H 'Content-Type: application/json' \
+-H 'Authorization: Token ' \
+--data-raw '{
+ "description": "My first route",
+ "network_id": "Route 1",
+ "enabled": true,
+ "peer": "chacbco6lnnbn6cg5s91",
+ "network": "10.64.0.0/24",
+ "metric": 9999,
+ "masquerade": true,
+ "groups": [
+ "chacdk86lnnboviihd70"
+ ]
+}'
+```
+
+```js
+const axios = require('axios');
+let data = JSON.stringify({
+ "description": "My first route",
+ "network_id": "Route 1",
+ "enabled": true,
+ "peer": "chacbco6lnnbn6cg5s91",
+ "network": "10.64.0.0/24",
+ "metric": 9999,
+ "masquerade": true,
+ "groups": [
+ "chacdk86lnnboviihd70"
+ ]
+});
+let config = {
+ method: 'put',
+ maxBodyLength: Infinity,
+ url: '/api/routes/{routeId}',
+ headers: {
+ 'Accept': 'application/json',
+ 'Content-Type': 'application/json',
+ 'Authorization': 'Token '
+ },
+ data : data
+};
+
+axios(config)
+.then((response) => {
+ console.log(JSON.stringify(response.data));
+})
+.catch((error) => {
+ console.log(error);
+});
+```
+
+```python
+import requests
+import json
+
+url = "https://api.netbird.io/api/routes/{routeId}"
+payload = json.dumps({
+ "description": "My first route",
+ "network_id": "Route 1",
+ "enabled": true,
+ "peer": "chacbco6lnnbn6cg5s91",
+ "network": "10.64.0.0/24",
+ "metric": 9999,
+ "masquerade": true,
+ "groups": [
+ "chacdk86lnnboviihd70"
+ ]
+})
+headers: {
+ 'Content-Type': 'application/json',
+ 'Accept': 'application/json',
+ 'Authorization': 'Token '
+}
+
+response = requests.request("PUT", url, headers=headers, data=payload)
+
+print(response.text)
+```
+
+```go
+package main
+
+import (
+ "fmt"
+ "strings"
+ "net/http"
+ "io/ioutil"
+)
+
+func main() {
+
+ url := "https://api.netbird.io/api/routes/{routeId}"
+ method := "PUT"
+
+ payload := strings.NewReader(`{
+ "description": "My first route",
+ "network_id": "Route 1",
+ "enabled": true,
+ "peer": "chacbco6lnnbn6cg5s91",
+ "network": "10.64.0.0/24",
+ "metric": 9999,
+ "masquerade": true,
+ "groups": [
+ "chacdk86lnnboviihd70"
+ ]
+}`)
+ client := &http.Client {
+ }
+ req, err := http.NewRequest(method, url, payload)
+
+ if err != nil {
+ fmt.Println(err)
+ return
+ {
+
+ req.Header.Add("Content-Type", "application/json")
+ req.Header.Add("Accept", "application/json")
+ req.Header.Add("Authorization", "Token ")
+
+ res, err := client.Do(req)
+ if err != nil {
+ fmt.Println(err)
+ return
+ }
+ defer res.Body.Close()
+
+ body, err := ioutil.ReadAll(res.Body)
+ if err != nil {
+ fmt.Println(err)
+ return
+ }
+ fmt.Println(string(body))
+}
+```
+
+```ruby
+require "uri"
+require "json"
+require "net/http"
+
+url = URI("https://api.netbird.io/api/routes/{routeId}")
+
+https = Net::HTTP.new(url.host, url.port)
+https.use_ssl = true
+
+request = Net::HTTP::Put.new(url)
+request["Content-Type"] = "application/json"
+request["Accept"] = "application/json"
+request["Authorization"] = "Token "
+
+request.body = JSON.dump({
+ "description": "My first route",
+ "network_id": "Route 1",
+ "enabled": true,
+ "peer": "chacbco6lnnbn6cg5s91",
+ "network": "10.64.0.0/24",
+ "metric": 9999,
+ "masquerade": true,
+ "groups": [
+ "chacdk86lnnboviihd70"
+ ]
+})
+response = https.request(request)
+puts response.read_body
+```
+
+```java
+OkHttpClient client = new OkHttpClient().newBuilder()
+ .build();
+MediaType mediaType = MediaType.parse("application/json");
+RequestBody body = RequestBody.create(mediaType, '{
+ "description": "My first route",
+ "network_id": "Route 1",
+ "enabled": true,
+ "peer": "chacbco6lnnbn6cg5s91",
+ "network": "10.64.0.0/24",
+ "metric": 9999,
+ "masquerade": true,
+ "groups": [
+ "chacdk86lnnboviihd70"
+ ]
+}');
+Request request = new Request.Builder()
+ .url("https://api.netbird.io/api/routes/{routeId}")
+ .method("PUT", body)
+ .addHeader("Content-Type", "application/json")
+ .addHeader("Accept", "application/json")
+ .addHeader("Authorization: Token ")
+ .build();
+Response response = client.newCall(request).execute();
+```
+
+```php
+ 'https://api.netbird.io/api/routes/{routeId}',
+ CURLOPT_RETURNTRANSFER => true,
+ CURLOPT_ENCODING => '',
+ CURLOPT_MAXREDIRS => 10,
+ CURLOPT_TIMEOUT => 0,
+ CURLOPT_FOLLOWLOCATION => true,
+ CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
+ CURLOPT_CUSTOMREQUEST => 'PUT',
+ CURLOPT_POSTFIELDS => '{
+ "description": "My first route",
+ "network_id": "Route 1",
+ "enabled": true,
+ "peer": "chacbco6lnnbn6cg5s91",
+ "network": "10.64.0.0/24",
+ "metric": 9999,
+ "masquerade": true,
+ "groups": [
+ "chacdk86lnnboviihd70"
+ ]
+}',
+ CURLOPT_HTTPHEADER => array(
+ 'Content-Type: application/json',
+ 'Accept: application/json',
+ 'Authorization: Token '
+ ),
+));
+
+$response = curl_exec($curl);
+
+curl_close($curl);
+echo $response;
+```
+
+
+
+
+
+
+```json {{ title: 'Example' }}
+{
+ "id": "chacdk86lnnboviihd7g",
+ "network_type": "IPv4",
+ "description": "My first route",
+ "network_id": "Route 1",
+ "enabled": true,
+ "peer": "chacbco6lnnbn6cg5s91",
+ "network": "10.64.0.0/24",
+ "metric": 9999,
+ "masquerade": true,
+ "groups": [
+ "chacdk86lnnboviihd70"
+ ]
+}
+```
+```json {{ title: 'Schema' }}
+{
+ "id": "string",
+ "network_type": "string",
+ "description": "string",
+ "network_id": "string",
+ "enabled": "boolean",
+ "peer": "string",
+ "network": "string",
+ "metric": "integer",
+ "masquerade": "boolean",
+ "groups": [
+ "string"
+ ]
+}
+```
+
+
+
+
+
+
+
+
+
+---
+
+
+## Delete a Route {{ tag: 'DELETE' , label: '/api/routes/{routeId}' }}
+
+
+
+ Delete a Route
+
+ #### Path Parameters
+
+
+
+ The unique identifier of a route
+
+
+
+
+
+
+```bash {{ title: 'cURL' }}
+curl -X DELETE https://api.netbird.io/api/routes/{routeId} \
+-H 'Authorization: Token '
+```
+
+```js
+const axios = require('axios');
+
+let config = {
+ method: 'delete',
+ maxBodyLength: Infinity,
+ url: '/api/routes/{routeId}',
+ headers: {
+ 'Authorization': 'Token '
+ }
+};
+
+axios(config)
+.then((response) => {
+ console.log(JSON.stringify(response.data));
+})
+.catch((error) => {
+ console.log(error);
+});
+```
+
+```python
+import requests
+import json
+
+url = "https://api.netbird.io/api/routes/{routeId}"
+
+headers: {
+ 'Authorization': 'Token '
+}
+
+response = requests.request("DELETE", url, headers=headers)
+
+print(response.text)
+```
+
+```go
+package main
+
+import (
+ "fmt"
+ "strings"
+ "net/http"
+ "io/ioutil"
+)
+
+func main() {
+
+ url := "https://api.netbird.io/api/routes/{routeId}"
+ method := "DELETE"
+
+ client := &http.Client {
+ }
+ req, err := http.NewRequest(method, url, nil)
+
+ if err != nil {
+ fmt.Println(err)
+ return
+ {
+
+ req.Header.Add("Authorization", "Token ")
+
+ res, err := client.Do(req)
+ if err != nil {
+ fmt.Println(err)
+ return
+ }
+ defer res.Body.Close()
+
+ body, err := ioutil.ReadAll(res.Body)
+ if err != nil {
+ fmt.Println(err)
+ return
+ }
+ fmt.Println(string(body))
+}
+```
+
+```ruby
+require "uri"
+require "json"
+require "net/http"
+
+url = URI("https://api.netbird.io/api/routes/{routeId}")
+
+https = Net::HTTP.new(url.host, url.port)
+https.use_ssl = true
+
+request = Net::HTTP::Delete.new(url)
+request["Authorization"] = "Token "
+
+response = https.request(request)
+puts response.read_body
+```
+
+```java
+OkHttpClient client = new OkHttpClient().newBuilder()
+ .build();
+
+Request request = new Request.Builder()
+ .url("https://api.netbird.io/api/routes/{routeId}")
+ .method("DELETE")
+ .addHeader("Authorization: Token ")
+ .build();
+Response response = client.newCall(request).execute();
+```
+
+```php
+ 'https://api.netbird.io/api/routes/{routeId}',
+ CURLOPT_RETURNTRANSFER => true,
+ CURLOPT_ENCODING => '',
+ CURLOPT_MAXREDIRS => 10,
+ CURLOPT_TIMEOUT => 0,
+ CURLOPT_FOLLOWLOCATION => true,
+ CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
+ CURLOPT_CUSTOMREQUEST => 'DELETE',
+ CURLOPT_HTTPHEADER => array(
+ 'Authorization: Token '
+ ),
+));
+
+$response = curl_exec($curl);
+
+curl_close($curl);
+echo $response;
+```
+
+
+
+
+
+
+
+
+
+
+---
diff --git a/src/pages/ipa/resources/rules.mdx b/src/pages/ipa/resources/rules.mdx
new file mode 100644
index 00000000..b18b59cc
--- /dev/null
+++ b/src/pages/ipa/resources/rules.mdx
@@ -0,0 +1,1321 @@
+
+export const title = 'Rules'
+
+
+
+## List all Rules {{ tag: 'GET' , label: '/api/rules' }}
+
+
+
+ Returns a list of all Rules
+
+
+
+
+```bash {{ title: 'cURL' }}
+curl -X GET https://api.netbird.io/api/rules \
+-H 'Accept: application/json' \
+-H 'Authorization: Token '
+```
+
+```js
+const axios = require('axios');
+
+let config = {
+ method: 'get',
+ maxBodyLength: Infinity,
+ url: '/api/rules',
+ headers: {
+ 'Accept': 'application/json',
+ 'Authorization': 'Token '
+ }
+};
+
+axios(config)
+.then((response) => {
+ console.log(JSON.stringify(response.data));
+})
+.catch((error) => {
+ console.log(error);
+});
+```
+
+```python
+import requests
+import json
+
+url = "https://api.netbird.io/api/rules"
+
+headers: {
+ 'Accept': 'application/json',
+ 'Authorization': 'Token '
+}
+
+response = requests.request("GET", url, headers=headers)
+
+print(response.text)
+```
+
+```go
+package main
+
+import (
+ "fmt"
+ "strings"
+ "net/http"
+ "io/ioutil"
+)
+
+func main() {
+
+ url := "https://api.netbird.io/api/rules"
+ method := "GET"
+
+ client := &http.Client {
+ }
+ req, err := http.NewRequest(method, url, nil)
+
+ if err != nil {
+ fmt.Println(err)
+ return
+ {
+
+ req.Header.Add("Accept", "application/json")
+ req.Header.Add("Authorization", "Token ")
+
+ res, err := client.Do(req)
+ if err != nil {
+ fmt.Println(err)
+ return
+ }
+ defer res.Body.Close()
+
+ body, err := ioutil.ReadAll(res.Body)
+ if err != nil {
+ fmt.Println(err)
+ return
+ }
+ fmt.Println(string(body))
+}
+```
+
+```ruby
+require "uri"
+require "json"
+require "net/http"
+
+url = URI("https://api.netbird.io/api/rules")
+
+https = Net::HTTP.new(url.host, url.port)
+https.use_ssl = true
+
+request = Net::HTTP::Get.new(url)
+request["Accept"] = "application/json"
+request["Authorization"] = "Token "
+
+response = https.request(request)
+puts response.read_body
+```
+
+```java
+OkHttpClient client = new OkHttpClient().newBuilder()
+ .build();
+
+Request request = new Request.Builder()
+ .url("https://api.netbird.io/api/rules")
+ .method("GET")
+ .addHeader("Accept", "application/json")
+ .addHeader("Authorization: Token ")
+ .build();
+Response response = client.newCall(request).execute();
+```
+
+```php
+ 'https://api.netbird.io/api/rules',
+ CURLOPT_RETURNTRANSFER => true,
+ CURLOPT_ENCODING => '',
+ CURLOPT_MAXREDIRS => 10,
+ CURLOPT_TIMEOUT => 0,
+ CURLOPT_FOLLOWLOCATION => true,
+ CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
+ CURLOPT_CUSTOMREQUEST => 'GET',
+ CURLOPT_HTTPHEADER => array(
+ 'Accept: application/json',
+ 'Authorization: Token '
+ ),
+));
+
+$response = curl_exec($curl);
+
+curl_close($curl);
+echo $response;
+```
+
+
+
+
+
+
+```json {{ title: 'Example' }}
+[
+ {
+ "id": "ch8i4ug6lnn4g9hqv7mg",
+ "name": "Default",
+ "description": "This is a default rule that allows connections between all the resources",
+ "disabled": false,
+ "flow": "bidirect",
+ "sources": [
+ {
+ "id": "ch8i4ug6lnn4g9hqv7m0",
+ "name": "devs",
+ "peers_count": 2
+ }
+ ],
+ "destinations": [
+ {
+ "id": "ch8i4ug6lnn4g9hqv7m0",
+ "name": "devs",
+ "peers_count": 2
+ }
+ ]
+ }
+]
+```
+```json {{ title: 'Schema' }}
+[
+ {
+ "id": "string",
+ "name": "string",
+ "description": "string",
+ "disabled": "boolean",
+ "flow": "string",
+ "sources": [
+ {
+ "id": "string",
+ "name": "string",
+ "peers_count": "integer"
+ }
+ ],
+ "destinations": [
+ {
+ "id": "string",
+ "name": "string",
+ "peers_count": "integer"
+ }
+ ]
+ }
+]
+```
+
+
+
+
+
+
+
+
+
+---
+
+
+## Create a Rule {{ tag: 'POST' , label: '/api/rules' }}
+
+
+
+ Creates a Rule
+
+ #### Request-Body Parameters
+
+
+
+ Rule name identifier
+
+
+
+ Rule friendly description
+
+
+
+ Rules status
+
+
+
+ Rule flow, currently, only "bidirect" for bi-directional traffic is accepted
+
+
+
+ List of source groups
+
+
+
+ List of destination groups
+
+
+
+
+
+
+```bash {{ title: 'cURL' }}
+curl -X POST https://api.netbird.io/api/rules \
+-H 'Accept: application/json' \
+-H 'Content-Type: application/json' \
+-H 'Authorization: Token ' \
+--data-raw '{
+ "name": "Default",
+ "description": "This is a default rule that allows connections between all the resources",
+ "disabled": false,
+ "flow": "bidirect",
+ "sources": [
+ "ch8i4ug6lnn4g9hqv7m1"
+ ],
+ "destinations": [
+ "ch8i4ug6lnn4g9hqv7m0"
+ ]
+}'
+```
+
+```js
+const axios = require('axios');
+let data = JSON.stringify({
+ "name": "Default",
+ "description": "This is a default rule that allows connections between all the resources",
+ "disabled": false,
+ "flow": "bidirect",
+ "sources": [
+ "ch8i4ug6lnn4g9hqv7m1"
+ ],
+ "destinations": [
+ "ch8i4ug6lnn4g9hqv7m0"
+ ]
+});
+let config = {
+ method: 'post',
+ maxBodyLength: Infinity,
+ url: '/api/rules',
+ headers: {
+ 'Accept': 'application/json',
+ 'Content-Type': 'application/json',
+ 'Authorization': 'Token '
+ },
+ data : data
+};
+
+axios(config)
+.then((response) => {
+ console.log(JSON.stringify(response.data));
+})
+.catch((error) => {
+ console.log(error);
+});
+```
+
+```python
+import requests
+import json
+
+url = "https://api.netbird.io/api/rules"
+payload = json.dumps({
+ "name": "Default",
+ "description": "This is a default rule that allows connections between all the resources",
+ "disabled": false,
+ "flow": "bidirect",
+ "sources": [
+ "ch8i4ug6lnn4g9hqv7m1"
+ ],
+ "destinations": [
+ "ch8i4ug6lnn4g9hqv7m0"
+ ]
+})
+headers: {
+ 'Content-Type': 'application/json',
+ 'Accept': 'application/json',
+ 'Authorization': 'Token '
+}
+
+response = requests.request("POST", url, headers=headers, data=payload)
+
+print(response.text)
+```
+
+```go
+package main
+
+import (
+ "fmt"
+ "strings"
+ "net/http"
+ "io/ioutil"
+)
+
+func main() {
+
+ url := "https://api.netbird.io/api/rules"
+ method := "POST"
+
+ payload := strings.NewReader(`{
+ "name": "Default",
+ "description": "This is a default rule that allows connections between all the resources",
+ "disabled": false,
+ "flow": "bidirect",
+ "sources": [
+ "ch8i4ug6lnn4g9hqv7m1"
+ ],
+ "destinations": [
+ "ch8i4ug6lnn4g9hqv7m0"
+ ]
+}`)
+ client := &http.Client {
+ }
+ req, err := http.NewRequest(method, url, payload)
+
+ if err != nil {
+ fmt.Println(err)
+ return
+ {
+
+ req.Header.Add("Content-Type", "application/json")
+ req.Header.Add("Accept", "application/json")
+ req.Header.Add("Authorization", "Token ")
+
+ res, err := client.Do(req)
+ if err != nil {
+ fmt.Println(err)
+ return
+ }
+ defer res.Body.Close()
+
+ body, err := ioutil.ReadAll(res.Body)
+ if err != nil {
+ fmt.Println(err)
+ return
+ }
+ fmt.Println(string(body))
+}
+```
+
+```ruby
+require "uri"
+require "json"
+require "net/http"
+
+url = URI("https://api.netbird.io/api/rules")
+
+https = Net::HTTP.new(url.host, url.port)
+https.use_ssl = true
+
+request = Net::HTTP::Post.new(url)
+request["Content-Type"] = "application/json"
+request["Accept"] = "application/json"
+request["Authorization"] = "Token "
+
+request.body = JSON.dump({
+ "name": "Default",
+ "description": "This is a default rule that allows connections between all the resources",
+ "disabled": false,
+ "flow": "bidirect",
+ "sources": [
+ "ch8i4ug6lnn4g9hqv7m1"
+ ],
+ "destinations": [
+ "ch8i4ug6lnn4g9hqv7m0"
+ ]
+})
+response = https.request(request)
+puts response.read_body
+```
+
+```java
+OkHttpClient client = new OkHttpClient().newBuilder()
+ .build();
+MediaType mediaType = MediaType.parse("application/json");
+RequestBody body = RequestBody.create(mediaType, '{
+ "name": "Default",
+ "description": "This is a default rule that allows connections between all the resources",
+ "disabled": false,
+ "flow": "bidirect",
+ "sources": [
+ "ch8i4ug6lnn4g9hqv7m1"
+ ],
+ "destinations": [
+ "ch8i4ug6lnn4g9hqv7m0"
+ ]
+}');
+Request request = new Request.Builder()
+ .url("https://api.netbird.io/api/rules")
+ .method("POST", body)
+ .addHeader("Content-Type", "application/json")
+ .addHeader("Accept", "application/json")
+ .addHeader("Authorization: Token ")
+ .build();
+Response response = client.newCall(request).execute();
+```
+
+```php
+ 'https://api.netbird.io/api/rules',
+ CURLOPT_RETURNTRANSFER => true,
+ CURLOPT_ENCODING => '',
+ CURLOPT_MAXREDIRS => 10,
+ CURLOPT_TIMEOUT => 0,
+ CURLOPT_FOLLOWLOCATION => true,
+ CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
+ CURLOPT_CUSTOMREQUEST => 'POST',
+ CURLOPT_POSTFIELDS => '{
+ "name": "Default",
+ "description": "This is a default rule that allows connections between all the resources",
+ "disabled": false,
+ "flow": "bidirect",
+ "sources": [
+ "ch8i4ug6lnn4g9hqv7m1"
+ ],
+ "destinations": [
+ "ch8i4ug6lnn4g9hqv7m0"
+ ]
+}',
+ CURLOPT_HTTPHEADER => array(
+ 'Content-Type: application/json',
+ 'Accept: application/json',
+ 'Authorization: Token '
+ ),
+));
+
+$response = curl_exec($curl);
+
+curl_close($curl);
+echo $response;
+```
+
+
+
+
+
+
+```json {{ title: 'Example' }}
+{
+ "id": "ch8i4ug6lnn4g9hqv7mg",
+ "name": "Default",
+ "description": "This is a default rule that allows connections between all the resources",
+ "disabled": false,
+ "flow": "bidirect",
+ "sources": [
+ {
+ "id": "ch8i4ug6lnn4g9hqv7m0",
+ "name": "devs",
+ "peers_count": 2
+ }
+ ],
+ "destinations": [
+ {
+ "id": "ch8i4ug6lnn4g9hqv7m0",
+ "name": "devs",
+ "peers_count": 2
+ }
+ ]
+}
+```
+```json {{ title: 'Schema' }}
+{
+ "id": "string",
+ "name": "string",
+ "description": "string",
+ "disabled": "boolean",
+ "flow": "string",
+ "sources": [
+ {
+ "id": "string",
+ "name": "string",
+ "peers_count": "integer"
+ }
+ ],
+ "destinations": [
+ {
+ "id": "string",
+ "name": "string",
+ "peers_count": "integer"
+ }
+ ]
+}
+```
+
+
+
+
+
+---
+
+
+## Retrieve a Rule {{ tag: 'GET' , label: '/api/rules/{ruleId}' }}
+
+
+
+ Get information about a Rules
+
+ #### Path Parameters
+
+
+
+ The unique identifier of a rule
+
+
+
+
+
+
+```bash {{ title: 'cURL' }}
+curl -X GET https://api.netbird.io/api/rules/{ruleId} \
+-H 'Accept: application/json' \
+-H 'Authorization: Token '
+```
+
+```js
+const axios = require('axios');
+
+let config = {
+ method: 'get',
+ maxBodyLength: Infinity,
+ url: '/api/rules/{ruleId}',
+ headers: {
+ 'Accept': 'application/json',
+ 'Authorization': 'Token '
+ }
+};
+
+axios(config)
+.then((response) => {
+ console.log(JSON.stringify(response.data));
+})
+.catch((error) => {
+ console.log(error);
+});
+```
+
+```python
+import requests
+import json
+
+url = "https://api.netbird.io/api/rules/{ruleId}"
+
+headers: {
+ 'Accept': 'application/json',
+ 'Authorization': 'Token '
+}
+
+response = requests.request("GET", url, headers=headers)
+
+print(response.text)
+```
+
+```go
+package main
+
+import (
+ "fmt"
+ "strings"
+ "net/http"
+ "io/ioutil"
+)
+
+func main() {
+
+ url := "https://api.netbird.io/api/rules/{ruleId}"
+ method := "GET"
+
+ client := &http.Client {
+ }
+ req, err := http.NewRequest(method, url, nil)
+
+ if err != nil {
+ fmt.Println(err)
+ return
+ {
+
+ req.Header.Add("Accept", "application/json")
+ req.Header.Add("Authorization", "Token ")
+
+ res, err := client.Do(req)
+ if err != nil {
+ fmt.Println(err)
+ return
+ }
+ defer res.Body.Close()
+
+ body, err := ioutil.ReadAll(res.Body)
+ if err != nil {
+ fmt.Println(err)
+ return
+ }
+ fmt.Println(string(body))
+}
+```
+
+```ruby
+require "uri"
+require "json"
+require "net/http"
+
+url = URI("https://api.netbird.io/api/rules/{ruleId}")
+
+https = Net::HTTP.new(url.host, url.port)
+https.use_ssl = true
+
+request = Net::HTTP::Get.new(url)
+request["Accept"] = "application/json"
+request["Authorization"] = "Token "
+
+response = https.request(request)
+puts response.read_body
+```
+
+```java
+OkHttpClient client = new OkHttpClient().newBuilder()
+ .build();
+
+Request request = new Request.Builder()
+ .url("https://api.netbird.io/api/rules/{ruleId}")
+ .method("GET")
+ .addHeader("Accept", "application/json")
+ .addHeader("Authorization: Token ")
+ .build();
+Response response = client.newCall(request).execute();
+```
+
+```php
+ 'https://api.netbird.io/api/rules/{ruleId}',
+ CURLOPT_RETURNTRANSFER => true,
+ CURLOPT_ENCODING => '',
+ CURLOPT_MAXREDIRS => 10,
+ CURLOPT_TIMEOUT => 0,
+ CURLOPT_FOLLOWLOCATION => true,
+ CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
+ CURLOPT_CUSTOMREQUEST => 'GET',
+ CURLOPT_HTTPHEADER => array(
+ 'Accept: application/json',
+ 'Authorization: Token '
+ ),
+));
+
+$response = curl_exec($curl);
+
+curl_close($curl);
+echo $response;
+```
+
+
+
+
+
+
+```json {{ title: 'Example' }}
+{
+ "id": "ch8i4ug6lnn4g9hqv7mg",
+ "name": "Default",
+ "description": "This is a default rule that allows connections between all the resources",
+ "disabled": false,
+ "flow": "bidirect",
+ "sources": [
+ {
+ "id": "ch8i4ug6lnn4g9hqv7m0",
+ "name": "devs",
+ "peers_count": 2
+ }
+ ],
+ "destinations": [
+ {
+ "id": "ch8i4ug6lnn4g9hqv7m0",
+ "name": "devs",
+ "peers_count": 2
+ }
+ ]
+}
+```
+```json {{ title: 'Schema' }}
+{
+ "id": "string",
+ "name": "string",
+ "description": "string",
+ "disabled": "boolean",
+ "flow": "string",
+ "sources": [
+ {
+ "id": "string",
+ "name": "string",
+ "peers_count": "integer"
+ }
+ ],
+ "destinations": [
+ {
+ "id": "string",
+ "name": "string",
+ "peers_count": "integer"
+ }
+ ]
+}
+```
+
+
+
+
+
+
+
+
+
+---
+
+
+## Update a Rule {{ tag: 'PUT' , label: '/api/rules/{ruleId}' }}
+
+
+
+ Update/Replace a Rule
+
+ #### Path Parameters
+
+
+
+ The unique identifier of a rule
+
+
+
+ #### Request-Body Parameters
+
+
+
+ Rule name identifier
+
+
+
+ Rule friendly description
+
+
+
+ Rules status
+
+
+
+ Rule flow, currently, only "bidirect" for bi-directional traffic is accepted
+
+
+
+ List of source groups
+
+
+
+ List of destination groups
+
+
+
+
+
+
+```bash {{ title: 'cURL' }}
+curl -X PUT https://api.netbird.io/api/rules/{ruleId} \
+-H 'Accept: application/json' \
+-H 'Content-Type: application/json' \
+-H 'Authorization: Token ' \
+--data-raw '{
+ "name": "Default",
+ "description": "This is a default rule that allows connections between all the resources",
+ "disabled": false,
+ "flow": "bidirect",
+ "sources": [
+ "ch8i4ug6lnn4g9hqv7m1"
+ ],
+ "destinations": [
+ "ch8i4ug6lnn4g9hqv7m0"
+ ]
+}'
+```
+
+```js
+const axios = require('axios');
+let data = JSON.stringify({
+ "name": "Default",
+ "description": "This is a default rule that allows connections between all the resources",
+ "disabled": false,
+ "flow": "bidirect",
+ "sources": [
+ "ch8i4ug6lnn4g9hqv7m1"
+ ],
+ "destinations": [
+ "ch8i4ug6lnn4g9hqv7m0"
+ ]
+});
+let config = {
+ method: 'put',
+ maxBodyLength: Infinity,
+ url: '/api/rules/{ruleId}',
+ headers: {
+ 'Accept': 'application/json',
+ 'Content-Type': 'application/json',
+ 'Authorization': 'Token '
+ },
+ data : data
+};
+
+axios(config)
+.then((response) => {
+ console.log(JSON.stringify(response.data));
+})
+.catch((error) => {
+ console.log(error);
+});
+```
+
+```python
+import requests
+import json
+
+url = "https://api.netbird.io/api/rules/{ruleId}"
+payload = json.dumps({
+ "name": "Default",
+ "description": "This is a default rule that allows connections between all the resources",
+ "disabled": false,
+ "flow": "bidirect",
+ "sources": [
+ "ch8i4ug6lnn4g9hqv7m1"
+ ],
+ "destinations": [
+ "ch8i4ug6lnn4g9hqv7m0"
+ ]
+})
+headers: {
+ 'Content-Type': 'application/json',
+ 'Accept': 'application/json',
+ 'Authorization': 'Token '
+}
+
+response = requests.request("PUT", url, headers=headers, data=payload)
+
+print(response.text)
+```
+
+```go
+package main
+
+import (
+ "fmt"
+ "strings"
+ "net/http"
+ "io/ioutil"
+)
+
+func main() {
+
+ url := "https://api.netbird.io/api/rules/{ruleId}"
+ method := "PUT"
+
+ payload := strings.NewReader(`{
+ "name": "Default",
+ "description": "This is a default rule that allows connections between all the resources",
+ "disabled": false,
+ "flow": "bidirect",
+ "sources": [
+ "ch8i4ug6lnn4g9hqv7m1"
+ ],
+ "destinations": [
+ "ch8i4ug6lnn4g9hqv7m0"
+ ]
+}`)
+ client := &http.Client {
+ }
+ req, err := http.NewRequest(method, url, payload)
+
+ if err != nil {
+ fmt.Println(err)
+ return
+ {
+
+ req.Header.Add("Content-Type", "application/json")
+ req.Header.Add("Accept", "application/json")
+ req.Header.Add("Authorization", "Token ")
+
+ res, err := client.Do(req)
+ if err != nil {
+ fmt.Println(err)
+ return
+ }
+ defer res.Body.Close()
+
+ body, err := ioutil.ReadAll(res.Body)
+ if err != nil {
+ fmt.Println(err)
+ return
+ }
+ fmt.Println(string(body))
+}
+```
+
+```ruby
+require "uri"
+require "json"
+require "net/http"
+
+url = URI("https://api.netbird.io/api/rules/{ruleId}")
+
+https = Net::HTTP.new(url.host, url.port)
+https.use_ssl = true
+
+request = Net::HTTP::Put.new(url)
+request["Content-Type"] = "application/json"
+request["Accept"] = "application/json"
+request["Authorization"] = "Token "
+
+request.body = JSON.dump({
+ "name": "Default",
+ "description": "This is a default rule that allows connections between all the resources",
+ "disabled": false,
+ "flow": "bidirect",
+ "sources": [
+ "ch8i4ug6lnn4g9hqv7m1"
+ ],
+ "destinations": [
+ "ch8i4ug6lnn4g9hqv7m0"
+ ]
+})
+response = https.request(request)
+puts response.read_body
+```
+
+```java
+OkHttpClient client = new OkHttpClient().newBuilder()
+ .build();
+MediaType mediaType = MediaType.parse("application/json");
+RequestBody body = RequestBody.create(mediaType, '{
+ "name": "Default",
+ "description": "This is a default rule that allows connections between all the resources",
+ "disabled": false,
+ "flow": "bidirect",
+ "sources": [
+ "ch8i4ug6lnn4g9hqv7m1"
+ ],
+ "destinations": [
+ "ch8i4ug6lnn4g9hqv7m0"
+ ]
+}');
+Request request = new Request.Builder()
+ .url("https://api.netbird.io/api/rules/{ruleId}")
+ .method("PUT", body)
+ .addHeader("Content-Type", "application/json")
+ .addHeader("Accept", "application/json")
+ .addHeader("Authorization: Token ")
+ .build();
+Response response = client.newCall(request).execute();
+```
+
+```php
+ 'https://api.netbird.io/api/rules/{ruleId}',
+ CURLOPT_RETURNTRANSFER => true,
+ CURLOPT_ENCODING => '',
+ CURLOPT_MAXREDIRS => 10,
+ CURLOPT_TIMEOUT => 0,
+ CURLOPT_FOLLOWLOCATION => true,
+ CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
+ CURLOPT_CUSTOMREQUEST => 'PUT',
+ CURLOPT_POSTFIELDS => '{
+ "name": "Default",
+ "description": "This is a default rule that allows connections between all the resources",
+ "disabled": false,
+ "flow": "bidirect",
+ "sources": [
+ "ch8i4ug6lnn4g9hqv7m1"
+ ],
+ "destinations": [
+ "ch8i4ug6lnn4g9hqv7m0"
+ ]
+}',
+ CURLOPT_HTTPHEADER => array(
+ 'Content-Type: application/json',
+ 'Accept: application/json',
+ 'Authorization: Token '
+ ),
+));
+
+$response = curl_exec($curl);
+
+curl_close($curl);
+echo $response;
+```
+
+
+
+
+
+
+```json {{ title: 'Example' }}
+{
+ "id": "ch8i4ug6lnn4g9hqv7mg",
+ "name": "Default",
+ "description": "This is a default rule that allows connections between all the resources",
+ "disabled": false,
+ "flow": "bidirect",
+ "sources": [
+ {
+ "id": "ch8i4ug6lnn4g9hqv7m0",
+ "name": "devs",
+ "peers_count": 2
+ }
+ ],
+ "destinations": [
+ {
+ "id": "ch8i4ug6lnn4g9hqv7m0",
+ "name": "devs",
+ "peers_count": 2
+ }
+ ]
+}
+```
+```json {{ title: 'Schema' }}
+{
+ "id": "string",
+ "name": "string",
+ "description": "string",
+ "disabled": "boolean",
+ "flow": "string",
+ "sources": [
+ {
+ "id": "string",
+ "name": "string",
+ "peers_count": "integer"
+ }
+ ],
+ "destinations": [
+ {
+ "id": "string",
+ "name": "string",
+ "peers_count": "integer"
+ }
+ ]
+}
+```
+
+
+
+
+
+
+
+
+
+---
+
+
+## Delete a Rule {{ tag: 'DELETE' , label: '/api/rules/{ruleId}' }}
+
+
+
+ Delete a Rule
+
+ #### Path Parameters
+
+
+
+ The unique identifier of a rule
+
+
+
+
+
+
+```bash {{ title: 'cURL' }}
+curl -X DELETE https://api.netbird.io/api/rules/{ruleId} \
+-H 'Authorization: Token '
+```
+
+```js
+const axios = require('axios');
+
+let config = {
+ method: 'delete',
+ maxBodyLength: Infinity,
+ url: '/api/rules/{ruleId}',
+ headers: {
+ 'Authorization': 'Token '
+ }
+};
+
+axios(config)
+.then((response) => {
+ console.log(JSON.stringify(response.data));
+})
+.catch((error) => {
+ console.log(error);
+});
+```
+
+```python
+import requests
+import json
+
+url = "https://api.netbird.io/api/rules/{ruleId}"
+
+headers: {
+ 'Authorization': 'Token '
+}
+
+response = requests.request("DELETE", url, headers=headers)
+
+print(response.text)
+```
+
+```go
+package main
+
+import (
+ "fmt"
+ "strings"
+ "net/http"
+ "io/ioutil"
+)
+
+func main() {
+
+ url := "https://api.netbird.io/api/rules/{ruleId}"
+ method := "DELETE"
+
+ client := &http.Client {
+ }
+ req, err := http.NewRequest(method, url, nil)
+
+ if err != nil {
+ fmt.Println(err)
+ return
+ {
+
+ req.Header.Add("Authorization", "Token ")
+
+ res, err := client.Do(req)
+ if err != nil {
+ fmt.Println(err)
+ return
+ }
+ defer res.Body.Close()
+
+ body, err := ioutil.ReadAll(res.Body)
+ if err != nil {
+ fmt.Println(err)
+ return
+ }
+ fmt.Println(string(body))
+}
+```
+
+```ruby
+require "uri"
+require "json"
+require "net/http"
+
+url = URI("https://api.netbird.io/api/rules/{ruleId}")
+
+https = Net::HTTP.new(url.host, url.port)
+https.use_ssl = true
+
+request = Net::HTTP::Delete.new(url)
+request["Authorization"] = "Token "
+
+response = https.request(request)
+puts response.read_body
+```
+
+```java
+OkHttpClient client = new OkHttpClient().newBuilder()
+ .build();
+
+Request request = new Request.Builder()
+ .url("https://api.netbird.io/api/rules/{ruleId}")
+ .method("DELETE")
+ .addHeader("Authorization: Token ")
+ .build();
+Response response = client.newCall(request).execute();
+```
+
+```php
+ 'https://api.netbird.io/api/rules/{ruleId}',
+ CURLOPT_RETURNTRANSFER => true,
+ CURLOPT_ENCODING => '',
+ CURLOPT_MAXREDIRS => 10,
+ CURLOPT_TIMEOUT => 0,
+ CURLOPT_FOLLOWLOCATION => true,
+ CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
+ CURLOPT_CUSTOMREQUEST => 'DELETE',
+ CURLOPT_HTTPHEADER => array(
+ 'Authorization: Token '
+ ),
+));
+
+$response = curl_exec($curl);
+
+curl_close($curl);
+echo $response;
+```
+
+
+
+
+
+
+
+
+
+
+---
diff --git a/src/pages/ipa/resources/setup-keys.mdx b/src/pages/ipa/resources/setup-keys.mdx
new file mode 100644
index 00000000..2f0b08ae
--- /dev/null
+++ b/src/pages/ipa/resources/setup-keys.mdx
@@ -0,0 +1,1099 @@
+
+export const title = 'Setup Keys'
+
+
+
+## List all Setup Keys {{ tag: 'GET' , label: '/api/setup-keys' }}
+
+
+
+ Returns a list of all Setup Keys
+
+
+
+
+```bash {{ title: 'cURL' }}
+curl -X GET https://api.netbird.io/api/setup-keys \
+-H 'Accept: application/json' \
+-H 'Authorization: Token '
+```
+
+```js
+const axios = require('axios');
+
+let config = {
+ method: 'get',
+ maxBodyLength: Infinity,
+ url: '/api/setup-keys',
+ headers: {
+ 'Accept': 'application/json',
+ 'Authorization': 'Token '
+ }
+};
+
+axios(config)
+.then((response) => {
+ console.log(JSON.stringify(response.data));
+})
+.catch((error) => {
+ console.log(error);
+});
+```
+
+```python
+import requests
+import json
+
+url = "https://api.netbird.io/api/setup-keys"
+
+headers: {
+ 'Accept': 'application/json',
+ 'Authorization': 'Token '
+}
+
+response = requests.request("GET", url, headers=headers)
+
+print(response.text)
+```
+
+```go
+package main
+
+import (
+ "fmt"
+ "strings"
+ "net/http"
+ "io/ioutil"
+)
+
+func main() {
+
+ url := "https://api.netbird.io/api/setup-keys"
+ method := "GET"
+
+ client := &http.Client {
+ }
+ req, err := http.NewRequest(method, url, nil)
+
+ if err != nil {
+ fmt.Println(err)
+ return
+ {
+
+ req.Header.Add("Accept", "application/json")
+ req.Header.Add("Authorization", "Token ")
+
+ res, err := client.Do(req)
+ if err != nil {
+ fmt.Println(err)
+ return
+ }
+ defer res.Body.Close()
+
+ body, err := ioutil.ReadAll(res.Body)
+ if err != nil {
+ fmt.Println(err)
+ return
+ }
+ fmt.Println(string(body))
+}
+```
+
+```ruby
+require "uri"
+require "json"
+require "net/http"
+
+url = URI("https://api.netbird.io/api/setup-keys")
+
+https = Net::HTTP.new(url.host, url.port)
+https.use_ssl = true
+
+request = Net::HTTP::Get.new(url)
+request["Accept"] = "application/json"
+request["Authorization"] = "Token "
+
+response = https.request(request)
+puts response.read_body
+```
+
+```java
+OkHttpClient client = new OkHttpClient().newBuilder()
+ .build();
+
+Request request = new Request.Builder()
+ .url("https://api.netbird.io/api/setup-keys")
+ .method("GET")
+ .addHeader("Accept", "application/json")
+ .addHeader("Authorization: Token ")
+ .build();
+Response response = client.newCall(request).execute();
+```
+
+```php
+ 'https://api.netbird.io/api/setup-keys',
+ CURLOPT_RETURNTRANSFER => true,
+ CURLOPT_ENCODING => '',
+ CURLOPT_MAXREDIRS => 10,
+ CURLOPT_TIMEOUT => 0,
+ CURLOPT_FOLLOWLOCATION => true,
+ CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
+ CURLOPT_CUSTOMREQUEST => 'GET',
+ CURLOPT_HTTPHEADER => array(
+ 'Accept: application/json',
+ 'Authorization: Token '
+ ),
+));
+
+$response = curl_exec($curl);
+
+curl_close($curl);
+echo $response;
+```
+
+
+
+
+
+
+```json {{ title: 'Example' }}
+[
+ {
+ "id": "2531583362",
+ "key": "A616097E-FCF0-48FA-9354-CA4A61142761",
+ "name": "Default key",
+ "expires": "2023-06-01T14:47:22.291057Z",
+ "type": "reusable",
+ "valid": true,
+ "revoked": false,
+ "used_times": 2,
+ "last_used": "2023-05-05T09:00:35.477782Z",
+ "state": "valid",
+ "auto_groups": [
+ "devs"
+ ],
+ "updated_at": "2023-05-05T09:00:35.477782Z",
+ "usage_limit": 0
+ }
+]
+```
+```json {{ title: 'Schema' }}
+[
+ {
+ "id": "string",
+ "key": "string",
+ "name": "string",
+ "expires": "string",
+ "type": "string",
+ "valid": "boolean",
+ "revoked": "boolean",
+ "used_times": "integer",
+ "last_used": "string",
+ "state": "string",
+ "auto_groups": [
+ "string"
+ ],
+ "updated_at": "string",
+ "usage_limit": "integer"
+ }
+]
+```
+
+
+
+
+
+
+
+
+
+---
+
+
+## Create a Setup Key {{ tag: 'POST' , label: '/api/setup-keys' }}
+
+
+
+ Creates a Setup Key
+
+ #### Request-Body Parameters
+
+
+
+ Setup Key name
+
+
+
+ Setup key type, one-off for single time usage and reusable
+
+
+
+ Expiration time in seconds
+
+
+
+ Setup key revocation status
+
+
+
+ Setup key groups to auto-assign to peers registered with this key
+
+
+
+ A number of times this key can be used. The value of 0 indicates the unlimited usage.
+
+
+
+
+
+
+```bash {{ title: 'cURL' }}
+curl -X POST https://api.netbird.io/api/setup-keys \
+-H 'Accept: application/json' \
+-H 'Content-Type: application/json' \
+-H 'Authorization: Token ' \
+--data-raw '{
+ "name": "Default key",
+ "type": "reusable",
+ "expires_in": 43200,
+ "revoked": false,
+ "auto_groups": [
+ "devs"
+ ],
+ "usage_limit": 0
+}'
+```
+
+```js
+const axios = require('axios');
+let data = JSON.stringify({
+ "name": "Default key",
+ "type": "reusable",
+ "expires_in": 43200,
+ "revoked": false,
+ "auto_groups": [
+ "devs"
+ ],
+ "usage_limit": 0
+});
+let config = {
+ method: 'post',
+ maxBodyLength: Infinity,
+ url: '/api/setup-keys',
+ headers: {
+ 'Accept': 'application/json',
+ 'Content-Type': 'application/json',
+ 'Authorization': 'Token '
+ },
+ data : data
+};
+
+axios(config)
+.then((response) => {
+ console.log(JSON.stringify(response.data));
+})
+.catch((error) => {
+ console.log(error);
+});
+```
+
+```python
+import requests
+import json
+
+url = "https://api.netbird.io/api/setup-keys"
+payload = json.dumps({
+ "name": "Default key",
+ "type": "reusable",
+ "expires_in": 43200,
+ "revoked": false,
+ "auto_groups": [
+ "devs"
+ ],
+ "usage_limit": 0
+})
+headers: {
+ 'Content-Type': 'application/json',
+ 'Accept': 'application/json',
+ 'Authorization': 'Token '
+}
+
+response = requests.request("POST", url, headers=headers, data=payload)
+
+print(response.text)
+```
+
+```go
+package main
+
+import (
+ "fmt"
+ "strings"
+ "net/http"
+ "io/ioutil"
+)
+
+func main() {
+
+ url := "https://api.netbird.io/api/setup-keys"
+ method := "POST"
+
+ payload := strings.NewReader(`{
+ "name": "Default key",
+ "type": "reusable",
+ "expires_in": 43200,
+ "revoked": false,
+ "auto_groups": [
+ "devs"
+ ],
+ "usage_limit": 0
+}`)
+ client := &http.Client {
+ }
+ req, err := http.NewRequest(method, url, payload)
+
+ if err != nil {
+ fmt.Println(err)
+ return
+ {
+
+ req.Header.Add("Content-Type", "application/json")
+ req.Header.Add("Accept", "application/json")
+ req.Header.Add("Authorization", "Token ")
+
+ res, err := client.Do(req)
+ if err != nil {
+ fmt.Println(err)
+ return
+ }
+ defer res.Body.Close()
+
+ body, err := ioutil.ReadAll(res.Body)
+ if err != nil {
+ fmt.Println(err)
+ return
+ }
+ fmt.Println(string(body))
+}
+```
+
+```ruby
+require "uri"
+require "json"
+require "net/http"
+
+url = URI("https://api.netbird.io/api/setup-keys")
+
+https = Net::HTTP.new(url.host, url.port)
+https.use_ssl = true
+
+request = Net::HTTP::Post.new(url)
+request["Content-Type"] = "application/json"
+request["Accept"] = "application/json"
+request["Authorization"] = "Token "
+
+request.body = JSON.dump({
+ "name": "Default key",
+ "type": "reusable",
+ "expires_in": 43200,
+ "revoked": false,
+ "auto_groups": [
+ "devs"
+ ],
+ "usage_limit": 0
+})
+response = https.request(request)
+puts response.read_body
+```
+
+```java
+OkHttpClient client = new OkHttpClient().newBuilder()
+ .build();
+MediaType mediaType = MediaType.parse("application/json");
+RequestBody body = RequestBody.create(mediaType, '{
+ "name": "Default key",
+ "type": "reusable",
+ "expires_in": 43200,
+ "revoked": false,
+ "auto_groups": [
+ "devs"
+ ],
+ "usage_limit": 0
+}');
+Request request = new Request.Builder()
+ .url("https://api.netbird.io/api/setup-keys")
+ .method("POST", body)
+ .addHeader("Content-Type", "application/json")
+ .addHeader("Accept", "application/json")
+ .addHeader("Authorization: Token ")
+ .build();
+Response response = client.newCall(request).execute();
+```
+
+```php
+ 'https://api.netbird.io/api/setup-keys',
+ CURLOPT_RETURNTRANSFER => true,
+ CURLOPT_ENCODING => '',
+ CURLOPT_MAXREDIRS => 10,
+ CURLOPT_TIMEOUT => 0,
+ CURLOPT_FOLLOWLOCATION => true,
+ CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
+ CURLOPT_CUSTOMREQUEST => 'POST',
+ CURLOPT_POSTFIELDS => '{
+ "name": "Default key",
+ "type": "reusable",
+ "expires_in": 43200,
+ "revoked": false,
+ "auto_groups": [
+ "devs"
+ ],
+ "usage_limit": 0
+}',
+ CURLOPT_HTTPHEADER => array(
+ 'Content-Type: application/json',
+ 'Accept: application/json',
+ 'Authorization: Token '
+ ),
+));
+
+$response = curl_exec($curl);
+
+curl_close($curl);
+echo $response;
+```
+
+
+
+
+
+
+```json {{ title: 'Example' }}
+{
+ "id": "2531583362",
+ "key": "A616097E-FCF0-48FA-9354-CA4A61142761",
+ "name": "Default key",
+ "expires": "2023-06-01T14:47:22.291057Z",
+ "type": "reusable",
+ "valid": true,
+ "revoked": false,
+ "used_times": 2,
+ "last_used": "2023-05-05T09:00:35.477782Z",
+ "state": "valid",
+ "auto_groups": [
+ "devs"
+ ],
+ "updated_at": "2023-05-05T09:00:35.477782Z",
+ "usage_limit": 0
+}
+```
+```json {{ title: 'Schema' }}
+{
+ "id": "string",
+ "key": "string",
+ "name": "string",
+ "expires": "string",
+ "type": "string",
+ "valid": "boolean",
+ "revoked": "boolean",
+ "used_times": "integer",
+ "last_used": "string",
+ "state": "string",
+ "auto_groups": [
+ "string"
+ ],
+ "updated_at": "string",
+ "usage_limit": "integer"
+}
+```
+
+
+
+
+
+
+
+
+
+---
+
+
+## Retrieve a Setup Key {{ tag: 'GET' , label: '/api/setup-keys/{keyId}' }}
+
+
+
+ Get information about a Setup Key
+
+ #### Path Parameters
+
+
+
+ The unique identifier of a setup key
+
+
+
+
+
+
+```bash {{ title: 'cURL' }}
+curl -X GET https://api.netbird.io/api/setup-keys/{keyId} \
+-H 'Accept: application/json' \
+-H 'Authorization: Token '
+```
+
+```js
+const axios = require('axios');
+
+let config = {
+ method: 'get',
+ maxBodyLength: Infinity,
+ url: '/api/setup-keys/{keyId}',
+ headers: {
+ 'Accept': 'application/json',
+ 'Authorization': 'Token '
+ }
+};
+
+axios(config)
+.then((response) => {
+ console.log(JSON.stringify(response.data));
+})
+.catch((error) => {
+ console.log(error);
+});
+```
+
+```python
+import requests
+import json
+
+url = "https://api.netbird.io/api/setup-keys/{keyId}"
+
+headers: {
+ 'Accept': 'application/json',
+ 'Authorization': 'Token '
+}
+
+response = requests.request("GET", url, headers=headers)
+
+print(response.text)
+```
+
+```go
+package main
+
+import (
+ "fmt"
+ "strings"
+ "net/http"
+ "io/ioutil"
+)
+
+func main() {
+
+ url := "https://api.netbird.io/api/setup-keys/{keyId}"
+ method := "GET"
+
+ client := &http.Client {
+ }
+ req, err := http.NewRequest(method, url, nil)
+
+ if err != nil {
+ fmt.Println(err)
+ return
+ {
+
+ req.Header.Add("Accept", "application/json")
+ req.Header.Add("Authorization", "Token ")
+
+ res, err := client.Do(req)
+ if err != nil {
+ fmt.Println(err)
+ return
+ }
+ defer res.Body.Close()
+
+ body, err := ioutil.ReadAll(res.Body)
+ if err != nil {
+ fmt.Println(err)
+ return
+ }
+ fmt.Println(string(body))
+}
+```
+
+```ruby
+require "uri"
+require "json"
+require "net/http"
+
+url = URI("https://api.netbird.io/api/setup-keys/{keyId}")
+
+https = Net::HTTP.new(url.host, url.port)
+https.use_ssl = true
+
+request = Net::HTTP::Get.new(url)
+request["Accept"] = "application/json"
+request["Authorization"] = "Token "
+
+response = https.request(request)
+puts response.read_body
+```
+
+```java
+OkHttpClient client = new OkHttpClient().newBuilder()
+ .build();
+
+Request request = new Request.Builder()
+ .url("https://api.netbird.io/api/setup-keys/{keyId}")
+ .method("GET")
+ .addHeader("Accept", "application/json")
+ .addHeader("Authorization: Token ")
+ .build();
+Response response = client.newCall(request).execute();
+```
+
+```php
+ 'https://api.netbird.io/api/setup-keys/{keyId}',
+ CURLOPT_RETURNTRANSFER => true,
+ CURLOPT_ENCODING => '',
+ CURLOPT_MAXREDIRS => 10,
+ CURLOPT_TIMEOUT => 0,
+ CURLOPT_FOLLOWLOCATION => true,
+ CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
+ CURLOPT_CUSTOMREQUEST => 'GET',
+ CURLOPT_HTTPHEADER => array(
+ 'Accept: application/json',
+ 'Authorization: Token '
+ ),
+));
+
+$response = curl_exec($curl);
+
+curl_close($curl);
+echo $response;
+```
+
+
+
+
+
+
+```json {{ title: 'Example' }}
+{
+ "id": "2531583362",
+ "key": "A616097E-FCF0-48FA-9354-CA4A61142761",
+ "name": "Default key",
+ "expires": "2023-06-01T14:47:22.291057Z",
+ "type": "reusable",
+ "valid": true,
+ "revoked": false,
+ "used_times": 2,
+ "last_used": "2023-05-05T09:00:35.477782Z",
+ "state": "valid",
+ "auto_groups": [
+ "devs"
+ ],
+ "updated_at": "2023-05-05T09:00:35.477782Z",
+ "usage_limit": 0
+}
+```
+```json {{ title: 'Schema' }}
+{
+ "id": "string",
+ "key": "string",
+ "name": "string",
+ "expires": "string",
+ "type": "string",
+ "valid": "boolean",
+ "revoked": "boolean",
+ "used_times": "integer",
+ "last_used": "string",
+ "state": "string",
+ "auto_groups": [
+ "string"
+ ],
+ "updated_at": "string",
+ "usage_limit": "integer"
+}
+```
+
+
+
+
+
+
+
+
+
+---
+
+
+## Update a Setup Key {{ tag: 'PUT' , label: '/api/setup-keys/{keyId}' }}
+
+
+
+ Update information about a Setup Key
+
+ #### Path Parameters
+
+
+
+ The unique identifier of a setup key
+
+
+
+ #### Request-Body Parameters
+
+
+
+ Setup Key name
+
+
+
+ Setup key type, one-off for single time usage and reusable
+
+
+
+ Expiration time in seconds
+
+
+
+ Setup key revocation status
+
+
+
+ Setup key groups to auto-assign to peers registered with this key
+
+
+
+ A number of times this key can be used. The value of 0 indicates the unlimited usage.
+
+
+
+
+
+
+```bash {{ title: 'cURL' }}
+curl -X PUT https://api.netbird.io/api/setup-keys/{keyId} \
+-H 'Accept: application/json' \
+-H 'Content-Type: application/json' \
+-H 'Authorization: Token ' \
+--data-raw '{
+ "name": "Default key",
+ "type": "reusable",
+ "expires_in": 43200,
+ "revoked": false,
+ "auto_groups": [
+ "devs"
+ ],
+ "usage_limit": 0
+}'
+```
+
+```js
+const axios = require('axios');
+let data = JSON.stringify({
+ "name": "Default key",
+ "type": "reusable",
+ "expires_in": 43200,
+ "revoked": false,
+ "auto_groups": [
+ "devs"
+ ],
+ "usage_limit": 0
+});
+let config = {
+ method: 'put',
+ maxBodyLength: Infinity,
+ url: '/api/setup-keys/{keyId}',
+ headers: {
+ 'Accept': 'application/json',
+ 'Content-Type': 'application/json',
+ 'Authorization': 'Token '
+ },
+ data : data
+};
+
+axios(config)
+.then((response) => {
+ console.log(JSON.stringify(response.data));
+})
+.catch((error) => {
+ console.log(error);
+});
+```
+
+```python
+import requests
+import json
+
+url = "https://api.netbird.io/api/setup-keys/{keyId}"
+payload = json.dumps({
+ "name": "Default key",
+ "type": "reusable",
+ "expires_in": 43200,
+ "revoked": false,
+ "auto_groups": [
+ "devs"
+ ],
+ "usage_limit": 0
+})
+headers: {
+ 'Content-Type': 'application/json',
+ 'Accept': 'application/json',
+ 'Authorization': 'Token '
+}
+
+response = requests.request("PUT", url, headers=headers, data=payload)
+
+print(response.text)
+```
+
+```go
+package main
+
+import (
+ "fmt"
+ "strings"
+ "net/http"
+ "io/ioutil"
+)
+
+func main() {
+
+ url := "https://api.netbird.io/api/setup-keys/{keyId}"
+ method := "PUT"
+
+ payload := strings.NewReader(`{
+ "name": "Default key",
+ "type": "reusable",
+ "expires_in": 43200,
+ "revoked": false,
+ "auto_groups": [
+ "devs"
+ ],
+ "usage_limit": 0
+}`)
+ client := &http.Client {
+ }
+ req, err := http.NewRequest(method, url, payload)
+
+ if err != nil {
+ fmt.Println(err)
+ return
+ {
+
+ req.Header.Add("Content-Type", "application/json")
+ req.Header.Add("Accept", "application/json")
+ req.Header.Add("Authorization", "Token ")
+
+ res, err := client.Do(req)
+ if err != nil {
+ fmt.Println(err)
+ return
+ }
+ defer res.Body.Close()
+
+ body, err := ioutil.ReadAll(res.Body)
+ if err != nil {
+ fmt.Println(err)
+ return
+ }
+ fmt.Println(string(body))
+}
+```
+
+```ruby
+require "uri"
+require "json"
+require "net/http"
+
+url = URI("https://api.netbird.io/api/setup-keys/{keyId}")
+
+https = Net::HTTP.new(url.host, url.port)
+https.use_ssl = true
+
+request = Net::HTTP::Put.new(url)
+request["Content-Type"] = "application/json"
+request["Accept"] = "application/json"
+request["Authorization"] = "Token "
+
+request.body = JSON.dump({
+ "name": "Default key",
+ "type": "reusable",
+ "expires_in": 43200,
+ "revoked": false,
+ "auto_groups": [
+ "devs"
+ ],
+ "usage_limit": 0
+})
+response = https.request(request)
+puts response.read_body
+```
+
+```java
+OkHttpClient client = new OkHttpClient().newBuilder()
+ .build();
+MediaType mediaType = MediaType.parse("application/json");
+RequestBody body = RequestBody.create(mediaType, '{
+ "name": "Default key",
+ "type": "reusable",
+ "expires_in": 43200,
+ "revoked": false,
+ "auto_groups": [
+ "devs"
+ ],
+ "usage_limit": 0
+}');
+Request request = new Request.Builder()
+ .url("https://api.netbird.io/api/setup-keys/{keyId}")
+ .method("PUT", body)
+ .addHeader("Content-Type", "application/json")
+ .addHeader("Accept", "application/json")
+ .addHeader("Authorization: Token ")
+ .build();
+Response response = client.newCall(request).execute();
+```
+
+```php
+ 'https://api.netbird.io/api/setup-keys/{keyId}',
+ CURLOPT_RETURNTRANSFER => true,
+ CURLOPT_ENCODING => '',
+ CURLOPT_MAXREDIRS => 10,
+ CURLOPT_TIMEOUT => 0,
+ CURLOPT_FOLLOWLOCATION => true,
+ CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
+ CURLOPT_CUSTOMREQUEST => 'PUT',
+ CURLOPT_POSTFIELDS => '{
+ "name": "Default key",
+ "type": "reusable",
+ "expires_in": 43200,
+ "revoked": false,
+ "auto_groups": [
+ "devs"
+ ],
+ "usage_limit": 0
+}',
+ CURLOPT_HTTPHEADER => array(
+ 'Content-Type: application/json',
+ 'Accept: application/json',
+ 'Authorization: Token '
+ ),
+));
+
+$response = curl_exec($curl);
+
+curl_close($curl);
+echo $response;
+```
+
+
+
+
+
+
+```json {{ title: 'Example' }}
+{
+ "id": "2531583362",
+ "key": "A616097E-FCF0-48FA-9354-CA4A61142761",
+ "name": "Default key",
+ "expires": "2023-06-01T14:47:22.291057Z",
+ "type": "reusable",
+ "valid": true,
+ "revoked": false,
+ "used_times": 2,
+ "last_used": "2023-05-05T09:00:35.477782Z",
+ "state": "valid",
+ "auto_groups": [
+ "devs"
+ ],
+ "updated_at": "2023-05-05T09:00:35.477782Z",
+ "usage_limit": 0
+}
+```
+```json {{ title: 'Schema' }}
+{
+ "id": "string",
+ "key": "string",
+ "name": "string",
+ "expires": "string",
+ "type": "string",
+ "valid": "boolean",
+ "revoked": "boolean",
+ "used_times": "integer",
+ "last_used": "string",
+ "state": "string",
+ "auto_groups": [
+ "string"
+ ],
+ "updated_at": "string",
+ "usage_limit": "integer"
+}
+```
+
+
+
+
+
+
+
+
+
+---
diff --git a/src/pages/ipa/resources/tokens.mdx b/src/pages/ipa/resources/tokens.mdx
new file mode 100644
index 00000000..2b5b6ac4
--- /dev/null
+++ b/src/pages/ipa/resources/tokens.mdx
@@ -0,0 +1,837 @@
+
+export const title = 'Tokens'
+
+
+
+## List all Tokens {{ tag: 'GET' , label: '/api/users/{userId}/tokens' }}
+
+
+
+ Returns a list of all tokens for a user
+
+ #### Path Parameters
+
+
+
+ The unique identifier of a user
+
+
+
+
+
+
+```bash {{ title: 'cURL' }}
+curl -X GET https://api.netbird.io/api/users/{userId}/tokens \
+-H 'Accept: application/json' \
+-H 'Authorization: Token '
+```
+
+```js
+const axios = require('axios');
+
+let config = {
+ method: 'get',
+ maxBodyLength: Infinity,
+ url: '/api/users/{userId}/tokens',
+ headers: {
+ 'Accept': 'application/json',
+ 'Authorization': 'Token '
+ }
+};
+
+axios(config)
+.then((response) => {
+ console.log(JSON.stringify(response.data));
+})
+.catch((error) => {
+ console.log(error);
+});
+```
+
+```python
+import requests
+import json
+
+url = "https://api.netbird.io/api/users/{userId}/tokens"
+
+headers: {
+ 'Accept': 'application/json',
+ 'Authorization': 'Token '
+}
+
+response = requests.request("GET", url, headers=headers)
+
+print(response.text)
+```
+
+```go
+package main
+
+import (
+ "fmt"
+ "strings"
+ "net/http"
+ "io/ioutil"
+)
+
+func main() {
+
+ url := "https://api.netbird.io/api/users/{userId}/tokens"
+ method := "GET"
+
+ client := &http.Client {
+ }
+ req, err := http.NewRequest(method, url, nil)
+
+ if err != nil {
+ fmt.Println(err)
+ return
+ {
+
+ req.Header.Add("Accept", "application/json")
+ req.Header.Add("Authorization", "Token ")
+
+ res, err := client.Do(req)
+ if err != nil {
+ fmt.Println(err)
+ return
+ }
+ defer res.Body.Close()
+
+ body, err := ioutil.ReadAll(res.Body)
+ if err != nil {
+ fmt.Println(err)
+ return
+ }
+ fmt.Println(string(body))
+}
+```
+
+```ruby
+require "uri"
+require "json"
+require "net/http"
+
+url = URI("https://api.netbird.io/api/users/{userId}/tokens")
+
+https = Net::HTTP.new(url.host, url.port)
+https.use_ssl = true
+
+request = Net::HTTP::Get.new(url)
+request["Accept"] = "application/json"
+request["Authorization"] = "Token "
+
+response = https.request(request)
+puts response.read_body
+```
+
+```java
+OkHttpClient client = new OkHttpClient().newBuilder()
+ .build();
+
+Request request = new Request.Builder()
+ .url("https://api.netbird.io/api/users/{userId}/tokens")
+ .method("GET")
+ .addHeader("Accept", "application/json")
+ .addHeader("Authorization: Token ")
+ .build();
+Response response = client.newCall(request).execute();
+```
+
+```php
+ 'https://api.netbird.io/api/users/{userId}/tokens',
+ CURLOPT_RETURNTRANSFER => true,
+ CURLOPT_ENCODING => '',
+ CURLOPT_MAXREDIRS => 10,
+ CURLOPT_TIMEOUT => 0,
+ CURLOPT_FOLLOWLOCATION => true,
+ CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
+ CURLOPT_CUSTOMREQUEST => 'GET',
+ CURLOPT_HTTPHEADER => array(
+ 'Accept: application/json',
+ 'Authorization: Token '
+ ),
+));
+
+$response = curl_exec($curl);
+
+curl_close($curl);
+echo $response;
+```
+
+
+
+
+
+
+```json {{ title: 'Example' }}
+[
+ {
+ "id": "ch8i54g6lnn4g9hqv7n0",
+ "name": "My first token",
+ "expiration_date": "2023-05-05T14:38:28.977616Z",
+ "created_by": "google-oauth2|277474792786460067937",
+ "created_at": "2023-05-02T14:48:20.465209Z",
+ "last_used": "2023-05-04T12:45:25.9723616Z"
+ }
+]
+```
+```json {{ title: 'Schema' }}
+[
+ {
+ "id": "string",
+ "name": "string",
+ "expiration_date": "string",
+ "created_by": "string",
+ "created_at": "string",
+ "last_used": "string"
+ }
+]
+```
+
+
+
+
+
+
+
+
+
+---
+
+
+## Create a Token {{ tag: 'POST' , label: '/api/users/{userId}/tokens' }}
+
+
+
+ Create a new token for a user
+
+ #### Path Parameters
+
+
+
+ The unique identifier of a user
+
+
+
+ #### Request-Body Parameters
+
+
+
+ Name of the token
+
+
+
+ Expiration in days
+
+
+
+
+
+
+```bash {{ title: 'cURL' }}
+curl -X POST https://api.netbird.io/api/users/{userId}/tokens \
+-H 'Accept: application/json' \
+-H 'Content-Type: application/json' \
+-H 'Authorization: Token ' \
+--data-raw '{
+ "name": "My first token",
+ "expires_in": 30
+}'
+```
+
+```js
+const axios = require('axios');
+let data = JSON.stringify({
+ "name": "My first token",
+ "expires_in": 30
+});
+let config = {
+ method: 'post',
+ maxBodyLength: Infinity,
+ url: '/api/users/{userId}/tokens',
+ headers: {
+ 'Accept': 'application/json',
+ 'Content-Type': 'application/json',
+ 'Authorization': 'Token '
+ },
+ data : data
+};
+
+axios(config)
+.then((response) => {
+ console.log(JSON.stringify(response.data));
+})
+.catch((error) => {
+ console.log(error);
+});
+```
+
+```python
+import requests
+import json
+
+url = "https://api.netbird.io/api/users/{userId}/tokens"
+payload = json.dumps({
+ "name": "My first token",
+ "expires_in": 30
+})
+headers: {
+ 'Content-Type': 'application/json',
+ 'Accept': 'application/json',
+ 'Authorization': 'Token '
+}
+
+response = requests.request("POST", url, headers=headers, data=payload)
+
+print(response.text)
+```
+
+```go
+package main
+
+import (
+ "fmt"
+ "strings"
+ "net/http"
+ "io/ioutil"
+)
+
+func main() {
+
+ url := "https://api.netbird.io/api/users/{userId}/tokens"
+ method := "POST"
+
+ payload := strings.NewReader(`{
+ "name": "My first token",
+ "expires_in": 30
+}`)
+ client := &http.Client {
+ }
+ req, err := http.NewRequest(method, url, payload)
+
+ if err != nil {
+ fmt.Println(err)
+ return
+ {
+
+ req.Header.Add("Content-Type", "application/json")
+ req.Header.Add("Accept", "application/json")
+ req.Header.Add("Authorization", "Token ")
+
+ res, err := client.Do(req)
+ if err != nil {
+ fmt.Println(err)
+ return
+ }
+ defer res.Body.Close()
+
+ body, err := ioutil.ReadAll(res.Body)
+ if err != nil {
+ fmt.Println(err)
+ return
+ }
+ fmt.Println(string(body))
+}
+```
+
+```ruby
+require "uri"
+require "json"
+require "net/http"
+
+url = URI("https://api.netbird.io/api/users/{userId}/tokens")
+
+https = Net::HTTP.new(url.host, url.port)
+https.use_ssl = true
+
+request = Net::HTTP::Post.new(url)
+request["Content-Type"] = "application/json"
+request["Accept"] = "application/json"
+request["Authorization"] = "Token "
+
+request.body = JSON.dump({
+ "name": "My first token",
+ "expires_in": 30
+})
+response = https.request(request)
+puts response.read_body
+```
+
+```java
+OkHttpClient client = new OkHttpClient().newBuilder()
+ .build();
+MediaType mediaType = MediaType.parse("application/json");
+RequestBody body = RequestBody.create(mediaType, '{
+ "name": "My first token",
+ "expires_in": 30
+}');
+Request request = new Request.Builder()
+ .url("https://api.netbird.io/api/users/{userId}/tokens")
+ .method("POST", body)
+ .addHeader("Content-Type", "application/json")
+ .addHeader("Accept", "application/json")
+ .addHeader("Authorization: Token ")
+ .build();
+Response response = client.newCall(request).execute();
+```
+
+```php
+ 'https://api.netbird.io/api/users/{userId}/tokens',
+ CURLOPT_RETURNTRANSFER => true,
+ CURLOPT_ENCODING => '',
+ CURLOPT_MAXREDIRS => 10,
+ CURLOPT_TIMEOUT => 0,
+ CURLOPT_FOLLOWLOCATION => true,
+ CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
+ CURLOPT_CUSTOMREQUEST => 'POST',
+ CURLOPT_POSTFIELDS => '{
+ "name": "My first token",
+ "expires_in": 30
+}',
+ CURLOPT_HTTPHEADER => array(
+ 'Content-Type: application/json',
+ 'Accept: application/json',
+ 'Authorization: Token '
+ ),
+));
+
+$response = curl_exec($curl);
+
+curl_close($curl);
+echo $response;
+```
+
+
+
+
+
+
+```json {{ title: 'Example' }}
+{
+ "plain_token": "2023-05-02T14:48:20.465209Z",
+ "personal_access_token": {
+ "id": "ch8i54g6lnn4g9hqv7n0",
+ "name": "My first token",
+ "expiration_date": "2023-05-05T14:38:28.977616Z",
+ "created_by": "google-oauth2|277474792786460067937",
+ "created_at": "2023-05-02T14:48:20.465209Z",
+ "last_used": "2023-05-04T12:45:25.9723616Z"
+ }
+}
+```
+```json {{ title: 'Schema' }}
+{
+ "plain_token": "string",
+ "personal_access_token": {
+ "id": "string",
+ "name": "string",
+ "expiration_date": "string",
+ "created_by": "string",
+ "created_at": "string",
+ "last_used": "string"
+ }
+}
+```
+
+
+
+
+
+
+
+
+
+---
+
+
+## Retrieve a Token {{ tag: 'GET' , label: '/api/users/{userId}/tokens/{tokenId}' }}
+
+
+
+ Returns a specific token for a user
+
+ #### Path Parameters
+
+
+
+ The unique identifier of a user
+
+
+
+ The unique identifier of a token
+
+
+
+
+
+
+```bash {{ title: 'cURL' }}
+curl -X GET https://api.netbird.io/api/users/{userId}/tokens/{tokenId} \
+-H 'Accept: application/json' \
+-H 'Authorization: Token '
+```
+
+```js
+const axios = require('axios');
+
+let config = {
+ method: 'get',
+ maxBodyLength: Infinity,
+ url: '/api/users/{userId}/tokens/{tokenId}',
+ headers: {
+ 'Accept': 'application/json',
+ 'Authorization': 'Token '
+ }
+};
+
+axios(config)
+.then((response) => {
+ console.log(JSON.stringify(response.data));
+})
+.catch((error) => {
+ console.log(error);
+});
+```
+
+```python
+import requests
+import json
+
+url = "https://api.netbird.io/api/users/{userId}/tokens/{tokenId}"
+
+headers: {
+ 'Accept': 'application/json',
+ 'Authorization': 'Token '
+}
+
+response = requests.request("GET", url, headers=headers)
+
+print(response.text)
+```
+
+```go
+package main
+
+import (
+ "fmt"
+ "strings"
+ "net/http"
+ "io/ioutil"
+)
+
+func main() {
+
+ url := "https://api.netbird.io/api/users/{userId}/tokens/{tokenId}"
+ method := "GET"
+
+ client := &http.Client {
+ }
+ req, err := http.NewRequest(method, url, nil)
+
+ if err != nil {
+ fmt.Println(err)
+ return
+ {
+
+ req.Header.Add("Accept", "application/json")
+ req.Header.Add("Authorization", "Token ")
+
+ res, err := client.Do(req)
+ if err != nil {
+ fmt.Println(err)
+ return
+ }
+ defer res.Body.Close()
+
+ body, err := ioutil.ReadAll(res.Body)
+ if err != nil {
+ fmt.Println(err)
+ return
+ }
+ fmt.Println(string(body))
+}
+```
+
+```ruby
+require "uri"
+require "json"
+require "net/http"
+
+url = URI("https://api.netbird.io/api/users/{userId}/tokens/{tokenId}")
+
+https = Net::HTTP.new(url.host, url.port)
+https.use_ssl = true
+
+request = Net::HTTP::Get.new(url)
+request["Accept"] = "application/json"
+request["Authorization"] = "Token "
+
+response = https.request(request)
+puts response.read_body
+```
+
+```java
+OkHttpClient client = new OkHttpClient().newBuilder()
+ .build();
+
+Request request = new Request.Builder()
+ .url("https://api.netbird.io/api/users/{userId}/tokens/{tokenId}")
+ .method("GET")
+ .addHeader("Accept", "application/json")
+ .addHeader("Authorization: Token ")
+ .build();
+Response response = client.newCall(request).execute();
+```
+
+```php
+ 'https://api.netbird.io/api/users/{userId}/tokens/{tokenId}',
+ CURLOPT_RETURNTRANSFER => true,
+ CURLOPT_ENCODING => '',
+ CURLOPT_MAXREDIRS => 10,
+ CURLOPT_TIMEOUT => 0,
+ CURLOPT_FOLLOWLOCATION => true,
+ CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
+ CURLOPT_CUSTOMREQUEST => 'GET',
+ CURLOPT_HTTPHEADER => array(
+ 'Accept: application/json',
+ 'Authorization: Token '
+ ),
+));
+
+$response = curl_exec($curl);
+
+curl_close($curl);
+echo $response;
+```
+
+
+
+
+
+
+```json {{ title: 'Example' }}
+{
+ "id": "ch8i54g6lnn4g9hqv7n0",
+ "name": "My first token",
+ "expiration_date": "2023-05-05T14:38:28.977616Z",
+ "created_by": "google-oauth2|277474792786460067937",
+ "created_at": "2023-05-02T14:48:20.465209Z",
+ "last_used": "2023-05-04T12:45:25.9723616Z"
+}
+```
+```json {{ title: 'Schema' }}
+{
+ "id": "string",
+ "name": "string",
+ "expiration_date": "string",
+ "created_by": "string",
+ "created_at": "string",
+ "last_used": "string"
+}
+```
+
+
+
+
+
+
+
+
+
+---
+
+
+## Delete a Token {{ tag: 'DELETE' , label: '/api/users/{userId}/tokens/{tokenId}' }}
+
+
+
+ Delete a token for a user
+
+ #### Path Parameters
+
+
+
+ The unique identifier of a user
+
+
+
+ The unique identifier of a token
+
+
+
+
+
+
+```bash {{ title: 'cURL' }}
+curl -X DELETE https://api.netbird.io/api/users/{userId}/tokens/{tokenId} \
+-H 'Authorization: Token '
+```
+
+```js
+const axios = require('axios');
+
+let config = {
+ method: 'delete',
+ maxBodyLength: Infinity,
+ url: '/api/users/{userId}/tokens/{tokenId}',
+ headers: {
+ 'Authorization': 'Token '
+ }
+};
+
+axios(config)
+.then((response) => {
+ console.log(JSON.stringify(response.data));
+})
+.catch((error) => {
+ console.log(error);
+});
+```
+
+```python
+import requests
+import json
+
+url = "https://api.netbird.io/api/users/{userId}/tokens/{tokenId}"
+
+headers: {
+ 'Authorization': 'Token '
+}
+
+response = requests.request("DELETE", url, headers=headers)
+
+print(response.text)
+```
+
+```go
+package main
+
+import (
+ "fmt"
+ "strings"
+ "net/http"
+ "io/ioutil"
+)
+
+func main() {
+
+ url := "https://api.netbird.io/api/users/{userId}/tokens/{tokenId}"
+ method := "DELETE"
+
+ client := &http.Client {
+ }
+ req, err := http.NewRequest(method, url, nil)
+
+ if err != nil {
+ fmt.Println(err)
+ return
+ {
+
+ req.Header.Add("Authorization", "Token ")
+
+ res, err := client.Do(req)
+ if err != nil {
+ fmt.Println(err)
+ return
+ }
+ defer res.Body.Close()
+
+ body, err := ioutil.ReadAll(res.Body)
+ if err != nil {
+ fmt.Println(err)
+ return
+ }
+ fmt.Println(string(body))
+}
+```
+
+```ruby
+require "uri"
+require "json"
+require "net/http"
+
+url = URI("https://api.netbird.io/api/users/{userId}/tokens/{tokenId}")
+
+https = Net::HTTP.new(url.host, url.port)
+https.use_ssl = true
+
+request = Net::HTTP::Delete.new(url)
+request["Authorization"] = "Token "
+
+response = https.request(request)
+puts response.read_body
+```
+
+```java
+OkHttpClient client = new OkHttpClient().newBuilder()
+ .build();
+
+Request request = new Request.Builder()
+ .url("https://api.netbird.io/api/users/{userId}/tokens/{tokenId}")
+ .method("DELETE")
+ .addHeader("Authorization: Token ")
+ .build();
+Response response = client.newCall(request).execute();
+```
+
+```php
+ 'https://api.netbird.io/api/users/{userId}/tokens/{tokenId}',
+ CURLOPT_RETURNTRANSFER => true,
+ CURLOPT_ENCODING => '',
+ CURLOPT_MAXREDIRS => 10,
+ CURLOPT_TIMEOUT => 0,
+ CURLOPT_FOLLOWLOCATION => true,
+ CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
+ CURLOPT_CUSTOMREQUEST => 'DELETE',
+ CURLOPT_HTTPHEADER => array(
+ 'Authorization: Token '
+ ),
+));
+
+$response = curl_exec($curl);
+
+curl_close($curl);
+echo $response;
+```
+
+
+
+
+
+
+
+
+
+
+---
diff --git a/src/pages/ipa/resources/users.mdx b/src/pages/ipa/resources/users.mdx
new file mode 100644
index 00000000..0f46d1b8
--- /dev/null
+++ b/src/pages/ipa/resources/users.mdx
@@ -0,0 +1,957 @@
+
+export const title = 'Users'
+
+
+
+## List all Users {{ tag: 'GET' , label: '/api/users' }}
+
+
+
+ Returns a list of all users
+
+ #### Query Parameters
+
+
+
+ Filters users and returns either regular users or service users
+
+
+
+
+
+
+```bash {{ title: 'cURL' }}
+curl -X GET https://api.netbird.io/api/users \
+-H 'Accept: application/json' \
+-H 'Authorization: Token '
+```
+
+```js
+const axios = require('axios');
+
+let config = {
+ method: 'get',
+ maxBodyLength: Infinity,
+ url: '/api/users',
+ headers: {
+ 'Accept': 'application/json',
+ 'Authorization': 'Token '
+ }
+};
+
+axios(config)
+.then((response) => {
+ console.log(JSON.stringify(response.data));
+})
+.catch((error) => {
+ console.log(error);
+});
+```
+
+```python
+import requests
+import json
+
+url = "https://api.netbird.io/api/users"
+
+headers: {
+ 'Accept': 'application/json',
+ 'Authorization': 'Token '
+}
+
+response = requests.request("GET", url, headers=headers)
+
+print(response.text)
+```
+
+```go
+package main
+
+import (
+ "fmt"
+ "strings"
+ "net/http"
+ "io/ioutil"
+)
+
+func main() {
+
+ url := "https://api.netbird.io/api/users"
+ method := "GET"
+
+ client := &http.Client {
+ }
+ req, err := http.NewRequest(method, url, nil)
+
+ if err != nil {
+ fmt.Println(err)
+ return
+ {
+
+ req.Header.Add("Accept", "application/json")
+ req.Header.Add("Authorization", "Token ")
+
+ res, err := client.Do(req)
+ if err != nil {
+ fmt.Println(err)
+ return
+ }
+ defer res.Body.Close()
+
+ body, err := ioutil.ReadAll(res.Body)
+ if err != nil {
+ fmt.Println(err)
+ return
+ }
+ fmt.Println(string(body))
+}
+```
+
+```ruby
+require "uri"
+require "json"
+require "net/http"
+
+url = URI("https://api.netbird.io/api/users")
+
+https = Net::HTTP.new(url.host, url.port)
+https.use_ssl = true
+
+request = Net::HTTP::Get.new(url)
+request["Accept"] = "application/json"
+request["Authorization"] = "Token "
+
+response = https.request(request)
+puts response.read_body
+```
+
+```java
+OkHttpClient client = new OkHttpClient().newBuilder()
+ .build();
+
+Request request = new Request.Builder()
+ .url("https://api.netbird.io/api/users")
+ .method("GET")
+ .addHeader("Accept", "application/json")
+ .addHeader("Authorization: Token ")
+ .build();
+Response response = client.newCall(request).execute();
+```
+
+```php
+ 'https://api.netbird.io/api/users',
+ CURLOPT_RETURNTRANSFER => true,
+ CURLOPT_ENCODING => '',
+ CURLOPT_MAXREDIRS => 10,
+ CURLOPT_TIMEOUT => 0,
+ CURLOPT_FOLLOWLOCATION => true,
+ CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
+ CURLOPT_CUSTOMREQUEST => 'GET',
+ CURLOPT_HTTPHEADER => array(
+ 'Accept: application/json',
+ 'Authorization: Token '
+ ),
+));
+
+$response = curl_exec($curl);
+
+curl_close($curl);
+echo $response;
+```
+
+
+
+
+
+
+```json {{ title: 'Example' }}
+[
+ {
+ "id": "google-oauth2|277474792786460067937",
+ "email": "demo@netbird.io",
+ "name": "Tom Schulz",
+ "role": "admin",
+ "status": "active",
+ "auto_groups": [
+ "devs"
+ ],
+ "is_current": true,
+ "is_service_user": false
+ }
+]
+```
+```json {{ title: 'Schema' }}
+[
+ {
+ "id": "string",
+ "email": "string",
+ "name": "string",
+ "role": "string",
+ "status": "string",
+ "auto_groups": [
+ "string"
+ ],
+ "is_current": "boolean",
+ "is_service_user": "boolean"
+ }
+]
+```
+
+
+
+
+
+
+
+
+
+---
+
+
+## Create a User {{ tag: 'POST' , label: '/api/users' }}
+
+
+
+ Creates a new service user or sends an invite to a regular user
+
+ #### Request-Body Parameters
+
+
+
+ User's Email to send invite to
+
+
+
+ User's full name
+
+
+
+ User's NetBird account role
+
+
+
+ Groups to auto-assign to peers registered by this user
+
+
+
+ Is true if this user is a service user
+
+
+
+
+
+
+```bash {{ title: 'cURL' }}
+curl -X POST https://api.netbird.io/api/users \
+-H 'Accept: application/json' \
+-H 'Content-Type: application/json' \
+-H 'Authorization: Token ' \
+--data-raw '{
+ "email": "demo@netbird.io",
+ "name": "Tom Schulz",
+ "role": "admin",
+ "auto_groups": [
+ "devs"
+ ],
+ "is_service_user": false
+}'
+```
+
+```js
+const axios = require('axios');
+let data = JSON.stringify({
+ "email": "demo@netbird.io",
+ "name": "Tom Schulz",
+ "role": "admin",
+ "auto_groups": [
+ "devs"
+ ],
+ "is_service_user": false
+});
+let config = {
+ method: 'post',
+ maxBodyLength: Infinity,
+ url: '/api/users',
+ headers: {
+ 'Accept': 'application/json',
+ 'Content-Type': 'application/json',
+ 'Authorization': 'Token '
+ },
+ data : data
+};
+
+axios(config)
+.then((response) => {
+ console.log(JSON.stringify(response.data));
+})
+.catch((error) => {
+ console.log(error);
+});
+```
+
+```python
+import requests
+import json
+
+url = "https://api.netbird.io/api/users"
+payload = json.dumps({
+ "email": "demo@netbird.io",
+ "name": "Tom Schulz",
+ "role": "admin",
+ "auto_groups": [
+ "devs"
+ ],
+ "is_service_user": false
+})
+headers: {
+ 'Content-Type': 'application/json',
+ 'Accept': 'application/json',
+ 'Authorization': 'Token '
+}
+
+response = requests.request("POST", url, headers=headers, data=payload)
+
+print(response.text)
+```
+
+```go
+package main
+
+import (
+ "fmt"
+ "strings"
+ "net/http"
+ "io/ioutil"
+)
+
+func main() {
+
+ url := "https://api.netbird.io/api/users"
+ method := "POST"
+
+ payload := strings.NewReader(`{
+ "email": "demo@netbird.io",
+ "name": "Tom Schulz",
+ "role": "admin",
+ "auto_groups": [
+ "devs"
+ ],
+ "is_service_user": false
+}`)
+ client := &http.Client {
+ }
+ req, err := http.NewRequest(method, url, payload)
+
+ if err != nil {
+ fmt.Println(err)
+ return
+ {
+
+ req.Header.Add("Content-Type", "application/json")
+ req.Header.Add("Accept", "application/json")
+ req.Header.Add("Authorization", "Token ")
+
+ res, err := client.Do(req)
+ if err != nil {
+ fmt.Println(err)
+ return
+ }
+ defer res.Body.Close()
+
+ body, err := ioutil.ReadAll(res.Body)
+ if err != nil {
+ fmt.Println(err)
+ return
+ }
+ fmt.Println(string(body))
+}
+```
+
+```ruby
+require "uri"
+require "json"
+require "net/http"
+
+url = URI("https://api.netbird.io/api/users")
+
+https = Net::HTTP.new(url.host, url.port)
+https.use_ssl = true
+
+request = Net::HTTP::Post.new(url)
+request["Content-Type"] = "application/json"
+request["Accept"] = "application/json"
+request["Authorization"] = "Token "
+
+request.body = JSON.dump({
+ "email": "demo@netbird.io",
+ "name": "Tom Schulz",
+ "role": "admin",
+ "auto_groups": [
+ "devs"
+ ],
+ "is_service_user": false
+})
+response = https.request(request)
+puts response.read_body
+```
+
+```java
+OkHttpClient client = new OkHttpClient().newBuilder()
+ .build();
+MediaType mediaType = MediaType.parse("application/json");
+RequestBody body = RequestBody.create(mediaType, '{
+ "email": "demo@netbird.io",
+ "name": "Tom Schulz",
+ "role": "admin",
+ "auto_groups": [
+ "devs"
+ ],
+ "is_service_user": false
+}');
+Request request = new Request.Builder()
+ .url("https://api.netbird.io/api/users")
+ .method("POST", body)
+ .addHeader("Content-Type", "application/json")
+ .addHeader("Accept", "application/json")
+ .addHeader("Authorization: Token ")
+ .build();
+Response response = client.newCall(request).execute();
+```
+
+```php
+ 'https://api.netbird.io/api/users',
+ CURLOPT_RETURNTRANSFER => true,
+ CURLOPT_ENCODING => '',
+ CURLOPT_MAXREDIRS => 10,
+ CURLOPT_TIMEOUT => 0,
+ CURLOPT_FOLLOWLOCATION => true,
+ CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
+ CURLOPT_CUSTOMREQUEST => 'POST',
+ CURLOPT_POSTFIELDS => '{
+ "email": "demo@netbird.io",
+ "name": "Tom Schulz",
+ "role": "admin",
+ "auto_groups": [
+ "devs"
+ ],
+ "is_service_user": false
+}',
+ CURLOPT_HTTPHEADER => array(
+ 'Content-Type: application/json',
+ 'Accept: application/json',
+ 'Authorization: Token '
+ ),
+));
+
+$response = curl_exec($curl);
+
+curl_close($curl);
+echo $response;
+```
+
+
+
+
+
+
+```json {{ title: 'Example' }}
+{
+ "id": "google-oauth2|277474792786460067937",
+ "email": "demo@netbird.io",
+ "name": "Tom Schulz",
+ "role": "admin",
+ "status": "active",
+ "auto_groups": [
+ "devs"
+ ],
+ "is_current": true,
+ "is_service_user": false
+}
+```
+```json {{ title: 'Schema' }}
+{
+ "id": "string",
+ "email": "string",
+ "name": "string",
+ "role": "string",
+ "status": "string",
+ "auto_groups": [
+ "string"
+ ],
+ "is_current": "boolean",
+ "is_service_user": "boolean"
+}
+```
+
+
+
+
+
+
+
+
+
+---
+
+
+## Update a User {{ tag: 'PUT' , label: '/api/users/{userId}' }}
+
+
+
+ Update information about a User
+
+ #### Path Parameters
+
+
+
+ The unique identifier of a user
+
+
+
+ #### Request-Body Parameters
+
+
+
+ User's NetBird account role
+
+
+
+ Groups to auto-assign to peers registered by this user
+
+
+
+
+
+
+```bash {{ title: 'cURL' }}
+curl -X PUT https://api.netbird.io/api/users/{userId} \
+-H 'Accept: application/json' \
+-H 'Content-Type: application/json' \
+-H 'Authorization: Token ' \
+--data-raw '{
+ "role": "admin",
+ "auto_groups": [
+ "devs"
+ ]
+}'
+```
+
+```js
+const axios = require('axios');
+let data = JSON.stringify({
+ "role": "admin",
+ "auto_groups": [
+ "devs"
+ ]
+});
+let config = {
+ method: 'put',
+ maxBodyLength: Infinity,
+ url: '/api/users/{userId}',
+ headers: {
+ 'Accept': 'application/json',
+ 'Content-Type': 'application/json',
+ 'Authorization': 'Token '
+ },
+ data : data
+};
+
+axios(config)
+.then((response) => {
+ console.log(JSON.stringify(response.data));
+})
+.catch((error) => {
+ console.log(error);
+});
+```
+
+```python
+import requests
+import json
+
+url = "https://api.netbird.io/api/users/{userId}"
+payload = json.dumps({
+ "role": "admin",
+ "auto_groups": [
+ "devs"
+ ]
+})
+headers: {
+ 'Content-Type': 'application/json',
+ 'Accept': 'application/json',
+ 'Authorization': 'Token '
+}
+
+response = requests.request("PUT", url, headers=headers, data=payload)
+
+print(response.text)
+```
+
+```go
+package main
+
+import (
+ "fmt"
+ "strings"
+ "net/http"
+ "io/ioutil"
+)
+
+func main() {
+
+ url := "https://api.netbird.io/api/users/{userId}"
+ method := "PUT"
+
+ payload := strings.NewReader(`{
+ "role": "admin",
+ "auto_groups": [
+ "devs"
+ ]
+}`)
+ client := &http.Client {
+ }
+ req, err := http.NewRequest(method, url, payload)
+
+ if err != nil {
+ fmt.Println(err)
+ return
+ {
+
+ req.Header.Add("Content-Type", "application/json")
+ req.Header.Add("Accept", "application/json")
+ req.Header.Add("Authorization", "Token ")
+
+ res, err := client.Do(req)
+ if err != nil {
+ fmt.Println(err)
+ return
+ }
+ defer res.Body.Close()
+
+ body, err := ioutil.ReadAll(res.Body)
+ if err != nil {
+ fmt.Println(err)
+ return
+ }
+ fmt.Println(string(body))
+}
+```
+
+```ruby
+require "uri"
+require "json"
+require "net/http"
+
+url = URI("https://api.netbird.io/api/users/{userId}")
+
+https = Net::HTTP.new(url.host, url.port)
+https.use_ssl = true
+
+request = Net::HTTP::Put.new(url)
+request["Content-Type"] = "application/json"
+request["Accept"] = "application/json"
+request["Authorization"] = "Token "
+
+request.body = JSON.dump({
+ "role": "admin",
+ "auto_groups": [
+ "devs"
+ ]
+})
+response = https.request(request)
+puts response.read_body
+```
+
+```java
+OkHttpClient client = new OkHttpClient().newBuilder()
+ .build();
+MediaType mediaType = MediaType.parse("application/json");
+RequestBody body = RequestBody.create(mediaType, '{
+ "role": "admin",
+ "auto_groups": [
+ "devs"
+ ]
+}');
+Request request = new Request.Builder()
+ .url("https://api.netbird.io/api/users/{userId}")
+ .method("PUT", body)
+ .addHeader("Content-Type", "application/json")
+ .addHeader("Accept", "application/json")
+ .addHeader("Authorization: Token ")
+ .build();
+Response response = client.newCall(request).execute();
+```
+
+```php
+ 'https://api.netbird.io/api/users/{userId}',
+ CURLOPT_RETURNTRANSFER => true,
+ CURLOPT_ENCODING => '',
+ CURLOPT_MAXREDIRS => 10,
+ CURLOPT_TIMEOUT => 0,
+ CURLOPT_FOLLOWLOCATION => true,
+ CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
+ CURLOPT_CUSTOMREQUEST => 'PUT',
+ CURLOPT_POSTFIELDS => '{
+ "role": "admin",
+ "auto_groups": [
+ "devs"
+ ]
+}',
+ CURLOPT_HTTPHEADER => array(
+ 'Content-Type: application/json',
+ 'Accept: application/json',
+ 'Authorization: Token '
+ ),
+));
+
+$response = curl_exec($curl);
+
+curl_close($curl);
+echo $response;
+```
+
+
+
+
+
+
+```json {{ title: 'Example' }}
+{
+ "id": "google-oauth2|277474792786460067937",
+ "email": "demo@netbird.io",
+ "name": "Tom Schulz",
+ "role": "admin",
+ "status": "active",
+ "auto_groups": [
+ "devs"
+ ],
+ "is_current": true,
+ "is_service_user": false
+}
+```
+```json {{ title: 'Schema' }}
+{
+ "id": "string",
+ "email": "string",
+ "name": "string",
+ "role": "string",
+ "status": "string",
+ "auto_groups": [
+ "string"
+ ],
+ "is_current": "boolean",
+ "is_service_user": "boolean"
+}
+```
+
+
+
+
+
+
+
+
+
+---
+
+
+## Delete a User {{ tag: 'DELETE' , label: '/api/users/{userId}' }}
+
+
+
+ Delete a User
+
+ #### Path Parameters
+
+
+
+ The unique identifier of a user
+
+
+
+
+
+
+```bash {{ title: 'cURL' }}
+curl -X DELETE https://api.netbird.io/api/users/{userId} \
+-H 'Authorization: Token '
+```
+
+```js
+const axios = require('axios');
+
+let config = {
+ method: 'delete',
+ maxBodyLength: Infinity,
+ url: '/api/users/{userId}',
+ headers: {
+ 'Authorization': 'Token '
+ }
+};
+
+axios(config)
+.then((response) => {
+ console.log(JSON.stringify(response.data));
+})
+.catch((error) => {
+ console.log(error);
+});
+```
+
+```python
+import requests
+import json
+
+url = "https://api.netbird.io/api/users/{userId}"
+
+headers: {
+ 'Authorization': 'Token '
+}
+
+response = requests.request("DELETE", url, headers=headers)
+
+print(response.text)
+```
+
+```go
+package main
+
+import (
+ "fmt"
+ "strings"
+ "net/http"
+ "io/ioutil"
+)
+
+func main() {
+
+ url := "https://api.netbird.io/api/users/{userId}"
+ method := "DELETE"
+
+ client := &http.Client {
+ }
+ req, err := http.NewRequest(method, url, nil)
+
+ if err != nil {
+ fmt.Println(err)
+ return
+ {
+
+ req.Header.Add("Authorization", "Token ")
+
+ res, err := client.Do(req)
+ if err != nil {
+ fmt.Println(err)
+ return
+ }
+ defer res.Body.Close()
+
+ body, err := ioutil.ReadAll(res.Body)
+ if err != nil {
+ fmt.Println(err)
+ return
+ }
+ fmt.Println(string(body))
+}
+```
+
+```ruby
+require "uri"
+require "json"
+require "net/http"
+
+url = URI("https://api.netbird.io/api/users/{userId}")
+
+https = Net::HTTP.new(url.host, url.port)
+https.use_ssl = true
+
+request = Net::HTTP::Delete.new(url)
+request["Authorization"] = "Token "
+
+response = https.request(request)
+puts response.read_body
+```
+
+```java
+OkHttpClient client = new OkHttpClient().newBuilder()
+ .build();
+
+Request request = new Request.Builder()
+ .url("https://api.netbird.io/api/users/{userId}")
+ .method("DELETE")
+ .addHeader("Authorization: Token ")
+ .build();
+Response response = client.newCall(request).execute();
+```
+
+```php
+ 'https://api.netbird.io/api/users/{userId}',
+ CURLOPT_RETURNTRANSFER => true,
+ CURLOPT_ENCODING => '',
+ CURLOPT_MAXREDIRS => 10,
+ CURLOPT_TIMEOUT => 0,
+ CURLOPT_FOLLOWLOCATION => true,
+ CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
+ CURLOPT_CUSTOMREQUEST => 'DELETE',
+ CURLOPT_HTTPHEADER => array(
+ 'Authorization: Token '
+ ),
+));
+
+$response = curl_exec($curl);
+
+curl_close($curl);
+echo $response;
+```
+
+
+
+
+
+
+
+
+
+
+---
diff --git a/src/styles/tailwind.css b/src/styles/tailwind.css
new file mode 100644
index 00000000..3f32aeaa
--- /dev/null
+++ b/src/styles/tailwind.css
@@ -0,0 +1,39 @@
+:root {
+ --shiki-color-text: theme('colors.white');
+ --shiki-token-constant: theme('colors.orange.300');
+ --shiki-token-string: theme('colors.orange.300');
+ --shiki-token-comment: theme('colors.zinc.500');
+ --shiki-token-keyword: theme('colors.sky.300');
+ --shiki-token-parameter: theme('colors.pink.300');
+ --shiki-token-function: theme('colors.violet.300');
+ --shiki-token-string-expression: theme('colors.orange.300');
+ --shiki-token-punctuation: theme('colors.zinc.200');
+}
+
+@tailwind base;
+@tailwind components;
+@tailwind utilities;
+
+.imagewrapper {
+ box-shadow: 0 4px 8px 0 rgba(0, 0, 0, 0.2), 0 6px 20px 0 rgba(0, 0, 0, 0.19);
+ border-radius: 4px;
+ overflow:hidden;
+}
+
+.videowrapper {
+ float: none;
+ clear: both;
+ width: 100%;
+ position: relative;
+ padding-bottom: 46.25%;
+ padding-top: 25px;
+ height: 0;
+}
+.videowrapper iframe {
+ position: absolute;
+ top: 0;
+ left: 0;
+ width: 100%;
+ height: 100%;
+ border-radius: 4px;
+}
\ No newline at end of file
diff --git a/static/img/getting-started/add-peer.png b/static/img/getting-started/add-peer.png
deleted file mode 100644
index ff4a0471..00000000
Binary files a/static/img/getting-started/add-peer.png and /dev/null differ
diff --git a/static/img/getting-started/auth.png b/static/img/getting-started/auth.png
deleted file mode 100644
index 71551c0f..00000000
Binary files a/static/img/getting-started/auth.png and /dev/null differ
diff --git a/static/img/getting-started/device-confirmation.png b/static/img/getting-started/device-confirmation.png
deleted file mode 100644
index deee99cd..00000000
Binary files a/static/img/getting-started/device-confirmation.png and /dev/null differ
diff --git a/static/img/getting-started/empty-peers.png b/static/img/getting-started/empty-peers.png
deleted file mode 100644
index d98127f3..00000000
Binary files a/static/img/getting-started/empty-peers.png and /dev/null differ
diff --git a/static/img/getting-started/netbird-up.png b/static/img/getting-started/netbird-up.png
deleted file mode 100644
index 08bb2083..00000000
Binary files a/static/img/getting-started/netbird-up.png and /dev/null differ
diff --git a/static/img/getting-started/peers.png b/static/img/getting-started/peers.png
deleted file mode 100644
index 1f985329..00000000
Binary files a/static/img/getting-started/peers.png and /dev/null differ
diff --git a/static/img/getting-started/zitadel-create-user.png b/static/img/getting-started/zitadel-create-user.png
deleted file mode 100644
index 3a74faf8..00000000
Binary files a/static/img/getting-started/zitadel-create-user.png and /dev/null differ
diff --git a/static/img/getting-started/zitadel-service-account-role.png b/static/img/getting-started/zitadel-service-account-role.png
deleted file mode 100644
index a7b8b76e..00000000
Binary files a/static/img/getting-started/zitadel-service-account-role.png and /dev/null differ
diff --git a/static/img/getting-started/zitadel-service-user-secret.png b/static/img/getting-started/zitadel-service-user-secret.png
deleted file mode 100644
index 5895e89b..00000000
Binary files a/static/img/getting-started/zitadel-service-user-secret.png and /dev/null differ
diff --git a/tailwind.config.js b/tailwind.config.js
new file mode 100644
index 00000000..9681c2c3
--- /dev/null
+++ b/tailwind.config.js
@@ -0,0 +1,42 @@
+/** @type {import('tailwindcss').Config} */
+module.exports = {
+ content: ['./{src,mdx}/**/*.{js,mjs,jsx,mdx}'],
+ darkMode: 'class',
+ theme: {
+ fontSize: {
+ '2xs': ['0.75rem', { lineHeight: '1.25rem' }],
+ xs: ['0.8125rem', { lineHeight: '1.5rem' }],
+ sm: ['0.875rem', { lineHeight: '1.5rem' }],
+ base: ['1rem', { lineHeight: '1.75rem' }],
+ lg: ['1.125rem', { lineHeight: '1.75rem' }],
+ xl: ['1.25rem', { lineHeight: '1.75rem' }],
+ '2xl': ['1.5rem', { lineHeight: '2rem' }],
+ '3xl': ['1.875rem', { lineHeight: '2.25rem' }],
+ '4xl': ['2.25rem', { lineHeight: '2.5rem' }],
+ '5xl': ['3rem', { lineHeight: '1' }],
+ '6xl': ['3.75rem', { lineHeight: '1' }],
+ '7xl': ['4.5rem', { lineHeight: '1' }],
+ '8xl': ['6rem', { lineHeight: '1' }],
+ '9xl': ['8rem', { lineHeight: '1' }],
+ },
+ typography: require('./typography'),
+ extend: {
+ boxShadow: {
+ glow: '0 0 4px rgb(0 0 0 / 0.1)',
+ },
+ maxWidth: {
+ lg: '33rem',
+ '2xl': '40rem',
+ '3xl': '50rem',
+ '5xl': '66rem',
+ },
+ opacity: {
+ 1: '0.01',
+ 2.5: '0.025',
+ 7.5: '0.075',
+ 15: '0.15',
+ },
+ },
+ },
+ plugins: [require('@tailwindcss/typography')],
+}
diff --git a/typography.js b/typography.js
new file mode 100644
index 00000000..239d34c4
--- /dev/null
+++ b/typography.js
@@ -0,0 +1,357 @@
+module.exports = ({ theme }) => ({
+ DEFAULT: {
+ css: {
+ '--tw-prose-body': theme('colors.zinc.700'),
+ '--tw-prose-headings': theme('colors.zinc.900'),
+ '--tw-prose-links': theme('colors.orange.500'),
+ '--tw-prose-links-hover': theme('colors.orange.600'),
+ '--tw-prose-links-underline': theme('colors.orange.500 / 0.3'),
+ '--tw-prose-bold': theme('colors.zinc.900'),
+ '--tw-prose-counters': theme('colors.zinc.500'),
+ '--tw-prose-bullets': theme('colors.zinc.300'),
+ '--tw-prose-hr': theme('colors.zinc.900 / 0.05'),
+ '--tw-prose-quotes': theme('colors.zinc.900'),
+ '--tw-prose-quote-borders': theme('colors.zinc.200'),
+ '--tw-prose-captions': theme('colors.zinc.500'),
+ '--tw-prose-code': theme('colors.zinc.900'),
+ '--tw-prose-code-bg': theme('colors.zinc.100'),
+ '--tw-prose-code-ring': theme('colors.zinc.300'),
+ '--tw-prose-th-borders': theme('colors.zinc.300'),
+ '--tw-prose-td-borders': theme('colors.zinc.200'),
+
+ '--tw-prose-invert-body': theme('colors.zinc.400'),
+ '--tw-prose-invert-headings': theme('colors.white'),
+ '--tw-prose-invert-links': theme('colors.orange.400'),
+ '--tw-prose-invert-links-hover': theme('colors.orange.500'),
+ '--tw-prose-invert-links-underline': theme('colors.orange.500 / 0.3'),
+ '--tw-prose-invert-bold': theme('colors.white'),
+ '--tw-prose-invert-counters': theme('colors.zinc.400'),
+ '--tw-prose-invert-bullets': theme('colors.zinc.600'),
+ '--tw-prose-invert-hr': theme('colors.white / 0.05'),
+ '--tw-prose-invert-quotes': theme('colors.zinc.100'),
+ '--tw-prose-invert-quote-borders': theme('colors.zinc.700'),
+ '--tw-prose-invert-captions': theme('colors.zinc.400'),
+ '--tw-prose-invert-code': theme('colors.white'),
+ '--tw-prose-invert-code-bg': theme('colors.zinc.700 / 0.15'),
+ '--tw-prose-invert-code-ring': theme('colors.white / 0.1'),
+ '--tw-prose-invert-th-borders': theme('colors.zinc.600'),
+ '--tw-prose-invert-td-borders': theme('colors.zinc.700'),
+
+ // Base
+ color: 'var(--tw-prose-body)',
+ fontSize: theme('fontSize.sm')[0],
+ lineHeight: theme('lineHeight.7'),
+
+ // Layout
+ '> *': {
+ maxWidth: theme('maxWidth.2xl'),
+ marginLeft: 'auto',
+ marginRight: 'auto',
+ '@screen lg': {
+ maxWidth: theme('maxWidth.3xl'),
+ marginLeft: `calc(50% - min(50%, ${theme('maxWidth.lg')}))`,
+ marginRight: `calc(50% - min(50%, ${theme('maxWidth.lg')}))`,
+ },
+ },
+
+ // Text
+ p: {
+ marginTop: theme('spacing.6'),
+ marginBottom: theme('spacing.6'),
+ },
+ '[class~="lead"]': {
+ fontSize: theme('fontSize.base')[0],
+ ...theme('fontSize.base')[1],
+ },
+
+ // Lists
+ ol: {
+ listStyleType: 'decimal',
+ marginTop: theme('spacing.5'),
+ marginBottom: theme('spacing.5'),
+ paddingLeft: '1.625rem',
+ },
+ 'ol[type="A"]': {
+ listStyleType: 'upper-alpha',
+ },
+ 'ol[type="a"]': {
+ listStyleType: 'lower-alpha',
+ },
+ 'ol[type="A" s]': {
+ listStyleType: 'upper-alpha',
+ },
+ 'ol[type="a" s]': {
+ listStyleType: 'lower-alpha',
+ },
+ 'ol[type="I"]': {
+ listStyleType: 'upper-roman',
+ },
+ 'ol[type="i"]': {
+ listStyleType: 'lower-roman',
+ },
+ 'ol[type="I" s]': {
+ listStyleType: 'upper-roman',
+ },
+ 'ol[type="i" s]': {
+ listStyleType: 'lower-roman',
+ },
+ 'ol[type="1"]': {
+ listStyleType: 'decimal',
+ },
+ ul: {
+ listStyleType: 'disc',
+ marginTop: theme('spacing.5'),
+ marginBottom: theme('spacing.5'),
+ paddingLeft: '1.625rem',
+ },
+ li: {
+ marginTop: theme('spacing.2'),
+ marginBottom: theme('spacing.2'),
+ },
+ ':is(ol, ul) > li': {
+ paddingLeft: theme('spacing[1.5]'),
+ },
+ 'ol > li::marker': {
+ fontWeight: '400',
+ color: 'var(--tw-prose-counters)',
+ },
+ 'ul > li::marker': {
+ color: 'var(--tw-prose-bullets)',
+ },
+ '> ul > li p': {
+ marginTop: theme('spacing.3'),
+ marginBottom: theme('spacing.3'),
+ },
+ '> ul > li > *:first-child': {
+ marginTop: theme('spacing.5'),
+ },
+ '> ul > li > *:last-child': {
+ marginBottom: theme('spacing.5'),
+ },
+ '> ol > li > *:first-child': {
+ marginTop: theme('spacing.5'),
+ },
+ '> ol > li > *:last-child': {
+ marginBottom: theme('spacing.5'),
+ },
+ 'ul ul, ul ol, ol ul, ol ol': {
+ marginTop: theme('spacing.3'),
+ marginBottom: theme('spacing.3'),
+ },
+
+ // Horizontal rules
+ hr: {
+ borderColor: 'var(--tw-prose-hr)',
+ borderTopWidth: 1,
+ marginTop: theme('spacing.16'),
+ marginBottom: theme('spacing.16'),
+ maxWidth: 'none',
+ marginLeft: `calc(-1 * ${theme('spacing.4')})`,
+ marginRight: `calc(-1 * ${theme('spacing.4')})`,
+ '@screen sm': {
+ marginLeft: `calc(-1 * ${theme('spacing.6')})`,
+ marginRight: `calc(-1 * ${theme('spacing.6')})`,
+ },
+ '@screen lg': {
+ marginLeft: `calc(-1 * ${theme('spacing.8')})`,
+ marginRight: `calc(-1 * ${theme('spacing.8')})`,
+ },
+ },
+
+ // Quotes
+ blockquote: {
+ fontWeight: '500',
+ fontStyle: 'italic',
+ color: 'var(--tw-prose-quotes)',
+ borderLeftWidth: '0.25rem',
+ borderLeftColor: 'var(--tw-prose-quote-borders)',
+ quotes: '"\\201C""\\201D""\\2018""\\2019"',
+ marginTop: theme('spacing.8'),
+ marginBottom: theme('spacing.8'),
+ paddingLeft: theme('spacing.5'),
+ },
+ 'blockquote p:first-of-type::before': {
+ content: 'open-quote',
+ },
+ 'blockquote p:last-of-type::after': {
+ content: 'close-quote',
+ },
+
+ // Headings
+ h1: {
+ color: 'var(--tw-prose-headings)',
+ fontWeight: '700',
+ fontSize: theme('fontSize.2xl')[0],
+ ...theme('fontSize.2xl')[1],
+ marginBottom: theme('spacing.2'),
+ },
+ h2: {
+ color: 'var(--tw-prose-headings)',
+ fontWeight: '600',
+ fontSize: theme('fontSize.lg')[0],
+ ...theme('fontSize.lg')[1],
+ marginTop: theme('spacing.16'),
+ marginBottom: theme('spacing.2'),
+ },
+ h3: {
+ color: 'var(--tw-prose-headings)',
+ fontSize: theme('fontSize.base')[0],
+ ...theme('fontSize.base')[1],
+ fontWeight: '600',
+ marginTop: theme('spacing.10'),
+ marginBottom: theme('spacing.2'),
+ },
+
+ // Media
+ 'img, video, figure': {
+ marginTop: theme('spacing.8'),
+ marginBottom: theme('spacing.8'),
+ },
+ 'figure > *': {
+ marginTop: '0',
+ marginBottom: '0',
+ },
+ figcaption: {
+ color: 'var(--tw-prose-captions)',
+ fontSize: theme('fontSize.xs')[0],
+ ...theme('fontSize.xs')[1],
+ marginTop: theme('spacing.2'),
+ },
+
+ // Tables
+ table: {
+ width: '100%',
+ tableLayout: 'auto',
+ textAlign: 'left',
+ marginTop: theme('spacing.8'),
+ marginBottom: theme('spacing.8'),
+ lineHeight: theme('lineHeight.6'),
+ },
+ thead: {
+ borderBottomWidth: '1px',
+ borderBottomColor: 'var(--tw-prose-th-borders)',
+ },
+ 'thead th': {
+ color: 'var(--tw-prose-headings)',
+ fontWeight: '600',
+ verticalAlign: 'bottom',
+ paddingRight: theme('spacing.2'),
+ paddingBottom: theme('spacing.2'),
+ paddingLeft: theme('spacing.2'),
+ },
+ 'thead th:first-child': {
+ paddingLeft: '0',
+ },
+ 'thead th:last-child': {
+ paddingRight: '0',
+ },
+ 'tbody tr': {
+ borderBottomWidth: '1px',
+ borderBottomColor: 'var(--tw-prose-td-borders)',
+ },
+ 'tbody tr:last-child': {
+ borderBottomWidth: '0',
+ },
+ 'tbody td': {
+ verticalAlign: 'baseline',
+ },
+ tfoot: {
+ borderTopWidth: '1px',
+ borderTopColor: 'var(--tw-prose-th-borders)',
+ },
+ 'tfoot td': {
+ verticalAlign: 'top',
+ },
+ ':is(tbody, tfoot) td': {
+ paddingTop: theme('spacing.2'),
+ paddingRight: theme('spacing.2'),
+ paddingBottom: theme('spacing.2'),
+ paddingLeft: theme('spacing.2'),
+ },
+ ':is(tbody, tfoot) td:first-child': {
+ paddingLeft: '0',
+ },
+ ':is(tbody, tfoot) td:last-child': {
+ paddingRight: '0',
+ },
+
+ // Inline elements
+ a: {
+ color: 'var(--tw-prose-links)',
+ textDecoration: 'underline transparent',
+ fontWeight: '500',
+ transitionProperty: 'color, text-decoration-color',
+ transitionDuration: theme('transitionDuration.DEFAULT'),
+ transitionTimingFunction: theme('transitionTimingFunction.DEFAULT'),
+ '&:hover': {
+ color: 'var(--tw-prose-links-hover)',
+ textDecorationColor: 'var(--tw-prose-links-underline)',
+ },
+ },
+ ':is(h1, h2, h3) a': {
+ fontWeight: 'inherit',
+ },
+ strong: {
+ color: 'var(--tw-prose-bold)',
+ fontWeight: '600',
+ },
+ ':is(a, blockquote, thead th) strong': {
+ color: 'inherit',
+ },
+ code: {
+ color: 'var(--tw-prose-code)',
+ borderRadius: theme('borderRadius.lg'),
+ paddingTop: theme('padding.1'),
+ paddingRight: theme('padding[1.5]'),
+ paddingBottom: theme('padding.1'),
+ paddingLeft: theme('padding[1.5]'),
+ boxShadow: 'inset 0 0 0 1px var(--tw-prose-code-ring)',
+ backgroundColor: 'var(--tw-prose-code-bg)',
+ fontSize: theme('fontSize.2xs'),
+ },
+ ':is(a, h1, h2, h3, blockquote, thead th) code': {
+ color: 'inherit',
+ },
+ 'h2 code': {
+ fontSize: theme('fontSize.base')[0],
+ fontWeight: 'inherit',
+ },
+ 'h3 code': {
+ fontSize: theme('fontSize.sm')[0],
+ fontWeight: 'inherit',
+ },
+
+ // Overrides
+ ':is(h1, h2, h3) + *': {
+ marginTop: '0',
+ },
+ '> :first-child': {
+ marginTop: '0 !important',
+ },
+ '> :last-child': {
+ marginBottom: '0 !important',
+ },
+ },
+ },
+ invert: {
+ css: {
+ '--tw-prose-body': 'var(--tw-prose-invert-body)',
+ '--tw-prose-headings': 'var(--tw-prose-invert-headings)',
+ '--tw-prose-links': 'var(--tw-prose-invert-links)',
+ '--tw-prose-links-hover': 'var(--tw-prose-invert-links-hover)',
+ '--tw-prose-links-underline': 'var(--tw-prose-invert-links-underline)',
+ '--tw-prose-bold': 'var(--tw-prose-invert-bold)',
+ '--tw-prose-counters': 'var(--tw-prose-invert-counters)',
+ '--tw-prose-bullets': 'var(--tw-prose-invert-bullets)',
+ '--tw-prose-hr': 'var(--tw-prose-invert-hr)',
+ '--tw-prose-quotes': 'var(--tw-prose-invert-quotes)',
+ '--tw-prose-quote-borders': 'var(--tw-prose-invert-quote-borders)',
+ '--tw-prose-captions': 'var(--tw-prose-invert-captions)',
+ '--tw-prose-code': 'var(--tw-prose-invert-code)',
+ '--tw-prose-code-bg': 'var(--tw-prose-invert-code-bg)',
+ '--tw-prose-code-ring': 'var(--tw-prose-invert-code-ring)',
+ '--tw-prose-th-borders': 'var(--tw-prose-invert-th-borders)',
+ '--tw-prose-td-borders': 'var(--tw-prose-invert-td-borders)',
+ },
+ },
+})
diff --git a/yarn.lock b/yarn.lock
deleted file mode 100644
index 0a2e1c22..00000000
--- a/yarn.lock
+++ /dev/null
@@ -1,8341 +0,0 @@
-# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
-# yarn lockfile v1
-
-
-"@algolia/autocomplete-core@1.5.2":
- "integrity" "sha512-DY0bhyczFSS1b/CqJlTE/nQRtnTAHl6IemIkBy0nEWnhDzRDdtdx4p5Uuk3vwAFxwEEgi1WqKwgSSMx6DpNL4A=="
- "resolved" "https://registry.npmjs.org/@algolia/autocomplete-core/-/autocomplete-core-1.5.2.tgz"
- "version" "1.5.2"
- dependencies:
- "@algolia/autocomplete-shared" "1.5.2"
-
-"@algolia/autocomplete-preset-algolia@1.5.2":
- "integrity" "sha512-3MRYnYQFJyovANzSX2CToS6/5cfVjbLLqFsZTKcvF3abhQzxbqwwaMBlJtt620uBUOeMzhdfasKhCc40+RHiZw=="
- "resolved" "https://registry.npmjs.org/@algolia/autocomplete-preset-algolia/-/autocomplete-preset-algolia-1.5.2.tgz"
- "version" "1.5.2"
- dependencies:
- "@algolia/autocomplete-shared" "1.5.2"
-
-"@algolia/autocomplete-shared@1.5.2":
- "integrity" "sha512-ylQAYv5H0YKMfHgVWX0j0NmL8XBcAeeeVQUmppnnMtzDbDnca6CzhKj3Q8eF9cHCgcdTDdb5K+3aKyGWA0obug=="
- "resolved" "https://registry.npmjs.org/@algolia/autocomplete-shared/-/autocomplete-shared-1.5.2.tgz"
- "version" "1.5.2"
-
-"@algolia/cache-browser-local-storage@4.13.0":
- "integrity" "sha512-nj1vHRZauTqP/bluwkRIgEADEimqojJgoTRCel5f6q8WCa9Y8QeI4bpDQP28FoeKnDRYa3J5CauDlN466jqRhg=="
- "resolved" "https://registry.npmjs.org/@algolia/cache-browser-local-storage/-/cache-browser-local-storage-4.13.0.tgz"
- "version" "4.13.0"
- dependencies:
- "@algolia/cache-common" "4.13.0"
-
-"@algolia/cache-common@4.13.0":
- "integrity" "sha512-f9mdZjskCui/dA/fA/5a+6hZ7xnHaaZI5tM/Rw9X8rRB39SUlF/+o3P47onZ33n/AwkpSbi5QOyhs16wHd55kA=="
- "resolved" "https://registry.npmjs.org/@algolia/cache-common/-/cache-common-4.13.0.tgz"
- "version" "4.13.0"
-
-"@algolia/cache-in-memory@4.13.0":
- "integrity" "sha512-hHdc+ahPiMM92CQMljmObE75laYzNFYLrNOu0Q3/eyvubZZRtY2SUsEEgyUEyzXruNdzrkcDxFYa7YpWBJYHAg=="
- "resolved" "https://registry.npmjs.org/@algolia/cache-in-memory/-/cache-in-memory-4.13.0.tgz"
- "version" "4.13.0"
- dependencies:
- "@algolia/cache-common" "4.13.0"
-
-"@algolia/client-account@4.13.0":
- "integrity" "sha512-FzFqFt9b0g/LKszBDoEsW+dVBuUe1K3scp2Yf7q6pgHWM1WqyqUlARwVpLxqyc+LoyJkTxQftOKjyFUqddnPKA=="
- "resolved" "https://registry.npmjs.org/@algolia/client-account/-/client-account-4.13.0.tgz"
- "version" "4.13.0"
- dependencies:
- "@algolia/client-common" "4.13.0"
- "@algolia/client-search" "4.13.0"
- "@algolia/transporter" "4.13.0"
-
-"@algolia/client-analytics@4.13.0":
- "integrity" "sha512-klmnoq2FIiiMHImkzOm+cGxqRLLu9CMHqFhbgSy9wtXZrqb8BBUIUE2VyBe7azzv1wKcxZV2RUyNOMpFqmnRZA=="
- "resolved" "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-4.13.0.tgz"
- "version" "4.13.0"
- dependencies:
- "@algolia/client-common" "4.13.0"
- "@algolia/client-search" "4.13.0"
- "@algolia/requester-common" "4.13.0"
- "@algolia/transporter" "4.13.0"
-
-"@algolia/client-common@4.13.0":
- "integrity" "sha512-GoXfTp0kVcbgfSXOjfrxx+slSipMqGO9WnNWgeMmru5Ra09MDjrcdunsiiuzF0wua6INbIpBQFTC2Mi5lUNqGA=="
- "resolved" "https://registry.npmjs.org/@algolia/client-common/-/client-common-4.13.0.tgz"
- "version" "4.13.0"
- dependencies:
- "@algolia/requester-common" "4.13.0"
- "@algolia/transporter" "4.13.0"
-
-"@algolia/client-personalization@4.13.0":
- "integrity" "sha512-KneLz2WaehJmNfdr5yt2HQETpLaCYagRdWwIwkTqRVFCv4DxRQ2ChPVW9jeTj4YfAAhfzE6F8hn7wkQ/Jfj6ZA=="
- "resolved" "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-4.13.0.tgz"
- "version" "4.13.0"
- dependencies:
- "@algolia/client-common" "4.13.0"
- "@algolia/requester-common" "4.13.0"
- "@algolia/transporter" "4.13.0"
-
-"@algolia/client-search@^4.9.1", "@algolia/client-search@4.13.0":
- "integrity" "sha512-blgCKYbZh1NgJWzeGf+caKE32mo3j54NprOf0LZVCubQb3Kx37tk1Hc8SDs9bCAE8hUvf3cazMPIg7wscSxspA=="
- "resolved" "https://registry.npmjs.org/@algolia/client-search/-/client-search-4.13.0.tgz"
- "version" "4.13.0"
- dependencies:
- "@algolia/client-common" "4.13.0"
- "@algolia/requester-common" "4.13.0"
- "@algolia/transporter" "4.13.0"
-
-"@algolia/events@^4.0.1":
- "integrity" "sha512-FQzvOCgoFXAbf5Y6mYozw2aj5KCJoA3m4heImceldzPSMbdyS4atVjJzXKMsfX3wnZTFYwkkt8/z8UesLHlSBQ=="
- "resolved" "https://registry.npmjs.org/@algolia/events/-/events-4.0.1.tgz"
- "version" "4.0.1"
-
-"@algolia/logger-common@4.13.0":
- "integrity" "sha512-8yqXk7rMtmQJ9wZiHOt/6d4/JDEg5VCk83gJ39I+X/pwUPzIsbKy9QiK4uJ3aJELKyoIiDT1hpYVt+5ia+94IA=="
- "resolved" "https://registry.npmjs.org/@algolia/logger-common/-/logger-common-4.13.0.tgz"
- "version" "4.13.0"
-
-"@algolia/logger-console@4.13.0":
- "integrity" "sha512-YepRg7w2/87L0vSXRfMND6VJ5d6699sFJBRWzZPOlek2p5fLxxK7O0VncYuc/IbVHEgeApvgXx0WgCEa38GVuQ=="
- "resolved" "https://registry.npmjs.org/@algolia/logger-console/-/logger-console-4.13.0.tgz"
- "version" "4.13.0"
- dependencies:
- "@algolia/logger-common" "4.13.0"
-
-"@algolia/requester-browser-xhr@4.13.0":
- "integrity" "sha512-Dj+bnoWR5MotrnjblzGKZ2kCdQi2cK/VzPURPnE616NU/il7Ypy6U6DLGZ/ZYz+tnwPa0yypNf21uqt84fOgrg=="
- "resolved" "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-4.13.0.tgz"
- "version" "4.13.0"
- dependencies:
- "@algolia/requester-common" "4.13.0"
-
-"@algolia/requester-common@4.13.0":
- "integrity" "sha512-BRTDj53ecK+gn7ugukDWOOcBRul59C4NblCHqj4Zm5msd5UnHFjd/sGX+RLOEoFMhetILAnmg6wMrRrQVac9vw=="
- "resolved" "https://registry.npmjs.org/@algolia/requester-common/-/requester-common-4.13.0.tgz"
- "version" "4.13.0"
-
-"@algolia/requester-node-http@4.13.0":
- "integrity" "sha512-9b+3O4QFU4azLhGMrZAr/uZPydvzOR4aEZfSL8ZrpLZ7fbbqTO0S/5EVko+QIgglRAtVwxvf8UJ1wzTD2jvKxQ=="
- "resolved" "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-4.13.0.tgz"
- "version" "4.13.0"
- dependencies:
- "@algolia/requester-common" "4.13.0"
-
-"@algolia/transporter@4.13.0":
- "integrity" "sha512-8tSQYE+ykQENAdeZdofvtkOr5uJ9VcQSWgRhQ9h01AehtBIPAczk/b2CLrMsw5yQZziLs5cZ3pJ3478yI+urhA=="
- "resolved" "https://registry.npmjs.org/@algolia/transporter/-/transporter-4.13.0.tgz"
- "version" "4.13.0"
- dependencies:
- "@algolia/cache-common" "4.13.0"
- "@algolia/logger-common" "4.13.0"
- "@algolia/requester-common" "4.13.0"
-
-"@ampproject/remapping@^2.1.0":
- "integrity" "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w=="
- "resolved" "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz"
- "version" "2.2.0"
- dependencies:
- "@jridgewell/gen-mapping" "^0.1.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.16.7", "@babel/code-frame@^7.8.3":
- "integrity" "sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg=="
- "resolved" "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.7.tgz"
- "version" "7.16.7"
- dependencies:
- "@babel/highlight" "^7.16.7"
-
-"@babel/compat-data@^7.13.11", "@babel/compat-data@^7.17.10":
- "integrity" "sha512-GZt/TCsG70Ms19gfZO1tM4CVnXsPgEPBCpJu+Qz3L0LUDsY5nZqFZglIoPC1kIYOtNBZlrnFT+klg12vFGZXrw=="
- "resolved" "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.17.10.tgz"
- "version" "7.17.10"
-
-"@babel/core@^7.0.0", "@babel/core@^7.0.0-0", "@babel/core@^7.11.6", "@babel/core@^7.12.0", "@babel/core@^7.12.3", "@babel/core@^7.13.0", "@babel/core@^7.15.5", "@babel/core@^7.17.10", "@babel/core@^7.18.2", "@babel/core@^7.4.0-0":
- "integrity" "sha512-A8pri1YJiC5UnkdrWcmfZTJTV85b4UXTAfImGmCfYmax4TR9Cw8sDS0MOk++Gp2mE/BefVJ5nwy5yzqNJbP/DQ=="
- "resolved" "https://registry.npmjs.org/@babel/core/-/core-7.18.2.tgz"
- "version" "7.18.2"
- dependencies:
- "@ampproject/remapping" "^2.1.0"
- "@babel/code-frame" "^7.16.7"
- "@babel/generator" "^7.18.2"
- "@babel/helper-compilation-targets" "^7.18.2"
- "@babel/helper-module-transforms" "^7.18.0"
- "@babel/helpers" "^7.18.2"
- "@babel/parser" "^7.18.0"
- "@babel/template" "^7.16.7"
- "@babel/traverse" "^7.18.2"
- "@babel/types" "^7.18.2"
- "convert-source-map" "^1.7.0"
- "debug" "^4.1.0"
- "gensync" "^1.0.0-beta.2"
- "json5" "^2.2.1"
- "semver" "^6.3.0"
-
-"@babel/core@7.12.9":
- "integrity" "sha512-gTXYh3M5wb7FRXQy+FErKFAv90BnlOuNn1QkCK2lREoPAjrQCO49+HVSrFoe5uakFAF5eenS75KbO2vQiLrTMQ=="
- "resolved" "https://registry.npmjs.org/@babel/core/-/core-7.12.9.tgz"
- "version" "7.12.9"
- dependencies:
- "@babel/code-frame" "^7.10.4"
- "@babel/generator" "^7.12.5"
- "@babel/helper-module-transforms" "^7.12.1"
- "@babel/helpers" "^7.12.5"
- "@babel/parser" "^7.12.7"
- "@babel/template" "^7.12.7"
- "@babel/traverse" "^7.12.9"
- "@babel/types" "^7.12.7"
- "convert-source-map" "^1.7.0"
- "debug" "^4.1.0"
- "gensync" "^1.0.0-beta.1"
- "json5" "^2.1.2"
- "lodash" "^4.17.19"
- "resolve" "^1.3.2"
- "semver" "^5.4.1"
- "source-map" "^0.5.0"
-
-"@babel/generator@^7.12.5", "@babel/generator@^7.17.10", "@babel/generator@^7.18.2":
- "integrity" "sha512-W1lG5vUwFvfMd8HVXqdfbuG7RuaSrTCCD8cl8fP8wOivdbtbIg2Db3IWUcgvfxKbbn6ZBGYRW/Zk1MIwK49mgw=="
- "resolved" "https://registry.npmjs.org/@babel/generator/-/generator-7.18.2.tgz"
- "version" "7.18.2"
- dependencies:
- "@babel/types" "^7.18.2"
- "@jridgewell/gen-mapping" "^0.3.0"
- "jsesc" "^2.5.1"
-
-"@babel/helper-annotate-as-pure@^7.16.7":
- "integrity" "sha512-s6t2w/IPQVTAET1HitoowRGXooX8mCgtuP5195wD/QJPV6wYjpujCGF7JuMODVX2ZAJOf1GT6DT9MHEZvLOFSw=="
- "resolved" "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.16.7.tgz"
- "version" "7.16.7"
- dependencies:
- "@babel/types" "^7.16.7"
-
-"@babel/helper-builder-binary-assignment-operator-visitor@^7.16.7":
- "integrity" "sha512-C6FdbRaxYjwVu/geKW4ZeQ0Q31AftgRcdSnZ5/jsH6BzCJbtvXvhpfkbkThYSuutZA7nCXpPR6AD9zd1dprMkA=="
- "resolved" "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.16.7.tgz"
- "version" "7.16.7"
- dependencies:
- "@babel/helper-explode-assignable-expression" "^7.16.7"
- "@babel/types" "^7.16.7"
-
-"@babel/helper-compilation-targets@^7.13.0", "@babel/helper-compilation-targets@^7.16.7", "@babel/helper-compilation-targets@^7.17.10", "@babel/helper-compilation-targets@^7.18.2":
- "integrity" "sha512-s1jnPotJS9uQnzFtiZVBUxe67CuBa679oWFHpxYYnTpRL/1ffhyX44R9uYiXoa/pLXcY9H2moJta0iaanlk/rQ=="
- "resolved" "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.18.2.tgz"
- "version" "7.18.2"
- dependencies:
- "@babel/compat-data" "^7.17.10"
- "@babel/helper-validator-option" "^7.16.7"
- "browserslist" "^4.20.2"
- "semver" "^6.3.0"
-
-"@babel/helper-create-class-features-plugin@^7.17.12", "@babel/helper-create-class-features-plugin@^7.18.0":
- "integrity" "sha512-Kh8zTGR9de3J63e5nS0rQUdRs/kbtwoeQQ0sriS0lItjC96u8XXZN6lKpuyWd2coKSU13py/y+LTmThLuVX0Pg=="
- "resolved" "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.18.0.tgz"
- "version" "7.18.0"
- dependencies:
- "@babel/helper-annotate-as-pure" "^7.16.7"
- "@babel/helper-environment-visitor" "^7.16.7"
- "@babel/helper-function-name" "^7.17.9"
- "@babel/helper-member-expression-to-functions" "^7.17.7"
- "@babel/helper-optimise-call-expression" "^7.16.7"
- "@babel/helper-replace-supers" "^7.16.7"
- "@babel/helper-split-export-declaration" "^7.16.7"
-
-"@babel/helper-create-regexp-features-plugin@^7.16.7", "@babel/helper-create-regexp-features-plugin@^7.17.12":
- "integrity" "sha512-b2aZrV4zvutr9AIa6/gA3wsZKRwTKYoDxYiFKcESS3Ug2GTXzwBEvMuuFLhCQpEnRXs1zng4ISAXSUxxKBIcxw=="
- "resolved" "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.17.12.tgz"
- "version" "7.17.12"
- dependencies:
- "@babel/helper-annotate-as-pure" "^7.16.7"
- "regexpu-core" "^5.0.1"
-
-"@babel/helper-define-polyfill-provider@^0.3.0", "@babel/helper-define-polyfill-provider@^0.3.1":
- "integrity" "sha512-J9hGMpJQmtWmj46B3kBHmL38UhJGhYX7eqkcq+2gsstyYt341HmPeWspihX43yVRA0mS+8GGk2Gckc7bY/HCmA=="
- "resolved" "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.1.tgz"
- "version" "0.3.1"
- dependencies:
- "@babel/helper-compilation-targets" "^7.13.0"
- "@babel/helper-module-imports" "^7.12.13"
- "@babel/helper-plugin-utils" "^7.13.0"
- "@babel/traverse" "^7.13.0"
- "debug" "^4.1.1"
- "lodash.debounce" "^4.0.8"
- "resolve" "^1.14.2"
- "semver" "^6.1.2"
-
-"@babel/helper-environment-visitor@^7.16.7", "@babel/helper-environment-visitor@^7.18.2":
- "integrity" "sha512-14GQKWkX9oJzPiQQ7/J36FTXcD4kSp8egKjO9nINlSKiHITRA9q/R74qu8S9xlc/b/yjsJItQUeeh3xnGN0voQ=="
- "resolved" "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.2.tgz"
- "version" "7.18.2"
-
-"@babel/helper-explode-assignable-expression@^7.16.7":
- "integrity" "sha512-KyUenhWMC8VrxzkGP0Jizjo4/Zx+1nNZhgocs+gLzyZyB8SHidhoq9KK/8Ato4anhwsivfkBLftky7gvzbZMtQ=="
- "resolved" "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.16.7.tgz"
- "version" "7.16.7"
- dependencies:
- "@babel/types" "^7.16.7"
-
-"@babel/helper-function-name@^7.16.7", "@babel/helper-function-name@^7.17.9":
- "integrity" "sha512-7cRisGlVtiVqZ0MW0/yFB4atgpGLWEHUVYnb448hZK4x+vih0YO5UoS11XIYtZYqHd0dIPMdUSv8q5K4LdMnIg=="
- "resolved" "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.17.9.tgz"
- "version" "7.17.9"
- dependencies:
- "@babel/template" "^7.16.7"
- "@babel/types" "^7.17.0"
-
-"@babel/helper-hoist-variables@^7.16.7":
- "integrity" "sha512-m04d/0Op34H5v7pbZw6pSKP7weA6lsMvfiIAMeIvkY/R4xQtBSMFEigu9QTZ2qB/9l22vsxtM8a+Q8CzD255fg=="
- "resolved" "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.16.7.tgz"
- "version" "7.16.7"
- dependencies:
- "@babel/types" "^7.16.7"
-
-"@babel/helper-member-expression-to-functions@^7.17.7":
- "integrity" "sha512-thxXgnQ8qQ11W2wVUObIqDL4p148VMxkt5T/qpN5k2fboRyzFGFmKsTGViquyM5QHKUy48OZoca8kw4ajaDPyw=="
- "resolved" "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.17.7.tgz"
- "version" "7.17.7"
- dependencies:
- "@babel/types" "^7.17.0"
-
-"@babel/helper-module-imports@^7.12.13", "@babel/helper-module-imports@^7.16.7":
- "integrity" "sha512-LVtS6TqjJHFc+nYeITRo6VLXve70xmq7wPhWTqDJusJEgGmkAACWwMiTNrvfoQo6hEhFwAIixNkvB0jPXDL8Wg=="
- "resolved" "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.16.7.tgz"
- "version" "7.16.7"
- dependencies:
- "@babel/types" "^7.16.7"
-
-"@babel/helper-module-transforms@^7.12.1", "@babel/helper-module-transforms@^7.18.0":
- "integrity" "sha512-kclUYSUBIjlvnzN2++K9f2qzYKFgjmnmjwL4zlmU5f8ZtzgWe8s0rUPSTGy2HmK4P8T52MQsS+HTQAgZd3dMEA=="
- "resolved" "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.18.0.tgz"
- "version" "7.18.0"
- dependencies:
- "@babel/helper-environment-visitor" "^7.16.7"
- "@babel/helper-module-imports" "^7.16.7"
- "@babel/helper-simple-access" "^7.17.7"
- "@babel/helper-split-export-declaration" "^7.16.7"
- "@babel/helper-validator-identifier" "^7.16.7"
- "@babel/template" "^7.16.7"
- "@babel/traverse" "^7.18.0"
- "@babel/types" "^7.18.0"
-
-"@babel/helper-optimise-call-expression@^7.16.7":
- "integrity" "sha512-EtgBhg7rd/JcnpZFXpBy0ze1YRfdm7BnBX4uKMBd3ixa3RGAE002JZB66FJyNH7g0F38U05pXmA5P8cBh7z+1w=="
- "resolved" "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.16.7.tgz"
- "version" "7.16.7"
- dependencies:
- "@babel/types" "^7.16.7"
-
-"@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.13.0", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.16.7", "@babel/helper-plugin-utils@^7.17.12", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3":
- "integrity" "sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA=="
- "resolved" "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz"
- "version" "7.17.12"
-
-"@babel/helper-plugin-utils@7.10.4":
- "integrity" "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg=="
- "resolved" "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz"
- "version" "7.10.4"
-
-"@babel/helper-remap-async-to-generator@^7.16.8":
- "integrity" "sha512-fm0gH7Flb8H51LqJHy3HJ3wnE1+qtYR2A99K06ahwrawLdOFsCEWjZOrYricXJHoPSudNKxrMBUPEIPxiIIvBw=="
- "resolved" "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.16.8.tgz"
- "version" "7.16.8"
- dependencies:
- "@babel/helper-annotate-as-pure" "^7.16.7"
- "@babel/helper-wrap-function" "^7.16.8"
- "@babel/types" "^7.16.8"
-
-"@babel/helper-replace-supers@^7.16.7", "@babel/helper-replace-supers@^7.18.2":
- "integrity" "sha512-XzAIyxx+vFnrOxiQrToSUOzUOn0e1J2Li40ntddek1Y69AXUTXoDJ40/D5RdjFu7s7qHiaeoTiempZcbuVXh2Q=="
- "resolved" "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.18.2.tgz"
- "version" "7.18.2"
- dependencies:
- "@babel/helper-environment-visitor" "^7.18.2"
- "@babel/helper-member-expression-to-functions" "^7.17.7"
- "@babel/helper-optimise-call-expression" "^7.16.7"
- "@babel/traverse" "^7.18.2"
- "@babel/types" "^7.18.2"
-
-"@babel/helper-simple-access@^7.17.7", "@babel/helper-simple-access@^7.18.2":
- "integrity" "sha512-7LIrjYzndorDY88MycupkpQLKS1AFfsVRm2k/9PtKScSy5tZq0McZTj+DiMRynboZfIqOKvo03pmhTaUgiD6fQ=="
- "resolved" "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.18.2.tgz"
- "version" "7.18.2"
- dependencies:
- "@babel/types" "^7.18.2"
-
-"@babel/helper-skip-transparent-expression-wrappers@^7.16.0":
- "integrity" "sha512-+il1gTy0oHwUsBQZyJvukbB4vPMdcYBrFHa0Uc4AizLxbq6BOYC51Rv4tWocX9BLBDLZ4kc6qUFpQ6HRgL+3zw=="
- "resolved" "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.16.0.tgz"
- "version" "7.16.0"
- dependencies:
- "@babel/types" "^7.16.0"
-
-"@babel/helper-split-export-declaration@^7.16.7":
- "integrity" "sha512-xbWoy/PFoxSWazIToT9Sif+jJTlrMcndIsaOKvTA6u7QEo7ilkRZpjew18/W3c7nm8fXdUDXh02VXTbZ0pGDNw=="
- "resolved" "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.7.tgz"
- "version" "7.16.7"
- dependencies:
- "@babel/types" "^7.16.7"
-
-"@babel/helper-validator-identifier@^7.16.7":
- "integrity" "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw=="
- "resolved" "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz"
- "version" "7.16.7"
-
-"@babel/helper-validator-option@^7.16.7":
- "integrity" "sha512-TRtenOuRUVo9oIQGPC5G9DgK4743cdxvtOw0weQNpZXaS16SCBi5MNjZF8vba3ETURjZpTbVn7Vvcf2eAwFozQ=="
- "resolved" "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.16.7.tgz"
- "version" "7.16.7"
-
-"@babel/helper-wrap-function@^7.16.8":
- "integrity" "sha512-8RpyRVIAW1RcDDGTA+GpPAwV22wXCfKOoM9bet6TLkGIFTkRQSkH1nMQ5Yet4MpoXe1ZwHPVtNasc2w0uZMqnw=="
- "resolved" "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.16.8.tgz"
- "version" "7.16.8"
- dependencies:
- "@babel/helper-function-name" "^7.16.7"
- "@babel/template" "^7.16.7"
- "@babel/traverse" "^7.16.8"
- "@babel/types" "^7.16.8"
-
-"@babel/helpers@^7.12.5", "@babel/helpers@^7.18.2":
- "integrity" "sha512-j+d+u5xT5utcQSzrh9p+PaJX94h++KN+ng9b9WEJq7pkUPAd61FGqhjuUEdfknb3E/uDBb7ruwEeKkIxNJPIrg=="
- "resolved" "https://registry.npmjs.org/@babel/helpers/-/helpers-7.18.2.tgz"
- "version" "7.18.2"
- dependencies:
- "@babel/template" "^7.16.7"
- "@babel/traverse" "^7.18.2"
- "@babel/types" "^7.18.2"
-
-"@babel/highlight@^7.16.7":
- "integrity" "sha512-J9PfEKCbFIv2X5bjTMiZu6Vf341N05QIY+d6FvVKynkG1S7G0j3I0QoRtWIrXhZ+/Nlb5Q0MzqL7TokEJ5BNHg=="
- "resolved" "https://registry.npmjs.org/@babel/highlight/-/highlight-7.17.9.tgz"
- "version" "7.17.9"
- dependencies:
- "@babel/helper-validator-identifier" "^7.16.7"
- "chalk" "^2.0.0"
- "js-tokens" "^4.0.0"
-
-"@babel/parser@^7.12.7", "@babel/parser@^7.16.7", "@babel/parser@^7.17.10", "@babel/parser@^7.18.0", "@babel/parser@^7.18.3":
- "integrity" "sha512-FDge0dFazETFcxGw/EXzOkN8uJp0PC7Qbm+Pe9T+av2zlBpOgunFHkQPPn+eRuClU73JF+98D531UgayY89tow=="
- "resolved" "https://registry.npmjs.org/@babel/parser/-/parser-7.18.4.tgz"
- "version" "7.18.4"
-
-"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.17.12":
- "integrity" "sha512-xCJQXl4EeQ3J9C4yOmpTrtVGmzpm2iSzyxbkZHw7UCnZBftHpF/hpII80uWVyVrc40ytIClHjgWGTG1g/yB+aw=="
- "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.17.12.tgz"
- "version" "7.17.12"
- dependencies:
- "@babel/helper-plugin-utils" "^7.17.12"
-
-"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.17.12":
- "integrity" "sha512-/vt0hpIw0x4b6BLKUkwlvEoiGZYYLNZ96CzyHYPbtG2jZGz6LBe7/V+drYrc/d+ovrF9NBi0pmtvmNb/FsWtRQ=="
- "resolved" "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.17.12.tgz"
- "version" "7.17.12"
- dependencies:
- "@babel/helper-plugin-utils" "^7.17.12"
- "@babel/helper-skip-transparent-expression-wrappers" "^7.16.0"
- "@babel/plugin-proposal-optional-chaining" "^7.17.12"
-
-"@babel/plugin-proposal-async-generator-functions@^7.17.12":
- "integrity" "sha512-RWVvqD1ooLKP6IqWTA5GyFVX2isGEgC5iFxKzfYOIy/QEFdxYyCybBDtIGjipHpb9bDWHzcqGqFakf+mVmBTdQ=="
- "resolved" "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.17.12.tgz"
- "version" "7.17.12"
- dependencies:
- "@babel/helper-plugin-utils" "^7.17.12"
- "@babel/helper-remap-async-to-generator" "^7.16.8"
- "@babel/plugin-syntax-async-generators" "^7.8.4"
-
-"@babel/plugin-proposal-class-properties@^7.17.12":
- "integrity" "sha512-U0mI9q8pW5Q9EaTHFPwSVusPMV/DV9Mm8p7csqROFLtIE9rBF5piLqyrBGigftALrBcsBGu4m38JneAe7ZDLXw=="
- "resolved" "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.17.12.tgz"
- "version" "7.17.12"
- dependencies:
- "@babel/helper-create-class-features-plugin" "^7.17.12"
- "@babel/helper-plugin-utils" "^7.17.12"
-
-"@babel/plugin-proposal-class-static-block@^7.18.0":
- "integrity" "sha512-t+8LsRMMDE74c6sV7KShIw13sqbqd58tlqNrsWoWBTIMw7SVQ0cZ905wLNS/FBCy/3PyooRHLFFlfrUNyyz5lA=="
- "resolved" "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.18.0.tgz"
- "version" "7.18.0"
- dependencies:
- "@babel/helper-create-class-features-plugin" "^7.18.0"
- "@babel/helper-plugin-utils" "^7.17.12"
- "@babel/plugin-syntax-class-static-block" "^7.14.5"
-
-"@babel/plugin-proposal-dynamic-import@^7.16.7":
- "integrity" "sha512-I8SW9Ho3/8DRSdmDdH3gORdyUuYnk1m4cMxUAdu5oy4n3OfN8flDEH+d60iG7dUfi0KkYwSvoalHzzdRzpWHTg=="
- "resolved" "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.16.7.tgz"
- "version" "7.16.7"
- dependencies:
- "@babel/helper-plugin-utils" "^7.16.7"
- "@babel/plugin-syntax-dynamic-import" "^7.8.3"
-
-"@babel/plugin-proposal-export-namespace-from@^7.17.12":
- "integrity" "sha512-j7Ye5EWdwoXOpRmo5QmRyHPsDIe6+u70ZYZrd7uz+ebPYFKfRcLcNu3Ro0vOlJ5zuv8rU7xa+GttNiRzX56snQ=="
- "resolved" "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.17.12.tgz"
- "version" "7.17.12"
- dependencies:
- "@babel/helper-plugin-utils" "^7.17.12"
- "@babel/plugin-syntax-export-namespace-from" "^7.8.3"
-
-"@babel/plugin-proposal-json-strings@^7.17.12":
- "integrity" "sha512-rKJ+rKBoXwLnIn7n6o6fulViHMrOThz99ybH+hKHcOZbnN14VuMnH9fo2eHE69C8pO4uX1Q7t2HYYIDmv8VYkg=="
- "resolved" "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.17.12.tgz"
- "version" "7.17.12"
- dependencies:
- "@babel/helper-plugin-utils" "^7.17.12"
- "@babel/plugin-syntax-json-strings" "^7.8.3"
-
-"@babel/plugin-proposal-logical-assignment-operators@^7.17.12":
- "integrity" "sha512-EqFo2s1Z5yy+JeJu7SFfbIUtToJTVlC61/C7WLKDntSw4Sz6JNAIfL7zQ74VvirxpjB5kz/kIx0gCcb+5OEo2Q=="
- "resolved" "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.17.12.tgz"
- "version" "7.17.12"
- dependencies:
- "@babel/helper-plugin-utils" "^7.17.12"
- "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4"
-
-"@babel/plugin-proposal-nullish-coalescing-operator@^7.17.12":
- "integrity" "sha512-ws/g3FSGVzv+VH86+QvgtuJL/kR67xaEIF2x0iPqdDfYW6ra6JF3lKVBkWynRLcNtIC1oCTfDRVxmm2mKzy+ag=="
- "resolved" "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.17.12.tgz"
- "version" "7.17.12"
- dependencies:
- "@babel/helper-plugin-utils" "^7.17.12"
- "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3"
-
-"@babel/plugin-proposal-numeric-separator@^7.16.7":
- "integrity" "sha512-vQgPMknOIgiuVqbokToyXbkY/OmmjAzr/0lhSIbG/KmnzXPGwW/AdhdKpi+O4X/VkWiWjnkKOBiqJrTaC98VKw=="
- "resolved" "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.16.7.tgz"
- "version" "7.16.7"
- dependencies:
- "@babel/helper-plugin-utils" "^7.16.7"
- "@babel/plugin-syntax-numeric-separator" "^7.10.4"
-
-"@babel/plugin-proposal-object-rest-spread@^7.18.0":
- "integrity" "sha512-nbTv371eTrFabDfHLElkn9oyf9VG+VKK6WMzhY2o4eHKaG19BToD9947zzGMO6I/Irstx9d8CwX6njPNIAR/yw=="
- "resolved" "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.18.0.tgz"
- "version" "7.18.0"
- dependencies:
- "@babel/compat-data" "^7.17.10"
- "@babel/helper-compilation-targets" "^7.17.10"
- "@babel/helper-plugin-utils" "^7.17.12"
- "@babel/plugin-syntax-object-rest-spread" "^7.8.3"
- "@babel/plugin-transform-parameters" "^7.17.12"
-
-"@babel/plugin-proposal-object-rest-spread@7.12.1":
- "integrity" "sha512-s6SowJIjzlhx8o7lsFx5zmY4At6CTtDvgNQDdPzkBQucle58A6b/TTeEBYtyDgmcXjUTM+vE8YOGHZzzbc/ioA=="
- "resolved" "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.12.1.tgz"
- "version" "7.12.1"
- dependencies:
- "@babel/helper-plugin-utils" "^7.10.4"
- "@babel/plugin-syntax-object-rest-spread" "^7.8.0"
- "@babel/plugin-transform-parameters" "^7.12.1"
-
-"@babel/plugin-proposal-optional-catch-binding@^7.16.7":
- "integrity" "sha512-eMOH/L4OvWSZAE1VkHbr1vckLG1WUcHGJSLqqQwl2GaUqG6QjddvrOaTUMNYiv77H5IKPMZ9U9P7EaHwvAShfA=="
- "resolved" "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.16.7.tgz"
- "version" "7.16.7"
- dependencies:
- "@babel/helper-plugin-utils" "^7.16.7"
- "@babel/plugin-syntax-optional-catch-binding" "^7.8.3"
-
-"@babel/plugin-proposal-optional-chaining@^7.17.12":
- "integrity" "sha512-7wigcOs/Z4YWlK7xxjkvaIw84vGhDv/P1dFGQap0nHkc8gFKY/r+hXc8Qzf5k1gY7CvGIcHqAnOagVKJJ1wVOQ=="
- "resolved" "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.17.12.tgz"
- "version" "7.17.12"
- dependencies:
- "@babel/helper-plugin-utils" "^7.17.12"
- "@babel/helper-skip-transparent-expression-wrappers" "^7.16.0"
- "@babel/plugin-syntax-optional-chaining" "^7.8.3"
-
-"@babel/plugin-proposal-private-methods@^7.17.12":
- "integrity" "sha512-SllXoxo19HmxhDWm3luPz+cPhtoTSKLJE9PXshsfrOzBqs60QP0r8OaJItrPhAj0d7mZMnNF0Y1UUggCDgMz1A=="
- "resolved" "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.17.12.tgz"
- "version" "7.17.12"
- dependencies:
- "@babel/helper-create-class-features-plugin" "^7.17.12"
- "@babel/helper-plugin-utils" "^7.17.12"
-
-"@babel/plugin-proposal-private-property-in-object@^7.17.12":
- "integrity" "sha512-/6BtVi57CJfrtDNKfK5b66ydK2J5pXUKBKSPD2G1whamMuEnZWgoOIfO8Vf9F/DoD4izBLD/Au4NMQfruzzykg=="
- "resolved" "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.17.12.tgz"
- "version" "7.17.12"
- dependencies:
- "@babel/helper-annotate-as-pure" "^7.16.7"
- "@babel/helper-create-class-features-plugin" "^7.17.12"
- "@babel/helper-plugin-utils" "^7.17.12"
- "@babel/plugin-syntax-private-property-in-object" "^7.14.5"
-
-"@babel/plugin-proposal-unicode-property-regex@^7.17.12", "@babel/plugin-proposal-unicode-property-regex@^7.4.4":
- "integrity" "sha512-Wb9qLjXf3ZazqXA7IvI7ozqRIXIGPtSo+L5coFmEkhTQK18ao4UDDD0zdTGAarmbLj2urpRwrc6893cu5Bfh0A=="
- "resolved" "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.17.12.tgz"
- "version" "7.17.12"
- dependencies:
- "@babel/helper-create-regexp-features-plugin" "^7.17.12"
- "@babel/helper-plugin-utils" "^7.17.12"
-
-"@babel/plugin-syntax-async-generators@^7.8.4":
- "integrity" "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw=="
- "resolved" "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz"
- "version" "7.8.4"
- dependencies:
- "@babel/helper-plugin-utils" "^7.8.0"
-
-"@babel/plugin-syntax-class-properties@^7.12.13":
- "integrity" "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA=="
- "resolved" "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz"
- "version" "7.12.13"
- dependencies:
- "@babel/helper-plugin-utils" "^7.12.13"
-
-"@babel/plugin-syntax-class-static-block@^7.14.5":
- "integrity" "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw=="
- "resolved" "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz"
- "version" "7.14.5"
- dependencies:
- "@babel/helper-plugin-utils" "^7.14.5"
-
-"@babel/plugin-syntax-dynamic-import@^7.8.3":
- "integrity" "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ=="
- "resolved" "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz"
- "version" "7.8.3"
- dependencies:
- "@babel/helper-plugin-utils" "^7.8.0"
-
-"@babel/plugin-syntax-export-namespace-from@^7.8.3":
- "integrity" "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q=="
- "resolved" "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz"
- "version" "7.8.3"
- dependencies:
- "@babel/helper-plugin-utils" "^7.8.3"
-
-"@babel/plugin-syntax-import-assertions@^7.17.12":
- "integrity" "sha512-n/loy2zkq9ZEM8tEOwON9wTQSTNDTDEz6NujPtJGLU7qObzT1N4c4YZZf8E6ATB2AjNQg/Ib2AIpO03EZaCehw=="
- "resolved" "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.17.12.tgz"
- "version" "7.17.12"
- dependencies:
- "@babel/helper-plugin-utils" "^7.17.12"
-
-"@babel/plugin-syntax-json-strings@^7.8.3":
- "integrity" "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA=="
- "resolved" "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz"
- "version" "7.8.3"
- dependencies:
- "@babel/helper-plugin-utils" "^7.8.0"
-
-"@babel/plugin-syntax-jsx@^7.17.12":
- "integrity" "sha512-spyY3E3AURfxh/RHtjx5j6hs8am5NbUBGfcZ2vB3uShSpZdQyXSf5rR5Mk76vbtlAZOelyVQ71Fg0x9SG4fsog=="
- "resolved" "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.17.12.tgz"
- "version" "7.17.12"
- dependencies:
- "@babel/helper-plugin-utils" "^7.17.12"
-
-"@babel/plugin-syntax-jsx@7.12.1":
- "integrity" "sha512-1yRi7yAtB0ETgxdY9ti/p2TivUxJkTdhu/ZbF9MshVGqOx1TdB3b7xCXs49Fupgg50N45KcAsRP/ZqWjs9SRjg=="
- "resolved" "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.12.1.tgz"
- "version" "7.12.1"
- dependencies:
- "@babel/helper-plugin-utils" "^7.10.4"
-
-"@babel/plugin-syntax-logical-assignment-operators@^7.10.4":
- "integrity" "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig=="
- "resolved" "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz"
- "version" "7.10.4"
- dependencies:
- "@babel/helper-plugin-utils" "^7.10.4"
-
-"@babel/plugin-syntax-nullish-coalescing-operator@^7.8.3":
- "integrity" "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ=="
- "resolved" "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz"
- "version" "7.8.3"
- dependencies:
- "@babel/helper-plugin-utils" "^7.8.0"
-
-"@babel/plugin-syntax-numeric-separator@^7.10.4":
- "integrity" "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug=="
- "resolved" "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz"
- "version" "7.10.4"
- 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":
- "integrity" "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA=="
- "resolved" "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz"
- "version" "7.8.3"
- dependencies:
- "@babel/helper-plugin-utils" "^7.8.0"
-
-"@babel/plugin-syntax-optional-catch-binding@^7.8.3":
- "integrity" "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q=="
- "resolved" "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz"
- "version" "7.8.3"
- dependencies:
- "@babel/helper-plugin-utils" "^7.8.0"
-
-"@babel/plugin-syntax-optional-chaining@^7.8.3":
- "integrity" "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg=="
- "resolved" "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz"
- "version" "7.8.3"
- dependencies:
- "@babel/helper-plugin-utils" "^7.8.0"
-
-"@babel/plugin-syntax-private-property-in-object@^7.14.5":
- "integrity" "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg=="
- "resolved" "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz"
- "version" "7.14.5"
- dependencies:
- "@babel/helper-plugin-utils" "^7.14.5"
-
-"@babel/plugin-syntax-top-level-await@^7.14.5":
- "integrity" "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw=="
- "resolved" "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz"
- "version" "7.14.5"
- dependencies:
- "@babel/helper-plugin-utils" "^7.14.5"
-
-"@babel/plugin-syntax-typescript@^7.17.12":
- "integrity" "sha512-TYY0SXFiO31YXtNg3HtFwNJHjLsAyIIhAhNWkQ5whPPS7HWUFlg9z0Ta4qAQNjQbP1wsSt/oKkmZ/4/WWdMUpw=="
- "resolved" "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.17.12.tgz"
- "version" "7.17.12"
- dependencies:
- "@babel/helper-plugin-utils" "^7.17.12"
-
-"@babel/plugin-transform-arrow-functions@^7.17.12":
- "integrity" "sha512-PHln3CNi/49V+mza4xMwrg+WGYevSF1oaiXaC2EQfdp4HWlSjRsrDXWJiQBKpP7749u6vQ9mcry2uuFOv5CXvA=="
- "resolved" "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.17.12.tgz"
- "version" "7.17.12"
- dependencies:
- "@babel/helper-plugin-utils" "^7.17.12"
-
-"@babel/plugin-transform-async-to-generator@^7.17.12":
- "integrity" "sha512-J8dbrWIOO3orDzir57NRsjg4uxucvhby0L/KZuGsWDj0g7twWK3g7JhJhOrXtuXiw8MeiSdJ3E0OW9H8LYEzLQ=="
- "resolved" "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.17.12.tgz"
- "version" "7.17.12"
- dependencies:
- "@babel/helper-module-imports" "^7.16.7"
- "@babel/helper-plugin-utils" "^7.17.12"
- "@babel/helper-remap-async-to-generator" "^7.16.8"
-
-"@babel/plugin-transform-block-scoped-functions@^7.16.7":
- "integrity" "sha512-JUuzlzmF40Z9cXyytcbZEZKckgrQzChbQJw/5PuEHYeqzCsvebDx0K0jWnIIVcmmDOAVctCgnYs0pMcrYj2zJg=="
- "resolved" "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.16.7.tgz"
- "version" "7.16.7"
- dependencies:
- "@babel/helper-plugin-utils" "^7.16.7"
-
-"@babel/plugin-transform-block-scoping@^7.17.12":
- "integrity" "sha512-+Hq10ye+jlvLEogSOtq4mKvtk7qwcUQ1f0Mrueai866C82f844Yom2cttfJdMdqRLTxWpsbfbkIkOIfovyUQXw=="
- "resolved" "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.18.4.tgz"
- "version" "7.18.4"
- dependencies:
- "@babel/helper-plugin-utils" "^7.17.12"
-
-"@babel/plugin-transform-classes@^7.17.12":
- "integrity" "sha512-e42NSG2mlKWgxKUAD9EJJSkZxR67+wZqzNxLSpc51T8tRU5SLFHsPmgYR5yr7sdgX4u+iHA1C5VafJ6AyImV3A=="
- "resolved" "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.18.4.tgz"
- "version" "7.18.4"
- dependencies:
- "@babel/helper-annotate-as-pure" "^7.16.7"
- "@babel/helper-environment-visitor" "^7.18.2"
- "@babel/helper-function-name" "^7.17.9"
- "@babel/helper-optimise-call-expression" "^7.16.7"
- "@babel/helper-plugin-utils" "^7.17.12"
- "@babel/helper-replace-supers" "^7.18.2"
- "@babel/helper-split-export-declaration" "^7.16.7"
- "globals" "^11.1.0"
-
-"@babel/plugin-transform-computed-properties@^7.17.12":
- "integrity" "sha512-a7XINeplB5cQUWMg1E/GI1tFz3LfK021IjV1rj1ypE+R7jHm+pIHmHl25VNkZxtx9uuYp7ThGk8fur1HHG7PgQ=="
- "resolved" "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.17.12.tgz"
- "version" "7.17.12"
- dependencies:
- "@babel/helper-plugin-utils" "^7.17.12"
-
-"@babel/plugin-transform-destructuring@^7.18.0":
- "integrity" "sha512-Mo69klS79z6KEfrLg/1WkmVnB8javh75HX4pi2btjvlIoasuxilEyjtsQW6XPrubNd7AQy0MMaNIaQE4e7+PQw=="
- "resolved" "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.18.0.tgz"
- "version" "7.18.0"
- dependencies:
- "@babel/helper-plugin-utils" "^7.17.12"
-
-"@babel/plugin-transform-dotall-regex@^7.16.7", "@babel/plugin-transform-dotall-regex@^7.4.4":
- "integrity" "sha512-Lyttaao2SjZF6Pf4vk1dVKv8YypMpomAbygW+mU5cYP3S5cWTfCJjG8xV6CFdzGFlfWK81IjL9viiTvpb6G7gQ=="
- "resolved" "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.16.7.tgz"
- "version" "7.16.7"
- dependencies:
- "@babel/helper-create-regexp-features-plugin" "^7.16.7"
- "@babel/helper-plugin-utils" "^7.16.7"
-
-"@babel/plugin-transform-duplicate-keys@^7.17.12":
- "integrity" "sha512-EA5eYFUG6xeerdabina/xIoB95jJ17mAkR8ivx6ZSu9frKShBjpOGZPn511MTDTkiCO+zXnzNczvUM69YSf3Zw=="
- "resolved" "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.17.12.tgz"
- "version" "7.17.12"
- dependencies:
- "@babel/helper-plugin-utils" "^7.17.12"
-
-"@babel/plugin-transform-exponentiation-operator@^7.16.7":
- "integrity" "sha512-8UYLSlyLgRixQvlYH3J2ekXFHDFLQutdy7FfFAMm3CPZ6q9wHCwnUyiXpQCe3gVVnQlHc5nsuiEVziteRNTXEA=="
- "resolved" "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.16.7.tgz"
- "version" "7.16.7"
- dependencies:
- "@babel/helper-builder-binary-assignment-operator-visitor" "^7.16.7"
- "@babel/helper-plugin-utils" "^7.16.7"
-
-"@babel/plugin-transform-for-of@^7.18.1":
- "integrity" "sha512-+TTB5XwvJ5hZbO8xvl2H4XaMDOAK57zF4miuC9qQJgysPNEAZZ9Z69rdF5LJkozGdZrjBIUAIyKUWRMmebI7vg=="
- "resolved" "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.18.1.tgz"
- "version" "7.18.1"
- dependencies:
- "@babel/helper-plugin-utils" "^7.17.12"
-
-"@babel/plugin-transform-function-name@^7.16.7":
- "integrity" "sha512-SU/C68YVwTRxqWj5kgsbKINakGag0KTgq9f2iZEXdStoAbOzLHEBRYzImmA6yFo8YZhJVflvXmIHUO7GWHmxxA=="
- "resolved" "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.16.7.tgz"
- "version" "7.16.7"
- dependencies:
- "@babel/helper-compilation-targets" "^7.16.7"
- "@babel/helper-function-name" "^7.16.7"
- "@babel/helper-plugin-utils" "^7.16.7"
-
-"@babel/plugin-transform-literals@^7.17.12":
- "integrity" "sha512-8iRkvaTjJciWycPIZ9k9duu663FT7VrBdNqNgxnVXEFwOIp55JWcZd23VBRySYbnS3PwQ3rGiabJBBBGj5APmQ=="
- "resolved" "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.17.12.tgz"
- "version" "7.17.12"
- dependencies:
- "@babel/helper-plugin-utils" "^7.17.12"
-
-"@babel/plugin-transform-member-expression-literals@^7.16.7":
- "integrity" "sha512-mBruRMbktKQwbxaJof32LT9KLy2f3gH+27a5XSuXo6h7R3vqltl0PgZ80C8ZMKw98Bf8bqt6BEVi3svOh2PzMw=="
- "resolved" "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.16.7.tgz"
- "version" "7.16.7"
- dependencies:
- "@babel/helper-plugin-utils" "^7.16.7"
-
-"@babel/plugin-transform-modules-amd@^7.18.0":
- "integrity" "sha512-h8FjOlYmdZwl7Xm2Ug4iX2j7Qy63NANI+NQVWQzv6r25fqgg7k2dZl03p95kvqNclglHs4FZ+isv4p1uXMA+QA=="
- "resolved" "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.18.0.tgz"
- "version" "7.18.0"
- dependencies:
- "@babel/helper-module-transforms" "^7.18.0"
- "@babel/helper-plugin-utils" "^7.17.12"
- "babel-plugin-dynamic-import-node" "^2.3.3"
-
-"@babel/plugin-transform-modules-commonjs@^7.18.2":
- "integrity" "sha512-f5A865gFPAJAEE0K7F/+nm5CmAE3y8AWlMBG9unu5j9+tk50UQVK0QS8RNxSp7MJf0wh97uYyLWt3Zvu71zyOQ=="
- "resolved" "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.18.2.tgz"
- "version" "7.18.2"
- dependencies:
- "@babel/helper-module-transforms" "^7.18.0"
- "@babel/helper-plugin-utils" "^7.17.12"
- "@babel/helper-simple-access" "^7.18.2"
- "babel-plugin-dynamic-import-node" "^2.3.3"
-
-"@babel/plugin-transform-modules-systemjs@^7.18.0":
- "integrity" "sha512-lH2UaQaHVOAeYrUUuZ8i38o76J/FnO8vu21OE+tD1MyP9lxdZoSfz+pDbWkq46GogUrdrMz3tiz/FYGB+bVThg=="
- "resolved" "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.18.4.tgz"
- "version" "7.18.4"
- dependencies:
- "@babel/helper-hoist-variables" "^7.16.7"
- "@babel/helper-module-transforms" "^7.18.0"
- "@babel/helper-plugin-utils" "^7.17.12"
- "@babel/helper-validator-identifier" "^7.16.7"
- "babel-plugin-dynamic-import-node" "^2.3.3"
-
-"@babel/plugin-transform-modules-umd@^7.18.0":
- "integrity" "sha512-d/zZ8I3BWli1tmROLxXLc9A6YXvGK8egMxHp+E/rRwMh1Kip0AP77VwZae3snEJ33iiWwvNv2+UIIhfalqhzZA=="
- "resolved" "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.18.0.tgz"
- "version" "7.18.0"
- dependencies:
- "@babel/helper-module-transforms" "^7.18.0"
- "@babel/helper-plugin-utils" "^7.17.12"
-
-"@babel/plugin-transform-named-capturing-groups-regex@^7.17.12":
- "integrity" "sha512-vWoWFM5CKaTeHrdUJ/3SIOTRV+MBVGybOC9mhJkaprGNt5demMymDW24yC74avb915/mIRe3TgNb/d8idvnCRA=="
- "resolved" "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.17.12.tgz"
- "version" "7.17.12"
- dependencies:
- "@babel/helper-create-regexp-features-plugin" "^7.17.12"
- "@babel/helper-plugin-utils" "^7.17.12"
-
-"@babel/plugin-transform-new-target@^7.17.12":
- "integrity" "sha512-CaOtzk2fDYisbjAD4Sd1MTKGVIpRtx9bWLyj24Y/k6p4s4gQ3CqDGJauFJxt8M/LEx003d0i3klVqnN73qvK3w=="
- "resolved" "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.17.12.tgz"
- "version" "7.17.12"
- dependencies:
- "@babel/helper-plugin-utils" "^7.17.12"
-
-"@babel/plugin-transform-object-super@^7.16.7":
- "integrity" "sha512-14J1feiQVWaGvRxj2WjyMuXS2jsBkgB3MdSN5HuC2G5nRspa5RK9COcs82Pwy5BuGcjb+fYaUj94mYcOj7rCvw=="
- "resolved" "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.16.7.tgz"
- "version" "7.16.7"
- dependencies:
- "@babel/helper-plugin-utils" "^7.16.7"
- "@babel/helper-replace-supers" "^7.16.7"
-
-"@babel/plugin-transform-parameters@^7.12.1", "@babel/plugin-transform-parameters@^7.17.12":
- "integrity" "sha512-6qW4rWo1cyCdq1FkYri7AHpauchbGLXpdwnYsfxFb+KtddHENfsY5JZb35xUwkK5opOLcJ3BNd2l7PhRYGlwIA=="
- "resolved" "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.17.12.tgz"
- "version" "7.17.12"
- dependencies:
- "@babel/helper-plugin-utils" "^7.17.12"
-
-"@babel/plugin-transform-property-literals@^7.16.7":
- "integrity" "sha512-z4FGr9NMGdoIl1RqavCqGG+ZuYjfZ/hkCIeuH6Do7tXmSm0ls11nYVSJqFEUOSJbDab5wC6lRE/w6YjVcr6Hqw=="
- "resolved" "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.16.7.tgz"
- "version" "7.16.7"
- dependencies:
- "@babel/helper-plugin-utils" "^7.16.7"
-
-"@babel/plugin-transform-react-constant-elements@^7.12.1", "@babel/plugin-transform-react-constant-elements@^7.14.5":
- "integrity" "sha512-OgtklS+p9t1X37eWA4XdvvbZG/3gqzX569gqmo3q4/Ui6qjfTQmOs5UTSrfdD9nVByHhX6Gbm/Pyc4KbwUXGWA=="
- "resolved" "https://registry.npmjs.org/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.16.0.tgz"
- "version" "7.16.0"
- dependencies:
- "@babel/helper-plugin-utils" "^7.14.5"
-
-"@babel/plugin-transform-react-display-name@^7.16.7":
- "integrity" "sha512-qgIg8BcZgd0G/Cz916D5+9kqX0c7nPZyXaP8R2tLNN5tkyIZdG5fEwBrxwplzSnjC1jvQmyMNVwUCZPcbGY7Pg=="
- "resolved" "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.16.7.tgz"
- "version" "7.16.7"
- dependencies:
- "@babel/helper-plugin-utils" "^7.16.7"
-
-"@babel/plugin-transform-react-jsx-development@^7.16.7":
- "integrity" "sha512-RMvQWvpla+xy6MlBpPlrKZCMRs2AGiHOGHY3xRwl0pEeim348dDyxeH4xBsMPbIMhujeq7ihE702eM2Ew0Wo+A=="
- "resolved" "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.16.7.tgz"
- "version" "7.16.7"
- dependencies:
- "@babel/plugin-transform-react-jsx" "^7.16.7"
-
-"@babel/plugin-transform-react-jsx@^7.16.7", "@babel/plugin-transform-react-jsx@^7.17.12":
- "integrity" "sha512-Lcaw8bxd1DKht3thfD4A12dqo1X16he1Lm8rIv8sTwjAYNInRS1qHa9aJoqvzpscItXvftKDCfaEQzwoVyXpEQ=="
- "resolved" "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.17.12.tgz"
- "version" "7.17.12"
- dependencies:
- "@babel/helper-annotate-as-pure" "^7.16.7"
- "@babel/helper-module-imports" "^7.16.7"
- "@babel/helper-plugin-utils" "^7.17.12"
- "@babel/plugin-syntax-jsx" "^7.17.12"
- "@babel/types" "^7.17.12"
-
-"@babel/plugin-transform-react-pure-annotations@^7.16.7":
- "integrity" "sha512-hs71ToC97k3QWxswh2ElzMFABXHvGiJ01IB1TbYQDGeWRKWz/MPUTh5jGExdHvosYKpnJW5Pm3S4+TA3FyX+GA=="
- "resolved" "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.16.7.tgz"
- "version" "7.16.7"
- dependencies:
- "@babel/helper-annotate-as-pure" "^7.16.7"
- "@babel/helper-plugin-utils" "^7.16.7"
-
-"@babel/plugin-transform-regenerator@^7.18.0":
- "integrity" "sha512-C8YdRw9uzx25HSIzwA7EM7YP0FhCe5wNvJbZzjVNHHPGVcDJ3Aie+qGYYdS1oVQgn+B3eAIJbWFLrJ4Jipv7nw=="
- "resolved" "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.18.0.tgz"
- "version" "7.18.0"
- dependencies:
- "@babel/helper-plugin-utils" "^7.17.12"
- "regenerator-transform" "^0.15.0"
-
-"@babel/plugin-transform-reserved-words@^7.17.12":
- "integrity" "sha512-1KYqwbJV3Co03NIi14uEHW8P50Md6KqFgt0FfpHdK6oyAHQVTosgPuPSiWud1HX0oYJ1hGRRlk0fP87jFpqXZA=="
- "resolved" "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.17.12.tgz"
- "version" "7.17.12"
- dependencies:
- "@babel/helper-plugin-utils" "^7.17.12"
-
-"@babel/plugin-transform-runtime@^7.17.10", "@babel/plugin-transform-runtime@^7.18.2":
- "integrity" "sha512-mr1ufuRMfS52ttq+1G1PD8OJNqgcTFjq3hwn8SZ5n1x1pBhi0E36rYMdTK0TsKtApJ4lDEdfXJwtGobQMHSMPg=="
- "resolved" "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.18.2.tgz"
- "version" "7.18.2"
- dependencies:
- "@babel/helper-module-imports" "^7.16.7"
- "@babel/helper-plugin-utils" "^7.17.12"
- "babel-plugin-polyfill-corejs2" "^0.3.0"
- "babel-plugin-polyfill-corejs3" "^0.5.0"
- "babel-plugin-polyfill-regenerator" "^0.3.0"
- "semver" "^6.3.0"
-
-"@babel/plugin-transform-shorthand-properties@^7.16.7":
- "integrity" "sha512-hah2+FEnoRoATdIb05IOXf+4GzXYTq75TVhIn1PewihbpyrNWUt2JbudKQOETWw6QpLe+AIUpJ5MVLYTQbeeUg=="
- "resolved" "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.16.7.tgz"
- "version" "7.16.7"
- dependencies:
- "@babel/helper-plugin-utils" "^7.16.7"
-
-"@babel/plugin-transform-spread@^7.17.12":
- "integrity" "sha512-9pgmuQAtFi3lpNUstvG9nGfk9DkrdmWNp9KeKPFmuZCpEnxRzYlS8JgwPjYj+1AWDOSvoGN0H30p1cBOmT/Svg=="
- "resolved" "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.17.12.tgz"
- "version" "7.17.12"
- dependencies:
- "@babel/helper-plugin-utils" "^7.17.12"
- "@babel/helper-skip-transparent-expression-wrappers" "^7.16.0"
-
-"@babel/plugin-transform-sticky-regex@^7.16.7":
- "integrity" "sha512-NJa0Bd/87QV5NZZzTuZG5BPJjLYadeSZ9fO6oOUoL4iQx+9EEuw/eEM92SrsT19Yc2jgB1u1hsjqDtH02c3Drw=="
- "resolved" "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.16.7.tgz"
- "version" "7.16.7"
- dependencies:
- "@babel/helper-plugin-utils" "^7.16.7"
-
-"@babel/plugin-transform-template-literals@^7.18.2":
- "integrity" "sha512-/cmuBVw9sZBGZVOMkpAEaVLwm4JmK2GZ1dFKOGGpMzEHWFmyZZ59lUU0PdRr8YNYeQdNzTDwuxP2X2gzydTc9g=="
- "resolved" "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.18.2.tgz"
- "version" "7.18.2"
- dependencies:
- "@babel/helper-plugin-utils" "^7.17.12"
-
-"@babel/plugin-transform-typeof-symbol@^7.17.12":
- "integrity" "sha512-Q8y+Jp7ZdtSPXCThB6zjQ74N3lj0f6TDh1Hnf5B+sYlzQ8i5Pjp8gW0My79iekSpT4WnI06blqP6DT0OmaXXmw=="
- "resolved" "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.17.12.tgz"
- "version" "7.17.12"
- dependencies:
- "@babel/helper-plugin-utils" "^7.17.12"
-
-"@babel/plugin-transform-typescript@^7.17.12":
- "integrity" "sha512-l4vHuSLUajptpHNEOUDEGsnpl9pfRLsN1XUoDQDD/YBuXTM+v37SHGS+c6n4jdcZy96QtuUuSvZYMLSSsjH8Mw=="
- "resolved" "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.18.4.tgz"
- "version" "7.18.4"
- dependencies:
- "@babel/helper-create-class-features-plugin" "^7.18.0"
- "@babel/helper-plugin-utils" "^7.17.12"
- "@babel/plugin-syntax-typescript" "^7.17.12"
-
-"@babel/plugin-transform-unicode-escapes@^7.16.7":
- "integrity" "sha512-TAV5IGahIz3yZ9/Hfv35TV2xEm+kaBDaZQCn2S/hG9/CZ0DktxJv9eKfPc7yYCvOYR4JGx1h8C+jcSOvgaaI/Q=="
- "resolved" "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.16.7.tgz"
- "version" "7.16.7"
- dependencies:
- "@babel/helper-plugin-utils" "^7.16.7"
-
-"@babel/plugin-transform-unicode-regex@^7.16.7":
- "integrity" "sha512-oC5tYYKw56HO75KZVLQ+R/Nl3Hro9kf8iG0hXoaHP7tjAyCpvqBiSNe6vGrZni1Z6MggmUOC6A7VP7AVmw225Q=="
- "resolved" "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.16.7.tgz"
- "version" "7.16.7"
- dependencies:
- "@babel/helper-create-regexp-features-plugin" "^7.16.7"
- "@babel/helper-plugin-utils" "^7.16.7"
-
-"@babel/preset-env@^7.12.1", "@babel/preset-env@^7.15.6", "@babel/preset-env@^7.17.10", "@babel/preset-env@^7.18.2":
- "integrity" "sha512-PfpdxotV6afmXMU47S08F9ZKIm2bJIQ0YbAAtDfIENX7G1NUAXigLREh69CWDjtgUy7dYn7bsMzkgdtAlmS68Q=="
- "resolved" "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.18.2.tgz"
- "version" "7.18.2"
- dependencies:
- "@babel/compat-data" "^7.17.10"
- "@babel/helper-compilation-targets" "^7.18.2"
- "@babel/helper-plugin-utils" "^7.17.12"
- "@babel/helper-validator-option" "^7.16.7"
- "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.17.12"
- "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.17.12"
- "@babel/plugin-proposal-async-generator-functions" "^7.17.12"
- "@babel/plugin-proposal-class-properties" "^7.17.12"
- "@babel/plugin-proposal-class-static-block" "^7.18.0"
- "@babel/plugin-proposal-dynamic-import" "^7.16.7"
- "@babel/plugin-proposal-export-namespace-from" "^7.17.12"
- "@babel/plugin-proposal-json-strings" "^7.17.12"
- "@babel/plugin-proposal-logical-assignment-operators" "^7.17.12"
- "@babel/plugin-proposal-nullish-coalescing-operator" "^7.17.12"
- "@babel/plugin-proposal-numeric-separator" "^7.16.7"
- "@babel/plugin-proposal-object-rest-spread" "^7.18.0"
- "@babel/plugin-proposal-optional-catch-binding" "^7.16.7"
- "@babel/plugin-proposal-optional-chaining" "^7.17.12"
- "@babel/plugin-proposal-private-methods" "^7.17.12"
- "@babel/plugin-proposal-private-property-in-object" "^7.17.12"
- "@babel/plugin-proposal-unicode-property-regex" "^7.17.12"
- "@babel/plugin-syntax-async-generators" "^7.8.4"
- "@babel/plugin-syntax-class-properties" "^7.12.13"
- "@babel/plugin-syntax-class-static-block" "^7.14.5"
- "@babel/plugin-syntax-dynamic-import" "^7.8.3"
- "@babel/plugin-syntax-export-namespace-from" "^7.8.3"
- "@babel/plugin-syntax-import-assertions" "^7.17.12"
- "@babel/plugin-syntax-json-strings" "^7.8.3"
- "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4"
- "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3"
- "@babel/plugin-syntax-numeric-separator" "^7.10.4"
- "@babel/plugin-syntax-object-rest-spread" "^7.8.3"
- "@babel/plugin-syntax-optional-catch-binding" "^7.8.3"
- "@babel/plugin-syntax-optional-chaining" "^7.8.3"
- "@babel/plugin-syntax-private-property-in-object" "^7.14.5"
- "@babel/plugin-syntax-top-level-await" "^7.14.5"
- "@babel/plugin-transform-arrow-functions" "^7.17.12"
- "@babel/plugin-transform-async-to-generator" "^7.17.12"
- "@babel/plugin-transform-block-scoped-functions" "^7.16.7"
- "@babel/plugin-transform-block-scoping" "^7.17.12"
- "@babel/plugin-transform-classes" "^7.17.12"
- "@babel/plugin-transform-computed-properties" "^7.17.12"
- "@babel/plugin-transform-destructuring" "^7.18.0"
- "@babel/plugin-transform-dotall-regex" "^7.16.7"
- "@babel/plugin-transform-duplicate-keys" "^7.17.12"
- "@babel/plugin-transform-exponentiation-operator" "^7.16.7"
- "@babel/plugin-transform-for-of" "^7.18.1"
- "@babel/plugin-transform-function-name" "^7.16.7"
- "@babel/plugin-transform-literals" "^7.17.12"
- "@babel/plugin-transform-member-expression-literals" "^7.16.7"
- "@babel/plugin-transform-modules-amd" "^7.18.0"
- "@babel/plugin-transform-modules-commonjs" "^7.18.2"
- "@babel/plugin-transform-modules-systemjs" "^7.18.0"
- "@babel/plugin-transform-modules-umd" "^7.18.0"
- "@babel/plugin-transform-named-capturing-groups-regex" "^7.17.12"
- "@babel/plugin-transform-new-target" "^7.17.12"
- "@babel/plugin-transform-object-super" "^7.16.7"
- "@babel/plugin-transform-parameters" "^7.17.12"
- "@babel/plugin-transform-property-literals" "^7.16.7"
- "@babel/plugin-transform-regenerator" "^7.18.0"
- "@babel/plugin-transform-reserved-words" "^7.17.12"
- "@babel/plugin-transform-shorthand-properties" "^7.16.7"
- "@babel/plugin-transform-spread" "^7.17.12"
- "@babel/plugin-transform-sticky-regex" "^7.16.7"
- "@babel/plugin-transform-template-literals" "^7.18.2"
- "@babel/plugin-transform-typeof-symbol" "^7.17.12"
- "@babel/plugin-transform-unicode-escapes" "^7.16.7"
- "@babel/plugin-transform-unicode-regex" "^7.16.7"
- "@babel/preset-modules" "^0.1.5"
- "@babel/types" "^7.18.2"
- "babel-plugin-polyfill-corejs2" "^0.3.0"
- "babel-plugin-polyfill-corejs3" "^0.5.0"
- "babel-plugin-polyfill-regenerator" "^0.3.0"
- "core-js-compat" "^3.22.1"
- "semver" "^6.3.0"
-
-"@babel/preset-modules@^0.1.5":
- "integrity" "sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA=="
- "resolved" "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.5.tgz"
- "version" "0.1.5"
- dependencies:
- "@babel/helper-plugin-utils" "^7.0.0"
- "@babel/plugin-proposal-unicode-property-regex" "^7.4.4"
- "@babel/plugin-transform-dotall-regex" "^7.4.4"
- "@babel/types" "^7.4.4"
- "esutils" "^2.0.2"
-
-"@babel/preset-react@^7.12.5", "@babel/preset-react@^7.14.5", "@babel/preset-react@^7.16.7", "@babel/preset-react@^7.17.12":
- "integrity" "sha512-h5U+rwreXtZaRBEQhW1hOJLMq8XNJBQ/9oymXiCXTuT/0uOwpbT0gUt+sXeOqoXBgNuUKI7TaObVwoEyWkpFgA=="
- "resolved" "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.17.12.tgz"
- "version" "7.17.12"
- dependencies:
- "@babel/helper-plugin-utils" "^7.17.12"
- "@babel/helper-validator-option" "^7.16.7"
- "@babel/plugin-transform-react-display-name" "^7.16.7"
- "@babel/plugin-transform-react-jsx" "^7.17.12"
- "@babel/plugin-transform-react-jsx-development" "^7.16.7"
- "@babel/plugin-transform-react-pure-annotations" "^7.16.7"
-
-"@babel/preset-typescript@^7.15.0", "@babel/preset-typescript@^7.16.7", "@babel/preset-typescript@^7.17.12":
- "integrity" "sha512-S1ViF8W2QwAKUGJXxP9NAfNaqGDdEBJKpYkxHf5Yy2C4NPPzXGeR3Lhk7G8xJaaLcFTRfNjVbtbVtm8Gb0mqvg=="
- "resolved" "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.17.12.tgz"
- "version" "7.17.12"
- dependencies:
- "@babel/helper-plugin-utils" "^7.17.12"
- "@babel/helper-validator-option" "^7.16.7"
- "@babel/plugin-transform-typescript" "^7.17.12"
-
-"@babel/runtime-corejs3@^7.17.9", "@babel/runtime-corejs3@^7.18.3":
- "integrity" "sha512-l4ddFwrc9rnR+EJsHsh+TJ4A35YqQz/UqcjtlX2ov53hlJYG5CxtQmNZxyajwDVmCxwy++rtvGU5HazCK4W41Q=="
- "resolved" "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.18.3.tgz"
- "version" "7.18.3"
- dependencies:
- "core-js-pure" "^3.20.2"
- "regenerator-runtime" "^0.13.4"
-
-"@babel/runtime@^7.1.2", "@babel/runtime@^7.10.2", "@babel/runtime@^7.10.3", "@babel/runtime@^7.12.1", "@babel/runtime@^7.12.13", "@babel/runtime@^7.12.5", "@babel/runtime@^7.17.9", "@babel/runtime@^7.18.3", "@babel/runtime@^7.8.4":
- "integrity" "sha512-38Y8f7YUhce/K7RMwTp7m0uCumpv9hZkitCbBClqQIow1qSbCvGkcegKOXpEWCQLfWmevgRiWokZ1GkpfhbZug=="
- "resolved" "https://registry.npmjs.org/@babel/runtime/-/runtime-7.18.3.tgz"
- "version" "7.18.3"
- dependencies:
- "regenerator-runtime" "^0.13.4"
-
-"@babel/template@^7.12.7", "@babel/template@^7.16.7":
- "integrity" "sha512-I8j/x8kHUrbYRTUxXrrMbfCa7jxkE7tZre39x3kjr9hvI82cK1FfqLygotcWN5kdPGWcLdWMHpSBavse5tWw3w=="
- "resolved" "https://registry.npmjs.org/@babel/template/-/template-7.16.7.tgz"
- "version" "7.16.7"
- dependencies:
- "@babel/code-frame" "^7.16.7"
- "@babel/parser" "^7.16.7"
- "@babel/types" "^7.16.7"
-
-"@babel/traverse@^7.12.9", "@babel/traverse@^7.13.0", "@babel/traverse@^7.16.8", "@babel/traverse@^7.17.10", "@babel/traverse@^7.18.0", "@babel/traverse@^7.18.2":
- "integrity" "sha512-9eNwoeovJ6KH9zcCNnENY7DMFwTU9JdGCFtqNLfUAqtUHRCOsTOqWoffosP8vKmNYeSBUv3yVJXjfd8ucwOjUA=="
- "resolved" "https://registry.npmjs.org/@babel/traverse/-/traverse-7.18.2.tgz"
- "version" "7.18.2"
- dependencies:
- "@babel/code-frame" "^7.16.7"
- "@babel/generator" "^7.18.2"
- "@babel/helper-environment-visitor" "^7.18.2"
- "@babel/helper-function-name" "^7.17.9"
- "@babel/helper-hoist-variables" "^7.16.7"
- "@babel/helper-split-export-declaration" "^7.16.7"
- "@babel/parser" "^7.18.0"
- "@babel/types" "^7.18.2"
- "debug" "^4.1.0"
- "globals" "^11.1.0"
-
-"@babel/types@^7.12.6", "@babel/types@^7.12.7", "@babel/types@^7.15.6", "@babel/types@^7.16.0", "@babel/types@^7.16.7", "@babel/types@^7.16.8", "@babel/types@^7.17.0", "@babel/types@^7.17.12", "@babel/types@^7.18.0", "@babel/types@^7.18.2", "@babel/types@^7.4.4":
- "integrity" "sha512-ThN1mBcMq5pG/Vm2IcBmPPfyPXbd8S02rS+OBIDENdufvqC7Z/jHPCv9IcP01277aKtDI8g/2XysBN4hA8niiw=="
- "resolved" "https://registry.npmjs.org/@babel/types/-/types-7.18.4.tgz"
- "version" "7.18.4"
- dependencies:
- "@babel/helper-validator-identifier" "^7.16.7"
- "to-fast-properties" "^2.0.0"
-
-"@colors/colors@1.5.0":
- "integrity" "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ=="
- "resolved" "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz"
- "version" "1.5.0"
-
-"@docsearch/css@3.0.0":
- "integrity" "sha512-1kkV7tkAsiuEd0shunYRByKJe3xQDG2q7wYg24SOw1nV9/2lwEd4WrUYRJC/ukGTl2/kHeFxsaUvtiOy0y6fFA=="
- "resolved" "https://registry.npmjs.org/@docsearch/css/-/css-3.0.0.tgz"
- "version" "3.0.0"
-
-"@docsearch/react@^3.0.0":
- "integrity" "sha512-yhMacqS6TVQYoBh/o603zszIb5Bl8MIXuOc6Vy617I74pirisDzzcNh0NEaYQt50fVVR3khUbeEhUEWEWipESg=="
- "resolved" "https://registry.npmjs.org/@docsearch/react/-/react-3.0.0.tgz"
- "version" "3.0.0"
- dependencies:
- "@algolia/autocomplete-core" "1.5.2"
- "@algolia/autocomplete-preset-algolia" "1.5.2"
- "@docsearch/css" "3.0.0"
- "algoliasearch" "^4.0.0"
-
-"@docusaurus/core@2.0.0-beta.20":
- "integrity" "sha512-a3UgZ4lIcIOoZd4j9INqVkWSXEDxR7EicJXt8eq2whg4N5hKGqLHoDSnWfrVSPQn4NoG5T7jhPypphSoysImfQ=="
- "resolved" "https://registry.npmjs.org/@docusaurus/core/-/core-2.0.0-beta.20.tgz"
- "version" "2.0.0-beta.20"
- dependencies:
- "@babel/core" "^7.17.10"
- "@babel/generator" "^7.17.10"
- "@babel/plugin-syntax-dynamic-import" "^7.8.3"
- "@babel/plugin-transform-runtime" "^7.17.10"
- "@babel/preset-env" "^7.17.10"
- "@babel/preset-react" "^7.16.7"
- "@babel/preset-typescript" "^7.16.7"
- "@babel/runtime" "^7.17.9"
- "@babel/runtime-corejs3" "^7.17.9"
- "@babel/traverse" "^7.17.10"
- "@docusaurus/cssnano-preset" "2.0.0-beta.20"
- "@docusaurus/logger" "2.0.0-beta.20"
- "@docusaurus/mdx-loader" "2.0.0-beta.20"
- "@docusaurus/react-loadable" "5.5.2"
- "@docusaurus/utils" "2.0.0-beta.20"
- "@docusaurus/utils-common" "2.0.0-beta.20"
- "@docusaurus/utils-validation" "2.0.0-beta.20"
- "@slorber/static-site-generator-webpack-plugin" "^4.0.4"
- "@svgr/webpack" "^6.2.1"
- "autoprefixer" "^10.4.5"
- "babel-loader" "^8.2.5"
- "babel-plugin-dynamic-import-node" "2.3.0"
- "boxen" "^6.2.1"
- "chokidar" "^3.5.3"
- "clean-css" "^5.3.0"
- "cli-table3" "^0.6.2"
- "combine-promises" "^1.1.0"
- "commander" "^5.1.0"
- "copy-webpack-plugin" "^10.2.4"
- "core-js" "^3.22.3"
- "css-loader" "^6.7.1"
- "css-minimizer-webpack-plugin" "^3.4.1"
- "cssnano" "^5.1.7"
- "del" "^6.0.0"
- "detect-port" "^1.3.0"
- "escape-html" "^1.0.3"
- "eta" "^1.12.3"
- "file-loader" "^6.2.0"
- "fs-extra" "^10.1.0"
- "html-minifier-terser" "^6.1.0"
- "html-tags" "^3.2.0"
- "html-webpack-plugin" "^5.5.0"
- "import-fresh" "^3.3.0"
- "leven" "^3.1.0"
- "lodash" "^4.17.21"
- "mini-css-extract-plugin" "^2.6.0"
- "postcss" "^8.4.13"
- "postcss-loader" "^6.2.1"
- "prompts" "^2.4.2"
- "react-dev-utils" "^12.0.1"
- "react-helmet-async" "^1.3.0"
- "react-loadable" "npm:@docusaurus/react-loadable@5.5.2"
- "react-loadable-ssr-addon-v5-slorber" "^1.0.1"
- "react-router" "^5.2.0"
- "react-router-config" "^5.1.1"
- "react-router-dom" "^5.2.0"
- "remark-admonitions" "^1.2.1"
- "rtl-detect" "^1.0.4"
- "semver" "^7.3.7"
- "serve-handler" "^6.1.3"
- "shelljs" "^0.8.5"
- "terser-webpack-plugin" "^5.3.1"
- "tslib" "^2.4.0"
- "update-notifier" "^5.1.0"
- "url-loader" "^4.1.1"
- "wait-on" "^6.0.1"
- "webpack" "^5.72.0"
- "webpack-bundle-analyzer" "^4.5.0"
- "webpack-dev-server" "^4.8.1"
- "webpack-merge" "^5.8.0"
- "webpackbar" "^5.0.2"
-
-"@docusaurus/core@2.0.0-beta.21":
- "integrity" "sha512-qysDMVp1M5UozK3u/qOxsEZsHF7jeBvJDS+5ItMPYmNKvMbNKeYZGA0g6S7F9hRDwjIlEbvo7BaX0UMDcmTAWA=="
- "resolved" "https://registry.npmjs.org/@docusaurus/core/-/core-2.0.0-beta.21.tgz"
- "version" "2.0.0-beta.21"
- dependencies:
- "@babel/core" "^7.18.2"
- "@babel/generator" "^7.18.2"
- "@babel/plugin-syntax-dynamic-import" "^7.8.3"
- "@babel/plugin-transform-runtime" "^7.18.2"
- "@babel/preset-env" "^7.18.2"
- "@babel/preset-react" "^7.17.12"
- "@babel/preset-typescript" "^7.17.12"
- "@babel/runtime" "^7.18.3"
- "@babel/runtime-corejs3" "^7.18.3"
- "@babel/traverse" "^7.18.2"
- "@docusaurus/cssnano-preset" "2.0.0-beta.21"
- "@docusaurus/logger" "2.0.0-beta.21"
- "@docusaurus/mdx-loader" "2.0.0-beta.21"
- "@docusaurus/react-loadable" "5.5.2"
- "@docusaurus/utils" "2.0.0-beta.21"
- "@docusaurus/utils-common" "2.0.0-beta.21"
- "@docusaurus/utils-validation" "2.0.0-beta.21"
- "@slorber/static-site-generator-webpack-plugin" "^4.0.4"
- "@svgr/webpack" "^6.2.1"
- "autoprefixer" "^10.4.7"
- "babel-loader" "^8.2.5"
- "babel-plugin-dynamic-import-node" "^2.3.3"
- "boxen" "^6.2.1"
- "chalk" "^4.1.2"
- "chokidar" "^3.5.3"
- "clean-css" "^5.3.0"
- "cli-table3" "^0.6.2"
- "combine-promises" "^1.1.0"
- "commander" "^5.1.0"
- "copy-webpack-plugin" "^11.0.0"
- "core-js" "^3.22.7"
- "css-loader" "^6.7.1"
- "css-minimizer-webpack-plugin" "^4.0.0"
- "cssnano" "^5.1.9"
- "del" "^6.1.1"
- "detect-port" "^1.3.0"
- "escape-html" "^1.0.3"
- "eta" "^1.12.3"
- "file-loader" "^6.2.0"
- "fs-extra" "^10.1.0"
- "html-minifier-terser" "^6.1.0"
- "html-tags" "^3.2.0"
- "html-webpack-plugin" "^5.5.0"
- "import-fresh" "^3.3.0"
- "leven" "^3.1.0"
- "lodash" "^4.17.21"
- "mini-css-extract-plugin" "^2.6.0"
- "postcss" "^8.4.14"
- "postcss-loader" "^7.0.0"
- "prompts" "^2.4.2"
- "react-dev-utils" "^12.0.1"
- "react-helmet-async" "^1.3.0"
- "react-loadable" "npm:@docusaurus/react-loadable@5.5.2"
- "react-loadable-ssr-addon-v5-slorber" "^1.0.1"
- "react-router" "^5.3.3"
- "react-router-config" "^5.1.1"
- "react-router-dom" "^5.3.3"
- "remark-admonitions" "^1.2.1"
- "rtl-detect" "^1.0.4"
- "semver" "^7.3.7"
- "serve-handler" "^6.1.3"
- "shelljs" "^0.8.5"
- "terser-webpack-plugin" "^5.3.1"
- "tslib" "^2.4.0"
- "update-notifier" "^5.1.0"
- "url-loader" "^4.1.1"
- "wait-on" "^6.0.1"
- "webpack" "^5.72.1"
- "webpack-bundle-analyzer" "^4.5.0"
- "webpack-dev-server" "^4.9.0"
- "webpack-merge" "^5.8.0"
- "webpackbar" "^5.0.2"
-
-"@docusaurus/cssnano-preset@2.0.0-beta.20":
- "integrity" "sha512-7pfrYuahHl3YYS+gYhbb1YHsq5s5+hk+1KIU7QqNNn4YjrIqAHlOznCQ9XfQfspe9boZmaNFGMZQ1tawNOVLqQ=="
- "resolved" "https://registry.npmjs.org/@docusaurus/cssnano-preset/-/cssnano-preset-2.0.0-beta.20.tgz"
- "version" "2.0.0-beta.20"
- dependencies:
- "cssnano-preset-advanced" "^5.3.3"
- "postcss" "^8.4.13"
- "postcss-sort-media-queries" "^4.2.1"
-
-"@docusaurus/cssnano-preset@2.0.0-beta.21":
- "integrity" "sha512-fhTZrg1vc6zYYZIIMXpe1TnEVGEjqscBo0s1uomSwKjjtMgu7wkzc1KKJYY7BndsSA+fVVkZ+OmL/kAsmK7xxw=="
- "resolved" "https://registry.npmjs.org/@docusaurus/cssnano-preset/-/cssnano-preset-2.0.0-beta.21.tgz"
- "version" "2.0.0-beta.21"
- dependencies:
- "cssnano-preset-advanced" "^5.3.5"
- "postcss" "^8.4.14"
- "postcss-sort-media-queries" "^4.2.1"
- "tslib" "^2.4.0"
-
-"@docusaurus/logger@2.0.0-beta.20":
- "integrity" "sha512-7Rt7c8m3ZM81o5jsm6ENgdbjq/hUICv8Om2i7grynI4GT2aQyFoHcusaNbRji4FZt0DaKT2CQxiAWP8BbD4xzQ=="
- "resolved" "https://registry.npmjs.org/@docusaurus/logger/-/logger-2.0.0-beta.20.tgz"
- "version" "2.0.0-beta.20"
- dependencies:
- "chalk" "^4.1.2"
- "tslib" "^2.4.0"
-
-"@docusaurus/logger@2.0.0-beta.21":
- "integrity" "sha512-HTFp8FsSMrAj7Uxl5p72U+P7rjYU/LRRBazEoJbs9RaqoKEdtZuhv8MYPOCh46K9TekaoquRYqag2o23Qt4ggA=="
- "resolved" "https://registry.npmjs.org/@docusaurus/logger/-/logger-2.0.0-beta.21.tgz"
- "version" "2.0.0-beta.21"
- dependencies:
- "chalk" "^4.1.2"
- "tslib" "^2.4.0"
-
-"@docusaurus/mdx-loader@2.0.0-beta.20":
- "integrity" "sha512-BBuf77sji3JxbCEW7Qsv3CXlgpm+iSLTQn6JUK7x8vJ1JYZ3KJbNgpo9TmxIIltpcvNQ/QOy6dvqrpSStaWmKQ=="
- "resolved" "https://registry.npmjs.org/@docusaurus/mdx-loader/-/mdx-loader-2.0.0-beta.20.tgz"
- "version" "2.0.0-beta.20"
- dependencies:
- "@babel/parser" "^7.17.10"
- "@babel/traverse" "^7.17.10"
- "@docusaurus/logger" "2.0.0-beta.20"
- "@docusaurus/utils" "2.0.0-beta.20"
- "@mdx-js/mdx" "^1.6.22"
- "escape-html" "^1.0.3"
- "file-loader" "^6.2.0"
- "fs-extra" "^10.1.0"
- "image-size" "^1.0.1"
- "mdast-util-to-string" "^2.0.0"
- "remark-emoji" "^2.2.0"
- "stringify-object" "^3.3.0"
- "tslib" "^2.4.0"
- "unist-util-visit" "^2.0.3"
- "url-loader" "^4.1.1"
- "webpack" "^5.72.0"
-
-"@docusaurus/mdx-loader@2.0.0-beta.21":
- "integrity" "sha512-AI+4obJnpOaBOAYV6df2ux5Y1YJCBS+MhXFf0yhED12sVLJi2vffZgdamYd/d/FwvWDw6QLs/VD2jebd7P50yQ=="
- "resolved" "https://registry.npmjs.org/@docusaurus/mdx-loader/-/mdx-loader-2.0.0-beta.21.tgz"
- "version" "2.0.0-beta.21"
- dependencies:
- "@babel/parser" "^7.18.3"
- "@babel/traverse" "^7.18.2"
- "@docusaurus/logger" "2.0.0-beta.21"
- "@docusaurus/utils" "2.0.0-beta.21"
- "@mdx-js/mdx" "^1.6.22"
- "escape-html" "^1.0.3"
- "file-loader" "^6.2.0"
- "fs-extra" "^10.1.0"
- "image-size" "^1.0.1"
- "mdast-util-to-string" "^2.0.0"
- "remark-emoji" "^2.2.0"
- "stringify-object" "^3.3.0"
- "tslib" "^2.4.0"
- "unist-util-visit" "^2.0.3"
- "url-loader" "^4.1.1"
- "webpack" "^5.72.1"
-
-"@docusaurus/module-type-aliases@2.0.0-beta.20":
- "integrity" "sha512-lUIXLwQEOyYwcb3iCNibPUL6O9ijvYF5xQwehGeVraTEBts/Ch8ZwELFk+XbaGHKh52PiVxuWL2CP4Gdjy5QKw=="
- "resolved" "https://registry.npmjs.org/@docusaurus/module-type-aliases/-/module-type-aliases-2.0.0-beta.20.tgz"
- "version" "2.0.0-beta.20"
- dependencies:
- "@docusaurus/types" "2.0.0-beta.20"
- "@types/react" "*"
- "@types/react-router-config" "*"
- "@types/react-router-dom" "*"
- "react-helmet-async" "*"
-
-"@docusaurus/plugin-content-blog@2.0.0-beta.20":
- "integrity" "sha512-6aby36Gmny5h2oo/eEZ2iwVsIlBWbRnNNeqT0BYnJO5aj53iCU/ctFPpJVYcw0l2l8+8ITS70FyePIWEsaZ0jA=="
- "resolved" "https://registry.npmjs.org/@docusaurus/plugin-content-blog/-/plugin-content-blog-2.0.0-beta.20.tgz"
- "version" "2.0.0-beta.20"
- dependencies:
- "@docusaurus/core" "2.0.0-beta.20"
- "@docusaurus/logger" "2.0.0-beta.20"
- "@docusaurus/mdx-loader" "2.0.0-beta.20"
- "@docusaurus/utils" "2.0.0-beta.20"
- "@docusaurus/utils-common" "2.0.0-beta.20"
- "@docusaurus/utils-validation" "2.0.0-beta.20"
- "cheerio" "^1.0.0-rc.10"
- "feed" "^4.2.2"
- "fs-extra" "^10.1.0"
- "lodash" "^4.17.21"
- "reading-time" "^1.5.0"
- "remark-admonitions" "^1.2.1"
- "tslib" "^2.4.0"
- "unist-util-visit" "^2.0.3"
- "utility-types" "^3.10.0"
- "webpack" "^5.72.0"
-
-"@docusaurus/plugin-content-docs@2.0.0-beta.20":
- "integrity" "sha512-XOgwUqXtr/DStpB3azdN6wgkKtQkOXOx1XetORzhHnjihrSMn6daxg+spmcJh1ki/mpT3n7yBbKJxVNo+VB38Q=="
- "resolved" "https://registry.npmjs.org/@docusaurus/plugin-content-docs/-/plugin-content-docs-2.0.0-beta.20.tgz"
- "version" "2.0.0-beta.20"
- dependencies:
- "@docusaurus/core" "2.0.0-beta.20"
- "@docusaurus/logger" "2.0.0-beta.20"
- "@docusaurus/mdx-loader" "2.0.0-beta.20"
- "@docusaurus/utils" "2.0.0-beta.20"
- "@docusaurus/utils-validation" "2.0.0-beta.20"
- "combine-promises" "^1.1.0"
- "fs-extra" "^10.1.0"
- "import-fresh" "^3.3.0"
- "js-yaml" "^4.1.0"
- "lodash" "^4.17.21"
- "remark-admonitions" "^1.2.1"
- "tslib" "^2.4.0"
- "utility-types" "^3.10.0"
- "webpack" "^5.72.0"
-
-"@docusaurus/plugin-content-pages@2.0.0-beta.20":
- "integrity" "sha512-ubY6DG4F0skFKjfNGCbfO34Qf+MZy6C05OtpIYsoA2YU8ADx0nRH7qPgdEkwR3ma860DbY612rleRT13ogSlhg=="
- "resolved" "https://registry.npmjs.org/@docusaurus/plugin-content-pages/-/plugin-content-pages-2.0.0-beta.20.tgz"
- "version" "2.0.0-beta.20"
- dependencies:
- "@docusaurus/core" "2.0.0-beta.20"
- "@docusaurus/mdx-loader" "2.0.0-beta.20"
- "@docusaurus/utils" "2.0.0-beta.20"
- "@docusaurus/utils-validation" "2.0.0-beta.20"
- "fs-extra" "^10.1.0"
- "remark-admonitions" "^1.2.1"
- "tslib" "^2.4.0"
- "webpack" "^5.72.0"
-
-"@docusaurus/plugin-debug@2.0.0-beta.20":
- "integrity" "sha512-acGZmpncPA1XDczpV1ji1ajBCRBY/H2lXN8alSjOB1vh0c/2Qz+KKD05p17lsUbhIyvsnZBa/BaOwtek91Lu7Q=="
- "resolved" "https://registry.npmjs.org/@docusaurus/plugin-debug/-/plugin-debug-2.0.0-beta.20.tgz"
- "version" "2.0.0-beta.20"
- dependencies:
- "@docusaurus/core" "2.0.0-beta.20"
- "@docusaurus/utils" "2.0.0-beta.20"
- "fs-extra" "^10.1.0"
- "react-json-view" "^1.21.3"
- "tslib" "^2.4.0"
-
-"@docusaurus/plugin-google-analytics@^2.0.0-beta.21":
- "integrity" "sha512-+5MS0PeGaJRgPuNZlbd/WMdQSpOACaxEz7A81HAxm6kE+tIASTW3l8jgj1eWFy/PGPzaLnQrEjxI1McAfnYmQw=="
- "resolved" "https://registry.npmjs.org/@docusaurus/plugin-google-analytics/-/plugin-google-analytics-2.0.0-beta.21.tgz"
- "version" "2.0.0-beta.21"
- dependencies:
- "@docusaurus/core" "2.0.0-beta.21"
- "@docusaurus/utils-validation" "2.0.0-beta.21"
- "tslib" "^2.4.0"
-
-"@docusaurus/plugin-google-analytics@2.0.0-beta.20":
- "integrity" "sha512-4C5nY25j0R1lntFmpSEalhL7jYA7tWvk0VZObiIxGilLagT/f9gWPQtIjNBe4yzdQvkhiaXpa8xcMcJUAKRJyw=="
- "resolved" "https://registry.npmjs.org/@docusaurus/plugin-google-analytics/-/plugin-google-analytics-2.0.0-beta.20.tgz"
- "version" "2.0.0-beta.20"
- dependencies:
- "@docusaurus/core" "2.0.0-beta.20"
- "@docusaurus/utils-validation" "2.0.0-beta.20"
- "tslib" "^2.4.0"
-
-"@docusaurus/plugin-google-gtag@2.0.0-beta.20":
- "integrity" "sha512-EMZdiMTNg4NwE60xwjbetcqMDqAOazMTwQAQ4OuNAclv7oh8+VPCvqRF8s8AxCoI2Uqc7vh8yzNUuM307Ne9JA=="
- "resolved" "https://registry.npmjs.org/@docusaurus/plugin-google-gtag/-/plugin-google-gtag-2.0.0-beta.20.tgz"
- "version" "2.0.0-beta.20"
- dependencies:
- "@docusaurus/core" "2.0.0-beta.20"
- "@docusaurus/utils-validation" "2.0.0-beta.20"
- "tslib" "^2.4.0"
-
-"@docusaurus/plugin-sitemap@2.0.0-beta.20":
- "integrity" "sha512-Rf5a2vOBWjbe7PJJEBDeLZzDA7lsDi+16bqzKN8OKSXlcZLhxjmIpL5NrjANNbpGpL5vbl9z+iqvjbQmZ3QSmA=="
- "resolved" "https://registry.npmjs.org/@docusaurus/plugin-sitemap/-/plugin-sitemap-2.0.0-beta.20.tgz"
- "version" "2.0.0-beta.20"
- dependencies:
- "@docusaurus/core" "2.0.0-beta.20"
- "@docusaurus/utils" "2.0.0-beta.20"
- "@docusaurus/utils-common" "2.0.0-beta.20"
- "@docusaurus/utils-validation" "2.0.0-beta.20"
- "fs-extra" "^10.1.0"
- "sitemap" "^7.1.1"
- "tslib" "^2.4.0"
-
-"@docusaurus/preset-classic@2.0.0-beta.20":
- "integrity" "sha512-artUDjiYFIlGd2fxk0iqqcJ5xSCrgormOAoind1c0pn8TRXY1WSCQWYI6p4X24jjhSCzLv0s6Z9PMDyxZdivhg=="
- "resolved" "https://registry.npmjs.org/@docusaurus/preset-classic/-/preset-classic-2.0.0-beta.20.tgz"
- "version" "2.0.0-beta.20"
- dependencies:
- "@docusaurus/core" "2.0.0-beta.20"
- "@docusaurus/plugin-content-blog" "2.0.0-beta.20"
- "@docusaurus/plugin-content-docs" "2.0.0-beta.20"
- "@docusaurus/plugin-content-pages" "2.0.0-beta.20"
- "@docusaurus/plugin-debug" "2.0.0-beta.20"
- "@docusaurus/plugin-google-analytics" "2.0.0-beta.20"
- "@docusaurus/plugin-google-gtag" "2.0.0-beta.20"
- "@docusaurus/plugin-sitemap" "2.0.0-beta.20"
- "@docusaurus/theme-classic" "2.0.0-beta.20"
- "@docusaurus/theme-common" "2.0.0-beta.20"
- "@docusaurus/theme-search-algolia" "2.0.0-beta.20"
-
-"@docusaurus/react-loadable@5.5.2":
- "integrity" "sha512-A3dYjdBGuy0IGT+wyLIGIKLRE+sAk1iNk0f1HjNDysO7u8lhL4N3VEm+FAubmJbAztn94F7MxBTPmnixbiyFdQ=="
- "resolved" "https://registry.npmjs.org/@docusaurus/react-loadable/-/react-loadable-5.5.2.tgz"
- "version" "5.5.2"
- dependencies:
- "@types/react" "*"
- "prop-types" "^15.6.2"
-
-"@docusaurus/theme-classic@2.0.0-beta.20":
- "integrity" "sha512-rs4U68x8Xk6rPsZC/7eaPxCKqzXX1S45FICKmq/IZuaDaQyQIijCvv2ssxYnUyVZUNayZfJK7ZtNu+A0kzYgSQ=="
- "resolved" "https://registry.npmjs.org/@docusaurus/theme-classic/-/theme-classic-2.0.0-beta.20.tgz"
- "version" "2.0.0-beta.20"
- dependencies:
- "@docusaurus/core" "2.0.0-beta.20"
- "@docusaurus/plugin-content-blog" "2.0.0-beta.20"
- "@docusaurus/plugin-content-docs" "2.0.0-beta.20"
- "@docusaurus/plugin-content-pages" "2.0.0-beta.20"
- "@docusaurus/theme-common" "2.0.0-beta.20"
- "@docusaurus/theme-translations" "2.0.0-beta.20"
- "@docusaurus/utils" "2.0.0-beta.20"
- "@docusaurus/utils-common" "2.0.0-beta.20"
- "@docusaurus/utils-validation" "2.0.0-beta.20"
- "@mdx-js/react" "^1.6.22"
- "clsx" "^1.1.1"
- "copy-text-to-clipboard" "^3.0.1"
- "infima" "0.2.0-alpha.39"
- "lodash" "^4.17.21"
- "nprogress" "^0.2.0"
- "postcss" "^8.4.13"
- "prism-react-renderer" "^1.3.1"
- "prismjs" "^1.28.0"
- "react-router-dom" "^5.2.0"
- "rtlcss" "^3.5.0"
-
-"@docusaurus/theme-common@2.0.0-beta.20":
- "integrity" "sha512-lmdGB3/GQM5z0GH0iHGRXUco4Wfqc6sR5eRKuW4j0sx3+UFVvtbVTTIGt0Cie4Dh6omnFxjPbNDlPDgWr/agVQ=="
- "resolved" "https://registry.npmjs.org/@docusaurus/theme-common/-/theme-common-2.0.0-beta.20.tgz"
- "version" "2.0.0-beta.20"
- dependencies:
- "@docusaurus/module-type-aliases" "2.0.0-beta.20"
- "@docusaurus/plugin-content-blog" "2.0.0-beta.20"
- "@docusaurus/plugin-content-docs" "2.0.0-beta.20"
- "@docusaurus/plugin-content-pages" "2.0.0-beta.20"
- "clsx" "^1.1.1"
- "parse-numeric-range" "^1.3.0"
- "prism-react-renderer" "^1.3.1"
- "tslib" "^2.4.0"
- "utility-types" "^3.10.0"
-
-"@docusaurus/theme-search-algolia@2.0.0-beta.20":
- "integrity" "sha512-9XAyiXXHgyhDmKXg9RUtnC4WBkYAZUqKT9Ntuk0OaOb4mBwiYUGL74tyP0LLL6T+oa9uEdXiUMlIL1onU8xhvA=="
- "resolved" "https://registry.npmjs.org/@docusaurus/theme-search-algolia/-/theme-search-algolia-2.0.0-beta.20.tgz"
- "version" "2.0.0-beta.20"
- dependencies:
- "@docsearch/react" "^3.0.0"
- "@docusaurus/core" "2.0.0-beta.20"
- "@docusaurus/logger" "2.0.0-beta.20"
- "@docusaurus/plugin-content-docs" "2.0.0-beta.20"
- "@docusaurus/theme-common" "2.0.0-beta.20"
- "@docusaurus/theme-translations" "2.0.0-beta.20"
- "@docusaurus/utils" "2.0.0-beta.20"
- "@docusaurus/utils-validation" "2.0.0-beta.20"
- "algoliasearch" "^4.13.0"
- "algoliasearch-helper" "^3.8.2"
- "clsx" "^1.1.1"
- "eta" "^1.12.3"
- "fs-extra" "^10.1.0"
- "lodash" "^4.17.21"
- "tslib" "^2.4.0"
- "utility-types" "^3.10.0"
-
-"@docusaurus/theme-translations@2.0.0-beta.20":
- "integrity" "sha512-O7J/4dHcg7Yr+r3ylgtqmtMEz6d5ScpUxBg8nsNTWOCRoGEXNZVmXSd5l6v72KCyxPZpllPrgjmqkL+I19qWiw=="
- "resolved" "https://registry.npmjs.org/@docusaurus/theme-translations/-/theme-translations-2.0.0-beta.20.tgz"
- "version" "2.0.0-beta.20"
- dependencies:
- "fs-extra" "^10.1.0"
- "tslib" "^2.4.0"
-
-"@docusaurus/types@2.0.0-beta.20":
- "integrity" "sha512-d4ZIpcrzGsUUcZJL3iz8/iSaewobPPiYfn2Lmmv7GTT5ZPtPkOAtR5mE6+LAf/KpjjgqrC7mpwDKADnOL/ic4Q=="
- "resolved" "https://registry.npmjs.org/@docusaurus/types/-/types-2.0.0-beta.20.tgz"
- "version" "2.0.0-beta.20"
- dependencies:
- "commander" "^5.1.0"
- "history" "^4.9.0"
- "joi" "^17.6.0"
- "react-helmet-async" "^1.3.0"
- "utility-types" "^3.10.0"
- "webpack" "^5.72.0"
- "webpack-merge" "^5.8.0"
-
-"@docusaurus/utils-common@2.0.0-beta.20":
- "integrity" "sha512-HabHh23vOQn6ygs0PjuCSF/oZaNsYTFsxB2R6EwHNyw01nWgBC3QAcGVmyIWQhlb9p8V3byKgbzVS68hZX5t9A=="
- "resolved" "https://registry.npmjs.org/@docusaurus/utils-common/-/utils-common-2.0.0-beta.20.tgz"
- "version" "2.0.0-beta.20"
- dependencies:
- "tslib" "^2.4.0"
-
-"@docusaurus/utils-common@2.0.0-beta.21":
- "integrity" "sha512-5w+6KQuJb6pUR2M8xyVuTMvO5NFQm/p8TOTDFTx60wt3p0P1rRX00v6FYsD4PK6pgmuoKjt2+Ls8dtSXc4qFpQ=="
- "resolved" "https://registry.npmjs.org/@docusaurus/utils-common/-/utils-common-2.0.0-beta.21.tgz"
- "version" "2.0.0-beta.21"
- dependencies:
- "tslib" "^2.4.0"
-
-"@docusaurus/utils-validation@2.0.0-beta.20":
- "integrity" "sha512-7MxMoaF4VNAt5vUwvITa6nbkw1tb4WE6hp1VlfIoLCY4D7Wk5cMf1ZFhppCP1UzmPwvFb9zw8fPuvDfB3Tb5nQ=="
- "resolved" "https://registry.npmjs.org/@docusaurus/utils-validation/-/utils-validation-2.0.0-beta.20.tgz"
- "version" "2.0.0-beta.20"
- dependencies:
- "@docusaurus/logger" "2.0.0-beta.20"
- "@docusaurus/utils" "2.0.0-beta.20"
- "joi" "^17.6.0"
- "js-yaml" "^4.1.0"
- "tslib" "^2.4.0"
-
-"@docusaurus/utils-validation@2.0.0-beta.21":
- "integrity" "sha512-6NG1FHTRjv1MFzqW//292z7uCs77vntpWEbZBHk3n67aB1HoMn5SOwjLPtRDjbCgn6HCHFmdiJr6euCbjhYolg=="
- "resolved" "https://registry.npmjs.org/@docusaurus/utils-validation/-/utils-validation-2.0.0-beta.21.tgz"
- "version" "2.0.0-beta.21"
- dependencies:
- "@docusaurus/logger" "2.0.0-beta.21"
- "@docusaurus/utils" "2.0.0-beta.21"
- "joi" "^17.6.0"
- "js-yaml" "^4.1.0"
- "tslib" "^2.4.0"
-
-"@docusaurus/utils@2.0.0-beta.20":
- "integrity" "sha512-eUQquakhrbnvhsmx8jRPLgoyjyzMuOhmQC99m7rotar7XOzROpgEpm7+xVaquG5Ha47WkybE3djHJhKNih7GZQ=="
- "resolved" "https://registry.npmjs.org/@docusaurus/utils/-/utils-2.0.0-beta.20.tgz"
- "version" "2.0.0-beta.20"
- dependencies:
- "@docusaurus/logger" "2.0.0-beta.20"
- "@svgr/webpack" "^6.2.1"
- "file-loader" "^6.2.0"
- "fs-extra" "^10.1.0"
- "github-slugger" "^1.4.0"
- "globby" "^11.1.0"
- "gray-matter" "^4.0.3"
- "js-yaml" "^4.1.0"
- "lodash" "^4.17.21"
- "micromatch" "^4.0.5"
- "resolve-pathname" "^3.0.0"
- "shelljs" "^0.8.5"
- "tslib" "^2.4.0"
- "url-loader" "^4.1.1"
- "webpack" "^5.72.0"
-
-"@docusaurus/utils@2.0.0-beta.21":
- "integrity" "sha512-M/BrVCDmmUPZLxtiStBgzpQ4I5hqkggcpnQmEN+LbvbohjbtVnnnZQ0vptIziv1w8jry/woY+ePsyOO7O/yeLQ=="
- "resolved" "https://registry.npmjs.org/@docusaurus/utils/-/utils-2.0.0-beta.21.tgz"
- "version" "2.0.0-beta.21"
- dependencies:
- "@docusaurus/logger" "2.0.0-beta.21"
- "@svgr/webpack" "^6.2.1"
- "file-loader" "^6.2.0"
- "fs-extra" "^10.1.0"
- "github-slugger" "^1.4.0"
- "globby" "^11.1.0"
- "gray-matter" "^4.0.3"
- "js-yaml" "^4.1.0"
- "lodash" "^4.17.21"
- "micromatch" "^4.0.5"
- "resolve-pathname" "^3.0.0"
- "shelljs" "^0.8.5"
- "tslib" "^2.4.0"
- "url-loader" "^4.1.1"
- "webpack" "^5.72.1"
-
-"@hapi/hoek@^9.0.0":
- "integrity" "sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ=="
- "resolved" "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.3.0.tgz"
- "version" "9.3.0"
-
-"@hapi/topo@^5.0.0":
- "integrity" "sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg=="
- "resolved" "https://registry.npmjs.org/@hapi/topo/-/topo-5.1.0.tgz"
- "version" "5.1.0"
- dependencies:
- "@hapi/hoek" "^9.0.0"
-
-"@jridgewell/gen-mapping@^0.1.0":
- "integrity" "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w=="
- "resolved" "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz"
- "version" "0.1.1"
- dependencies:
- "@jridgewell/set-array" "^1.0.0"
- "@jridgewell/sourcemap-codec" "^1.4.10"
-
-"@jridgewell/gen-mapping@^0.3.0":
- "integrity" "sha512-GcHwniMlA2z+WFPWuY8lp3fsza0I8xPFMWL5+n8LYyP6PSvPrXf4+n8stDHZY2DM0zy9sVkRDy1jDI4XGzYVqg=="
- "resolved" "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.1.tgz"
- "version" "0.3.1"
- dependencies:
- "@jridgewell/set-array" "^1.0.0"
- "@jridgewell/sourcemap-codec" "^1.4.10"
- "@jridgewell/trace-mapping" "^0.3.9"
-
-"@jridgewell/resolve-uri@^3.0.3":
- "integrity" "sha512-8cXDaBBHOr2pQ7j77Y6Vp5VDT2sIqWyWQ56TjEq4ih/a4iST3dItRe8Q9fp0rrIl9DoKhWQtUQz/YpOxLkXbNA=="
- "resolved" "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.0.7.tgz"
- "version" "3.0.7"
-
-"@jridgewell/set-array@^1.0.0":
- "integrity" "sha512-Ct5MqZkLGEXTVmQYbGtx9SVqD2fqwvdubdps5D3djjAkgkKwT918VNOz65pEHFaYTeWcukmJmH5SwsA9Tn2ObQ=="
- "resolved" "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.1.tgz"
- "version" "1.1.1"
-
-"@jridgewell/sourcemap-codec@^1.4.10":
- "integrity" "sha512-GryiOJmNcWbovBxTfZSF71V/mXbgcV3MewDe3kIMCLyIh5e7SKAeUZs+rMnJ8jkMolZ/4/VsdBmMrw3l+VdZ3w=="
- "resolved" "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.13.tgz"
- "version" "1.4.13"
-
-"@jridgewell/trace-mapping@^0.3.9":
- "integrity" "sha512-o1xbKhp9qnIAoHJSWd6KlCZfqslL4valSF81H8ImioOAxluWYWOpWkpyktY2vnt4tbrX9XYaxovq6cgowaJp2w=="
- "resolved" "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.13.tgz"
- "version" "0.3.13"
- dependencies:
- "@jridgewell/resolve-uri" "^3.0.3"
- "@jridgewell/sourcemap-codec" "^1.4.10"
-
-"@leichtgewicht/ip-codec@^2.0.1":
- "integrity" "sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A=="
- "resolved" "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.4.tgz"
- "version" "2.0.4"
-
-"@mdx-js/mdx@^1.6.22":
- "integrity" "sha512-AMxuLxPz2j5/6TpF/XSdKpQP1NlG0z11dFOlq+2IP/lSgl11GY8ji6S/rgsViN/L0BDvHvUMruRb7ub+24LUYA=="
- "resolved" "https://registry.npmjs.org/@mdx-js/mdx/-/mdx-1.6.22.tgz"
- "version" "1.6.22"
- dependencies:
- "@babel/core" "7.12.9"
- "@babel/plugin-syntax-jsx" "7.12.1"
- "@babel/plugin-syntax-object-rest-spread" "7.8.3"
- "@mdx-js/util" "1.6.22"
- "babel-plugin-apply-mdx-type-prop" "1.6.22"
- "babel-plugin-extract-import-names" "1.6.22"
- "camelcase-css" "2.0.1"
- "detab" "2.0.4"
- "hast-util-raw" "6.0.1"
- "lodash.uniq" "4.5.0"
- "mdast-util-to-hast" "10.0.1"
- "remark-footnotes" "2.0.0"
- "remark-mdx" "1.6.22"
- "remark-parse" "8.0.3"
- "remark-squeeze-paragraphs" "4.0.0"
- "style-to-object" "0.3.0"
- "unified" "9.2.0"
- "unist-builder" "2.0.3"
- "unist-util-visit" "2.0.3"
-
-"@mdx-js/react@^1.6.21", "@mdx-js/react@^1.6.22":
- "integrity" "sha512-TDoPum4SHdfPiGSAaRBw7ECyI8VaHpK8GJugbJIJuqyh6kzw9ZLJZW3HGL3NNrJGxcAixUvqROm+YuQOo5eXtg=="
- "resolved" "https://registry.npmjs.org/@mdx-js/react/-/react-1.6.22.tgz"
- "version" "1.6.22"
-
-"@mdx-js/util@1.6.22":
- "integrity" "sha512-H1rQc1ZOHANWBvPcW+JpGwr+juXSxM8Q8YCkm3GhZd8REu1fHR3z99CErO1p9pkcfcxZnMdIZdIsXkOHY0NilA=="
- "resolved" "https://registry.npmjs.org/@mdx-js/util/-/util-1.6.22.tgz"
- "version" "1.6.22"
-
-"@nodelib/fs.scandir@2.1.5":
- "integrity" "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g=="
- "resolved" "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz"
- "version" "2.1.5"
- dependencies:
- "@nodelib/fs.stat" "2.0.5"
- "run-parallel" "^1.1.9"
-
-"@nodelib/fs.stat@^2.0.2", "@nodelib/fs.stat@2.0.5":
- "integrity" "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A=="
- "resolved" "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz"
- "version" "2.0.5"
-
-"@nodelib/fs.walk@^1.2.3":
- "integrity" "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg=="
- "resolved" "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz"
- "version" "1.2.8"
- dependencies:
- "@nodelib/fs.scandir" "2.1.5"
- "fastq" "^1.6.0"
-
-"@polka/url@^1.0.0-next.20":
- "integrity" "sha512-a5Sab1C4/icpTZVzZc5Ghpz88yQtGOyNqYXcZgOssB2uuAr+wF/MvN6bgtW32q7HHrvBki+BsZ0OuNv6EV3K9g=="
- "resolved" "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.21.tgz"
- "version" "1.0.0-next.21"
-
-"@sideway/address@^4.1.3":
- "integrity" "sha512-7vwq+rOHVWjyXxVlR76Agnvhy8I9rpzjosTESvmhNeXOXdZZB15Fl+TI9x1SiHZH5Jv2wTGduSxFDIaq0m3DUw=="
- "resolved" "https://registry.npmjs.org/@sideway/address/-/address-4.1.4.tgz"
- "version" "4.1.4"
- dependencies:
- "@hapi/hoek" "^9.0.0"
-
-"@sideway/formula@^3.0.0":
- "integrity" "sha512-vHe7wZ4NOXVfkoRb8T5otiENVlT7a3IAiw7H5M2+GO+9CDgcVUUsX1zalAztCmwyOr2RUTGJdgB+ZvSVqmdHmg=="
- "resolved" "https://registry.npmjs.org/@sideway/formula/-/formula-3.0.0.tgz"
- "version" "3.0.0"
-
-"@sideway/pinpoint@^2.0.0":
- "integrity" "sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ=="
- "resolved" "https://registry.npmjs.org/@sideway/pinpoint/-/pinpoint-2.0.0.tgz"
- "version" "2.0.0"
-
-"@sindresorhus/is@^0.14.0":
- "integrity" "sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ=="
- "resolved" "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz"
- "version" "0.14.0"
-
-"@slorber/static-site-generator-webpack-plugin@^4.0.4":
- "integrity" "sha512-FvMavoWEIePps6/JwGCOLYKCRhuwIHhMtmbKpBFgzNkxwpa/569LfTkrbRk1m1I3n+ezJK4on9E1A6cjuZmD9g=="
- "resolved" "https://registry.npmjs.org/@slorber/static-site-generator-webpack-plugin/-/static-site-generator-webpack-plugin-4.0.4.tgz"
- "version" "4.0.4"
- dependencies:
- "bluebird" "^3.7.1"
- "cheerio" "^0.22.0"
- "eval" "^0.1.8"
- "webpack-sources" "^1.4.3"
-
-"@svgr/babel-plugin-add-jsx-attribute@^5.4.0":
- "integrity" "sha512-ZFf2gs/8/6B8PnSofI0inYXr2SDNTDScPXhN7k5EqD4aZ3gi6u+rbmZHVB8IM3wDyx8ntKACZbtXSm7oZGRqVg=="
- "resolved" "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-5.4.0.tgz"
- "version" "5.4.0"
-
-"@svgr/babel-plugin-add-jsx-attribute@^6.0.0":
- "integrity" "sha512-MdPdhdWLtQsjd29Wa4pABdhWbaRMACdM1h31BY+c6FghTZqNGT7pEYdBoaGeKtdTOBC/XNFQaKVj+r/Ei2ryWA=="
- "resolved" "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-6.0.0.tgz"
- "version" "6.0.0"
-
-"@svgr/babel-plugin-remove-jsx-attribute@^5.4.0":
- "integrity" "sha512-yaS4o2PgUtwLFGTKbsiAy6D0o3ugcUhWK0Z45umJ66EPWunAz9fuFw2gJuje6wqQvQWOTJvIahUwndOXb7QCPg=="
- "resolved" "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-5.4.0.tgz"
- "version" "5.4.0"
-
-"@svgr/babel-plugin-remove-jsx-attribute@^6.0.0":
- "integrity" "sha512-aVdtfx9jlaaxc3unA6l+M9YRnKIZjOhQPthLKqmTXC8UVkBLDRGwPKo+r8n3VZN8B34+yVajzPTZ+ptTSuZZCw=="
- "resolved" "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-6.0.0.tgz"
- "version" "6.0.0"
-
-"@svgr/babel-plugin-remove-jsx-empty-expression@^5.0.1":
- "integrity" "sha512-LA72+88A11ND/yFIMzyuLRSMJ+tRKeYKeQ+mR3DcAZ5I4h5CPWN9AHyUzJbWSYp/u2u0xhmgOe0+E41+GjEueA=="
- "resolved" "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-5.0.1.tgz"
- "version" "5.0.1"
-
-"@svgr/babel-plugin-remove-jsx-empty-expression@^6.0.0":
- "integrity" "sha512-Ccj42ApsePD451AZJJf1QzTD1B/BOU392URJTeXFxSK709i0KUsGtbwyiqsKu7vsYxpTM0IA5clAKDyf9RCZyA=="
- "resolved" "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-6.0.0.tgz"
- "version" "6.0.0"
-
-"@svgr/babel-plugin-replace-jsx-attribute-value@^5.0.1":
- "integrity" "sha512-PoiE6ZD2Eiy5mK+fjHqwGOS+IXX0wq/YDtNyIgOrc6ejFnxN4b13pRpiIPbtPwHEc+NT2KCjteAcq33/F1Y9KQ=="
- "resolved" "https://registry.npmjs.org/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-5.0.1.tgz"
- "version" "5.0.1"
-
-"@svgr/babel-plugin-replace-jsx-attribute-value@^6.0.0":
- "integrity" "sha512-88V26WGyt1Sfd1emBYmBJRWMmgarrExpKNVmI9vVozha4kqs6FzQJ/Kp5+EYli1apgX44518/0+t9+NU36lThQ=="
- "resolved" "https://registry.npmjs.org/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-6.0.0.tgz"
- "version" "6.0.0"
-
-"@svgr/babel-plugin-svg-dynamic-title@^5.4.0":
- "integrity" "sha512-zSOZH8PdZOpuG1ZVx/cLVePB2ibo3WPpqo7gFIjLV9a0QsuQAzJiwwqmuEdTaW2pegyBE17Uu15mOgOcgabQZg=="
- "resolved" "https://registry.npmjs.org/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-5.4.0.tgz"
- "version" "5.4.0"
-
-"@svgr/babel-plugin-svg-dynamic-title@^6.0.0":
- "integrity" "sha512-F7YXNLfGze+xv0KMQxrl2vkNbI9kzT9oDK55/kUuymh1ACyXkMV+VZWX1zEhSTfEKh7VkHVZGmVtHg8eTZ6PRg=="
- "resolved" "https://registry.npmjs.org/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-6.0.0.tgz"
- "version" "6.0.0"
-
-"@svgr/babel-plugin-svg-em-dimensions@^5.4.0":
- "integrity" "sha512-cPzDbDA5oT/sPXDCUYoVXEmm3VIoAWAPT6mSPTJNbQaBNUuEKVKyGH93oDY4e42PYHRW67N5alJx/eEol20abw=="
- "resolved" "https://registry.npmjs.org/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-5.4.0.tgz"
- "version" "5.4.0"
-
-"@svgr/babel-plugin-svg-em-dimensions@^6.0.0":
- "integrity" "sha512-+rghFXxdIqJNLQK08kwPBD3Z22/0b2tEZ9lKiL/yTfuyj1wW8HUXu4bo/XkogATIYuXSghVQOOCwURXzHGKyZA=="
- "resolved" "https://registry.npmjs.org/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-6.0.0.tgz"
- "version" "6.0.0"
-
-"@svgr/babel-plugin-transform-react-native-svg@^5.4.0":
- "integrity" "sha512-3eYP/SaopZ41GHwXma7Rmxcv9uRslRDTY1estspeB1w1ueZWd/tPlMfEOoccYpEMZU3jD4OU7YitnXcF5hLW2Q=="
- "resolved" "https://registry.npmjs.org/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-5.4.0.tgz"
- "version" "5.4.0"
-
-"@svgr/babel-plugin-transform-react-native-svg@^6.0.0":
- "integrity" "sha512-VaphyHZ+xIKv5v0K0HCzyfAaLhPGJXSk2HkpYfXIOKb7DjLBv0soHDxNv6X0vr2titsxE7klb++u7iOf7TSrFQ=="
- "resolved" "https://registry.npmjs.org/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-6.0.0.tgz"
- "version" "6.0.0"
-
-"@svgr/babel-plugin-transform-svg-component@^5.5.0":
- "integrity" "sha512-q4jSH1UUvbrsOtlo/tKcgSeiCHRSBdXoIoqX1pgcKK/aU3JD27wmMKwGtpB8qRYUYoyXvfGxUVKchLuR5pB3rQ=="
- "resolved" "https://registry.npmjs.org/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-5.5.0.tgz"
- "version" "5.5.0"
-
-"@svgr/babel-plugin-transform-svg-component@^6.2.0":
- "integrity" "sha512-bhYIpsORb++wpsp91fymbFkf09Z/YEKR0DnFjxvN+8JHeCUD2unnh18jIMKnDJTWtvpTaGYPXELVe4OOzFI0xg=="
- "resolved" "https://registry.npmjs.org/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-6.2.0.tgz"
- "version" "6.2.0"
-
-"@svgr/babel-preset@^5.5.0":
- "integrity" "sha512-4FiXBjvQ+z2j7yASeGPEi8VD/5rrGQk4Xrq3EdJmoZgz/tpqChpo5hgXDvmEauwtvOc52q8ghhZK4Oy7qph4ig=="
- "resolved" "https://registry.npmjs.org/@svgr/babel-preset/-/babel-preset-5.5.0.tgz"
- "version" "5.5.0"
- dependencies:
- "@svgr/babel-plugin-add-jsx-attribute" "^5.4.0"
- "@svgr/babel-plugin-remove-jsx-attribute" "^5.4.0"
- "@svgr/babel-plugin-remove-jsx-empty-expression" "^5.0.1"
- "@svgr/babel-plugin-replace-jsx-attribute-value" "^5.0.1"
- "@svgr/babel-plugin-svg-dynamic-title" "^5.4.0"
- "@svgr/babel-plugin-svg-em-dimensions" "^5.4.0"
- "@svgr/babel-plugin-transform-react-native-svg" "^5.4.0"
- "@svgr/babel-plugin-transform-svg-component" "^5.5.0"
-
-"@svgr/babel-preset@^6.2.0":
- "integrity" "sha512-4WQNY0J71JIaL03DRn0vLiz87JXx0b9dYm2aA8XHlQJQoixMl4r/soYHm8dsaJZ3jWtkCiOYy48dp9izvXhDkQ=="
- "resolved" "https://registry.npmjs.org/@svgr/babel-preset/-/babel-preset-6.2.0.tgz"
- "version" "6.2.0"
- dependencies:
- "@svgr/babel-plugin-add-jsx-attribute" "^6.0.0"
- "@svgr/babel-plugin-remove-jsx-attribute" "^6.0.0"
- "@svgr/babel-plugin-remove-jsx-empty-expression" "^6.0.0"
- "@svgr/babel-plugin-replace-jsx-attribute-value" "^6.0.0"
- "@svgr/babel-plugin-svg-dynamic-title" "^6.0.0"
- "@svgr/babel-plugin-svg-em-dimensions" "^6.0.0"
- "@svgr/babel-plugin-transform-react-native-svg" "^6.0.0"
- "@svgr/babel-plugin-transform-svg-component" "^6.2.0"
-
-"@svgr/core@^5.5.0":
- "integrity" "sha512-q52VOcsJPvV3jO1wkPtzTuKlvX7Y3xIcWRpCMtBF3MrteZJtBfQw/+u0B1BHy5ColpQc1/YVTrPEtSYIMNZlrQ=="
- "resolved" "https://registry.npmjs.org/@svgr/core/-/core-5.5.0.tgz"
- "version" "5.5.0"
- dependencies:
- "@svgr/plugin-jsx" "^5.5.0"
- "camelcase" "^6.2.0"
- "cosmiconfig" "^7.0.0"
-
-"@svgr/core@^6.0.0", "@svgr/core@^6.2.1":
- "integrity" "sha512-NWufjGI2WUyrg46mKuySfviEJ6IxHUOm/8a3Ph38VCWSp+83HBraCQrpEM3F3dB6LBs5x8OElS8h3C0oOJaJAA=="
- "resolved" "https://registry.npmjs.org/@svgr/core/-/core-6.2.1.tgz"
- "version" "6.2.1"
- dependencies:
- "@svgr/plugin-jsx" "^6.2.1"
- "camelcase" "^6.2.0"
- "cosmiconfig" "^7.0.1"
-
-"@svgr/hast-util-to-babel-ast@^5.5.0":
- "integrity" "sha512-cAaR/CAiZRB8GP32N+1jocovUtvlj0+e65TB50/6Lcime+EA49m/8l+P2ko+XPJ4dw3xaPS3jOL4F2X4KWxoeQ=="
- "resolved" "https://registry.npmjs.org/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-5.5.0.tgz"
- "version" "5.5.0"
- dependencies:
- "@babel/types" "^7.12.6"
-
-"@svgr/hast-util-to-babel-ast@^6.2.1":
- "integrity" "sha512-pt7MMkQFDlWJVy9ULJ1h+hZBDGFfSCwlBNW1HkLnVi7jUhyEXUaGYWi1x6bM2IXuAR9l265khBT4Av4lPmaNLQ=="
- "resolved" "https://registry.npmjs.org/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-6.2.1.tgz"
- "version" "6.2.1"
- dependencies:
- "@babel/types" "^7.15.6"
- "entities" "^3.0.1"
-
-"@svgr/plugin-jsx@^5.5.0":
- "integrity" "sha512-V/wVh33j12hGh05IDg8GpIUXbjAPnTdPTKuP4VNLggnwaHMPNQNae2pRnyTAILWCQdz5GyMqtO488g7CKM8CBA=="
- "resolved" "https://registry.npmjs.org/@svgr/plugin-jsx/-/plugin-jsx-5.5.0.tgz"
- "version" "5.5.0"
- dependencies:
- "@babel/core" "^7.12.3"
- "@svgr/babel-preset" "^5.5.0"
- "@svgr/hast-util-to-babel-ast" "^5.5.0"
- "svg-parser" "^2.0.2"
-
-"@svgr/plugin-jsx@^6.2.1":
- "integrity" "sha512-u+MpjTsLaKo6r3pHeeSVsh9hmGRag2L7VzApWIaS8imNguqoUwDq/u6U/NDmYs/KAsrmtBjOEaAAPbwNGXXp1g=="
- "resolved" "https://registry.npmjs.org/@svgr/plugin-jsx/-/plugin-jsx-6.2.1.tgz"
- "version" "6.2.1"
- dependencies:
- "@babel/core" "^7.15.5"
- "@svgr/babel-preset" "^6.2.0"
- "@svgr/hast-util-to-babel-ast" "^6.2.1"
- "svg-parser" "^2.0.2"
-
-"@svgr/plugin-svgo@^5.5.0":
- "integrity" "sha512-r5swKk46GuQl4RrVejVwpeeJaydoxkdwkM1mBKOgJLBUJPGaLci6ylg/IjhrRsREKDkr4kbMWdgOtbXEh0fyLQ=="
- "resolved" "https://registry.npmjs.org/@svgr/plugin-svgo/-/plugin-svgo-5.5.0.tgz"
- "version" "5.5.0"
- dependencies:
- "cosmiconfig" "^7.0.0"
- "deepmerge" "^4.2.2"
- "svgo" "^1.2.2"
-
-"@svgr/plugin-svgo@^6.2.0":
- "integrity" "sha512-oDdMQONKOJEbuKwuy4Np6VdV6qoaLLvoY86hjvQEgU82Vx1MSWRyYms6Sl0f+NtqxLI/rDVufATbP/ev996k3Q=="
- "resolved" "https://registry.npmjs.org/@svgr/plugin-svgo/-/plugin-svgo-6.2.0.tgz"
- "version" "6.2.0"
- dependencies:
- "cosmiconfig" "^7.0.1"
- "deepmerge" "^4.2.2"
- "svgo" "^2.5.0"
-
-"@svgr/webpack@^5.5.0":
- "integrity" "sha512-DOBOK255wfQxguUta2INKkzPj6AIS6iafZYiYmHn6W3pHlycSRRlvWKCfLDG10fXfLWqE3DJHgRUOyJYmARa7g=="
- "resolved" "https://registry.npmjs.org/@svgr/webpack/-/webpack-5.5.0.tgz"
- "version" "5.5.0"
- dependencies:
- "@babel/core" "^7.12.3"
- "@babel/plugin-transform-react-constant-elements" "^7.12.1"
- "@babel/preset-env" "^7.12.1"
- "@babel/preset-react" "^7.12.5"
- "@svgr/core" "^5.5.0"
- "@svgr/plugin-jsx" "^5.5.0"
- "@svgr/plugin-svgo" "^5.5.0"
- "loader-utils" "^2.0.0"
-
-"@svgr/webpack@^6.2.1":
- "integrity" "sha512-h09ngMNd13hnePwgXa+Y5CgOjzlCvfWLHg+MBnydEedAnuLRzUHUJmGS3o2OsrhxTOOqEsPOFt5v/f6C5Qulcw=="
- "resolved" "https://registry.npmjs.org/@svgr/webpack/-/webpack-6.2.1.tgz"
- "version" "6.2.1"
- dependencies:
- "@babel/core" "^7.15.5"
- "@babel/plugin-transform-react-constant-elements" "^7.14.5"
- "@babel/preset-env" "^7.15.6"
- "@babel/preset-react" "^7.14.5"
- "@babel/preset-typescript" "^7.15.0"
- "@svgr/core" "^6.2.1"
- "@svgr/plugin-jsx" "^6.2.1"
- "@svgr/plugin-svgo" "^6.2.0"
-
-"@szmarczak/http-timer@^1.1.2":
- "integrity" "sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA=="
- "resolved" "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-1.1.2.tgz"
- "version" "1.1.2"
- dependencies:
- "defer-to-connect" "^1.0.1"
-
-"@trysound/sax@0.2.0":
- "integrity" "sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA=="
- "resolved" "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz"
- "version" "0.2.0"
-
-"@types/body-parser@*":
- "integrity" "sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g=="
- "resolved" "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz"
- "version" "1.19.2"
- dependencies:
- "@types/connect" "*"
- "@types/node" "*"
-
-"@types/bonjour@^3.5.9":
- "integrity" "sha512-p7ienRMiS41Nu2/igbJxxLDWrSZ0WxM8UQgCeO9KhoVF7cOVFkrKsiDr1EsJIla8vV3oEEjGcz11jc5yimhzZw=="
- "resolved" "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.10.tgz"
- "version" "3.5.10"
- dependencies:
- "@types/node" "*"
-
-"@types/connect-history-api-fallback@^1.3.5":
- "integrity" "sha512-h8QJa8xSb1WD4fpKBDcATDNGXghFj6/3GRWG6dhmRcu0RX1Ubasur2Uvx5aeEwlf0MwblEC2bMzzMQntxnw/Cw=="
- "resolved" "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.3.5.tgz"
- "version" "1.3.5"
- dependencies:
- "@types/express-serve-static-core" "*"
- "@types/node" "*"
-
-"@types/connect@*":
- "integrity" "sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ=="
- "resolved" "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz"
- "version" "3.4.35"
- dependencies:
- "@types/node" "*"
-
-"@types/eslint-scope@^3.7.3":
- "integrity" "sha512-PB3ldyrcnAicT35TWPs5IcwKD8S333HMaa2VVv4+wdvebJkjWuW/xESoB8IwRcog8HYVYamb1g/R31Qv5Bx03g=="
- "resolved" "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.3.tgz"
- "version" "3.7.3"
- dependencies:
- "@types/eslint" "*"
- "@types/estree" "*"
-
-"@types/eslint@*":
- "integrity" "sha512-Z1nseZON+GEnFjJc04sv4NSALGjhFwy6K0HXt7qsn5ArfAKtb63dXNJHf+1YW6IpOIYRBGUbu3GwJdj8DGnCjA=="
- "resolved" "https://registry.npmjs.org/@types/eslint/-/eslint-8.4.2.tgz"
- "version" "8.4.2"
- dependencies:
- "@types/estree" "*"
- "@types/json-schema" "*"
-
-"@types/estree@*", "@types/estree@^0.0.51":
- "integrity" "sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ=="
- "resolved" "https://registry.npmjs.org/@types/estree/-/estree-0.0.51.tgz"
- "version" "0.0.51"
-
-"@types/express-serve-static-core@*", "@types/express-serve-static-core@^4.17.18":
- "integrity" "sha512-P1BJAEAW3E2DJUlkgq4tOL3RyMunoWXqbSCygWo5ZIWTjUgN1YnaXWW4VWl/oc8vs/XoYibEGBKP0uZyF4AHig=="
- "resolved" "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.28.tgz"
- "version" "4.17.28"
- dependencies:
- "@types/node" "*"
- "@types/qs" "*"
- "@types/range-parser" "*"
-
-"@types/express@*", "@types/express@^4.17.13":
- "integrity" "sha512-6bSZTPaTIACxn48l50SR+axgrqm6qXFIxrdAKaG6PaJk3+zuUr35hBlgT7vOmJcum+OEaIBLtHV/qloEAFITeA=="
- "resolved" "https://registry.npmjs.org/@types/express/-/express-4.17.13.tgz"
- "version" "4.17.13"
- dependencies:
- "@types/body-parser" "*"
- "@types/express-serve-static-core" "^4.17.18"
- "@types/qs" "*"
- "@types/serve-static" "*"
-
-"@types/hast@^2.0.0":
- "integrity" "sha512-wLEm0QvaoawEDoTRwzTXp4b4jpwiJDvR5KMnFnVodm3scufTlBOWRD6N1OBf9TZMhjlNsSfcO5V+7AF4+Vy+9g=="
- "resolved" "https://registry.npmjs.org/@types/hast/-/hast-2.3.4.tgz"
- "version" "2.3.4"
- dependencies:
- "@types/unist" "*"
-
-"@types/history@^4.7.11":
- "integrity" "sha512-qjDJRrmvBMiTx+jyLxvLfJU7UznFuokDv4f3WRuriHKERccVpFU+8XMQUAbDzoiJCsmexxRExQeMwwCdamSKDA=="
- "resolved" "https://registry.npmjs.org/@types/history/-/history-4.7.11.tgz"
- "version" "4.7.11"
-
-"@types/html-minifier-terser@^6.0.0":
- "integrity" "sha512-NZwaaynfs1oIoLAV1vg18e7QMVDvw+6SQrdJc8w3BwUaoroVSf6EBj/Sk4PBWGxsq0dzhA2drbsuMC1/6C6KgQ=="
- "resolved" "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-6.0.0.tgz"
- "version" "6.0.0"
-
-"@types/http-proxy@^1.17.8":
- "integrity" "sha512-QsbSjA/fSk7xB+UXlCT3wHBy5ai9wOcNDWwZAtud+jXhwOM3l+EYZh8Lng4+/6n8uar0J7xILzqftJdJ/Wdfkw=="
- "resolved" "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.9.tgz"
- "version" "1.17.9"
- dependencies:
- "@types/node" "*"
-
-"@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":
- "integrity" "sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ=="
- "resolved" "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.9.tgz"
- "version" "7.0.9"
-
-"@types/mdast@^3.0.0":
- "integrity" "sha512-W864tg/Osz1+9f4lrGTZpCSO5/z4608eUp19tbozkq2HJK6i3z1kT0H9tlADXuYIb1YYOBByU4Jsqkk75q48qA=="
- "resolved" "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.10.tgz"
- "version" "3.0.10"
- dependencies:
- "@types/unist" "*"
-
-"@types/mime@^1":
- "integrity" "sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw=="
- "resolved" "https://registry.npmjs.org/@types/mime/-/mime-1.3.2.tgz"
- "version" "1.3.2"
-
-"@types/node@*", "@types/node@^17.0.5":
- "integrity" "sha512-miWq2m2FiQZmaHfdZNcbpp9PuXg34W5JZ5CrJ/BaS70VuhoJENBEQybeiYSaPBRNq6KQGnjfEnc/F3PN++D+XQ=="
- "resolved" "https://registry.npmjs.org/@types/node/-/node-17.0.33.tgz"
- "version" "17.0.33"
-
-"@types/parse-json@^4.0.0":
- "integrity" "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA=="
- "resolved" "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz"
- "version" "4.0.0"
-
-"@types/parse5@^5.0.0":
- "integrity" "sha512-kUNnecmtkunAoQ3CnjmMkzNU/gtxG8guhi+Fk2U/kOpIKjIMKnXGp4IJCgQJrXSgMsWYimYG4TGjz/UzbGEBTw=="
- "resolved" "https://registry.npmjs.org/@types/parse5/-/parse5-5.0.3.tgz"
- "version" "5.0.3"
-
-"@types/prop-types@*":
- "integrity" "sha512-rZ5drC/jWjrArrS8BR6SIr4cWpW09RNTYt9AMZo3Jwwif+iacXAqgVjm0B0Bv/S1jhDXKHqRVNCbACkJ89RAnQ=="
- "resolved" "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.4.tgz"
- "version" "15.7.4"
-
-"@types/q@^1.5.1":
- "integrity" "sha512-L28j2FcJfSZOnL1WBjDYp2vUHCeIFlyYI/53EwD/rKUBQ7MtUUfbQWiyKJGpcnv4/WgrhWsFKrcPstcAt/J0tQ=="
- "resolved" "https://registry.npmjs.org/@types/q/-/q-1.5.5.tgz"
- "version" "1.5.5"
-
-"@types/qs@*":
- "integrity" "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw=="
- "resolved" "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz"
- "version" "6.9.7"
-
-"@types/range-parser@*":
- "integrity" "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw=="
- "resolved" "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz"
- "version" "1.2.4"
-
-"@types/react-router-config@*":
- "integrity" "sha512-db1mx37a1EJDf1XeX8jJN7R3PZABmJQXR8r28yUjVMFSjkmnQo6X6pOEEmNl+Tp2gYQOGPdYbFIipBtdElZ3Yg=="
- "resolved" "https://registry.npmjs.org/@types/react-router-config/-/react-router-config-5.0.6.tgz"
- "version" "5.0.6"
- dependencies:
- "@types/history" "^4.7.11"
- "@types/react" "*"
- "@types/react-router" "*"
-
-"@types/react-router-dom@*":
- "integrity" "sha512-kpqnYK4wcdm5UaWI3fLcELopqLrHgLqNsdpHauzlQktfkHL3npOSwtj1Uz9oKBAzs7lFtVkV8j83voAz2D8fhw=="
- "resolved" "https://registry.npmjs.org/@types/react-router-dom/-/react-router-dom-5.3.3.tgz"
- "version" "5.3.3"
- dependencies:
- "@types/history" "^4.7.11"
- "@types/react" "*"
- "@types/react-router" "*"
-
-"@types/react-router@*":
- "integrity" "sha512-YYknwy0D0iOwKQgz9v8nOzt2J6l4gouBmDnWqUUznltOTaon+r8US8ky8HvN0tXvc38U9m6z/t2RsVsnd1zM0g=="
- "resolved" "https://registry.npmjs.org/@types/react-router/-/react-router-5.1.18.tgz"
- "version" "5.1.18"
- dependencies:
- "@types/history" "^4.7.11"
- "@types/react" "*"
-
-"@types/react@*", "@types/react@>= 16.8.0 < 18.0.0":
- "integrity" "sha512-r3C8/TJuri/SLZiiwwxQoLAoavaczARfT9up9b4Jr65+ErAUX3MIkU0oMOQnrpfgHme8zIqZLX7O5nnjm5Wayw=="
- "resolved" "https://registry.npmjs.org/@types/react/-/react-17.0.35.tgz"
- "version" "17.0.35"
- dependencies:
- "@types/prop-types" "*"
- "@types/scheduler" "*"
- "csstype" "^3.0.2"
-
-"@types/retry@0.12.0":
- "integrity" "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA=="
- "resolved" "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz"
- "version" "0.12.0"
-
-"@types/sax@^1.2.1":
- "integrity" "sha512-pSAff4IAxJjfAXUG6tFkO7dsSbTmf8CtUpfhhZ5VhkRpC4628tJhh3+V6H1E+/Gs9piSzYKT5yzHO5M4GG9jkw=="
- "resolved" "https://registry.npmjs.org/@types/sax/-/sax-1.2.4.tgz"
- "version" "1.2.4"
- dependencies:
- "@types/node" "*"
-
-"@types/scheduler@*":
- "integrity" "sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew=="
- "resolved" "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.2.tgz"
- "version" "0.16.2"
-
-"@types/serve-index@^1.9.1":
- "integrity" "sha512-d/Hs3nWDxNL2xAczmOVZNj92YZCS6RGxfBPjKzuu/XirCgXdpKEb88dYNbrYGint6IVWLNP+yonwVAuRC0T2Dg=="
- "resolved" "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.1.tgz"
- "version" "1.9.1"
- dependencies:
- "@types/express" "*"
-
-"@types/serve-static@*":
- "integrity" "sha512-nCkHGI4w7ZgAdNkrEu0bv+4xNV/XDqW+DydknebMOQwkpDGx8G+HTlj7R7ABI8i8nKxVw0wtKPi1D+lPOkh4YQ=="
- "resolved" "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.13.10.tgz"
- "version" "1.13.10"
- dependencies:
- "@types/mime" "^1"
- "@types/node" "*"
-
-"@types/sockjs@^0.3.33":
- "integrity" "sha512-f0KEEe05NvUnat+boPTZ0dgaLZ4SfSouXUgv5noUiefG2ajgKjmETo9ZJyuqsl7dfl2aHlLJUiki6B4ZYldiiw=="
- "resolved" "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.33.tgz"
- "version" "0.3.33"
- dependencies:
- "@types/node" "*"
-
-"@types/unist@*", "@types/unist@^2.0.0", "@types/unist@^2.0.2", "@types/unist@^2.0.3":
- "integrity" "sha512-PBjIUxZHOuj0R15/xuwJYjFi+KZdNFrehocChv4g5hu6aFroHue8m0lBP0POdK2nKzbw0cgV1mws8+V/JAcEkQ=="
- "resolved" "https://registry.npmjs.org/@types/unist/-/unist-2.0.6.tgz"
- "version" "2.0.6"
-
-"@types/ws@^8.5.1":
- "integrity" "sha512-6YOoWjruKj1uLf3INHH7D3qTXwFfEsg1kf3c0uDdSBJwfa/llkwIjrAGV7j7mVgGNbzTQ3HiHKKDXl6bJPD97w=="
- "resolved" "https://registry.npmjs.org/@types/ws/-/ws-8.5.3.tgz"
- "version" "8.5.3"
- dependencies:
- "@types/node" "*"
-
-"@webassemblyjs/ast@1.11.1":
- "integrity" "sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw=="
- "resolved" "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.1.tgz"
- "version" "1.11.1"
- dependencies:
- "@webassemblyjs/helper-numbers" "1.11.1"
- "@webassemblyjs/helper-wasm-bytecode" "1.11.1"
-
-"@webassemblyjs/floating-point-hex-parser@1.11.1":
- "integrity" "sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ=="
- "resolved" "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz"
- "version" "1.11.1"
-
-"@webassemblyjs/helper-api-error@1.11.1":
- "integrity" "sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg=="
- "resolved" "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz"
- "version" "1.11.1"
-
-"@webassemblyjs/helper-buffer@1.11.1":
- "integrity" "sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA=="
- "resolved" "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz"
- "version" "1.11.1"
-
-"@webassemblyjs/helper-numbers@1.11.1":
- "integrity" "sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ=="
- "resolved" "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.1.tgz"
- "version" "1.11.1"
- dependencies:
- "@webassemblyjs/floating-point-hex-parser" "1.11.1"
- "@webassemblyjs/helper-api-error" "1.11.1"
- "@xtuc/long" "4.2.2"
-
-"@webassemblyjs/helper-wasm-bytecode@1.11.1":
- "integrity" "sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q=="
- "resolved" "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz"
- "version" "1.11.1"
-
-"@webassemblyjs/helper-wasm-section@1.11.1":
- "integrity" "sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg=="
- "resolved" "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz"
- "version" "1.11.1"
- dependencies:
- "@webassemblyjs/ast" "1.11.1"
- "@webassemblyjs/helper-buffer" "1.11.1"
- "@webassemblyjs/helper-wasm-bytecode" "1.11.1"
- "@webassemblyjs/wasm-gen" "1.11.1"
-
-"@webassemblyjs/ieee754@1.11.1":
- "integrity" "sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ=="
- "resolved" "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz"
- "version" "1.11.1"
- dependencies:
- "@xtuc/ieee754" "^1.2.0"
-
-"@webassemblyjs/leb128@1.11.1":
- "integrity" "sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw=="
- "resolved" "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.1.tgz"
- "version" "1.11.1"
- dependencies:
- "@xtuc/long" "4.2.2"
-
-"@webassemblyjs/utf8@1.11.1":
- "integrity" "sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ=="
- "resolved" "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.1.tgz"
- "version" "1.11.1"
-
-"@webassemblyjs/wasm-edit@1.11.1":
- "integrity" "sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA=="
- "resolved" "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz"
- "version" "1.11.1"
- dependencies:
- "@webassemblyjs/ast" "1.11.1"
- "@webassemblyjs/helper-buffer" "1.11.1"
- "@webassemblyjs/helper-wasm-bytecode" "1.11.1"
- "@webassemblyjs/helper-wasm-section" "1.11.1"
- "@webassemblyjs/wasm-gen" "1.11.1"
- "@webassemblyjs/wasm-opt" "1.11.1"
- "@webassemblyjs/wasm-parser" "1.11.1"
- "@webassemblyjs/wast-printer" "1.11.1"
-
-"@webassemblyjs/wasm-gen@1.11.1":
- "integrity" "sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA=="
- "resolved" "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz"
- "version" "1.11.1"
- dependencies:
- "@webassemblyjs/ast" "1.11.1"
- "@webassemblyjs/helper-wasm-bytecode" "1.11.1"
- "@webassemblyjs/ieee754" "1.11.1"
- "@webassemblyjs/leb128" "1.11.1"
- "@webassemblyjs/utf8" "1.11.1"
-
-"@webassemblyjs/wasm-opt@1.11.1":
- "integrity" "sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw=="
- "resolved" "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz"
- "version" "1.11.1"
- dependencies:
- "@webassemblyjs/ast" "1.11.1"
- "@webassemblyjs/helper-buffer" "1.11.1"
- "@webassemblyjs/wasm-gen" "1.11.1"
- "@webassemblyjs/wasm-parser" "1.11.1"
-
-"@webassemblyjs/wasm-parser@1.11.1":
- "integrity" "sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA=="
- "resolved" "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz"
- "version" "1.11.1"
- dependencies:
- "@webassemblyjs/ast" "1.11.1"
- "@webassemblyjs/helper-api-error" "1.11.1"
- "@webassemblyjs/helper-wasm-bytecode" "1.11.1"
- "@webassemblyjs/ieee754" "1.11.1"
- "@webassemblyjs/leb128" "1.11.1"
- "@webassemblyjs/utf8" "1.11.1"
-
-"@webassemblyjs/wast-printer@1.11.1":
- "integrity" "sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg=="
- "resolved" "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz"
- "version" "1.11.1"
- dependencies:
- "@webassemblyjs/ast" "1.11.1"
- "@xtuc/long" "4.2.2"
-
-"@xtuc/ieee754@^1.2.0":
- "integrity" "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA=="
- "resolved" "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz"
- "version" "1.2.0"
-
-"@xtuc/long@4.2.2":
- "integrity" "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ=="
- "resolved" "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz"
- "version" "4.2.2"
-
-"accepts@~1.3.4", "accepts@~1.3.5", "accepts@~1.3.8":
- "integrity" "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw=="
- "resolved" "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz"
- "version" "1.3.8"
- dependencies:
- "mime-types" "~2.1.34"
- "negotiator" "0.6.3"
-
-"acorn-import-assertions@^1.7.6":
- "integrity" "sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw=="
- "resolved" "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz"
- "version" "1.8.0"
-
-"acorn-walk@^8.0.0":
- "integrity" "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA=="
- "resolved" "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz"
- "version" "8.2.0"
-
-"acorn@^8", "acorn@^8.0.4", "acorn@^8.4.1", "acorn@^8.5.0":
- "integrity" "sha512-U1riIR+lBSNi3IbxtaHOIKdH8sLFv3NYfNv8sg7ZsNhcfl4HF2++BfqqrNAxoCLQW1iiylOj76ecnaUxz+z9yw=="
- "resolved" "https://registry.npmjs.org/acorn/-/acorn-8.6.0.tgz"
- "version" "8.6.0"
-
-"address@^1.0.1", "address@^1.1.2":
- "integrity" "sha512-aT6camzM4xEA54YVJYSqxz1kv4IHnQZRtThJJHhUMRExaU5spC7jX5ugSwTaTgJliIgs4VhZOk7htClvQ/LmRA=="
- "resolved" "https://registry.npmjs.org/address/-/address-1.1.2.tgz"
- "version" "1.1.2"
-
-"aggregate-error@^3.0.0":
- "integrity" "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA=="
- "resolved" "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz"
- "version" "3.1.0"
- dependencies:
- "clean-stack" "^2.0.0"
- "indent-string" "^4.0.0"
-
-"ajv-formats@^2.1.1":
- "integrity" "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA=="
- "resolved" "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz"
- "version" "2.1.1"
- dependencies:
- "ajv" "^8.0.0"
-
-"ajv-keywords@^3.4.1", "ajv-keywords@^3.5.2":
- "integrity" "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ=="
- "resolved" "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz"
- "version" "3.5.2"
-
-"ajv-keywords@^5.0.0":
- "integrity" "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw=="
- "resolved" "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz"
- "version" "5.1.0"
- dependencies:
- "fast-deep-equal" "^3.1.3"
-
-"ajv@^6.12.2", "ajv@^6.12.4", "ajv@^6.12.5", "ajv@^6.9.1":
- "integrity" "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g=="
- "resolved" "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz"
- "version" "6.12.6"
- dependencies:
- "fast-deep-equal" "^3.1.1"
- "fast-json-stable-stringify" "^2.0.0"
- "json-schema-traverse" "^0.4.1"
- "uri-js" "^4.2.2"
-
-"ajv@^8.0.0":
- "integrity" "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg=="
- "resolved" "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz"
- "version" "8.11.0"
- 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@^8.8.0", "ajv@^8.8.2":
- "integrity" "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg=="
- "resolved" "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz"
- "version" "8.11.0"
- 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.8.2":
- "integrity" "sha512-AXxiF0zT9oYwl8ZBgU/eRXvfYhz7cBA5YrLPlw9inZHdaYF0QEya/f1Zp1mPYMXc1v6VkHwBq4pk6/vayBLICg=="
- "resolved" "https://registry.npmjs.org/algoliasearch-helper/-/algoliasearch-helper-3.8.2.tgz"
- "version" "3.8.2"
- dependencies:
- "@algolia/events" "^4.0.1"
-
-"algoliasearch@^4.0.0", "algoliasearch@^4.13.0", "algoliasearch@^4.9.1", "algoliasearch@>= 3.1 < 5":
- "integrity" "sha512-oHv4faI1Vl2s+YC0YquwkK/TsaJs79g2JFg5FDm2rKN12VItPTAeQ7hyJMHarOPPYuCnNC5kixbtcqvb21wchw=="
- "resolved" "https://registry.npmjs.org/algoliasearch/-/algoliasearch-4.13.0.tgz"
- "version" "4.13.0"
- dependencies:
- "@algolia/cache-browser-local-storage" "4.13.0"
- "@algolia/cache-common" "4.13.0"
- "@algolia/cache-in-memory" "4.13.0"
- "@algolia/client-account" "4.13.0"
- "@algolia/client-analytics" "4.13.0"
- "@algolia/client-common" "4.13.0"
- "@algolia/client-personalization" "4.13.0"
- "@algolia/client-search" "4.13.0"
- "@algolia/logger-common" "4.13.0"
- "@algolia/logger-console" "4.13.0"
- "@algolia/requester-browser-xhr" "4.13.0"
- "@algolia/requester-common" "4.13.0"
- "@algolia/requester-node-http" "4.13.0"
- "@algolia/transporter" "4.13.0"
-
-"ansi-align@^3.0.0", "ansi-align@^3.0.1":
- "integrity" "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w=="
- "resolved" "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz"
- "version" "3.0.1"
- dependencies:
- "string-width" "^4.1.0"
-
-"ansi-html-community@^0.0.8":
- "integrity" "sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw=="
- "resolved" "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz"
- "version" "0.0.8"
-
-"ansi-regex@^5.0.1":
- "integrity" "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="
- "resolved" "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz"
- "version" "5.0.1"
-
-"ansi-regex@^6.0.1":
- "integrity" "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA=="
- "resolved" "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz"
- "version" "6.0.1"
-
-"ansi-styles@^3.2.1":
- "integrity" "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA=="
- "resolved" "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz"
- "version" "3.2.1"
- dependencies:
- "color-convert" "^1.9.0"
-
-"ansi-styles@^4.0.0", "ansi-styles@^4.1.0":
- "integrity" "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="
- "resolved" "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz"
- "version" "4.3.0"
- dependencies:
- "color-convert" "^2.0.1"
-
-"ansi-styles@^6.1.0":
- "integrity" "sha512-VbqNsoz55SYGczauuup0MFUyXNQviSpFTj1RQtFzmQLk18qbVSpTFFGMT293rmDaQuKCT6InmbuEyUne4mTuxQ=="
- "resolved" "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.1.0.tgz"
- "version" "6.1.0"
-
-"anymatch@~3.1.2":
- "integrity" "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg=="
- "resolved" "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz"
- "version" "3.1.2"
- dependencies:
- "normalize-path" "^3.0.0"
- "picomatch" "^2.0.4"
-
-"arg@^5.0.0":
- "integrity" "sha512-e0hDa9H2Z9AwFkk2qDlwhoMYE4eToKarchkQHovNdLTCYMHZHeRjI71crOh+dio4K6u1IcwubQqo79Ga4CyAQA=="
- "resolved" "https://registry.npmjs.org/arg/-/arg-5.0.1.tgz"
- "version" "5.0.1"
-
-"argparse@^1.0.7":
- "integrity" "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg=="
- "resolved" "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz"
- "version" "1.0.10"
- dependencies:
- "sprintf-js" "~1.0.2"
-
-"argparse@^2.0.1":
- "integrity" "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="
- "resolved" "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz"
- "version" "2.0.1"
-
-"array-flatten@^2.1.2":
- "integrity" "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ=="
- "resolved" "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz"
- "version" "2.1.2"
-
-"array-flatten@1.1.1":
- "integrity" "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI= sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg=="
- "resolved" "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz"
- "version" "1.1.1"
-
-"array-union@^2.1.0":
- "integrity" "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw=="
- "resolved" "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz"
- "version" "2.1.0"
-
-"array-union@^3.0.1":
- "integrity" "sha512-1OvF9IbWwaeiM9VhzYXVQacMibxpXOMYVNIvMtKRyX9SImBXpKcFr8XvFDeEslCyuH/t6KRt7HEO94AlP8Iatw=="
- "resolved" "https://registry.npmjs.org/array-union/-/array-union-3.0.1.tgz"
- "version" "3.0.1"
-
-"asap@~2.0.3":
- "integrity" "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY= sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA=="
- "resolved" "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz"
- "version" "2.0.6"
-
-"at-least-node@^1.0.0":
- "integrity" "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg=="
- "resolved" "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz"
- "version" "1.0.0"
-
-"autoprefixer@^10.3.7", "autoprefixer@^10.4.5", "autoprefixer@^10.4.7":
- "integrity" "sha512-ypHju4Y2Oav95SipEcCcI5J7CGPuvz8oat7sUtYj3ClK44bldfvtvcxK6IEK++7rqB7YchDGzweZIBG+SD0ZAA=="
- "resolved" "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.7.tgz"
- "version" "10.4.7"
- dependencies:
- "browserslist" "^4.20.3"
- "caniuse-lite" "^1.0.30001335"
- "fraction.js" "^4.2.0"
- "normalize-range" "^0.1.2"
- "picocolors" "^1.0.0"
- "postcss-value-parser" "^4.2.0"
-
-"axios@^0.25.0":
- "integrity" "sha512-cD8FOb0tRH3uuEe6+evtAbgJtfxr7ly3fQjYcMcuPlgkwVS9xboaVIpcDV+cYQe+yGykgwZCs1pzjntcGa6l5g=="
- "resolved" "https://registry.npmjs.org/axios/-/axios-0.25.0.tgz"
- "version" "0.25.0"
- dependencies:
- "follow-redirects" "^1.14.7"
-
-"babel-loader@^8.2.5":
- "integrity" "sha512-OSiFfH89LrEMiWd4pLNqGz4CwJDtbs2ZVc+iGu2HrkRfPxId9F2anQj38IxWpmRfsUY0aBZYi1EFcd3mhtRMLQ=="
- "resolved" "https://registry.npmjs.org/babel-loader/-/babel-loader-8.2.5.tgz"
- "version" "8.2.5"
- dependencies:
- "find-cache-dir" "^3.3.1"
- "loader-utils" "^2.0.0"
- "make-dir" "^3.1.0"
- "schema-utils" "^2.6.5"
-
-"babel-plugin-apply-mdx-type-prop@1.6.22":
- "integrity" "sha512-VefL+8o+F/DfK24lPZMtJctrCVOfgbqLAGZSkxwhazQv4VxPg3Za/i40fu22KR2m8eEda+IfSOlPLUSIiLcnCQ=="
- "resolved" "https://registry.npmjs.org/babel-plugin-apply-mdx-type-prop/-/babel-plugin-apply-mdx-type-prop-1.6.22.tgz"
- "version" "1.6.22"
- dependencies:
- "@babel/helper-plugin-utils" "7.10.4"
- "@mdx-js/util" "1.6.22"
-
-"babel-plugin-dynamic-import-node@^2.3.3":
- "integrity" "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ=="
- "resolved" "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz"
- "version" "2.3.3"
- dependencies:
- "object.assign" "^4.1.0"
-
-"babel-plugin-dynamic-import-node@2.3.0":
- "integrity" "sha512-o6qFkpeQEBxcqt0XYlWzAVxNCSCZdUgcR8IRlhD/8DylxjjO4foPcvTW0GGKa/cVt3rvxZ7o5ippJ+/0nvLhlQ=="
- "resolved" "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.0.tgz"
- "version" "2.3.0"
- dependencies:
- "object.assign" "^4.1.0"
-
-"babel-plugin-extract-import-names@1.6.22":
- "integrity" "sha512-yJ9BsJaISua7d8zNT7oRG1ZLBJCIdZ4PZqmH8qa9N5AK01ifk3fnkc98AXhtzE7UkfCsEumvoQWgoYLhOnJ7jQ=="
- "resolved" "https://registry.npmjs.org/babel-plugin-extract-import-names/-/babel-plugin-extract-import-names-1.6.22.tgz"
- "version" "1.6.22"
- dependencies:
- "@babel/helper-plugin-utils" "7.10.4"
-
-"babel-plugin-polyfill-corejs2@^0.3.0":
- "integrity" "sha512-wMDoBJ6uG4u4PNFh72Ty6t3EgfA91puCuAwKIazbQlci+ENb/UU9A3xG5lutjUIiXCIn1CY5L15r9LimiJyrSA=="
- "resolved" "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.0.tgz"
- "version" "0.3.0"
- dependencies:
- "@babel/compat-data" "^7.13.11"
- "@babel/helper-define-polyfill-provider" "^0.3.0"
- "semver" "^6.1.1"
-
-"babel-plugin-polyfill-corejs3@^0.5.0":
- "integrity" "sha512-G3uJih0XWiID451fpeFaYGVuxHEjzKTHtc9uGFEjR6hHrvNzeS/PX+LLLcetJcytsB5m4j+K3o/EpXJNb/5IEQ=="
- "resolved" "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.5.2.tgz"
- "version" "0.5.2"
- dependencies:
- "@babel/helper-define-polyfill-provider" "^0.3.1"
- "core-js-compat" "^3.21.0"
-
-"babel-plugin-polyfill-regenerator@^0.3.0":
- "integrity" "sha512-dhAPTDLGoMW5/84wkgwiLRwMnio2i1fUe53EuvtKMv0pn2p3S8OCoV1xAzfJPl0KOX7IB89s2ib85vbYiea3jg=="
- "resolved" "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.3.0.tgz"
- "version" "0.3.0"
- dependencies:
- "@babel/helper-define-polyfill-provider" "^0.3.0"
-
-"bail@^1.0.0":
- "integrity" "sha512-xFbRxM1tahm08yHBP16MMjVUAvDaBMD38zsM9EMAUN61omwLmKlOpB/Zku5QkjZ8TZ4vn53pj+t518cH0S03RQ=="
- "resolved" "https://registry.npmjs.org/bail/-/bail-1.0.5.tgz"
- "version" "1.0.5"
-
-"balanced-match@^1.0.0":
- "integrity" "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="
- "resolved" "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz"
- "version" "1.0.2"
-
-"base16@^1.0.0":
- "integrity" "sha1-4pf2DX7BAUp6lxo568ipjAtoHnA= sha512-pNdYkNPiJUnEhnfXV56+sQy8+AaPcG3POZAUnwr4EeqCUZFz4u2PePbo3e5Gj4ziYPCWGUZT9RHisvJKnwFuBQ=="
- "resolved" "https://registry.npmjs.org/base16/-/base16-1.0.0.tgz"
- "version" "1.0.0"
-
-"batch@0.6.1":
- "integrity" "sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY= sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw=="
- "resolved" "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz"
- "version" "0.6.1"
-
-"big.js@^5.2.2":
- "integrity" "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ=="
- "resolved" "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz"
- "version" "5.2.2"
-
-"binary-extensions@^2.0.0":
- "integrity" "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA=="
- "resolved" "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz"
- "version" "2.2.0"
-
-"bluebird@^3.7.1":
- "integrity" "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg=="
- "resolved" "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz"
- "version" "3.7.2"
-
-"body-parser@1.20.0":
- "integrity" "sha512-DfJ+q6EPcGKZD1QWUjSpqp+Q7bDQTsQIF4zfUAtZ6qk+H/3/QRhg9CEp39ss+/T2vw0+HaidC0ecJj/DRLIaKg=="
- "resolved" "https://registry.npmjs.org/body-parser/-/body-parser-1.20.0.tgz"
- "version" "1.20.0"
- dependencies:
- "bytes" "3.1.2"
- "content-type" "~1.0.4"
- "debug" "2.6.9"
- "depd" "2.0.0"
- "destroy" "1.2.0"
- "http-errors" "2.0.0"
- "iconv-lite" "0.4.24"
- "on-finished" "2.4.1"
- "qs" "6.10.3"
- "raw-body" "2.5.1"
- "type-is" "~1.6.18"
- "unpipe" "1.0.0"
-
-"bonjour-service@^1.0.11":
- "integrity" "sha512-pMmguXYCu63Ug37DluMKEHdxc+aaIf/ay4YbF8Gxtba+9d3u+rmEWy61VK3Z3hp8Rskok3BunHYnG0dUHAsblw=="
- "resolved" "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.0.12.tgz"
- "version" "1.0.12"
- dependencies:
- "array-flatten" "^2.1.2"
- "dns-equal" "^1.0.0"
- "fast-deep-equal" "^3.1.3"
- "multicast-dns" "^7.2.4"
-
-"boolbase@^1.0.0", "boolbase@~1.0.0":
- "integrity" "sha1-aN/1++YMUes3cl6p4+0xDcwed24= sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww=="
- "resolved" "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz"
- "version" "1.0.0"
-
-"boxen@^5.0.0":
- "integrity" "sha512-9gYgQKXx+1nP8mP7CzFyaUARhg7D3n1dF/FnErWmu9l6JvGpNUN278h0aSb+QjoiKSWG+iZ3uHrcqk0qrY9RQQ=="
- "resolved" "https://registry.npmjs.org/boxen/-/boxen-5.1.2.tgz"
- "version" "5.1.2"
- dependencies:
- "ansi-align" "^3.0.0"
- "camelcase" "^6.2.0"
- "chalk" "^4.1.0"
- "cli-boxes" "^2.2.1"
- "string-width" "^4.2.2"
- "type-fest" "^0.20.2"
- "widest-line" "^3.1.0"
- "wrap-ansi" "^7.0.0"
-
-"boxen@^6.2.1":
- "integrity" "sha512-H4PEsJXfFI/Pt8sjDWbHlQPx4zL/bvSQjcilJmaulGt5mLDorHOHpmdXAJcBcmru7PhYSp/cDMWRko4ZUMFkSw=="
- "resolved" "https://registry.npmjs.org/boxen/-/boxen-6.2.1.tgz"
- "version" "6.2.1"
- dependencies:
- "ansi-align" "^3.0.1"
- "camelcase" "^6.2.0"
- "chalk" "^4.1.2"
- "cli-boxes" "^3.0.0"
- "string-width" "^5.0.1"
- "type-fest" "^2.5.0"
- "widest-line" "^4.0.1"
- "wrap-ansi" "^8.0.1"
-
-"brace-expansion@^1.1.7":
- "integrity" "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA=="
- "resolved" "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz"
- "version" "1.1.11"
- dependencies:
- "balanced-match" "^1.0.0"
- "concat-map" "0.0.1"
-
-"braces@^3.0.2", "braces@~3.0.2":
- "integrity" "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A=="
- "resolved" "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz"
- "version" "3.0.2"
- dependencies:
- "fill-range" "^7.0.1"
-
-"browserslist@^4.0.0", "browserslist@^4.14.5", "browserslist@^4.16.6", "browserslist@^4.18.1", "browserslist@^4.20.2", "browserslist@^4.20.3":
- "integrity" "sha512-NBhymBQl1zM0Y5dQT/O+xiLP9/rzOIQdKM/eMJBAq7yBgaB6krIYLGejrwVYnSHZdqjscB1SPuAjHwxjvN6Wdg=="
- "resolved" "https://registry.npmjs.org/browserslist/-/browserslist-4.20.3.tgz"
- "version" "4.20.3"
- dependencies:
- "caniuse-lite" "^1.0.30001332"
- "electron-to-chromium" "^1.4.118"
- "escalade" "^3.1.1"
- "node-releases" "^2.0.3"
- "picocolors" "^1.0.0"
-
-"buffer-from@^1.0.0":
- "integrity" "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ=="
- "resolved" "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz"
- "version" "1.1.2"
-
-"bytes@3.0.0":
- "integrity" "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg= sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw=="
- "resolved" "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz"
- "version" "3.0.0"
-
-"bytes@3.1.2":
- "integrity" "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg=="
- "resolved" "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz"
- "version" "3.1.2"
-
-"cacheable-request@^6.0.0":
- "integrity" "sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg=="
- "resolved" "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.1.0.tgz"
- "version" "6.1.0"
- dependencies:
- "clone-response" "^1.0.2"
- "get-stream" "^5.1.0"
- "http-cache-semantics" "^4.0.0"
- "keyv" "^3.0.0"
- "lowercase-keys" "^2.0.0"
- "normalize-url" "^4.1.0"
- "responselike" "^1.0.2"
-
-"call-bind@^1.0.0", "call-bind@^1.0.2":
- "integrity" "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA=="
- "resolved" "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz"
- "version" "1.0.2"
- dependencies:
- "function-bind" "^1.1.1"
- "get-intrinsic" "^1.0.2"
-
-"callsites@^3.0.0":
- "integrity" "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ=="
- "resolved" "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz"
- "version" "3.1.0"
-
-"camel-case@^4.1.2":
- "integrity" "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw=="
- "resolved" "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz"
- "version" "4.1.2"
- dependencies:
- "pascal-case" "^3.1.2"
- "tslib" "^2.0.3"
-
-"camelcase-css@2.0.1":
- "integrity" "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA=="
- "resolved" "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz"
- "version" "2.0.1"
-
-"camelcase@^6.2.0":
- "integrity" "sha512-tVI4q5jjFV5CavAU8DXfza/TJcZutVKo/5Foskmsqcm0MsL91moHvwiGNnqaa2o6PF/7yT5ikDRcVcl8Rj6LCA=="
- "resolved" "https://registry.npmjs.org/camelcase/-/camelcase-6.2.1.tgz"
- "version" "6.2.1"
-
-"caniuse-api@^3.0.0":
- "integrity" "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw=="
- "resolved" "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz"
- "version" "3.0.0"
- dependencies:
- "browserslist" "^4.0.0"
- "caniuse-lite" "^1.0.0"
- "lodash.memoize" "^4.1.2"
- "lodash.uniq" "^4.5.0"
-
-"caniuse-lite@^1.0.0", "caniuse-lite@^1.0.30001332", "caniuse-lite@^1.0.30001335":
- "integrity" "sha512-jUNz+a9blQTQVu4uFcn17uAD8IDizPzQkIKh3LCJfg9BkyIqExYYdyc/ZSlWUSKb8iYiXxKsxbv4zYSvkqjrxw=="
- "resolved" "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001340.tgz"
- "version" "1.0.30001340"
-
-"ccount@^1.0.0", "ccount@^1.0.3":
- "integrity" "sha512-vlNK021QdI7PNeiUh/lKkC/mNHHfV0m/Ad5JoI0TYtlBnJAslM/JIkm/tGC88bkLIwO6OQ5uV6ztS6kVAtCDlg=="
- "resolved" "https://registry.npmjs.org/ccount/-/ccount-1.1.0.tgz"
- "version" "1.1.0"
-
-"chalk@^2.0.0", "chalk@^2.4.1":
- "integrity" "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ=="
- "resolved" "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz"
- "version" "2.4.2"
- dependencies:
- "ansi-styles" "^3.2.1"
- "escape-string-regexp" "^1.0.5"
- "supports-color" "^5.3.0"
-
-"chalk@^4.1.0":
- "integrity" "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="
- "resolved" "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz"
- "version" "4.1.2"
- dependencies:
- "ansi-styles" "^4.1.0"
- "supports-color" "^7.1.0"
-
-"chalk@^4.1.2":
- "integrity" "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="
- "resolved" "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz"
- "version" "4.1.2"
- dependencies:
- "ansi-styles" "^4.1.0"
- "supports-color" "^7.1.0"
-
-"character-entities-legacy@^1.0.0":
- "integrity" "sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA=="
- "resolved" "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-1.1.4.tgz"
- "version" "1.1.4"
-
-"character-entities@^1.0.0":
- "integrity" "sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw=="
- "resolved" "https://registry.npmjs.org/character-entities/-/character-entities-1.2.4.tgz"
- "version" "1.2.4"
-
-"character-reference-invalid@^1.0.0":
- "integrity" "sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg=="
- "resolved" "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-1.1.4.tgz"
- "version" "1.1.4"
-
-"cheerio-select@^1.5.0":
- "integrity" "sha512-eq0GdBvxVFbqWgmCm7M3XGs1I8oLy/nExUnh6oLqmBditPO9AqQJrkslDpMun/hZ0yyTs8L0m85OHp4ho6Qm9g=="
- "resolved" "https://registry.npmjs.org/cheerio-select/-/cheerio-select-1.6.0.tgz"
- "version" "1.6.0"
- dependencies:
- "css-select" "^4.3.0"
- "css-what" "^6.0.1"
- "domelementtype" "^2.2.0"
- "domhandler" "^4.3.1"
- "domutils" "^2.8.0"
-
-"cheerio@^0.22.0":
- "integrity" "sha1-qbqoYKP5tZWmuBsahocxIe06Jp4= sha512-8/MzidM6G/TgRelkzDG13y3Y9LxBjCb+8yOEZ9+wwq5gVF2w2pV0wmHvjfT0RvuxGyR7UEuK36r+yYMbT4uKgA=="
- "resolved" "https://registry.npmjs.org/cheerio/-/cheerio-0.22.0.tgz"
- "version" "0.22.0"
- dependencies:
- "css-select" "~1.2.0"
- "dom-serializer" "~0.1.0"
- "entities" "~1.1.1"
- "htmlparser2" "^3.9.1"
- "lodash.assignin" "^4.0.9"
- "lodash.bind" "^4.1.4"
- "lodash.defaults" "^4.0.1"
- "lodash.filter" "^4.4.0"
- "lodash.flatten" "^4.2.0"
- "lodash.foreach" "^4.3.0"
- "lodash.map" "^4.4.0"
- "lodash.merge" "^4.4.0"
- "lodash.pick" "^4.2.1"
- "lodash.reduce" "^4.4.0"
- "lodash.reject" "^4.4.0"
- "lodash.some" "^4.4.0"
-
-"cheerio@^1.0.0-rc.10":
- "integrity" "sha512-g0J0q/O6mW8z5zxQ3A8E8J1hUgp4SMOvEoW/x84OwyHKe/Zccz83PVT4y5Crcr530FV6NgmKI1qvGTKVl9XXVw=="
- "resolved" "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.10.tgz"
- "version" "1.0.0-rc.10"
- dependencies:
- "cheerio-select" "^1.5.0"
- "dom-serializer" "^1.3.2"
- "domhandler" "^4.2.0"
- "htmlparser2" "^6.1.0"
- "parse5" "^6.0.1"
- "parse5-htmlparser2-tree-adapter" "^6.0.1"
- "tslib" "^2.2.0"
-
-"chokidar@^3.4.2", "chokidar@^3.5.3":
- "integrity" "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw=="
- "resolved" "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz"
- "version" "3.5.3"
- dependencies:
- "anymatch" "~3.1.2"
- "braces" "~3.0.2"
- "glob-parent" "~5.1.2"
- "is-binary-path" "~2.1.0"
- "is-glob" "~4.0.1"
- "normalize-path" "~3.0.0"
- "readdirp" "~3.6.0"
- optionalDependencies:
- "fsevents" "~2.3.2"
-
-"chrome-trace-event@^1.0.2":
- "integrity" "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg=="
- "resolved" "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz"
- "version" "1.0.3"
-
-"ci-info@^2.0.0":
- "integrity" "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ=="
- "resolved" "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz"
- "version" "2.0.0"
-
-"clean-css@^5.2.2", "clean-css@^5.3.0":
- "integrity" "sha512-YYuuxv4H/iNb1Z/5IbMRoxgrzjWGhOEFfd+groZ5dMCVkpENiMZmwspdrzBo9286JjM1gZJPAyL7ZIdzuvu2AQ=="
- "resolved" "https://registry.npmjs.org/clean-css/-/clean-css-5.3.0.tgz"
- "version" "5.3.0"
- dependencies:
- "source-map" "~0.6.0"
-
-"clean-stack@^2.0.0":
- "integrity" "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A=="
- "resolved" "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz"
- "version" "2.2.0"
-
-"cli-boxes@^2.2.1":
- "integrity" "sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw=="
- "resolved" "https://registry.npmjs.org/cli-boxes/-/cli-boxes-2.2.1.tgz"
- "version" "2.2.1"
-
-"cli-boxes@^3.0.0":
- "integrity" "sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g=="
- "resolved" "https://registry.npmjs.org/cli-boxes/-/cli-boxes-3.0.0.tgz"
- "version" "3.0.0"
-
-"cli-table3@^0.6.2":
- "integrity" "sha512-QyavHCaIC80cMivimWu4aWHilIpiDpfm3hGmqAmXVL1UsnbLuBSMd21hTX6VY4ZSDSM73ESLeF8TOYId3rBTbw=="
- "resolved" "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.2.tgz"
- "version" "0.6.2"
- dependencies:
- "string-width" "^4.2.0"
- optionalDependencies:
- "@colors/colors" "1.5.0"
-
-"clone-deep@^4.0.1":
- "integrity" "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ=="
- "resolved" "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz"
- "version" "4.0.1"
- dependencies:
- "is-plain-object" "^2.0.4"
- "kind-of" "^6.0.2"
- "shallow-clone" "^3.0.0"
-
-"clone-response@^1.0.2":
- "integrity" "sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws= sha512-yjLXh88P599UOyPTFX0POsd7WxnbsVsGohcwzHOLspIhhpalPw1BcqED8NblyZLKcGrL8dTgMlcaZxV2jAD41Q=="
- "resolved" "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz"
- "version" "1.0.2"
- dependencies:
- "mimic-response" "^1.0.0"
-
-"clsx@^1.1.1":
- "integrity" "sha512-6/bPho624p3S2pMyvP5kKBPXnI3ufHLObBFCfgx+LkeR5lg2XYy2hqZqUf45ypD8COn2bhgGJSUE+l5dhNBieA=="
- "resolved" "https://registry.npmjs.org/clsx/-/clsx-1.1.1.tgz"
- "version" "1.1.1"
-
-"coa@^2.0.2":
- "integrity" "sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA=="
- "resolved" "https://registry.npmjs.org/coa/-/coa-2.0.2.tgz"
- "version" "2.0.2"
- dependencies:
- "@types/q" "^1.5.1"
- "chalk" "^2.4.1"
- "q" "^1.1.2"
-
-"collapse-white-space@^1.0.2":
- "integrity" "sha512-jEovNnrhMuqyCcjfEJA56v0Xq8SkIoPKDyaHahwo3POf4qcSXqMYuwNcOTzp74vTsR9Tn08z4MxWqAhcekogkQ=="
- "resolved" "https://registry.npmjs.org/collapse-white-space/-/collapse-white-space-1.0.6.tgz"
- "version" "1.0.6"
-
-"color-convert@^1.9.0":
- "integrity" "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg=="
- "resolved" "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz"
- "version" "1.9.3"
- dependencies:
- "color-name" "1.1.3"
-
-"color-convert@^2.0.1":
- "integrity" "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ=="
- "resolved" "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz"
- "version" "2.0.1"
- dependencies:
- "color-name" "~1.1.4"
-
-"color-name@~1.1.4":
- "integrity" "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
- "resolved" "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz"
- "version" "1.1.4"
-
-"color-name@1.1.3":
- "integrity" "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw=="
- "resolved" "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz"
- "version" "1.1.3"
-
-"colord@^2.9.1":
- "integrity" "sha512-Uqbg+J445nc1TKn4FoDPS6ZZqAvEDnwrH42yo8B40JSOgSLxMZ/gt3h4nmCtPLQeXhjJJkqBx7SCY35WnIixaQ=="
- "resolved" "https://registry.npmjs.org/colord/-/colord-2.9.2.tgz"
- "version" "2.9.2"
-
-"colorette@^2.0.10":
- "integrity" "sha512-hUewv7oMjCp+wkBv5Rm0v87eJhq4woh5rSR+42YSQJKecCqgIqNkZ6lAlQms/BwHPJA5NKMRlpxPRv0n8HQW6g=="
- "resolved" "https://registry.npmjs.org/colorette/-/colorette-2.0.16.tgz"
- "version" "2.0.16"
-
-"combine-promises@^1.1.0":
- "integrity" "sha512-ZI9jvcLDxqwaXEixOhArm3r7ReIivsXkpbyEWyeOhzz1QS0iSgBPnWvEqvIQtYyamGCYA88gFhmUrs9hrrQ0pg=="
- "resolved" "https://registry.npmjs.org/combine-promises/-/combine-promises-1.1.0.tgz"
- "version" "1.1.0"
-
-"comma-separated-tokens@^1.0.0":
- "integrity" "sha512-GHuDRO12Sypu2cV70d1dkA2EUmXHgntrzbpvOB+Qy+49ypNfGgFQIC2fhhXbnyrJRynDCAARsT7Ou0M6hirpfw=="
- "resolved" "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-1.0.8.tgz"
- "version" "1.0.8"
-
-"commander@^2.20.0":
- "integrity" "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ=="
- "resolved" "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz"
- "version" "2.20.3"
-
-"commander@^5.1.0":
- "integrity" "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg=="
- "resolved" "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz"
- "version" "5.1.0"
-
-"commander@^7.2.0":
- "integrity" "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw=="
- "resolved" "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz"
- "version" "7.2.0"
-
-"commander@^8.3.0":
- "integrity" "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww=="
- "resolved" "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz"
- "version" "8.3.0"
-
-"commondir@^1.0.1":
- "integrity" "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs= sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg=="
- "resolved" "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz"
- "version" "1.0.1"
-
-"compressible@~2.0.16":
- "integrity" "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg=="
- "resolved" "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz"
- "version" "2.0.18"
- dependencies:
- "mime-db" ">= 1.43.0 < 2"
-
-"compression@^1.7.4":
- "integrity" "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ=="
- "resolved" "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz"
- "version" "1.7.4"
- dependencies:
- "accepts" "~1.3.5"
- "bytes" "3.0.0"
- "compressible" "~2.0.16"
- "debug" "2.6.9"
- "on-headers" "~1.0.2"
- "safe-buffer" "5.1.2"
- "vary" "~1.1.2"
-
-"concat-map@0.0.1":
- "integrity" "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg=="
- "resolved" "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz"
- "version" "0.0.1"
-
-"configstore@^5.0.1":
- "integrity" "sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA=="
- "resolved" "https://registry.npmjs.org/configstore/-/configstore-5.0.1.tgz"
- "version" "5.0.1"
- dependencies:
- "dot-prop" "^5.2.0"
- "graceful-fs" "^4.1.2"
- "make-dir" "^3.0.0"
- "unique-string" "^2.0.0"
- "write-file-atomic" "^3.0.0"
- "xdg-basedir" "^4.0.0"
-
-"connect-history-api-fallback@^1.6.0":
- "integrity" "sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg=="
- "resolved" "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz"
- "version" "1.6.0"
-
-"consola@^2.15.3":
- "integrity" "sha512-9vAdYbHj6x2fLKC4+oPH0kFzY/orMZyG2Aj+kNylHxKGJ/Ed4dpNyAQYwJOdqO4zdM7XpVHmyejQDcQHrnuXbw=="
- "resolved" "https://registry.npmjs.org/consola/-/consola-2.15.3.tgz"
- "version" "2.15.3"
-
-"content-disposition@0.5.2":
- "integrity" "sha1-DPaLud318r55YcOoUXjLhdunjLQ= sha512-kRGRZw3bLlFISDBgwTSA1TMBFN6J6GWDeubmDE3AF+3+yXL8hTWv8r5rkLbqYXY4RjPk/EzHnClI3zQf1cFmHA=="
- "resolved" "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz"
- "version" "0.5.2"
-
-"content-disposition@0.5.4":
- "integrity" "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ=="
- "resolved" "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz"
- "version" "0.5.4"
- dependencies:
- "safe-buffer" "5.2.1"
-
-"content-type@~1.0.4":
- "integrity" "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA=="
- "resolved" "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz"
- "version" "1.0.4"
-
-"convert-source-map@^1.7.0":
- "integrity" "sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA=="
- "resolved" "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz"
- "version" "1.8.0"
- dependencies:
- "safe-buffer" "~5.1.1"
-
-"cookie-signature@1.0.6":
- "integrity" "sha1-4wOogrNCzD7oylE6eZmXNNqzriw= sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ=="
- "resolved" "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz"
- "version" "1.0.6"
-
-"cookie@0.5.0":
- "integrity" "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw=="
- "resolved" "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz"
- "version" "0.5.0"
-
-"copy-text-to-clipboard@^3.0.1":
- "integrity" "sha512-rvVsHrpFcL4F2P8ihsoLdFHmd404+CMg71S756oRSeQgqk51U3kicGdnvfkrxva0xXH92SjGS62B0XIJsbh+9Q=="
- "resolved" "https://registry.npmjs.org/copy-text-to-clipboard/-/copy-text-to-clipboard-3.0.1.tgz"
- "version" "3.0.1"
-
-"copy-webpack-plugin@^10.2.4":
- "integrity" "sha512-xFVltahqlsRcyyJqQbDY6EYTtyQZF9rf+JPjwHObLdPFMEISqkFkr7mFoVOC6BfYS/dNThyoQKvziugm+OnwBg=="
- "resolved" "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-10.2.4.tgz"
- "version" "10.2.4"
- dependencies:
- "fast-glob" "^3.2.7"
- "glob-parent" "^6.0.1"
- "globby" "^12.0.2"
- "normalize-path" "^3.0.0"
- "schema-utils" "^4.0.0"
- "serialize-javascript" "^6.0.0"
-
-"copy-webpack-plugin@^11.0.0":
- "integrity" "sha512-fX2MWpamkW0hZxMEg0+mYnA40LTosOSa5TqZ9GYIBzyJa9C3QUaMPSE2xAi/buNr8u89SfD9wHSQVBzrRa/SOQ=="
- "resolved" "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-11.0.0.tgz"
- "version" "11.0.0"
- dependencies:
- "fast-glob" "^3.2.11"
- "glob-parent" "^6.0.1"
- "globby" "^13.1.1"
- "normalize-path" "^3.0.0"
- "schema-utils" "^4.0.0"
- "serialize-javascript" "^6.0.0"
-
-"core-js-compat@^3.21.0", "core-js-compat@^3.22.1":
- "integrity" "sha512-rEF75n3QtInrYICvJjrAgV03HwKiYvtKHdPtaba1KucG+cNZ4NJnH9isqt979e67KZlhpbCOTwnsvnIr+CVeOg=="
- "resolved" "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.22.5.tgz"
- "version" "3.22.5"
- dependencies:
- "browserslist" "^4.20.3"
- "semver" "7.0.0"
-
-"core-js-pure@^3.20.2":
- "integrity" "sha512-8xo9R00iYD7TcV7OrC98GwxiUEAabVWO3dix+uyWjnYrx9fyASLlIX+f/3p5dW5qByaP2bcZ8X/T47s55et/tA=="
- "resolved" "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.22.5.tgz"
- "version" "3.22.5"
-
-"core-js@^3.22.3", "core-js@^3.22.7":
- "integrity" "sha512-UoGQ/cfzGYIuiq6Z7vWL1HfkE9U9IZ4Ub+0XSiJTCzvbZzgPA69oDF2f+lgJ6dFFLEdjW5O6svvoKzXX23xFkA=="
- "resolved" "https://registry.npmjs.org/core-js/-/core-js-3.22.8.tgz"
- "version" "3.22.8"
-
-"core-util-is@~1.0.0":
- "integrity" "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ=="
- "resolved" "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz"
- "version" "1.0.3"
-
-"cosmiconfig@^6.0.0":
- "integrity" "sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg=="
- "resolved" "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-6.0.0.tgz"
- "version" "6.0.0"
- dependencies:
- "@types/parse-json" "^4.0.0"
- "import-fresh" "^3.1.0"
- "parse-json" "^5.0.0"
- "path-type" "^4.0.0"
- "yaml" "^1.7.2"
-
-"cosmiconfig@^7.0.0", "cosmiconfig@^7.0.1":
- "integrity" "sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ=="
- "resolved" "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.1.tgz"
- "version" "7.0.1"
- dependencies:
- "@types/parse-json" "^4.0.0"
- "import-fresh" "^3.2.1"
- "parse-json" "^5.0.0"
- "path-type" "^4.0.0"
- "yaml" "^1.10.0"
-
-"cross-fetch@^3.1.5":
- "integrity" "sha512-lvb1SBsI0Z7GDwmuid+mU3kWVBwTVUbe7S0H52yaaAdQOXq2YktTCZdlAcNKFzE6QtRz0snpw9bNiPeOIkkQvw=="
- "resolved" "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.5.tgz"
- "version" "3.1.5"
- dependencies:
- "node-fetch" "2.6.7"
-
-"cross-spawn@^7.0.3":
- "integrity" "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w=="
- "resolved" "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz"
- "version" "7.0.3"
- dependencies:
- "path-key" "^3.1.0"
- "shebang-command" "^2.0.0"
- "which" "^2.0.1"
-
-"crypto-random-string@^2.0.0":
- "integrity" "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA=="
- "resolved" "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz"
- "version" "2.0.0"
-
-"css-declaration-sorter@^6.2.2":
- "integrity" "sha512-Ufadglr88ZLsrvS11gjeu/40Lw74D9Am/Jpr3LlYm5Q4ZP5KdlUhG+6u2EjyXeZcxmZ2h1ebCKngDjolpeLHpg=="
- "resolved" "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-6.2.2.tgz"
- "version" "6.2.2"
-
-"css-loader@^6.7.1":
- "integrity" "sha512-yB5CNFa14MbPJcomwNh3wLThtkZgcNyI2bNMRt8iE5Z8Vwl7f8vQXFAzn2HDOJvtDq2NTZBUGMSUNNyrv3/+cw=="
- "resolved" "https://registry.npmjs.org/css-loader/-/css-loader-6.7.1.tgz"
- "version" "6.7.1"
- dependencies:
- "icss-utils" "^5.1.0"
- "postcss" "^8.4.7"
- "postcss-modules-extract-imports" "^3.0.0"
- "postcss-modules-local-by-default" "^4.0.0"
- "postcss-modules-scope" "^3.0.0"
- "postcss-modules-values" "^4.0.0"
- "postcss-value-parser" "^4.2.0"
- "semver" "^7.3.5"
-
-"css-minimizer-webpack-plugin@^3.4.1":
- "integrity" "sha512-1u6D71zeIfgngN2XNRJefc/hY7Ybsxd74Jm4qngIXyUEk7fss3VUzuHxLAq/R8NAba4QU9OUSaMZlbpRc7bM4Q=="
- "resolved" "https://registry.npmjs.org/css-minimizer-webpack-plugin/-/css-minimizer-webpack-plugin-3.4.1.tgz"
- "version" "3.4.1"
- dependencies:
- "cssnano" "^5.0.6"
- "jest-worker" "^27.0.2"
- "postcss" "^8.3.5"
- "schema-utils" "^4.0.0"
- "serialize-javascript" "^6.0.0"
- "source-map" "^0.6.1"
-
-"css-minimizer-webpack-plugin@^4.0.0":
- "integrity" "sha512-7ZXXRzRHvofv3Uac5Y+RkWRNo0ZMlcg8e9/OtrqUYmwDWJo+qs67GvdeFrXLsFb7czKNwjQhPkM0avlIYl+1nA=="
- "resolved" "https://registry.npmjs.org/css-minimizer-webpack-plugin/-/css-minimizer-webpack-plugin-4.0.0.tgz"
- "version" "4.0.0"
- dependencies:
- "cssnano" "^5.1.8"
- "jest-worker" "^27.5.1"
- "postcss" "^8.4.13"
- "schema-utils" "^4.0.0"
- "serialize-javascript" "^6.0.0"
- "source-map" "^0.6.1"
-
-"css-select-base-adapter@^0.1.1":
- "integrity" "sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w=="
- "resolved" "https://registry.npmjs.org/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz"
- "version" "0.1.1"
-
-"css-select@^2.0.0":
- "integrity" "sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ=="
- "resolved" "https://registry.npmjs.org/css-select/-/css-select-2.1.0.tgz"
- "version" "2.1.0"
- dependencies:
- "boolbase" "^1.0.0"
- "css-what" "^3.2.1"
- "domutils" "^1.7.0"
- "nth-check" "^1.0.2"
-
-"css-select@^4.1.3", "css-select@^4.3.0":
- "integrity" "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ=="
- "resolved" "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz"
- "version" "4.3.0"
- dependencies:
- "boolbase" "^1.0.0"
- "css-what" "^6.0.1"
- "domhandler" "^4.3.1"
- "domutils" "^2.8.0"
- "nth-check" "^2.0.1"
-
-"css-select@~1.2.0":
- "integrity" "sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg= sha512-dUQOBoqdR7QwV90WysXPLXG5LO7nhYBgiWVfxF80DKPF8zx1t/pUd2FYy73emg3zrjtM6dzmYgbHKfV2rxiHQA=="
- "resolved" "https://registry.npmjs.org/css-select/-/css-select-1.2.0.tgz"
- "version" "1.2.0"
- dependencies:
- "boolbase" "~1.0.0"
- "css-what" "2.1"
- "domutils" "1.5.1"
- "nth-check" "~1.0.1"
-
-"css-tree@^1.1.2":
- "integrity" "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q=="
- "resolved" "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz"
- "version" "1.1.3"
- dependencies:
- "mdn-data" "2.0.14"
- "source-map" "^0.6.1"
-
-"css-tree@^1.1.3":
- "integrity" "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q=="
- "resolved" "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz"
- "version" "1.1.3"
- dependencies:
- "mdn-data" "2.0.14"
- "source-map" "^0.6.1"
-
-"css-tree@1.0.0-alpha.37":
- "integrity" "sha512-DMxWJg0rnz7UgxKT0Q1HU/L9BeJI0M6ksor0OgqOnF+aRCDWg/N2641HmVyU9KVIu0OVVWOb2IpC9A+BJRnejg=="
- "resolved" "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.37.tgz"
- "version" "1.0.0-alpha.37"
- dependencies:
- "mdn-data" "2.0.4"
- "source-map" "^0.6.1"
-
-"css-what@^3.2.1":
- "integrity" "sha512-ACUm3L0/jiZTqfzRM3Hi9Q8eZqd6IK37mMWPLz9PJxkLWllYeRf+EHUSHYEtFop2Eqytaq1FizFVh7XfBnXCDQ=="
- "resolved" "https://registry.npmjs.org/css-what/-/css-what-3.4.2.tgz"
- "version" "3.4.2"
-
-"css-what@^6.0.1":
- "integrity" "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw=="
- "resolved" "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz"
- "version" "6.1.0"
-
-"css-what@2.1":
- "integrity" "sha512-a+EPoD+uZiNfh+5fxw2nO9QwFa6nJe2Or35fGY6Ipw1R3R4AGz1d1TEZrCegvw2YTmZ0jXirGYlzxxpYSHwpEg=="
- "resolved" "https://registry.npmjs.org/css-what/-/css-what-2.1.3.tgz"
- "version" "2.1.3"
-
-"cssesc@^3.0.0":
- "integrity" "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg=="
- "resolved" "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz"
- "version" "3.0.0"
-
-"cssnano-preset-advanced@^5.3.3", "cssnano-preset-advanced@^5.3.5":
- "integrity" "sha512-VNOdTMRA60KhaURZhnkTGeluHQBHWDMwY7TIDu1Qydf88X6k8xZbV2I+Wlm8JRaj2oi18xvoIOAW17JneoZzEg=="
- "resolved" "https://registry.npmjs.org/cssnano-preset-advanced/-/cssnano-preset-advanced-5.3.7.tgz"
- "version" "5.3.7"
- dependencies:
- "autoprefixer" "^10.3.7"
- "cssnano-preset-default" "^5.2.11"
- "postcss-discard-unused" "^5.1.0"
- "postcss-merge-idents" "^5.1.1"
- "postcss-reduce-idents" "^5.2.0"
- "postcss-zindex" "^5.1.0"
-
-"cssnano-preset-default@^5.2.11":
- "integrity" "sha512-4PadR1NtuaIK8MvLNuY7MznK4WJteldGlzCiMaaTiOUP+apeiIvUDIXykzUOoqgOOUAHrU64ncdD90NfZR3LSQ=="
- "resolved" "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-5.2.11.tgz"
- "version" "5.2.11"
- dependencies:
- "css-declaration-sorter" "^6.2.2"
- "cssnano-utils" "^3.1.0"
- "postcss-calc" "^8.2.3"
- "postcss-colormin" "^5.3.0"
- "postcss-convert-values" "^5.1.2"
- "postcss-discard-comments" "^5.1.2"
- "postcss-discard-duplicates" "^5.1.0"
- "postcss-discard-empty" "^5.1.1"
- "postcss-discard-overridden" "^5.1.0"
- "postcss-merge-longhand" "^5.1.5"
- "postcss-merge-rules" "^5.1.2"
- "postcss-minify-font-values" "^5.1.0"
- "postcss-minify-gradients" "^5.1.1"
- "postcss-minify-params" "^5.1.3"
- "postcss-minify-selectors" "^5.2.1"
- "postcss-normalize-charset" "^5.1.0"
- "postcss-normalize-display-values" "^5.1.0"
- "postcss-normalize-positions" "^5.1.0"
- "postcss-normalize-repeat-style" "^5.1.0"
- "postcss-normalize-string" "^5.1.0"
- "postcss-normalize-timing-functions" "^5.1.0"
- "postcss-normalize-unicode" "^5.1.0"
- "postcss-normalize-url" "^5.1.0"
- "postcss-normalize-whitespace" "^5.1.1"
- "postcss-ordered-values" "^5.1.2"
- "postcss-reduce-initial" "^5.1.0"
- "postcss-reduce-transforms" "^5.1.0"
- "postcss-svgo" "^5.1.0"
- "postcss-unique-selectors" "^5.1.1"
-
-"cssnano-utils@^3.1.0":
- "integrity" "sha512-JQNR19/YZhz4psLX/rQ9M83e3z2Wf/HdJbryzte4a3NSuafyp9w/I4U+hx5C2S9g41qlstH7DEWnZaaj83OuEA=="
- "resolved" "https://registry.npmjs.org/cssnano-utils/-/cssnano-utils-3.1.0.tgz"
- "version" "3.1.0"
-
-"cssnano@^5.0.6", "cssnano@^5.1.7", "cssnano@^5.1.8", "cssnano@^5.1.9":
- "integrity" "sha512-2nx+O6LvewPo5EBtYrKc8762mMkZRk9cMGIOP4UlkmxHm7ObxH+zvsJJ+qLwPkUc4/yumL/qJkavYi9NlodWIQ=="
- "resolved" "https://registry.npmjs.org/cssnano/-/cssnano-5.1.11.tgz"
- "version" "5.1.11"
- dependencies:
- "cssnano-preset-default" "^5.2.11"
- "lilconfig" "^2.0.3"
- "yaml" "^1.10.2"
-
-"csso@^4.0.2", "csso@^4.2.0":
- "integrity" "sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA=="
- "resolved" "https://registry.npmjs.org/csso/-/csso-4.2.0.tgz"
- "version" "4.2.0"
- dependencies:
- "css-tree" "^1.1.2"
-
-"csstype@^3.0.2":
- "integrity" "sha512-2u44ZG2OcNUO9HDp/Jl8C07x6pU/eTR3ncV91SiK3dhG9TWvRVsCoJw14Ckx5DgWkzGA3waZWO3d7pgqpUI/XA=="
- "resolved" "https://registry.npmjs.org/csstype/-/csstype-3.0.10.tgz"
- "version" "3.0.10"
-
-"debug@^2.6.0":
- "integrity" "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA=="
- "resolved" "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz"
- "version" "2.6.9"
- dependencies:
- "ms" "2.0.0"
-
-"debug@^4.1.0", "debug@^4.1.1":
- "integrity" "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw=="
- "resolved" "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz"
- "version" "4.3.2"
- dependencies:
- "ms" "2.1.2"
-
-"debug@2.6.9":
- "integrity" "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA=="
- "resolved" "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz"
- "version" "2.6.9"
- dependencies:
- "ms" "2.0.0"
-
-"decompress-response@^3.3.0":
- "integrity" "sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M= sha512-BzRPQuY1ip+qDonAOz42gRm/pg9F768C+npV/4JOsxRC2sq+Rlk+Q4ZCAsOhnIaMrgarILY+RMUIvMmmX1qAEA=="
- "resolved" "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz"
- "version" "3.3.0"
- dependencies:
- "mimic-response" "^1.0.0"
-
-"deep-extend@^0.6.0":
- "integrity" "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA=="
- "resolved" "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz"
- "version" "0.6.0"
-
-"deepmerge@^4.2.2":
- "integrity" "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg=="
- "resolved" "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz"
- "version" "4.2.2"
-
-"default-gateway@^6.0.3":
- "integrity" "sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg=="
- "resolved" "https://registry.npmjs.org/default-gateway/-/default-gateway-6.0.3.tgz"
- "version" "6.0.3"
- dependencies:
- "execa" "^5.0.0"
-
-"defer-to-connect@^1.0.1":
- "integrity" "sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ=="
- "resolved" "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.3.tgz"
- "version" "1.1.3"
-
-"define-lazy-prop@^2.0.0":
- "integrity" "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og=="
- "resolved" "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz"
- "version" "2.0.0"
-
-"define-properties@^1.1.3":
- "integrity" "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ=="
- "resolved" "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz"
- "version" "1.1.3"
- dependencies:
- "object-keys" "^1.0.12"
-
-"del@^6.0.0", "del@^6.1.1":
- "integrity" "sha512-ua8BhapfP0JUJKC/zV9yHHDW/rDoDxP4Zhn3AkA6/xT6gY7jYXJiaeyBZznYVujhZZET+UgcbZiQ7sN3WqcImg=="
- "resolved" "https://registry.npmjs.org/del/-/del-6.1.1.tgz"
- "version" "6.1.1"
- dependencies:
- "globby" "^11.0.1"
- "graceful-fs" "^4.2.4"
- "is-glob" "^4.0.1"
- "is-path-cwd" "^2.2.0"
- "is-path-inside" "^3.0.2"
- "p-map" "^4.0.0"
- "rimraf" "^3.0.2"
- "slash" "^3.0.0"
-
-"depd@~1.1.2":
- "integrity" "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak= sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ=="
- "resolved" "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz"
- "version" "1.1.2"
-
-"depd@2.0.0":
- "integrity" "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw=="
- "resolved" "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz"
- "version" "2.0.0"
-
-"destroy@1.2.0":
- "integrity" "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg=="
- "resolved" "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz"
- "version" "1.2.0"
-
-"detab@2.0.4":
- "integrity" "sha512-8zdsQA5bIkoRECvCrNKPla84lyoR7DSAyf7p0YgXzBO9PDJx8KntPUay7NS6yp+KdxdVtiE5SpHKtbp2ZQyA9g=="
- "resolved" "https://registry.npmjs.org/detab/-/detab-2.0.4.tgz"
- "version" "2.0.4"
- dependencies:
- "repeat-string" "^1.5.4"
-
-"detect-node@^2.0.4":
- "integrity" "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g=="
- "resolved" "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz"
- "version" "2.1.0"
-
-"detect-port-alt@^1.1.6":
- "integrity" "sha512-5tQykt+LqfJFBEYaDITx7S7cR7mJ/zQmLXZ2qt5w04ainYZw6tBf9dBunMjVeVOdYVRUzUOE4HkY5J7+uttb5Q=="
- "resolved" "https://registry.npmjs.org/detect-port-alt/-/detect-port-alt-1.1.6.tgz"
- "version" "1.1.6"
- dependencies:
- "address" "^1.0.1"
- "debug" "^2.6.0"
-
-"detect-port@^1.3.0":
- "integrity" "sha512-E+B1gzkl2gqxt1IhUzwjrxBKRqx1UzC3WLONHinn8S3T6lwV/agVCyitiFOsGJ/eYuEUBvD71MZHy3Pv1G9doQ=="
- "resolved" "https://registry.npmjs.org/detect-port/-/detect-port-1.3.0.tgz"
- "version" "1.3.0"
- dependencies:
- "address" "^1.0.1"
- "debug" "^2.6.0"
-
-"dir-glob@^3.0.1":
- "integrity" "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA=="
- "resolved" "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz"
- "version" "3.0.1"
- dependencies:
- "path-type" "^4.0.0"
-
-"dns-equal@^1.0.0":
- "integrity" "sha1-s55/HabrCnW6nBcySzR1PEfgZU0= sha512-z+paD6YUQsk+AbGCEM4PrOXSss5gd66QfcVBFTKR/HpFL9jCqikS94HYwKww6fQyO7IxrIIyUu+g0Ka9tUS2Cg=="
- "resolved" "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz"
- "version" "1.0.0"
-
-"dns-packet@^5.2.2":
- "integrity" "sha512-spBwIj0TK0Ey3666GwIdWVfUpLyubpU53BTCu8iPn4r4oXd9O14Hjg3EHw3ts2oed77/SeckunUYCyRlSngqHw=="
- "resolved" "https://registry.npmjs.org/dns-packet/-/dns-packet-5.3.1.tgz"
- "version" "5.3.1"
- dependencies:
- "@leichtgewicht/ip-codec" "^2.0.1"
-
-"dom-converter@^0.2.0":
- "integrity" "sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA=="
- "resolved" "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz"
- "version" "0.2.0"
- dependencies:
- "utila" "~0.4"
-
-"dom-serializer@^1.0.1", "dom-serializer@^1.3.2":
- "integrity" "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag=="
- "resolved" "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz"
- "version" "1.4.1"
- dependencies:
- "domelementtype" "^2.0.1"
- "domhandler" "^4.2.0"
- "entities" "^2.0.0"
-
-"dom-serializer@~0.1.0", "dom-serializer@0":
- "integrity" "sha512-l0IU0pPzLWSHBcieZbpOKgkIn3ts3vAh7ZuFyXNwJxJXk/c4Gwj9xaTJwIDVQCXawWD0qb3IzMGH5rglQaO0XA=="
- "resolved" "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.1.tgz"
- "version" "0.1.1"
- dependencies:
- "domelementtype" "^1.3.0"
- "entities" "^1.1.1"
-
-"domelementtype@^1.3.0", "domelementtype@^1.3.1", "domelementtype@1":
- "integrity" "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w=="
- "resolved" "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz"
- "version" "1.3.1"
-
-"domelementtype@^2.0.1", "domelementtype@^2.2.0":
- "integrity" "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw=="
- "resolved" "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz"
- "version" "2.3.0"
-
-"domhandler@^2.3.0":
- "integrity" "sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA=="
- "resolved" "https://registry.npmjs.org/domhandler/-/domhandler-2.4.2.tgz"
- "version" "2.4.2"
- dependencies:
- "domelementtype" "1"
-
-"domhandler@^4.0.0", "domhandler@^4.2.0", "domhandler@^4.3.1":
- "integrity" "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ=="
- "resolved" "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz"
- "version" "4.3.1"
- dependencies:
- "domelementtype" "^2.2.0"
-
-"domutils@^1.5.1", "domutils@1.5.1":
- "integrity" "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8= sha512-gSu5Oi/I+3wDENBsOWBiRK1eoGxcywYSqg3rR960/+EfY0CF4EX1VPkgHOZ3WiS/Jg2DtliF6BhWcHlfpYUcGw=="
- "resolved" "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz"
- "version" "1.5.1"
- dependencies:
- "dom-serializer" "0"
- "domelementtype" "1"
-
-"domutils@^1.7.0":
- "integrity" "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg=="
- "resolved" "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz"
- "version" "1.7.0"
- dependencies:
- "dom-serializer" "0"
- "domelementtype" "1"
-
-"domutils@^2.5.2", "domutils@^2.8.0":
- "integrity" "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A=="
- "resolved" "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz"
- "version" "2.8.0"
- dependencies:
- "dom-serializer" "^1.0.1"
- "domelementtype" "^2.2.0"
- "domhandler" "^4.2.0"
-
-"dot-case@^3.0.4":
- "integrity" "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w=="
- "resolved" "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz"
- "version" "3.0.4"
- dependencies:
- "no-case" "^3.0.4"
- "tslib" "^2.0.3"
-
-"dot-prop@^5.2.0":
- "integrity" "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q=="
- "resolved" "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz"
- "version" "5.3.0"
- dependencies:
- "is-obj" "^2.0.0"
-
-"duplexer@^0.1.2":
- "integrity" "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg=="
- "resolved" "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz"
- "version" "0.1.2"
-
-"duplexer3@^0.1.4":
- "integrity" "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI= sha512-CEj8FwwNA4cVH2uFCoHUrmojhYh1vmCdOaneKJXwkeY1i9jnlslVo9dx+hQ5Hl9GnH/Bwy/IjxAyOePyPKYnzA=="
- "resolved" "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz"
- "version" "0.1.4"
-
-"eastasianwidth@^0.2.0":
- "integrity" "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA=="
- "resolved" "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz"
- "version" "0.2.0"
-
-"ee-first@1.1.1":
- "integrity" "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow=="
- "resolved" "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz"
- "version" "1.1.1"
-
-"electron-to-chromium@^1.4.118":
- "integrity" "sha512-0Rcpald12O11BUogJagX3HsCN3FE83DSqWjgXoHo5a72KUKMSfI39XBgJpgNNxS9fuGzytaFjE06kZkiVFy2qA=="
- "resolved" "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.137.tgz"
- "version" "1.4.137"
-
-"emoji-regex@^8.0.0":
- "integrity" "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="
- "resolved" "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz"
- "version" "8.0.0"
-
-"emoji-regex@^9.2.2":
- "integrity" "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg=="
- "resolved" "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz"
- "version" "9.2.2"
-
-"emojis-list@^3.0.0":
- "integrity" "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q=="
- "resolved" "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz"
- "version" "3.0.0"
-
-"emoticon@^3.2.0":
- "integrity" "sha512-SNujglcLTTg+lDAcApPNgEdudaqQFiAbJCqzjNxJkvN9vAwCGi0uu8IUVvx+f16h+V44KCY6Y2yboroc9pilHg=="
- "resolved" "https://registry.npmjs.org/emoticon/-/emoticon-3.2.0.tgz"
- "version" "3.2.0"
-
-"encodeurl@~1.0.2":
- "integrity" "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k= sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w=="
- "resolved" "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz"
- "version" "1.0.2"
-
-"end-of-stream@^1.1.0":
- "integrity" "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q=="
- "resolved" "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz"
- "version" "1.4.4"
- dependencies:
- "once" "^1.4.0"
-
-"enhanced-resolve@^5.9.3":
- "integrity" "sha512-Bq9VSor+kjvW3f9/MiiR4eE3XYgOl7/rS8lnSxbRbF3kS0B2r+Y9w5krBWxZgDxASVZbdYrn5wT4j/Wb0J9qow=="
- "resolved" "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.9.3.tgz"
- "version" "5.9.3"
- dependencies:
- "graceful-fs" "^4.2.4"
- "tapable" "^2.2.0"
-
-"entities@^1.1.1", "entities@~1.1.1":
- "integrity" "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w=="
- "resolved" "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz"
- "version" "1.1.2"
-
-"entities@^2.0.0":
- "integrity" "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A=="
- "resolved" "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz"
- "version" "2.2.0"
-
-"entities@^3.0.1":
- "integrity" "sha512-WiyBqoomrwMdFG1e0kqvASYfnlb0lp8M5o5Fw2OFq1hNZxxcNk8Ik0Xm7LxzBhuidnZB/UtBqVCgUz3kBOP51Q=="
- "resolved" "https://registry.npmjs.org/entities/-/entities-3.0.1.tgz"
- "version" "3.0.1"
-
-"error-ex@^1.3.1":
- "integrity" "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g=="
- "resolved" "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz"
- "version" "1.3.2"
- dependencies:
- "is-arrayish" "^0.2.1"
-
-"es-abstract@^1.17.2", "es-abstract@^1.19.1":
- "integrity" "sha512-2vJ6tjA/UfqLm2MPs7jxVybLoB8i1t1Jd9R3kISld20sIxPcTbLuggQOUxeWeAvIUkduv/CfMjuh4WmiXr2v9w=="
- "resolved" "https://registry.npmjs.org/es-abstract/-/es-abstract-1.19.1.tgz"
- "version" "1.19.1"
- dependencies:
- "call-bind" "^1.0.2"
- "es-to-primitive" "^1.2.1"
- "function-bind" "^1.1.1"
- "get-intrinsic" "^1.1.1"
- "get-symbol-description" "^1.0.0"
- "has" "^1.0.3"
- "has-symbols" "^1.0.2"
- "internal-slot" "^1.0.3"
- "is-callable" "^1.2.4"
- "is-negative-zero" "^2.0.1"
- "is-regex" "^1.1.4"
- "is-shared-array-buffer" "^1.0.1"
- "is-string" "^1.0.7"
- "is-weakref" "^1.0.1"
- "object-inspect" "^1.11.0"
- "object-keys" "^1.1.1"
- "object.assign" "^4.1.2"
- "string.prototype.trimend" "^1.0.4"
- "string.prototype.trimstart" "^1.0.4"
- "unbox-primitive" "^1.0.1"
-
-"es-module-lexer@^0.9.0":
- "integrity" "sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ=="
- "resolved" "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.9.3.tgz"
- "version" "0.9.3"
-
-"es-to-primitive@^1.2.1":
- "integrity" "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA=="
- "resolved" "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz"
- "version" "1.2.1"
- dependencies:
- "is-callable" "^1.1.4"
- "is-date-object" "^1.0.1"
- "is-symbol" "^1.0.2"
-
-"escalade@^3.1.1":
- "integrity" "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw=="
- "resolved" "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz"
- "version" "3.1.1"
-
-"escape-goat@^2.0.0":
- "integrity" "sha512-8/uIhbG12Csjy2JEW7D9pHbreaVaS/OpN3ycnyvElTdwM5n6GY6W6e2IPemfvGZeUMqZ9A/3GqIZMgKnBhAw/Q=="
- "resolved" "https://registry.npmjs.org/escape-goat/-/escape-goat-2.1.1.tgz"
- "version" "2.1.1"
-
-"escape-html@^1.0.3", "escape-html@~1.0.3":
- "integrity" "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg= sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow=="
- "resolved" "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz"
- "version" "1.0.3"
-
-"escape-string-regexp@^1.0.5":
- "integrity" "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg=="
- "resolved" "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz"
- "version" "1.0.5"
-
-"escape-string-regexp@^4.0.0":
- "integrity" "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA=="
- "resolved" "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz"
- "version" "4.0.0"
-
-"eslint-scope@5.1.1":
- "integrity" "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw=="
- "resolved" "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz"
- "version" "5.1.1"
- dependencies:
- "esrecurse" "^4.3.0"
- "estraverse" "^4.1.1"
-
-"esprima@^4.0.0":
- "integrity" "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A=="
- "resolved" "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz"
- "version" "4.0.1"
-
-"esrecurse@^4.3.0":
- "integrity" "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag=="
- "resolved" "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz"
- "version" "4.3.0"
- dependencies:
- "estraverse" "^5.2.0"
-
-"estraverse@^4.1.1":
- "integrity" "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw=="
- "resolved" "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz"
- "version" "4.3.0"
-
-"estraverse@^5.2.0":
- "integrity" "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA=="
- "resolved" "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz"
- "version" "5.3.0"
-
-"esutils@^2.0.2":
- "integrity" "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g=="
- "resolved" "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz"
- "version" "2.0.3"
-
-"eta@^1.12.3":
- "integrity" "sha512-qHixwbDLtekO/d51Yr4glcaUJCIjGVJyTzuqV4GPlgZo1YpgOKG+avQynErZIYrfM6JIJdtiG2Kox8tbb+DoGg=="
- "resolved" "https://registry.npmjs.org/eta/-/eta-1.12.3.tgz"
- "version" "1.12.3"
-
-"etag@~1.8.1":
- "integrity" "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc= sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg=="
- "resolved" "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz"
- "version" "1.8.1"
-
-"eval@^0.1.8":
- "integrity" "sha512-EzV94NYKoO09GLXGjXj9JIlXijVck4ONSr5wiCWDvhsvj5jxSrzTmRU/9C1DyB6uToszLs8aifA6NQ7lEQdvFw=="
- "resolved" "https://registry.npmjs.org/eval/-/eval-0.1.8.tgz"
- "version" "0.1.8"
- dependencies:
- "@types/node" "*"
- "require-like" ">= 0.1.1"
-
-"eventemitter3@^4.0.0":
- "integrity" "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw=="
- "resolved" "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz"
- "version" "4.0.7"
-
-"events@^3.2.0":
- "integrity" "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q=="
- "resolved" "https://registry.npmjs.org/events/-/events-3.3.0.tgz"
- "version" "3.3.0"
-
-"execa@^5.0.0":
- "integrity" "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg=="
- "resolved" "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz"
- "version" "5.1.1"
- 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":
- "integrity" "sha512-zZBcOX9TfehHQhtupq57OF8lFZ3UZi08Y97dwFCkD8p9d/d2Y3M+ykKcwaMDEL+4qyUolgBDX6AblpR3fL212Q=="
- "resolved" "https://registry.npmjs.org/express/-/express-4.18.1.tgz"
- "version" "4.18.1"
- dependencies:
- "accepts" "~1.3.8"
- "array-flatten" "1.1.1"
- "body-parser" "1.20.0"
- "content-disposition" "0.5.4"
- "content-type" "~1.0.4"
- "cookie" "0.5.0"
- "cookie-signature" "1.0.6"
- "debug" "2.6.9"
- "depd" "2.0.0"
- "encodeurl" "~1.0.2"
- "escape-html" "~1.0.3"
- "etag" "~1.8.1"
- "finalhandler" "1.2.0"
- "fresh" "0.5.2"
- "http-errors" "2.0.0"
- "merge-descriptors" "1.0.1"
- "methods" "~1.1.2"
- "on-finished" "2.4.1"
- "parseurl" "~1.3.3"
- "path-to-regexp" "0.1.7"
- "proxy-addr" "~2.0.7"
- "qs" "6.10.3"
- "range-parser" "~1.2.1"
- "safe-buffer" "5.2.1"
- "send" "0.18.0"
- "serve-static" "1.15.0"
- "setprototypeof" "1.2.0"
- "statuses" "2.0.1"
- "type-is" "~1.6.18"
- "utils-merge" "1.0.1"
- "vary" "~1.1.2"
-
-"extend-shallow@^2.0.1":
- "integrity" "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8= sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug=="
- "resolved" "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz"
- "version" "2.0.1"
- dependencies:
- "is-extendable" "^0.1.0"
-
-"extend@^3.0.0":
- "integrity" "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g=="
- "resolved" "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz"
- "version" "3.0.2"
-
-"fast-deep-equal@^3.1.1", "fast-deep-equal@^3.1.3":
- "integrity" "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q=="
- "resolved" "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz"
- "version" "3.1.3"
-
-"fast-glob@^3.2.11", "fast-glob@^3.2.7", "fast-glob@^3.2.9":
- "integrity" "sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew=="
- "resolved" "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz"
- "version" "3.2.11"
- dependencies:
- "@nodelib/fs.stat" "^2.0.2"
- "@nodelib/fs.walk" "^1.2.3"
- "glob-parent" "^5.1.2"
- "merge2" "^1.3.0"
- "micromatch" "^4.0.4"
-
-"fast-json-stable-stringify@^2.0.0":
- "integrity" "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw=="
- "resolved" "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz"
- "version" "2.1.0"
-
-"fast-url-parser@1.1.3":
- "integrity" "sha1-9K8+qfNNiicc9YrSs3WfQx8LMY0= sha512-5jOCVXADYNuRkKFzNJ0dCCewsZiYo0dz8QNYljkOpFC6r2U4OBmKtvm/Tsuh4w1YYdDqDb31a8TVhBJ2OJKdqQ=="
- "resolved" "https://registry.npmjs.org/fast-url-parser/-/fast-url-parser-1.1.3.tgz"
- "version" "1.1.3"
- dependencies:
- "punycode" "^1.3.2"
-
-"fastq@^1.6.0":
- "integrity" "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw=="
- "resolved" "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz"
- "version" "1.13.0"
- dependencies:
- "reusify" "^1.0.4"
-
-"faye-websocket@^0.11.3":
- "integrity" "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g=="
- "resolved" "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz"
- "version" "0.11.4"
- dependencies:
- "websocket-driver" ">=0.5.1"
-
-"fbemitter@^3.0.0":
- "integrity" "sha512-KWKaceCwKQU0+HPoop6gn4eOHk50bBv/VxjJtGMfwmJt3D29JpN4H4eisCtIPA+a8GVBam+ldMMpMjJUvpDyHw=="
- "resolved" "https://registry.npmjs.org/fbemitter/-/fbemitter-3.0.0.tgz"
- "version" "3.0.0"
- dependencies:
- "fbjs" "^3.0.0"
-
-"fbjs-css-vars@^1.0.0":
- "integrity" "sha512-b2XGFAFdWZWg0phtAWLHCk836A1Xann+I+Dgd3Gk64MHKZO44FfoD1KxyvbSh0qZsIoXQGGlVztIY+oitJPpRQ=="
- "resolved" "https://registry.npmjs.org/fbjs-css-vars/-/fbjs-css-vars-1.0.2.tgz"
- "version" "1.0.2"
-
-"fbjs@^3.0.0", "fbjs@^3.0.1":
- "integrity" "sha512-ucV0tDODnGV3JCnnkmoszb5lf4bNpzjv80K41wd4k798Etq+UYD0y0TIfalLjZoKgjive6/adkRnszwapiDgBQ=="
- "resolved" "https://registry.npmjs.org/fbjs/-/fbjs-3.0.4.tgz"
- "version" "3.0.4"
- dependencies:
- "cross-fetch" "^3.1.5"
- "fbjs-css-vars" "^1.0.0"
- "loose-envify" "^1.0.0"
- "object-assign" "^4.1.0"
- "promise" "^7.1.1"
- "setimmediate" "^1.0.5"
- "ua-parser-js" "^0.7.30"
-
-"feed@^4.2.2":
- "integrity" "sha512-u5/sxGfiMfZNtJ3OvQpXcvotFpYkL0n9u9mM2vkui2nGo8b4wvDkJ8gAkYqbA8QpGyFCv3RK0Z+Iv+9veCS9bQ=="
- "resolved" "https://registry.npmjs.org/feed/-/feed-4.2.2.tgz"
- "version" "4.2.2"
- dependencies:
- "xml-js" "^1.6.11"
-
-"file-loader@*", "file-loader@^6.2.0":
- "integrity" "sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw=="
- "resolved" "https://registry.npmjs.org/file-loader/-/file-loader-6.2.0.tgz"
- "version" "6.2.0"
- dependencies:
- "loader-utils" "^2.0.0"
- "schema-utils" "^3.0.0"
-
-"filesize@^8.0.6":
- "integrity" "sha512-pjmC+bkIF8XI7fWaH8KxHcZL3DPybs1roSKP4rKDvy20tAWwIObE4+JIseG2byfGKhud5ZnM4YSGKBz7Sh0ndQ=="
- "resolved" "https://registry.npmjs.org/filesize/-/filesize-8.0.7.tgz"
- "version" "8.0.7"
-
-"fill-range@^7.0.1":
- "integrity" "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ=="
- "resolved" "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz"
- "version" "7.0.1"
- dependencies:
- "to-regex-range" "^5.0.1"
-
-"finalhandler@1.2.0":
- "integrity" "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg=="
- "resolved" "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz"
- "version" "1.2.0"
- dependencies:
- "debug" "2.6.9"
- "encodeurl" "~1.0.2"
- "escape-html" "~1.0.3"
- "on-finished" "2.4.1"
- "parseurl" "~1.3.3"
- "statuses" "2.0.1"
- "unpipe" "~1.0.0"
-
-"find-cache-dir@^3.3.1":
- "integrity" "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig=="
- "resolved" "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz"
- "version" "3.3.2"
- dependencies:
- "commondir" "^1.0.1"
- "make-dir" "^3.0.2"
- "pkg-dir" "^4.1.0"
-
-"find-up@^3.0.0":
- "integrity" "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg=="
- "resolved" "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz"
- "version" "3.0.0"
- dependencies:
- "locate-path" "^3.0.0"
-
-"find-up@^4.0.0":
- "integrity" "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw=="
- "resolved" "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz"
- "version" "4.1.0"
- dependencies:
- "locate-path" "^5.0.0"
- "path-exists" "^4.0.0"
-
-"find-up@^5.0.0":
- "integrity" "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng=="
- "resolved" "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz"
- "version" "5.0.0"
- dependencies:
- "locate-path" "^6.0.0"
- "path-exists" "^4.0.0"
-
-"flux@^4.0.1":
- "integrity" "sha512-yKAbrp7JhZhj6uiT1FTuVMlIAT1J4jqEyBpFApi1kxpGZCvacMVc/t1pMQyotqHhAgvoE3bNvAykhCo2CLjnYw=="
- "resolved" "https://registry.npmjs.org/flux/-/flux-4.0.3.tgz"
- "version" "4.0.3"
- dependencies:
- "fbemitter" "^3.0.0"
- "fbjs" "^3.0.1"
-
-"follow-redirects@^1.0.0", "follow-redirects@^1.14.7":
- "integrity" "sha512-aExlJShTV4qOUOL7yF1U5tvLCB0xQuudbf6toyYA0E/acBNw71mvjFTnLaRp50aQaYocMR0a/RMMBIHeZnGyjQ=="
- "resolved" "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.0.tgz"
- "version" "1.15.0"
-
-"fork-ts-checker-webpack-plugin@^6.5.0":
- "integrity" "sha512-m5cUmF30xkZ7h4tWUgTAcEaKmUW7tfyUyTqNNOz7OxWJ0v1VWKTcOvH8FWHUwSjlW/356Ijc9vi3XfcPstpQKA=="
- "resolved" "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-6.5.2.tgz"
- "version" "6.5.2"
- dependencies:
- "@babel/code-frame" "^7.8.3"
- "@types/json-schema" "^7.0.5"
- "chalk" "^4.1.0"
- "chokidar" "^3.4.2"
- "cosmiconfig" "^6.0.0"
- "deepmerge" "^4.2.2"
- "fs-extra" "^9.0.0"
- "glob" "^7.1.6"
- "memfs" "^3.1.2"
- "minimatch" "^3.0.4"
- "schema-utils" "2.7.0"
- "semver" "^7.3.2"
- "tapable" "^1.0.0"
-
-"forwarded@0.2.0":
- "integrity" "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow=="
- "resolved" "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz"
- "version" "0.2.0"
-
-"fraction.js@^4.2.0":
- "integrity" "sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA=="
- "resolved" "https://registry.npmjs.org/fraction.js/-/fraction.js-4.2.0.tgz"
- "version" "4.2.0"
-
-"fresh@0.5.2":
- "integrity" "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac= sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q=="
- "resolved" "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz"
- "version" "0.5.2"
-
-"fs-extra@^10.1.0":
- "integrity" "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ=="
- "resolved" "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz"
- "version" "10.1.0"
- dependencies:
- "graceful-fs" "^4.2.0"
- "jsonfile" "^6.0.1"
- "universalify" "^2.0.0"
-
-"fs-extra@^9.0.0":
- "integrity" "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ=="
- "resolved" "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz"
- "version" "9.1.0"
- dependencies:
- "at-least-node" "^1.0.0"
- "graceful-fs" "^4.2.0"
- "jsonfile" "^6.0.1"
- "universalify" "^2.0.0"
-
-"fs-monkey@1.0.3":
- "integrity" "sha512-cybjIfiiE+pTWicSCLFHSrXZ6EilF30oh91FDP9S2B051prEa7QWfrVTQm10/dDpswBDXZugPa1Ogu8Yh+HV0Q=="
- "resolved" "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.3.tgz"
- "version" "1.0.3"
-
-"fs.realpath@^1.0.0":
- "integrity" "sha1-FQStJSMVjKpA20onh8sBQRmU6k8= sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw=="
- "resolved" "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz"
- "version" "1.0.0"
-
-"fsevents@~2.3.2":
- "integrity" "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA=="
- "resolved" "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz"
- "version" "2.3.2"
-
-"function-bind@^1.1.1":
- "integrity" "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A=="
- "resolved" "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz"
- "version" "1.1.1"
-
-"gensync@^1.0.0-beta.1", "gensync@^1.0.0-beta.2":
- "integrity" "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg=="
- "resolved" "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz"
- "version" "1.0.0-beta.2"
-
-"get-intrinsic@^1.0.2", "get-intrinsic@^1.1.0", "get-intrinsic@^1.1.1":
- "integrity" "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q=="
- "resolved" "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz"
- "version" "1.1.1"
- dependencies:
- "function-bind" "^1.1.1"
- "has" "^1.0.3"
- "has-symbols" "^1.0.1"
-
-"get-own-enumerable-property-symbols@^3.0.0":
- "integrity" "sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g=="
- "resolved" "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz"
- "version" "3.0.2"
-
-"get-stream@^4.1.0":
- "integrity" "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w=="
- "resolved" "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz"
- "version" "4.1.0"
- dependencies:
- "pump" "^3.0.0"
-
-"get-stream@^5.1.0":
- "integrity" "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA=="
- "resolved" "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz"
- "version" "5.2.0"
- dependencies:
- "pump" "^3.0.0"
-
-"get-stream@^6.0.0":
- "integrity" "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg=="
- "resolved" "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz"
- "version" "6.0.1"
-
-"get-symbol-description@^1.0.0":
- "integrity" "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw=="
- "resolved" "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz"
- "version" "1.0.0"
- dependencies:
- "call-bind" "^1.0.2"
- "get-intrinsic" "^1.1.1"
-
-"github-slugger@^1.4.0":
- "integrity" "sha512-w0dzqw/nt51xMVmlaV1+JRzN+oCa1KfcgGEWhxUG16wbdA+Xnt/yoFO8Z8x/V82ZcZ0wy6ln9QDup5avbhiDhQ=="
- "resolved" "https://registry.npmjs.org/github-slugger/-/github-slugger-1.4.0.tgz"
- "version" "1.4.0"
-
-"glob-parent@^5.1.2", "glob-parent@~5.1.2":
- "integrity" "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow=="
- "resolved" "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz"
- "version" "5.1.2"
- dependencies:
- "is-glob" "^4.0.1"
-
-"glob-parent@^6.0.1":
- "integrity" "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A=="
- "resolved" "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz"
- "version" "6.0.2"
- dependencies:
- "is-glob" "^4.0.3"
-
-"glob-to-regexp@^0.4.1":
- "integrity" "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw=="
- "resolved" "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz"
- "version" "0.4.1"
-
-"glob@^7.0.0", "glob@^7.1.3", "glob@^7.1.6":
- "integrity" "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q=="
- "resolved" "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz"
- "version" "7.2.0"
- dependencies:
- "fs.realpath" "^1.0.0"
- "inflight" "^1.0.4"
- "inherits" "2"
- "minimatch" "^3.0.4"
- "once" "^1.3.0"
- "path-is-absolute" "^1.0.0"
-
-"global-dirs@^3.0.0":
- "integrity" "sha512-v8ho2DS5RiCjftj1nD9NmnfaOzTdud7RRnVd9kFNOjqZbISlx5DQ+OrTkywgd0dIt7oFCvKetZSHoHcP3sDdiA=="
- "resolved" "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.0.tgz"
- "version" "3.0.0"
- dependencies:
- "ini" "2.0.0"
-
-"global-modules@^2.0.0":
- "integrity" "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A=="
- "resolved" "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz"
- "version" "2.0.0"
- dependencies:
- "global-prefix" "^3.0.0"
-
-"global-prefix@^3.0.0":
- "integrity" "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg=="
- "resolved" "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz"
- "version" "3.0.0"
- dependencies:
- "ini" "^1.3.5"
- "kind-of" "^6.0.2"
- "which" "^1.3.1"
-
-"globals@^11.1.0":
- "integrity" "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA=="
- "resolved" "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz"
- "version" "11.12.0"
-
-"globby@^11.0.1", "globby@^11.0.4", "globby@^11.1.0":
- "integrity" "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g=="
- "resolved" "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz"
- "version" "11.1.0"
- dependencies:
- "array-union" "^2.1.0"
- "dir-glob" "^3.0.1"
- "fast-glob" "^3.2.9"
- "ignore" "^5.2.0"
- "merge2" "^1.4.1"
- "slash" "^3.0.0"
-
-"globby@^12.0.2":
- "integrity" "sha512-wiSuFQLZ+urS9x2gGPl1H5drc5twabmm4m2gTR27XDFyjUHJUNsS8o/2aKyIF6IoBaR630atdher0XJ5g6OMmA=="
- "resolved" "https://registry.npmjs.org/globby/-/globby-12.2.0.tgz"
- "version" "12.2.0"
- dependencies:
- "array-union" "^3.0.1"
- "dir-glob" "^3.0.1"
- "fast-glob" "^3.2.7"
- "ignore" "^5.1.9"
- "merge2" "^1.4.1"
- "slash" "^4.0.0"
-
-"globby@^13.1.1":
- "integrity" "sha512-XMzoDZbGZ37tufiv7g0N4F/zp3zkwdFtVbV3EHsVl1KQr4RPLfNoT068/97RPshz2J5xYNEjLKKBKaGHifBd3Q=="
- "resolved" "https://registry.npmjs.org/globby/-/globby-13.1.1.tgz"
- "version" "13.1.1"
- dependencies:
- "dir-glob" "^3.0.1"
- "fast-glob" "^3.2.11"
- "ignore" "^5.2.0"
- "merge2" "^1.4.1"
- "slash" "^4.0.0"
-
-"got@^9.6.0":
- "integrity" "sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q=="
- "resolved" "https://registry.npmjs.org/got/-/got-9.6.0.tgz"
- "version" "9.6.0"
- dependencies:
- "@sindresorhus/is" "^0.14.0"
- "@szmarczak/http-timer" "^1.1.2"
- "cacheable-request" "^6.0.0"
- "decompress-response" "^3.3.0"
- "duplexer3" "^0.1.4"
- "get-stream" "^4.1.0"
- "lowercase-keys" "^1.0.1"
- "mimic-response" "^1.0.1"
- "p-cancelable" "^1.0.0"
- "to-readable-stream" "^1.0.0"
- "url-parse-lax" "^3.0.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":
- "integrity" "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA=="
- "resolved" "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz"
- "version" "4.2.10"
-
-"gray-matter@^4.0.3":
- "integrity" "sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q=="
- "resolved" "https://registry.npmjs.org/gray-matter/-/gray-matter-4.0.3.tgz"
- "version" "4.0.3"
- dependencies:
- "js-yaml" "^3.13.1"
- "kind-of" "^6.0.2"
- "section-matter" "^1.0.0"
- "strip-bom-string" "^1.0.0"
-
-"gzip-size@^6.0.0":
- "integrity" "sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q=="
- "resolved" "https://registry.npmjs.org/gzip-size/-/gzip-size-6.0.0.tgz"
- "version" "6.0.0"
- dependencies:
- "duplexer" "^0.1.2"
-
-"handle-thing@^2.0.0":
- "integrity" "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg=="
- "resolved" "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz"
- "version" "2.0.1"
-
-"has-bigints@^1.0.1":
- "integrity" "sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA=="
- "resolved" "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.1.tgz"
- "version" "1.0.1"
-
-"has-flag@^3.0.0":
- "integrity" "sha1-tdRU3CGZriJWmfNGfloH87lVuv0= sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw=="
- "resolved" "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz"
- "version" "3.0.0"
-
-"has-flag@^4.0.0":
- "integrity" "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="
- "resolved" "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz"
- "version" "4.0.0"
-
-"has-symbols@^1.0.1", "has-symbols@^1.0.2":
- "integrity" "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw=="
- "resolved" "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz"
- "version" "1.0.2"
-
-"has-tostringtag@^1.0.0":
- "integrity" "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ=="
- "resolved" "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz"
- "version" "1.0.0"
- dependencies:
- "has-symbols" "^1.0.2"
-
-"has-yarn@^2.1.0":
- "integrity" "sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw=="
- "resolved" "https://registry.npmjs.org/has-yarn/-/has-yarn-2.1.0.tgz"
- "version" "2.1.0"
-
-"has@^1.0.3":
- "integrity" "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw=="
- "resolved" "https://registry.npmjs.org/has/-/has-1.0.3.tgz"
- "version" "1.0.3"
- dependencies:
- "function-bind" "^1.1.1"
-
-"hast-to-hyperscript@^9.0.0":
- "integrity" "sha512-zQgLKqF+O2F72S1aa4y2ivxzSlko3MAvxkwG8ehGmNiqd98BIN3JM1rAJPmplEyLmGLO2QZYJtIneOSZ2YbJuA=="
- "resolved" "https://registry.npmjs.org/hast-to-hyperscript/-/hast-to-hyperscript-9.0.1.tgz"
- "version" "9.0.1"
- dependencies:
- "@types/unist" "^2.0.3"
- "comma-separated-tokens" "^1.0.0"
- "property-information" "^5.3.0"
- "space-separated-tokens" "^1.0.0"
- "style-to-object" "^0.3.0"
- "unist-util-is" "^4.0.0"
- "web-namespaces" "^1.0.0"
-
-"hast-util-from-parse5@^5.0.0":
- "integrity" "sha512-gOc8UB99F6eWVWFtM9jUikjN7QkWxB3nY0df5Z0Zq1/Nkwl5V4hAAsl0tmwlgWl/1shlTF8DnNYLO8X6wRV9pA=="
- "resolved" "https://registry.npmjs.org/hast-util-from-parse5/-/hast-util-from-parse5-5.0.3.tgz"
- "version" "5.0.3"
- dependencies:
- "ccount" "^1.0.3"
- "hastscript" "^5.0.0"
- "property-information" "^5.0.0"
- "web-namespaces" "^1.1.2"
- "xtend" "^4.0.1"
-
-"hast-util-from-parse5@^6.0.0":
- "integrity" "sha512-jeJUWiN5pSxW12Rh01smtVkZgZr33wBokLzKLwinYOUfSzm1Nl/c3GUGebDyOKjdsRgMvoVbV0VpAcpjF4NrJA=="
- "resolved" "https://registry.npmjs.org/hast-util-from-parse5/-/hast-util-from-parse5-6.0.1.tgz"
- "version" "6.0.1"
- dependencies:
- "@types/parse5" "^5.0.0"
- "hastscript" "^6.0.0"
- "property-information" "^5.0.0"
- "vfile" "^4.0.0"
- "vfile-location" "^3.2.0"
- "web-namespaces" "^1.0.0"
-
-"hast-util-parse-selector@^2.0.0":
- "integrity" "sha512-7j6mrk/qqkSehsM92wQjdIgWM2/BW61u/53G6xmC8i1OmEdKLHbk419QKQUjz6LglWsfqoiHmyMRkP1BGjecNQ=="
- "resolved" "https://registry.npmjs.org/hast-util-parse-selector/-/hast-util-parse-selector-2.2.5.tgz"
- "version" "2.2.5"
-
-"hast-util-raw@6.0.1":
- "integrity" "sha512-ZMuiYA+UF7BXBtsTBNcLBF5HzXzkyE6MLzJnL605LKE8GJylNjGc4jjxazAHUtcwT5/CEt6afRKViYB4X66dig=="
- "resolved" "https://registry.npmjs.org/hast-util-raw/-/hast-util-raw-6.0.1.tgz"
- "version" "6.0.1"
- dependencies:
- "@types/hast" "^2.0.0"
- "hast-util-from-parse5" "^6.0.0"
- "hast-util-to-parse5" "^6.0.0"
- "html-void-elements" "^1.0.0"
- "parse5" "^6.0.0"
- "unist-util-position" "^3.0.0"
- "vfile" "^4.0.0"
- "web-namespaces" "^1.0.0"
- "xtend" "^4.0.0"
- "zwitch" "^1.0.0"
-
-"hast-util-to-parse5@^6.0.0":
- "integrity" "sha512-Lu5m6Lgm/fWuz8eWnrKezHtVY83JeRGaNQ2kn9aJgqaxvVkFCZQBEhgodZUDUvoodgyROHDb3r5IxAEdl6suJQ=="
- "resolved" "https://registry.npmjs.org/hast-util-to-parse5/-/hast-util-to-parse5-6.0.0.tgz"
- "version" "6.0.0"
- dependencies:
- "hast-to-hyperscript" "^9.0.0"
- "property-information" "^5.0.0"
- "web-namespaces" "^1.0.0"
- "xtend" "^4.0.0"
- "zwitch" "^1.0.0"
-
-"hastscript@^5.0.0":
- "integrity" "sha512-WlztFuK+Lrvi3EggsqOkQ52rKbxkXL3RwB6t5lwoa8QLMemoWfBuL43eDrwOamJyR7uKQKdmKYaBH1NZBiIRrQ=="
- "resolved" "https://registry.npmjs.org/hastscript/-/hastscript-5.1.2.tgz"
- "version" "5.1.2"
- dependencies:
- "comma-separated-tokens" "^1.0.0"
- "hast-util-parse-selector" "^2.0.0"
- "property-information" "^5.0.0"
- "space-separated-tokens" "^1.0.0"
-
-"hastscript@^6.0.0":
- "integrity" "sha512-nDM6bvd7lIqDUiYEiu5Sl/+6ReP0BMk/2f4U/Rooccxkj0P5nm+acM5PrGJ/t5I8qPGiqZSE6hVAwZEdZIvP4w=="
- "resolved" "https://registry.npmjs.org/hastscript/-/hastscript-6.0.0.tgz"
- "version" "6.0.0"
- dependencies:
- "@types/hast" "^2.0.0"
- "comma-separated-tokens" "^1.0.0"
- "hast-util-parse-selector" "^2.0.0"
- "property-information" "^5.0.0"
- "space-separated-tokens" "^1.0.0"
-
-"he@^1.2.0":
- "integrity" "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw=="
- "resolved" "https://registry.npmjs.org/he/-/he-1.2.0.tgz"
- "version" "1.2.0"
-
-"history@^4.9.0":
- "integrity" "sha512-36nwAD620w12kuzPAsyINPWJqlNbij+hpK1k9XRloDtym8mxzGYl2c17LnV6IAGB2Dmg4tEa7G7DlawS0+qjew=="
- "resolved" "https://registry.npmjs.org/history/-/history-4.10.1.tgz"
- "version" "4.10.1"
- dependencies:
- "@babel/runtime" "^7.1.2"
- "loose-envify" "^1.2.0"
- "resolve-pathname" "^3.0.0"
- "tiny-invariant" "^1.0.2"
- "tiny-warning" "^1.0.0"
- "value-equal" "^1.0.1"
-
-"hoist-non-react-statics@^3.1.0":
- "integrity" "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw=="
- "resolved" "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz"
- "version" "3.3.2"
- dependencies:
- "react-is" "^16.7.0"
-
-"hpack.js@^2.1.6":
- "integrity" "sha1-h3dMCUnlE/QuhFdbPEVoH63ioLI= sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ=="
- "resolved" "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz"
- "version" "2.1.6"
- dependencies:
- "inherits" "^2.0.1"
- "obuf" "^1.0.0"
- "readable-stream" "^2.0.1"
- "wbuf" "^1.1.0"
-
-"html-entities@^2.3.2":
- "integrity" "sha512-DV5Ln36z34NNTDgnz0EWGBLZENelNAtkiFA4kyNOG2tDI6Mz1uSWiq1wAKdyjnJwyDiDO7Fa2SO1CTxPXL8VxA=="
- "resolved" "https://registry.npmjs.org/html-entities/-/html-entities-2.3.3.tgz"
- "version" "2.3.3"
-
-"html-minifier-terser@^6.0.2", "html-minifier-terser@^6.1.0":
- "integrity" "sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw=="
- "resolved" "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz"
- "version" "6.1.0"
- dependencies:
- "camel-case" "^4.1.2"
- "clean-css" "^5.2.2"
- "commander" "^8.3.0"
- "he" "^1.2.0"
- "param-case" "^3.0.4"
- "relateurl" "^0.2.7"
- "terser" "^5.10.0"
-
-"html-tags@^3.2.0":
- "integrity" "sha512-vy7ClnArOZwCnqZgvv+ddgHgJiAFXe3Ge9ML5/mBctVJoUoYPCdxVucOywjDARn6CVoh3dRSFdPHy2sX80L0Wg=="
- "resolved" "https://registry.npmjs.org/html-tags/-/html-tags-3.2.0.tgz"
- "version" "3.2.0"
-
-"html-void-elements@^1.0.0":
- "integrity" "sha512-uE/TxKuyNIcx44cIWnjr/rfIATDH7ZaOMmstu0CwhFG1Dunhlp4OC6/NMbhiwoq5BpW0ubi303qnEk/PZj614w=="
- "resolved" "https://registry.npmjs.org/html-void-elements/-/html-void-elements-1.0.5.tgz"
- "version" "1.0.5"
-
-"html-webpack-plugin@^5.5.0":
- "integrity" "sha512-sy88PC2cRTVxvETRgUHFrL4No3UxvcH8G1NepGhqaTT+GXN2kTamqasot0inS5hXeg1cMbFDt27zzo9p35lZVw=="
- "resolved" "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-5.5.0.tgz"
- "version" "5.5.0"
- dependencies:
- "@types/html-minifier-terser" "^6.0.0"
- "html-minifier-terser" "^6.0.2"
- "lodash" "^4.17.21"
- "pretty-error" "^4.0.0"
- "tapable" "^2.0.0"
-
-"htmlparser2@^3.9.1":
- "integrity" "sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ=="
- "resolved" "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.10.1.tgz"
- "version" "3.10.1"
- dependencies:
- "domelementtype" "^1.3.1"
- "domhandler" "^2.3.0"
- "domutils" "^1.5.1"
- "entities" "^1.1.1"
- "inherits" "^2.0.1"
- "readable-stream" "^3.1.1"
-
-"htmlparser2@^6.1.0":
- "integrity" "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A=="
- "resolved" "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz"
- "version" "6.1.0"
- dependencies:
- "domelementtype" "^2.0.1"
- "domhandler" "^4.0.0"
- "domutils" "^2.5.2"
- "entities" "^2.0.0"
-
-"http-cache-semantics@^4.0.0":
- "integrity" "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ=="
- "resolved" "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz"
- "version" "4.1.0"
-
-"http-deceiver@^1.2.7":
- "integrity" "sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc= sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw=="
- "resolved" "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz"
- "version" "1.2.7"
-
-"http-errors@~1.6.2":
- "integrity" "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0= sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A=="
- "resolved" "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz"
- "version" "1.6.3"
- dependencies:
- "depd" "~1.1.2"
- "inherits" "2.0.3"
- "setprototypeof" "1.1.0"
- "statuses" ">= 1.4.0 < 2"
-
-"http-errors@2.0.0":
- "integrity" "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ=="
- "resolved" "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz"
- "version" "2.0.0"
- 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":
- "integrity" "sha512-vDlkRPDJn93swjcjqMSaGSPABbIarsr1TLAui/gLDXzV5VsJNdXNzMYDyNBLQkjWQCJ1uizu8T2oDMhmGt0PRA=="
- "resolved" "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.6.tgz"
- "version" "0.5.6"
-
-"http-proxy-middleware@^2.0.3":
- "integrity" "sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw=="
- "resolved" "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz"
- "version" "2.0.6"
- dependencies:
- "@types/http-proxy" "^1.17.8"
- "http-proxy" "^1.18.1"
- "is-glob" "^4.0.1"
- "is-plain-obj" "^3.0.0"
- "micromatch" "^4.0.2"
-
-"http-proxy@^1.18.1":
- "integrity" "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ=="
- "resolved" "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz"
- "version" "1.18.1"
- dependencies:
- "eventemitter3" "^4.0.0"
- "follow-redirects" "^1.0.0"
- "requires-port" "^1.0.0"
-
-"human-signals@^2.1.0":
- "integrity" "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw=="
- "resolved" "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz"
- "version" "2.1.0"
-
-"iconv-lite@0.4.24":
- "integrity" "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA=="
- "resolved" "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz"
- "version" "0.4.24"
- dependencies:
- "safer-buffer" ">= 2.1.2 < 3"
-
-"icss-utils@^5.0.0", "icss-utils@^5.1.0":
- "integrity" "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA=="
- "resolved" "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz"
- "version" "5.1.0"
-
-"ignore@^5.1.9", "ignore@^5.2.0":
- "integrity" "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ=="
- "resolved" "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz"
- "version" "5.2.0"
-
-"image-size@^1.0.1":
- "integrity" "sha512-VAwkvNSNGClRw9mDHhc5Efax8PLlsOGcUTh0T/LIriC8vPA3U5PdqXWqkz406MoYHMKW8Uf9gWr05T/rYB44kQ=="
- "resolved" "https://registry.npmjs.org/image-size/-/image-size-1.0.1.tgz"
- "version" "1.0.1"
- dependencies:
- "queue" "6.0.2"
-
-"immer@^9.0.7":
- "integrity" "sha512-ubBeqQutOSLIFCUBN03jGeOS6a3DoYlSYwYJTa+gSKEZKU5redJIqkIdZ3JVv/4RZpfcXdAWH5zCNLWPRv2WDw=="
- "resolved" "https://registry.npmjs.org/immer/-/immer-9.0.14.tgz"
- "version" "9.0.14"
-
-"import-fresh@^3.1.0", "import-fresh@^3.2.1", "import-fresh@^3.3.0":
- "integrity" "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw=="
- "resolved" "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz"
- "version" "3.3.0"
- dependencies:
- "parent-module" "^1.0.0"
- "resolve-from" "^4.0.0"
-
-"import-lazy@^2.1.0":
- "integrity" "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM= sha512-m7ZEHgtw69qOGw+jwxXkHlrlIPdTGkyh66zXZ1ajZbxkDBNjSY/LGbmjc7h0s2ELsUDTAhFr55TrPSSqJGPG0A=="
- "resolved" "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz"
- "version" "2.1.0"
-
-"imurmurhash@^0.1.4":
- "integrity" "sha1-khi5srkoojixPcT7a21XbyMUU+o= sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA=="
- "resolved" "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz"
- "version" "0.1.4"
-
-"indent-string@^4.0.0":
- "integrity" "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg=="
- "resolved" "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz"
- "version" "4.0.0"
-
-"infima@0.2.0-alpha.39":
- "integrity" "sha512-UyYiwD3nwHakGhuOUfpe3baJ8gkiPpRVx4a4sE/Ag+932+Y6swtLsdPoRR8ezhwqGnduzxmFkjumV9roz6QoLw=="
- "resolved" "https://registry.npmjs.org/infima/-/infima-0.2.0-alpha.39.tgz"
- "version" "0.2.0-alpha.39"
-
-"inflight@^1.0.4":
- "integrity" "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA=="
- "resolved" "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz"
- "version" "1.0.6"
- dependencies:
- "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":
- "integrity" "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
- "resolved" "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz"
- "version" "2.0.4"
-
-"inherits@2.0.3":
- "integrity" "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw=="
- "resolved" "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz"
- "version" "2.0.3"
-
-"ini@^1.3.5", "ini@~1.3.0":
- "integrity" "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew=="
- "resolved" "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz"
- "version" "1.3.8"
-
-"ini@2.0.0":
- "integrity" "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA=="
- "resolved" "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz"
- "version" "2.0.0"
-
-"inline-style-parser@0.1.1":
- "integrity" "sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q=="
- "resolved" "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.1.1.tgz"
- "version" "0.1.1"
-
-"internal-slot@^1.0.3":
- "integrity" "sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA=="
- "resolved" "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz"
- "version" "1.0.3"
- dependencies:
- "get-intrinsic" "^1.1.0"
- "has" "^1.0.3"
- "side-channel" "^1.0.4"
-
-"interpret@^1.0.0":
- "integrity" "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA=="
- "resolved" "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz"
- "version" "1.4.0"
-
-"invariant@^2.2.4":
- "integrity" "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA=="
- "resolved" "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz"
- "version" "2.2.4"
- dependencies:
- "loose-envify" "^1.0.0"
-
-"ipaddr.js@^2.0.1":
- "integrity" "sha512-1qTgH9NG+IIJ4yfKs2e6Pp1bZg8wbDbKHT21HrLIeYBTRLgMYKnMTPAuI3Lcs61nfx5h1xlXnbJtH1kX5/d/ng=="
- "resolved" "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.0.1.tgz"
- "version" "2.0.1"
-
-"ipaddr.js@1.9.1":
- "integrity" "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g=="
- "resolved" "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz"
- "version" "1.9.1"
-
-"is-alphabetical@^1.0.0", "is-alphabetical@1.0.4":
- "integrity" "sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg=="
- "resolved" "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-1.0.4.tgz"
- "version" "1.0.4"
-
-"is-alphanumerical@^1.0.0":
- "integrity" "sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A=="
- "resolved" "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-1.0.4.tgz"
- "version" "1.0.4"
- dependencies:
- "is-alphabetical" "^1.0.0"
- "is-decimal" "^1.0.0"
-
-"is-arrayish@^0.2.1":
- "integrity" "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0= sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg=="
- "resolved" "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz"
- "version" "0.2.1"
-
-"is-bigint@^1.0.1":
- "integrity" "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg=="
- "resolved" "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz"
- "version" "1.0.4"
- dependencies:
- "has-bigints" "^1.0.1"
-
-"is-binary-path@~2.1.0":
- "integrity" "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw=="
- "resolved" "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz"
- "version" "2.1.0"
- dependencies:
- "binary-extensions" "^2.0.0"
-
-"is-boolean-object@^1.1.0":
- "integrity" "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA=="
- "resolved" "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz"
- "version" "1.1.2"
- dependencies:
- "call-bind" "^1.0.2"
- "has-tostringtag" "^1.0.0"
-
-"is-buffer@^2.0.0":
- "integrity" "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ=="
- "resolved" "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz"
- "version" "2.0.5"
-
-"is-callable@^1.1.4", "is-callable@^1.2.4":
- "integrity" "sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w=="
- "resolved" "https://registry.npmjs.org/is-callable/-/is-callable-1.2.4.tgz"
- "version" "1.2.4"
-
-"is-ci@^2.0.0":
- "integrity" "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w=="
- "resolved" "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz"
- "version" "2.0.0"
- dependencies:
- "ci-info" "^2.0.0"
-
-"is-core-module@^2.2.0":
- "integrity" "sha512-vd15qHsaqrRL7dtH6QNuy0ndJmRDrS9HAM1CAiSifNUFv4x1a0CCVsj18hJ1mShxIG6T2i1sO78MkP56r0nYRw=="
- "resolved" "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.0.tgz"
- "version" "2.8.0"
- dependencies:
- "has" "^1.0.3"
-
-"is-date-object@^1.0.1":
- "integrity" "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ=="
- "resolved" "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz"
- "version" "1.0.5"
- dependencies:
- "has-tostringtag" "^1.0.0"
-
-"is-decimal@^1.0.0":
- "integrity" "sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw=="
- "resolved" "https://registry.npmjs.org/is-decimal/-/is-decimal-1.0.4.tgz"
- "version" "1.0.4"
-
-"is-docker@^2.0.0", "is-docker@^2.1.1":
- "integrity" "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ=="
- "resolved" "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz"
- "version" "2.2.1"
-
-"is-extendable@^0.1.0":
- "integrity" "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik= sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw=="
- "resolved" "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz"
- "version" "0.1.1"
-
-"is-extglob@^2.1.1":
- "integrity" "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ=="
- "resolved" "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz"
- "version" "2.1.1"
-
-"is-fullwidth-code-point@^3.0.0":
- "integrity" "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg=="
- "resolved" "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz"
- "version" "3.0.0"
-
-"is-glob@^4.0.1", "is-glob@^4.0.3", "is-glob@~4.0.1":
- "integrity" "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg=="
- "resolved" "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz"
- "version" "4.0.3"
- dependencies:
- "is-extglob" "^2.1.1"
-
-"is-hexadecimal@^1.0.0":
- "integrity" "sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw=="
- "resolved" "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-1.0.4.tgz"
- "version" "1.0.4"
-
-"is-installed-globally@^0.4.0":
- "integrity" "sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ=="
- "resolved" "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.4.0.tgz"
- "version" "0.4.0"
- dependencies:
- "global-dirs" "^3.0.0"
- "is-path-inside" "^3.0.2"
-
-"is-negative-zero@^2.0.1":
- "integrity" "sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w=="
- "resolved" "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.1.tgz"
- "version" "2.0.1"
-
-"is-npm@^5.0.0":
- "integrity" "sha512-WW/rQLOazUq+ST/bCAVBp/2oMERWLsR7OrKyt052dNDk4DHcDE0/7QSXITlmi+VBcV13DfIbysG3tZJm5RfdBA=="
- "resolved" "https://registry.npmjs.org/is-npm/-/is-npm-5.0.0.tgz"
- "version" "5.0.0"
-
-"is-number-object@^1.0.4":
- "integrity" "sha512-bEVOqiRcvo3zO1+G2lVMy+gkkEm9Yh7cDMRusKKu5ZJKPUYSJwICTKZrNKHA2EbSP0Tu0+6B/emsYNHZyn6K8g=="
- "resolved" "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.6.tgz"
- "version" "1.0.6"
- dependencies:
- "has-tostringtag" "^1.0.0"
-
-"is-number@^7.0.0":
- "integrity" "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng=="
- "resolved" "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz"
- "version" "7.0.0"
-
-"is-obj@^1.0.1":
- "integrity" "sha1-PkcprB9f3gJc19g6iW2rn09n2w8= sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg=="
- "resolved" "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz"
- "version" "1.0.1"
-
-"is-obj@^2.0.0":
- "integrity" "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w=="
- "resolved" "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz"
- "version" "2.0.0"
-
-"is-path-cwd@^2.2.0":
- "integrity" "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ=="
- "resolved" "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz"
- "version" "2.2.0"
-
-"is-path-inside@^3.0.2":
- "integrity" "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ=="
- "resolved" "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz"
- "version" "3.0.3"
-
-"is-plain-obj@^2.0.0":
- "integrity" "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA=="
- "resolved" "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz"
- "version" "2.1.0"
-
-"is-plain-obj@^3.0.0":
- "integrity" "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA=="
- "resolved" "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz"
- "version" "3.0.0"
-
-"is-plain-object@^2.0.4":
- "integrity" "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og=="
- "resolved" "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz"
- "version" "2.0.4"
- dependencies:
- "isobject" "^3.0.1"
-
-"is-regex@^1.1.4":
- "integrity" "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg=="
- "resolved" "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz"
- "version" "1.1.4"
- dependencies:
- "call-bind" "^1.0.2"
- "has-tostringtag" "^1.0.0"
-
-"is-regexp@^1.0.0":
- "integrity" "sha1-/S2INUXEa6xaYz57mgnof6LLUGk= sha512-7zjFAPO4/gwyQAAgRRmqeEeyIICSdmCqa3tsVHMdBzaXXRiqopZL4Cyghg/XulGWrtABTpbnYYzzIRffLkP4oA=="
- "resolved" "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz"
- "version" "1.0.0"
-
-"is-root@^2.1.0":
- "integrity" "sha512-AGOriNp96vNBd3HtU+RzFEc75FfR5ymiYv8E553I71SCeXBiMsVDUtdio1OEFvrPyLIQ9tVR5RxXIFe5PUFjMg=="
- "resolved" "https://registry.npmjs.org/is-root/-/is-root-2.1.0.tgz"
- "version" "2.1.0"
-
-"is-shared-array-buffer@^1.0.1":
- "integrity" "sha512-IU0NmyknYZN0rChcKhRO1X8LYz5Isj/Fsqh8NJOSf+N/hCOTwy29F32Ik7a+QszE63IdvmwdTPDd6cZ5pg4cwA=="
- "resolved" "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.1.tgz"
- "version" "1.0.1"
-
-"is-stream@^2.0.0":
- "integrity" "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg=="
- "resolved" "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz"
- "version" "2.0.1"
-
-"is-string@^1.0.5", "is-string@^1.0.7":
- "integrity" "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg=="
- "resolved" "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz"
- "version" "1.0.7"
- dependencies:
- "has-tostringtag" "^1.0.0"
-
-"is-symbol@^1.0.2", "is-symbol@^1.0.3":
- "integrity" "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg=="
- "resolved" "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz"
- "version" "1.0.4"
- dependencies:
- "has-symbols" "^1.0.2"
-
-"is-typedarray@^1.0.0":
- "integrity" "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo= sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA=="
- "resolved" "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz"
- "version" "1.0.0"
-
-"is-weakref@^1.0.1":
- "integrity" "sha512-b2jKc2pQZjaeFYWEf7ScFj+Be1I+PXmlu572Q8coTXZ+LD/QQZ7ShPMst8h16riVgyXTQwUsFEl74mDvc/3MHQ=="
- "resolved" "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.1.tgz"
- "version" "1.0.1"
- dependencies:
- "call-bind" "^1.0.0"
-
-"is-whitespace-character@^1.0.0":
- "integrity" "sha512-SDweEzfIZM0SJV0EUga669UTKlmL0Pq8Lno0QDQsPnvECB3IM2aP0gdx5TrU0A01MAPfViaZiI2V1QMZLaKK5w=="
- "resolved" "https://registry.npmjs.org/is-whitespace-character/-/is-whitespace-character-1.0.4.tgz"
- "version" "1.0.4"
-
-"is-word-character@^1.0.0":
- "integrity" "sha512-5SMO8RVennx3nZrqtKwCGyyetPE9VDba5ugvKLaD4KopPG5kR4mQ7tNt/r7feL5yt5h3lpuBbIUmCOG2eSzXHA=="
- "resolved" "https://registry.npmjs.org/is-word-character/-/is-word-character-1.0.4.tgz"
- "version" "1.0.4"
-
-"is-wsl@^2.2.0":
- "integrity" "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww=="
- "resolved" "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz"
- "version" "2.2.0"
- dependencies:
- "is-docker" "^2.0.0"
-
-"is-yarn-global@^0.3.0":
- "integrity" "sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw=="
- "resolved" "https://registry.npmjs.org/is-yarn-global/-/is-yarn-global-0.3.0.tgz"
- "version" "0.3.0"
-
-"isarray@~1.0.0":
- "integrity" "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ=="
- "resolved" "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz"
- "version" "1.0.0"
-
-"isarray@0.0.1":
- "integrity" "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8= sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ=="
- "resolved" "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz"
- "version" "0.0.1"
-
-"isexe@^2.0.0":
- "integrity" "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw=="
- "resolved" "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz"
- "version" "2.0.0"
-
-"isobject@^3.0.1":
- "integrity" "sha1-TkMekrEalzFjaqH5yNHMvP2reN8= sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg=="
- "resolved" "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz"
- "version" "3.0.1"
-
-"jest-worker@^27.0.2", "jest-worker@^27.4.5", "jest-worker@^27.5.1":
- "integrity" "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg=="
- "resolved" "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz"
- "version" "27.5.1"
- dependencies:
- "@types/node" "*"
- "merge-stream" "^2.0.0"
- "supports-color" "^8.0.0"
-
-"joi@^17.6.0":
- "integrity" "sha512-OX5dG6DTbcr/kbMFj0KGYxuew69HPcAE3K/sZpEV2nP6e/j/C0HV+HNiBPCASxdx5T7DMoa0s8UeHWMnb6n2zw=="
- "resolved" "https://registry.npmjs.org/joi/-/joi-17.6.0.tgz"
- "version" "17.6.0"
- dependencies:
- "@hapi/hoek" "^9.0.0"
- "@hapi/topo" "^5.0.0"
- "@sideway/address" "^4.1.3"
- "@sideway/formula" "^3.0.0"
- "@sideway/pinpoint" "^2.0.0"
-
-"js-tokens@^3.0.0 || ^4.0.0", "js-tokens@^4.0.0":
- "integrity" "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="
- "resolved" "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz"
- "version" "4.0.0"
-
-"js-yaml@^3.13.1":
- "integrity" "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g=="
- "resolved" "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz"
- "version" "3.14.1"
- dependencies:
- "argparse" "^1.0.7"
- "esprima" "^4.0.0"
-
-"js-yaml@^4.1.0":
- "integrity" "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA=="
- "resolved" "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz"
- "version" "4.1.0"
- dependencies:
- "argparse" "^2.0.1"
-
-"jsesc@^2.5.1":
- "integrity" "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA=="
- "resolved" "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz"
- "version" "2.5.2"
-
-"jsesc@~0.5.0":
- "integrity" "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0= sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA=="
- "resolved" "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz"
- "version" "0.5.0"
-
-"json-buffer@3.0.0":
- "integrity" "sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg= sha512-CuUqjv0FUZIdXkHPI8MezCnFCdaTAacej1TZYulLoAg1h/PhwkdXFN4V/gzY4g+fMBCOV2xF+rp7t2XD2ns/NQ=="
- "resolved" "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz"
- "version" "3.0.0"
-
-"json-parse-even-better-errors@^2.3.0", "json-parse-even-better-errors@^2.3.1":
- "integrity" "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w=="
- "resolved" "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz"
- "version" "2.3.1"
-
-"json-schema-traverse@^0.4.1":
- "integrity" "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="
- "resolved" "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz"
- "version" "0.4.1"
-
-"json-schema-traverse@^1.0.0":
- "integrity" "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug=="
- "resolved" "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz"
- "version" "1.0.0"
-
-"json5@^2.1.2", "json5@^2.2.1":
- "integrity" "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA=="
- "resolved" "https://registry.npmjs.org/json5/-/json5-2.2.1.tgz"
- "version" "2.2.1"
-
-"jsonfile@^6.0.1":
- "integrity" "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ=="
- "resolved" "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz"
- "version" "6.1.0"
- dependencies:
- "universalify" "^2.0.0"
- optionalDependencies:
- "graceful-fs" "^4.1.6"
-
-"keyv@^3.0.0":
- "integrity" "sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA=="
- "resolved" "https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz"
- "version" "3.1.0"
- dependencies:
- "json-buffer" "3.0.0"
-
-"kind-of@^6.0.0", "kind-of@^6.0.2":
- "integrity" "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw=="
- "resolved" "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz"
- "version" "6.0.3"
-
-"kleur@^3.0.3":
- "integrity" "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w=="
- "resolved" "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz"
- "version" "3.0.3"
-
-"klona@^2.0.5":
- "integrity" "sha512-pJiBpiXMbt7dkzXe8Ghj/u4FfXOOa98fPW+bihOJ4SjnoijweJrNThJfd3ifXpXhREjpoF2mZVH1GfS9LV3kHQ=="
- "resolved" "https://registry.npmjs.org/klona/-/klona-2.0.5.tgz"
- "version" "2.0.5"
-
-"latest-version@^5.1.0":
- "integrity" "sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA=="
- "resolved" "https://registry.npmjs.org/latest-version/-/latest-version-5.1.0.tgz"
- "version" "5.1.0"
- dependencies:
- "package-json" "^6.3.0"
-
-"leven@^3.1.0":
- "integrity" "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A=="
- "resolved" "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz"
- "version" "3.1.0"
-
-"lilconfig@^2.0.3":
- "integrity" "sha512-xaYmXZtTHPAw5m+xLN8ab9C+3a8YmV3asNSPOATITbtwrfbwaLJj8h66H1WMIpALCkqsIzK3h7oQ+PdX+LQ9Eg=="
- "resolved" "https://registry.npmjs.org/lilconfig/-/lilconfig-2.0.5.tgz"
- "version" "2.0.5"
-
-"lines-and-columns@^1.1.6":
- "integrity" "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA= sha512-8ZmlJFVK9iCmtLz19HpSsR8HaAMWBT284VMNednLwlIMDP2hJDCIhUp0IZ2xUcZ+Ob6BM0VvCSJwzASDM45NLQ=="
- "resolved" "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz"
- "version" "1.1.6"
-
-"loader-runner@^4.2.0":
- "integrity" "sha512-92+huvxMvYlMzMt0iIOukcwYBFpkYJdpl2xsZ7LrlayO7E8SOv+JJUEK17B/dJIHAOLMfh2dZZ/Y18WgmGtYNw=="
- "resolved" "https://registry.npmjs.org/loader-runner/-/loader-runner-4.2.0.tgz"
- "version" "4.2.0"
-
-"loader-utils@^2.0.0":
- "integrity" "sha512-TM57VeHptv569d/GKh6TAYdzKblwDNiumOdkFnejjD0XwTH87K90w3O7AiJRqdQoXygvi1VQTJTLGhJl7WqA7A=="
- "resolved" "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.2.tgz"
- "version" "2.0.2"
- dependencies:
- "big.js" "^5.2.2"
- "emojis-list" "^3.0.0"
- "json5" "^2.1.2"
-
-"loader-utils@^3.2.0":
- "integrity" "sha512-HVl9ZqccQihZ7JM85dco1MvO9G+ONvxoGa9rkhzFsneGLKSUg1gJf9bWzhRhcvm2qChhWpebQhP44qxjKIUCaQ=="
- "resolved" "https://registry.npmjs.org/loader-utils/-/loader-utils-3.2.0.tgz"
- "version" "3.2.0"
-
-"locate-path@^3.0.0":
- "integrity" "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A=="
- "resolved" "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz"
- "version" "3.0.0"
- dependencies:
- "p-locate" "^3.0.0"
- "path-exists" "^3.0.0"
-
-"locate-path@^5.0.0":
- "integrity" "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g=="
- "resolved" "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz"
- "version" "5.0.0"
- dependencies:
- "p-locate" "^4.1.0"
-
-"locate-path@^6.0.0":
- "integrity" "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw=="
- "resolved" "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz"
- "version" "6.0.0"
- dependencies:
- "p-locate" "^5.0.0"
-
-"lodash.assignin@^4.0.9":
- "integrity" "sha1-uo31+4QesKPoBEIysOJjqNxqKKI= sha512-yX/rx6d/UTVh7sSVWVSIMjfnz95evAgDFdb1ZozC35I9mSFCkmzptOzevxjgbQUsc78NR44LVHWjsoMQXy9FDg=="
- "resolved" "https://registry.npmjs.org/lodash.assignin/-/lodash.assignin-4.2.0.tgz"
- "version" "4.2.0"
-
-"lodash.bind@^4.1.4":
- "integrity" "sha1-euMBfpOWIqwxt9fX3LGzTbFpDTU= sha512-lxdsn7xxlCymgLYo1gGvVrfHmkjDiyqVv62FAeF2i5ta72BipE1SLxw8hPEPLhD4/247Ijw07UQH7Hq/chT5LA=="
- "resolved" "https://registry.npmjs.org/lodash.bind/-/lodash.bind-4.2.1.tgz"
- "version" "4.2.1"
-
-"lodash.curry@^4.0.1":
- "integrity" "sha1-JI42By7ekGUB11lmIAqG2riyMXA= sha512-/u14pXGviLaweY5JI0IUzgzF2J6Ne8INyzAZjImcryjgkZ+ebruBxy2/JaOOkTqScddcYtakjhSaeemV8lR0tA=="
- "resolved" "https://registry.npmjs.org/lodash.curry/-/lodash.curry-4.1.1.tgz"
- "version" "4.1.1"
-
-"lodash.debounce@^4.0.8":
- "integrity" "sha1-gteb/zCmfEAF/9XiUVMArZyk168= sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow=="
- "resolved" "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz"
- "version" "4.0.8"
-
-"lodash.defaults@^4.0.1":
- "integrity" "sha1-0JF4cW/+pN3p5ft7N/bwgCJ0WAw= sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ=="
- "resolved" "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz"
- "version" "4.2.0"
-
-"lodash.filter@^4.4.0":
- "integrity" "sha1-ZosdSYFgOuHMWm+nYBQ+SAtMSs4= sha512-pXYUy7PR8BCLwX5mgJ/aNtyOvuJTdZAo9EQFUvMIYugqmJxnrYaANvTbgndOzHSCSR0wnlBBfRXJL5SbWxo3FQ=="
- "resolved" "https://registry.npmjs.org/lodash.filter/-/lodash.filter-4.6.0.tgz"
- "version" "4.6.0"
-
-"lodash.flatten@^4.2.0":
- "integrity" "sha1-8xwiIlqWMtK7+OSt2+8kCqdlph8= sha512-C5N2Z3DgnnKr0LOpv/hKCgKdb7ZZwafIrsesve6lmzvZIRZRGaZ/l6Q8+2W7NaT+ZwO3fFlSCzCzrDCFdJfZ4g=="
- "resolved" "https://registry.npmjs.org/lodash.flatten/-/lodash.flatten-4.4.0.tgz"
- "version" "4.4.0"
-
-"lodash.flow@^3.3.0":
- "integrity" "sha1-h79AKSuM+D5OjOGjrkIJ4gBxZ1o= sha512-ff3BX/tSioo+XojX4MOsOMhJw0nZoUEF011LX8g8d3gvjVbxd89cCio4BCXronjxcTUIJUoqKEUA+n4CqvvRPw=="
- "resolved" "https://registry.npmjs.org/lodash.flow/-/lodash.flow-3.5.0.tgz"
- "version" "3.5.0"
-
-"lodash.foreach@^4.3.0":
- "integrity" "sha1-Gmo16s5AEoDH8G3d7DUWWrJ+PlM= sha512-aEXTF4d+m05rVOAUG3z4vZZ4xVexLKZGF0lIxuHZ1Hplpk/3B6Z1+/ICICYRLm7c41Z2xiejbkCkJoTlypoXhQ=="
- "resolved" "https://registry.npmjs.org/lodash.foreach/-/lodash.foreach-4.5.0.tgz"
- "version" "4.5.0"
-
-"lodash.map@^4.4.0":
- "integrity" "sha1-dx7Hg540c9nEzeKLGTlMNWL09tM= sha512-worNHGKLDetmcEYDvh2stPCrrQRkP20E4l0iIS7F8EvzMqBBi7ltvFN5m1HvTf1P7Jk1txKhvFcmYsCr8O2F1Q=="
- "resolved" "https://registry.npmjs.org/lodash.map/-/lodash.map-4.6.0.tgz"
- "version" "4.6.0"
-
-"lodash.memoize@^4.1.2":
- "integrity" "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4= sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag=="
- "resolved" "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz"
- "version" "4.1.2"
-
-"lodash.merge@^4.4.0":
- "integrity" "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ=="
- "resolved" "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz"
- "version" "4.6.2"
-
-"lodash.pick@^4.2.1":
- "integrity" "sha1-UvBWEP/53tQiYRRB7R/BI6AwAbM= sha512-hXt6Ul/5yWjfklSGvLQl8vM//l3FtyHZeuelpzK6mm99pNvN9yTDruNZPEJZD1oWrqo+izBmB7oUfWgcCX7s4Q=="
- "resolved" "https://registry.npmjs.org/lodash.pick/-/lodash.pick-4.4.0.tgz"
- "version" "4.4.0"
-
-"lodash.reduce@^4.4.0":
- "integrity" "sha1-8atrg5KZrUj3hKu/R2WW8DuRTTs= sha512-6raRe2vxCYBhpBu+B+TtNGUzah+hQjVdu3E17wfusjyrXBka2nBS8OH/gjVZ5PvHOhWmIZTYri09Z6n/QfnNMw=="
- "resolved" "https://registry.npmjs.org/lodash.reduce/-/lodash.reduce-4.6.0.tgz"
- "version" "4.6.0"
-
-"lodash.reject@^4.4.0":
- "integrity" "sha1-gNZJLcFHCGS79YNTO2UfQqn1JBU= sha512-qkTuvgEzYdyhiJBx42YPzPo71R1aEr0z79kAv7Ixg8wPFEjgRgJdUsGMG3Hf3OYSF/kHI79XhNlt+5Ar6OzwxQ=="
- "resolved" "https://registry.npmjs.org/lodash.reject/-/lodash.reject-4.6.0.tgz"
- "version" "4.6.0"
-
-"lodash.some@^4.4.0":
- "integrity" "sha1-G7nzFO9ri63tE7VJFpsqlF62jk0= sha512-j7MJE+TuT51q9ggt4fSgVqro163BEFjAt3u97IqU+JA2DkWl80nFTrowzLpZ/BnpN7rrl0JA/593NAdd8p/scQ=="
- "resolved" "https://registry.npmjs.org/lodash.some/-/lodash.some-4.6.0.tgz"
- "version" "4.6.0"
-
-"lodash.uniq@^4.5.0", "lodash.uniq@4.5.0":
- "integrity" "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M= sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ=="
- "resolved" "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz"
- "version" "4.5.0"
-
-"lodash@^4.17.19", "lodash@^4.17.20", "lodash@^4.17.21":
- "integrity" "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg=="
- "resolved" "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz"
- "version" "4.17.21"
-
-"loose-envify@^1.0.0", "loose-envify@^1.1.0", "loose-envify@^1.2.0", "loose-envify@^1.3.1", "loose-envify@^1.4.0":
- "integrity" "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q=="
- "resolved" "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz"
- "version" "1.4.0"
- dependencies:
- "js-tokens" "^3.0.0 || ^4.0.0"
-
-"lower-case@^2.0.2":
- "integrity" "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg=="
- "resolved" "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz"
- "version" "2.0.2"
- dependencies:
- "tslib" "^2.0.3"
-
-"lowercase-keys@^1.0.0", "lowercase-keys@^1.0.1":
- "integrity" "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA=="
- "resolved" "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz"
- "version" "1.0.1"
-
-"lowercase-keys@^2.0.0":
- "integrity" "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA=="
- "resolved" "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz"
- "version" "2.0.0"
-
-"lru-cache@^6.0.0":
- "integrity" "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA=="
- "resolved" "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz"
- "version" "6.0.0"
- dependencies:
- "yallist" "^4.0.0"
-
-"make-dir@^3.0.0", "make-dir@^3.0.2", "make-dir@^3.1.0":
- "integrity" "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw=="
- "resolved" "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz"
- "version" "3.1.0"
- dependencies:
- "semver" "^6.0.0"
-
-"markdown-escapes@^1.0.0":
- "integrity" "sha512-8z4efJYk43E0upd0NbVXwgSTQs6cT3T06etieCMEg7dRbzCbxUCK/GHlX8mhHRDcp+OLlHkPKsvqQTCvsRl2cg=="
- "resolved" "https://registry.npmjs.org/markdown-escapes/-/markdown-escapes-1.0.4.tgz"
- "version" "1.0.4"
-
-"mdast-squeeze-paragraphs@^4.0.0":
- "integrity" "sha512-zxdPn69hkQ1rm4J+2Cs2j6wDEv7O17TfXTJ33tl/+JPIoEmtV9t2ZzBM5LPHE8QlHsmVD8t3vPKCyY3oH+H8MQ=="
- "resolved" "https://registry.npmjs.org/mdast-squeeze-paragraphs/-/mdast-squeeze-paragraphs-4.0.0.tgz"
- "version" "4.0.0"
- dependencies:
- "unist-util-remove" "^2.0.0"
-
-"mdast-util-definitions@^4.0.0":
- "integrity" "sha512-k8AJ6aNnUkB7IE+5azR9h81O5EQ/cTDXtWdMq9Kk5KcEW/8ritU5CeLg/9HhOC++nALHBlaogJ5jz0Ybk3kPMQ=="
- "resolved" "https://registry.npmjs.org/mdast-util-definitions/-/mdast-util-definitions-4.0.0.tgz"
- "version" "4.0.0"
- dependencies:
- "unist-util-visit" "^2.0.0"
-
-"mdast-util-to-hast@10.0.1":
- "integrity" "sha512-BW3LM9SEMnjf4HXXVApZMt8gLQWVNXc3jryK0nJu/rOXPOnlkUjmdkDlmxMirpbU9ILncGFIwLH/ubnWBbcdgA=="
- "resolved" "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-10.0.1.tgz"
- "version" "10.0.1"
- dependencies:
- "@types/mdast" "^3.0.0"
- "@types/unist" "^2.0.0"
- "mdast-util-definitions" "^4.0.0"
- "mdurl" "^1.0.0"
- "unist-builder" "^2.0.0"
- "unist-util-generated" "^1.0.0"
- "unist-util-position" "^3.0.0"
- "unist-util-visit" "^2.0.0"
-
-"mdast-util-to-string@^2.0.0":
- "integrity" "sha512-AW4DRS3QbBayY/jJmD8437V1Gombjf8RSOUCMFBuo5iHi58AGEgVCKQ+ezHkZZDpAQS75hcBMpLqjpJTjtUL7w=="
- "resolved" "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-2.0.0.tgz"
- "version" "2.0.0"
-
-"mdn-data@2.0.14":
- "integrity" "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow=="
- "resolved" "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz"
- "version" "2.0.14"
-
-"mdn-data@2.0.4":
- "integrity" "sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA=="
- "resolved" "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.4.tgz"
- "version" "2.0.4"
-
-"mdurl@^1.0.0":
- "integrity" "sha1-/oWy7HWlkDfyrf7BAP1sYBdhFS4= sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g=="
- "resolved" "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz"
- "version" "1.0.1"
-
-"media-typer@0.3.0":
- "integrity" "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g= sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ=="
- "resolved" "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz"
- "version" "0.3.0"
-
-"memfs@^3.1.2", "memfs@^3.4.1":
- "integrity" "sha512-1c9VPVvW5P7I85c35zAdEr1TD5+F11IToIHIlrVIcflfnzPkJa0ZoYEoEdYDP8KgPFoSZ/opDrUsAoZWym3mtw=="
- "resolved" "https://registry.npmjs.org/memfs/-/memfs-3.4.1.tgz"
- "version" "3.4.1"
- dependencies:
- "fs-monkey" "1.0.3"
-
-"merge-descriptors@1.0.1":
- "integrity" "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E= sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w=="
- "resolved" "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz"
- "version" "1.0.1"
-
-"merge-stream@^2.0.0":
- "integrity" "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w=="
- "resolved" "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz"
- "version" "2.0.0"
-
-"merge2@^1.3.0", "merge2@^1.4.1":
- "integrity" "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg=="
- "resolved" "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz"
- "version" "1.4.1"
-
-"methods@~1.1.2":
- "integrity" "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4= sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w=="
- "resolved" "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz"
- "version" "1.1.2"
-
-"micromatch@^4.0.2", "micromatch@^4.0.4", "micromatch@^4.0.5":
- "integrity" "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA=="
- "resolved" "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz"
- "version" "4.0.5"
- dependencies:
- "braces" "^3.0.2"
- "picomatch" "^2.3.1"
-
-"mime-db@>= 1.43.0 < 2":
- "integrity" "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg=="
- "resolved" "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz"
- "version" "1.52.0"
-
-"mime-db@~1.33.0":
- "integrity" "sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ=="
- "resolved" "https://registry.npmjs.org/mime-db/-/mime-db-1.33.0.tgz"
- "version" "1.33.0"
-
-"mime-db@1.51.0":
- "integrity" "sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g=="
- "resolved" "https://registry.npmjs.org/mime-db/-/mime-db-1.51.0.tgz"
- "version" "1.51.0"
-
-"mime-db@1.52.0":
- "integrity" "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg=="
- "resolved" "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz"
- "version" "1.52.0"
-
-"mime-types@^2.1.27":
- "integrity" "sha512-6cP692WwGIs9XXdOO4++N+7qjqv0rqxxVvJ3VHPh/Sc9mVZcQP+ZGhkKiTvWMQRr2tbHkJP/Yn7Y0npb3ZBs4A=="
- "resolved" "https://registry.npmjs.org/mime-types/-/mime-types-2.1.34.tgz"
- "version" "2.1.34"
- dependencies:
- "mime-db" "1.51.0"
-
-"mime-types@^2.1.31":
- "integrity" "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw=="
- "resolved" "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz"
- "version" "2.1.35"
- dependencies:
- "mime-db" "1.52.0"
-
-"mime-types@~2.1.17", "mime-types@2.1.18":
- "integrity" "sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ=="
- "resolved" "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz"
- "version" "2.1.18"
- dependencies:
- "mime-db" "~1.33.0"
-
-"mime-types@~2.1.24":
- "integrity" "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw=="
- "resolved" "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz"
- "version" "2.1.35"
- dependencies:
- "mime-db" "1.52.0"
-
-"mime-types@~2.1.34":
- "integrity" "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw=="
- "resolved" "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz"
- "version" "2.1.35"
- dependencies:
- "mime-db" "1.52.0"
-
-"mime@^2.3.1":
- "integrity" "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg=="
- "resolved" "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz"
- "version" "2.6.0"
-
-"mime@1.6.0":
- "integrity" "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg=="
- "resolved" "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz"
- "version" "1.6.0"
-
-"mimic-fn@^2.1.0":
- "integrity" "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg=="
- "resolved" "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz"
- "version" "2.1.0"
-
-"mimic-response@^1.0.0", "mimic-response@^1.0.1":
- "integrity" "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ=="
- "resolved" "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz"
- "version" "1.0.1"
-
-"mini-create-react-context@^0.4.0":
- "integrity" "sha512-YWCYEmd5CQeHGSAKrYvXgmzzkrvssZcuuQDDeqkT+PziKGMgE+0MCCtcKbROzocGBG1meBLl2FotlRwf4gAzbQ=="
- "resolved" "https://registry.npmjs.org/mini-create-react-context/-/mini-create-react-context-0.4.1.tgz"
- "version" "0.4.1"
- dependencies:
- "@babel/runtime" "^7.12.1"
- "tiny-warning" "^1.0.3"
-
-"mini-css-extract-plugin@^2.6.0":
- "integrity" "sha512-ndG8nxCEnAemsg4FSgS+yNyHKgkTB4nPKqCOgh65j3/30qqC5RaSQQXMm++Y6sb6E1zRSxPkztj9fqxhS1Eo6w=="
- "resolved" "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.6.0.tgz"
- "version" "2.6.0"
- dependencies:
- "schema-utils" "^4.0.0"
-
-"minimalistic-assert@^1.0.0":
- "integrity" "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A=="
- "resolved" "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz"
- "version" "1.0.1"
-
-"minimatch@^3.0.4", "minimatch@3.0.4":
- "integrity" "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA=="
- "resolved" "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz"
- "version" "3.0.4"
- dependencies:
- "brace-expansion" "^1.1.7"
-
-"minimist@^1.2.0", "minimist@^1.2.5":
- "integrity" "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw=="
- "resolved" "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz"
- "version" "1.2.5"
-
-"mkdirp@~0.5.1":
- "integrity" "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ=="
- "resolved" "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz"
- "version" "0.5.5"
- dependencies:
- "minimist" "^1.2.5"
-
-"ms@2.0.0":
- "integrity" "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="
- "resolved" "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz"
- "version" "2.0.0"
-
-"ms@2.1.2":
- "integrity" "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
- "resolved" "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz"
- "version" "2.1.2"
-
-"ms@2.1.3":
- "integrity" "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="
- "resolved" "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz"
- "version" "2.1.3"
-
-"multicast-dns@^7.2.4":
- "integrity" "sha512-XkCYOU+rr2Ft3LI6w4ye51M3VK31qJXFIxu0XLw169PtKG0Zx47OrXeVW/GCYOfpC9s1yyyf1S+L8/4LY0J9Zw=="
- "resolved" "https://registry.npmjs.org/multicast-dns/-/multicast-dns-7.2.4.tgz"
- "version" "7.2.4"
- dependencies:
- "dns-packet" "^5.2.2"
- "thunky" "^1.0.2"
-
-"nanoid@^3.3.4":
- "integrity" "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw=="
- "resolved" "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz"
- "version" "3.3.4"
-
-"negotiator@0.6.3":
- "integrity" "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg=="
- "resolved" "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz"
- "version" "0.6.3"
-
-"neo-async@^2.6.2":
- "integrity" "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw=="
- "resolved" "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz"
- "version" "2.6.2"
-
-"no-case@^3.0.4":
- "integrity" "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg=="
- "resolved" "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz"
- "version" "3.0.4"
- dependencies:
- "lower-case" "^2.0.2"
- "tslib" "^2.0.3"
-
-"node-emoji@^1.10.0":
- "integrity" "sha512-wo2DpQkQp7Sjm2A0cq+sN7EHKO6Sl0ctXeBdFZrL9T9+UywORbufTcTZxom8YqpLQt/FqNMUkOpkZrJVYSKD3A=="
- "resolved" "https://registry.npmjs.org/node-emoji/-/node-emoji-1.11.0.tgz"
- "version" "1.11.0"
- dependencies:
- "lodash" "^4.17.21"
-
-"node-fetch@2.6.7":
- "integrity" "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ=="
- "resolved" "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz"
- "version" "2.6.7"
- dependencies:
- "whatwg-url" "^5.0.0"
-
-"node-forge@^1":
- "integrity" "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA=="
- "resolved" "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz"
- "version" "1.3.1"
-
-"node-releases@^2.0.3":
- "integrity" "sha512-gbMzqQtTtDz/00jQzZ21PQzdI9PyLYqUSvD0p3naOhX4odFji0ZxYdnVwPTxmSwkmxhcFImpozceidSG+AgoPQ=="
- "resolved" "https://registry.npmjs.org/node-releases/-/node-releases-2.0.4.tgz"
- "version" "2.0.4"
-
-"normalize-path@^3.0.0", "normalize-path@~3.0.0":
- "integrity" "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA=="
- "resolved" "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz"
- "version" "3.0.0"
-
-"normalize-range@^0.1.2":
- "integrity" "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI= sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA=="
- "resolved" "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz"
- "version" "0.1.2"
-
-"normalize-url@^4.1.0":
- "integrity" "sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA=="
- "resolved" "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.1.tgz"
- "version" "4.5.1"
-
-"normalize-url@^6.0.1":
- "integrity" "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A=="
- "resolved" "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz"
- "version" "6.1.0"
-
-"npm-run-path@^4.0.1":
- "integrity" "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw=="
- "resolved" "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz"
- "version" "4.0.1"
- dependencies:
- "path-key" "^3.0.0"
-
-"nprogress@^0.2.0":
- "integrity" "sha1-y480xTIT2JVyP8urkH6UIq28r7E= sha512-I19aIingLgR1fmhftnbWWO3dXc0hSxqHQHQb3H8m+K3TnEn/iSeTZZOyvKXWqQESMwuUVnatlCnZdLBZZt2VSA=="
- "resolved" "https://registry.npmjs.org/nprogress/-/nprogress-0.2.0.tgz"
- "version" "0.2.0"
-
-"nth-check@^1.0.2":
- "integrity" "sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg=="
- "resolved" "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz"
- "version" "1.0.2"
- dependencies:
- "boolbase" "~1.0.0"
-
-"nth-check@^2.0.1":
- "integrity" "sha512-it1vE95zF6dTT9lBsYbxvqh0Soy4SPowchj0UBGj/V6cTPnXXtQOPUbhZ6CmGzAD/rW22LQK6E96pcdJXk4A4w=="
- "resolved" "https://registry.npmjs.org/nth-check/-/nth-check-2.0.1.tgz"
- "version" "2.0.1"
- dependencies:
- "boolbase" "^1.0.0"
-
-"nth-check@~1.0.1":
- "integrity" "sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg=="
- "resolved" "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz"
- "version" "1.0.2"
- dependencies:
- "boolbase" "~1.0.0"
-
-"object-assign@^4.1.0", "object-assign@^4.1.1":
- "integrity" "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg=="
- "resolved" "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz"
- "version" "4.1.1"
-
-"object-inspect@^1.11.0", "object-inspect@^1.9.0":
- "integrity" "sha512-jp7ikS6Sd3GxQfZJPyH3cjcbJF6GZPClgdV+EFygjFLQ5FmW/dRUnTd9PQ9k0JhoNDabWFbpF1yCdSWCC6gexg=="
- "resolved" "https://registry.npmjs.org/object-inspect/-/object-inspect-1.11.0.tgz"
- "version" "1.11.0"
-
-"object-keys@^1.0.12", "object-keys@^1.1.1":
- "integrity" "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA=="
- "resolved" "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz"
- "version" "1.1.1"
-
-"object.assign@^4.1.0", "object.assign@^4.1.2":
- "integrity" "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ=="
- "resolved" "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz"
- "version" "4.1.2"
- dependencies:
- "call-bind" "^1.0.0"
- "define-properties" "^1.1.3"
- "has-symbols" "^1.0.1"
- "object-keys" "^1.1.1"
-
-"object.getownpropertydescriptors@^2.1.0":
- "integrity" "sha512-VdDoCwvJI4QdC6ndjpqFmoL3/+HxffFBbcJzKi5hwLLqqx3mdbedRpfZDdK0SrOSauj8X4GzBvnDZl4vTN7dOw=="
- "resolved" "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.3.tgz"
- "version" "2.1.3"
- dependencies:
- "call-bind" "^1.0.2"
- "define-properties" "^1.1.3"
- "es-abstract" "^1.19.1"
-
-"object.values@^1.1.0":
- "integrity" "sha512-QUZRW0ilQ3PnPpbNtgdNV1PDbEqLIiSFB3l+EnGtBQ/8SUTLj1PZwtQHABZtLgwpJZTSZhuGLOGk57Drx2IvYg=="
- "resolved" "https://registry.npmjs.org/object.values/-/object.values-1.1.5.tgz"
- "version" "1.1.5"
- dependencies:
- "call-bind" "^1.0.2"
- "define-properties" "^1.1.3"
- "es-abstract" "^1.19.1"
-
-"obuf@^1.0.0", "obuf@^1.1.2":
- "integrity" "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg=="
- "resolved" "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz"
- "version" "1.1.2"
-
-"on-finished@2.4.1":
- "integrity" "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg=="
- "resolved" "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz"
- "version" "2.4.1"
- dependencies:
- "ee-first" "1.1.1"
-
-"on-headers@~1.0.2":
- "integrity" "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA=="
- "resolved" "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz"
- "version" "1.0.2"
-
-"once@^1.3.0", "once@^1.3.1", "once@^1.4.0":
- "integrity" "sha1-WDsap3WWHUsROsF9nFC6753Xa9E= sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w=="
- "resolved" "https://registry.npmjs.org/once/-/once-1.4.0.tgz"
- "version" "1.4.0"
- dependencies:
- "wrappy" "1"
-
-"onetime@^5.1.2":
- "integrity" "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg=="
- "resolved" "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz"
- "version" "5.1.2"
- dependencies:
- "mimic-fn" "^2.1.0"
-
-"open@^8.0.9", "open@^8.4.0":
- "integrity" "sha512-XgFPPM+B28FtCCgSb9I+s9szOC1vZRSwgWsRUA5ylIxRTgKozqjOCrVOqGsYABPYK5qnfqClxZTFBa8PKt2v6Q=="
- "resolved" "https://registry.npmjs.org/open/-/open-8.4.0.tgz"
- "version" "8.4.0"
- dependencies:
- "define-lazy-prop" "^2.0.0"
- "is-docker" "^2.1.1"
- "is-wsl" "^2.2.0"
-
-"opener@^1.5.2":
- "integrity" "sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A=="
- "resolved" "https://registry.npmjs.org/opener/-/opener-1.5.2.tgz"
- "version" "1.5.2"
-
-"p-cancelable@^1.0.0":
- "integrity" "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw=="
- "resolved" "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz"
- "version" "1.1.0"
-
-"p-limit@^2.0.0", "p-limit@^2.2.0":
- "integrity" "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w=="
- "resolved" "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz"
- "version" "2.3.0"
- dependencies:
- "p-try" "^2.0.0"
-
-"p-limit@^3.0.2":
- "integrity" "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ=="
- "resolved" "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz"
- "version" "3.1.0"
- dependencies:
- "yocto-queue" "^0.1.0"
-
-"p-locate@^3.0.0":
- "integrity" "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ=="
- "resolved" "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz"
- "version" "3.0.0"
- dependencies:
- "p-limit" "^2.0.0"
-
-"p-locate@^4.1.0":
- "integrity" "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A=="
- "resolved" "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz"
- "version" "4.1.0"
- dependencies:
- "p-limit" "^2.2.0"
-
-"p-locate@^5.0.0":
- "integrity" "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw=="
- "resolved" "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz"
- "version" "5.0.0"
- dependencies:
- "p-limit" "^3.0.2"
-
-"p-map@^4.0.0":
- "integrity" "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ=="
- "resolved" "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz"
- "version" "4.0.0"
- dependencies:
- "aggregate-error" "^3.0.0"
-
-"p-retry@^4.5.0":
- "integrity" "sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ=="
- "resolved" "https://registry.npmjs.org/p-retry/-/p-retry-4.6.2.tgz"
- "version" "4.6.2"
- dependencies:
- "@types/retry" "0.12.0"
- "retry" "^0.13.1"
-
-"p-try@^2.0.0":
- "integrity" "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ=="
- "resolved" "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz"
- "version" "2.2.0"
-
-"package-json@^6.3.0":
- "integrity" "sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ=="
- "resolved" "https://registry.npmjs.org/package-json/-/package-json-6.5.0.tgz"
- "version" "6.5.0"
- dependencies:
- "got" "^9.6.0"
- "registry-auth-token" "^4.0.0"
- "registry-url" "^5.0.0"
- "semver" "^6.2.0"
-
-"param-case@^3.0.4":
- "integrity" "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A=="
- "resolved" "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz"
- "version" "3.0.4"
- dependencies:
- "dot-case" "^3.0.4"
- "tslib" "^2.0.3"
-
-"parent-module@^1.0.0":
- "integrity" "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g=="
- "resolved" "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz"
- "version" "1.0.1"
- dependencies:
- "callsites" "^3.0.0"
-
-"parse-entities@^2.0.0":
- "integrity" "sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ=="
- "resolved" "https://registry.npmjs.org/parse-entities/-/parse-entities-2.0.0.tgz"
- "version" "2.0.0"
- dependencies:
- "character-entities" "^1.0.0"
- "character-entities-legacy" "^1.0.0"
- "character-reference-invalid" "^1.0.0"
- "is-alphanumerical" "^1.0.0"
- "is-decimal" "^1.0.0"
- "is-hexadecimal" "^1.0.0"
-
-"parse-json@^5.0.0":
- "integrity" "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg=="
- "resolved" "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz"
- "version" "5.2.0"
- dependencies:
- "@babel/code-frame" "^7.0.0"
- "error-ex" "^1.3.1"
- "json-parse-even-better-errors" "^2.3.0"
- "lines-and-columns" "^1.1.6"
-
-"parse-numeric-range@^1.3.0":
- "integrity" "sha512-twN+njEipszzlMJd4ONUYgSfZPDxgHhT9Ahed5uTigpQn90FggW4SA/AIPq/6a149fTbE9qBEcSwE3FAEp6wQQ=="
- "resolved" "https://registry.npmjs.org/parse-numeric-range/-/parse-numeric-range-1.3.0.tgz"
- "version" "1.3.0"
-
-"parse5-htmlparser2-tree-adapter@^6.0.1":
- "integrity" "sha512-qPuWvbLgvDGilKc5BoicRovlT4MtYT6JfJyBOMDsKoiT+GiuP5qyrPCnR9HcPECIJJmZh5jRndyNThnhhb/vlA=="
- "resolved" "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-6.0.1.tgz"
- "version" "6.0.1"
- dependencies:
- "parse5" "^6.0.1"
-
-"parse5@^5.0.0":
- "integrity" "sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug=="
- "resolved" "https://registry.npmjs.org/parse5/-/parse5-5.1.1.tgz"
- "version" "5.1.1"
-
-"parse5@^6.0.0", "parse5@^6.0.1":
- "integrity" "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw=="
- "resolved" "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz"
- "version" "6.0.1"
-
-"parseurl@~1.3.2", "parseurl@~1.3.3":
- "integrity" "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ=="
- "resolved" "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz"
- "version" "1.3.3"
-
-"pascal-case@^3.1.2":
- "integrity" "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g=="
- "resolved" "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz"
- "version" "3.1.2"
- dependencies:
- "no-case" "^3.0.4"
- "tslib" "^2.0.3"
-
-"path-exists@^3.0.0":
- "integrity" "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU= sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ=="
- "resolved" "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz"
- "version" "3.0.0"
-
-"path-exists@^4.0.0":
- "integrity" "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w=="
- "resolved" "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz"
- "version" "4.0.0"
-
-"path-is-absolute@^1.0.0":
- "integrity" "sha1-F0uSaHNVNP+8es5r9TpanhtcX18= sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg=="
- "resolved" "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz"
- "version" "1.0.1"
-
-"path-is-inside@1.0.2":
- "integrity" "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM= sha512-DUWJr3+ULp4zXmol/SZkFf3JGsS9/SIv+Y3Rt93/UjPpDpklB5f1er4O3POIbUuUJ3FXgqte2Q7SrU6zAqwk8w=="
- "resolved" "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz"
- "version" "1.0.2"
-
-"path-key@^3.0.0", "path-key@^3.1.0":
- "integrity" "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q=="
- "resolved" "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz"
- "version" "3.1.1"
-
-"path-parse@^1.0.6":
- "integrity" "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw=="
- "resolved" "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz"
- "version" "1.0.7"
-
-"path-to-regexp@^1.7.0":
- "integrity" "sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA=="
- "resolved" "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz"
- "version" "1.8.0"
- dependencies:
- "isarray" "0.0.1"
-
-"path-to-regexp@0.1.7":
- "integrity" "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w= sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ=="
- "resolved" "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz"
- "version" "0.1.7"
-
-"path-to-regexp@2.2.1":
- "integrity" "sha512-gu9bD6Ta5bwGrrU8muHzVOBFFREpp2iRkVfhBJahwJ6p6Xw20SjT0MxLnwkjOibQmGSYhiUnf2FLe7k+jcFmGQ=="
- "resolved" "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-2.2.1.tgz"
- "version" "2.2.1"
-
-"path-type@^4.0.0":
- "integrity" "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw=="
- "resolved" "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz"
- "version" "4.0.0"
-
-"picocolors@^1.0.0":
- "integrity" "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ=="
- "resolved" "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz"
- "version" "1.0.0"
-
-"picomatch@^2.0.4", "picomatch@^2.2.1", "picomatch@^2.3.1":
- "integrity" "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="
- "resolved" "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz"
- "version" "2.3.1"
-
-"pkg-dir@^4.1.0":
- "integrity" "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ=="
- "resolved" "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz"
- "version" "4.2.0"
- dependencies:
- "find-up" "^4.0.0"
-
-"pkg-up@^3.1.0":
- "integrity" "sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA=="
- "resolved" "https://registry.npmjs.org/pkg-up/-/pkg-up-3.1.0.tgz"
- "version" "3.1.0"
- dependencies:
- "find-up" "^3.0.0"
-
-"postcss-calc@^8.2.3":
- "integrity" "sha512-SmWMSJmB8MRnnULldx0lQIyhSNvuDl9HfrZkaqqE/WHAhToYsAvDq+yAsA/kIyINDszOp3Rh0GFoNuH5Ypsm3Q=="
- "resolved" "https://registry.npmjs.org/postcss-calc/-/postcss-calc-8.2.4.tgz"
- "version" "8.2.4"
- dependencies:
- "postcss-selector-parser" "^6.0.9"
- "postcss-value-parser" "^4.2.0"
-
-"postcss-colormin@^5.3.0":
- "integrity" "sha512-WdDO4gOFG2Z8n4P8TWBpshnL3JpmNmJwdnfP2gbk2qBA8PWwOYcmjmI/t3CmMeL72a7Hkd+x/Mg9O2/0rD54Pg=="
- "resolved" "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-5.3.0.tgz"
- "version" "5.3.0"
- dependencies:
- "browserslist" "^4.16.6"
- "caniuse-api" "^3.0.0"
- "colord" "^2.9.1"
- "postcss-value-parser" "^4.2.0"
-
-"postcss-convert-values@^5.1.2":
- "integrity" "sha512-c6Hzc4GAv95B7suy4udszX9Zy4ETyMCgFPUDtWjdFTKH1SE9eFY/jEpHSwTH1QPuwxHpWslhckUQWbNRM4ho5g=="
- "resolved" "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-5.1.2.tgz"
- "version" "5.1.2"
- dependencies:
- "browserslist" "^4.20.3"
- "postcss-value-parser" "^4.2.0"
-
-"postcss-discard-comments@^5.1.2":
- "integrity" "sha512-+L8208OVbHVF2UQf1iDmRcbdjJkuBF6IS29yBDSiWUIzpYaAhtNl6JYnYm12FnkeCwQqF5LeklOu6rAqgfBZqQ=="
- "resolved" "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-5.1.2.tgz"
- "version" "5.1.2"
-
-"postcss-discard-duplicates@^5.1.0":
- "integrity" "sha512-zmX3IoSI2aoenxHV6C7plngHWWhUOV3sP1T8y2ifzxzbtnuhk1EdPwm0S1bIUNaJ2eNbWeGLEwzw8huPD67aQw=="
- "resolved" "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-5.1.0.tgz"
- "version" "5.1.0"
-
-"postcss-discard-empty@^5.1.1":
- "integrity" "sha512-zPz4WljiSuLWsI0ir4Mcnr4qQQ5e1Ukc3i7UfE2XcrwKK2LIPIqE5jxMRxO6GbI3cv//ztXDsXwEWT3BHOGh3A=="
- "resolved" "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-5.1.1.tgz"
- "version" "5.1.1"
-
-"postcss-discard-overridden@^5.1.0":
- "integrity" "sha512-21nOL7RqWR1kasIVdKs8HNqQJhFxLsyRfAnUDm4Fe4t4mCWL9OJiHvlHPjcd8zc5Myu89b/7wZDnOSjFgeWRtw=="
- "resolved" "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-5.1.0.tgz"
- "version" "5.1.0"
-
-"postcss-discard-unused@^5.1.0":
- "integrity" "sha512-KwLWymI9hbwXmJa0dkrzpRbSJEh0vVUd7r8t0yOGPcfKzyJJxFM8kLyC5Ev9avji6nY95pOp1W6HqIrfT+0VGw=="
- "resolved" "https://registry.npmjs.org/postcss-discard-unused/-/postcss-discard-unused-5.1.0.tgz"
- "version" "5.1.0"
- dependencies:
- "postcss-selector-parser" "^6.0.5"
-
-"postcss-loader@^6.2.1":
- "integrity" "sha512-WbbYpmAaKcux/P66bZ40bpWsBucjx/TTgVVzRZ9yUO8yQfVBlameJ0ZGVaPfH64hNSBh63a+ICP5nqOpBA0w+Q=="
- "resolved" "https://registry.npmjs.org/postcss-loader/-/postcss-loader-6.2.1.tgz"
- "version" "6.2.1"
- dependencies:
- "cosmiconfig" "^7.0.0"
- "klona" "^2.0.5"
- "semver" "^7.3.5"
-
-"postcss-loader@^7.0.0":
- "integrity" "sha512-IDyttebFzTSY6DI24KuHUcBjbAev1i+RyICoPEWcAstZsj03r533uMXtDn506l6/wlsRYiS5XBdx7TpccCsyUg=="
- "resolved" "https://registry.npmjs.org/postcss-loader/-/postcss-loader-7.0.0.tgz"
- "version" "7.0.0"
- dependencies:
- "cosmiconfig" "^7.0.0"
- "klona" "^2.0.5"
- "semver" "^7.3.7"
-
-"postcss-merge-idents@^5.1.1":
- "integrity" "sha512-pCijL1TREiCoog5nQp7wUe+TUonA2tC2sQ54UGeMmryK3UFGIYKqDyjnqd6RcuI4znFn9hWSLNN8xKE/vWcUQw=="
- "resolved" "https://registry.npmjs.org/postcss-merge-idents/-/postcss-merge-idents-5.1.1.tgz"
- "version" "5.1.1"
- dependencies:
- "cssnano-utils" "^3.1.0"
- "postcss-value-parser" "^4.2.0"
-
-"postcss-merge-longhand@^5.1.5":
- "integrity" "sha512-NOG1grw9wIO+60arKa2YYsrbgvP6tp+jqc7+ZD5/MalIw234ooH2C6KlR6FEn4yle7GqZoBxSK1mLBE9KPur6w=="
- "resolved" "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-5.1.5.tgz"
- "version" "5.1.5"
- dependencies:
- "postcss-value-parser" "^4.2.0"
- "stylehacks" "^5.1.0"
-
-"postcss-merge-rules@^5.1.2":
- "integrity" "sha512-zKMUlnw+zYCWoPN6yhPjtcEdlJaMUZ0WyVcxTAmw3lkkN/NDMRkOkiuctQEoWAOvH7twaxUUdvBWl0d4+hifRQ=="
- "resolved" "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-5.1.2.tgz"
- "version" "5.1.2"
- dependencies:
- "browserslist" "^4.16.6"
- "caniuse-api" "^3.0.0"
- "cssnano-utils" "^3.1.0"
- "postcss-selector-parser" "^6.0.5"
-
-"postcss-minify-font-values@^5.1.0":
- "integrity" "sha512-el3mYTgx13ZAPPirSVsHqFzl+BBBDrXvbySvPGFnQcTI4iNslrPaFq4muTkLZmKlGk4gyFAYUBMH30+HurREyA=="
- "resolved" "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-5.1.0.tgz"
- "version" "5.1.0"
- dependencies:
- "postcss-value-parser" "^4.2.0"
-
-"postcss-minify-gradients@^5.1.1":
- "integrity" "sha512-VGvXMTpCEo4qHTNSa9A0a3D+dxGFZCYwR6Jokk+/3oB6flu2/PnPXAh2x7x52EkY5xlIHLm+Le8tJxe/7TNhzw=="
- "resolved" "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-5.1.1.tgz"
- "version" "5.1.1"
- dependencies:
- "colord" "^2.9.1"
- "cssnano-utils" "^3.1.0"
- "postcss-value-parser" "^4.2.0"
-
-"postcss-minify-params@^5.1.3":
- "integrity" "sha512-bkzpWcjykkqIujNL+EVEPOlLYi/eZ050oImVtHU7b4lFS82jPnsCb44gvC6pxaNt38Els3jWYDHTjHKf0koTgg=="
- "resolved" "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-5.1.3.tgz"
- "version" "5.1.3"
- dependencies:
- "browserslist" "^4.16.6"
- "cssnano-utils" "^3.1.0"
- "postcss-value-parser" "^4.2.0"
-
-"postcss-minify-selectors@^5.2.1":
- "integrity" "sha512-nPJu7OjZJTsVUmPdm2TcaiohIwxP+v8ha9NehQ2ye9szv4orirRU3SDdtUmKH+10nzn0bAyOXZ0UEr7OpvLehg=="
- "resolved" "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-5.2.1.tgz"
- "version" "5.2.1"
- dependencies:
- "postcss-selector-parser" "^6.0.5"
-
-"postcss-modules-extract-imports@^3.0.0":
- "integrity" "sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw=="
- "resolved" "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz"
- "version" "3.0.0"
-
-"postcss-modules-local-by-default@^4.0.0":
- "integrity" "sha512-sT7ihtmGSF9yhm6ggikHdV0hlziDTX7oFoXtuVWeDd3hHObNkcHRo9V3yg7vCAY7cONyxJC/XXCmmiHHcvX7bQ=="
- "resolved" "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.0.tgz"
- "version" "4.0.0"
- dependencies:
- "icss-utils" "^5.0.0"
- "postcss-selector-parser" "^6.0.2"
- "postcss-value-parser" "^4.1.0"
-
-"postcss-modules-scope@^3.0.0":
- "integrity" "sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg=="
- "resolved" "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.0.0.tgz"
- "version" "3.0.0"
- dependencies:
- "postcss-selector-parser" "^6.0.4"
-
-"postcss-modules-values@^4.0.0":
- "integrity" "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ=="
- "resolved" "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz"
- "version" "4.0.0"
- dependencies:
- "icss-utils" "^5.0.0"
-
-"postcss-normalize-charset@^5.1.0":
- "integrity" "sha512-mSgUJ+pd/ldRGVx26p2wz9dNZ7ji6Pn8VWBajMXFf8jk7vUoSrZ2lt/wZR7DtlZYKesmZI680qjr2CeFF2fbUg=="
- "resolved" "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-5.1.0.tgz"
- "version" "5.1.0"
-
-"postcss-normalize-display-values@^5.1.0":
- "integrity" "sha512-WP4KIM4o2dazQXWmFaqMmcvsKmhdINFblgSeRgn8BJ6vxaMyaJkwAzpPpuvSIoG/rmX3M+IrRZEz2H0glrQNEA=="
- "resolved" "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-5.1.0.tgz"
- "version" "5.1.0"
- dependencies:
- "postcss-value-parser" "^4.2.0"
-
-"postcss-normalize-positions@^5.1.0":
- "integrity" "sha512-8gmItgA4H5xiUxgN/3TVvXRoJxkAWLW6f/KKhdsH03atg0cB8ilXnrB5PpSshwVu/dD2ZsRFQcR1OEmSBDAgcQ=="
- "resolved" "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-5.1.0.tgz"
- "version" "5.1.0"
- dependencies:
- "postcss-value-parser" "^4.2.0"
-
-"postcss-normalize-repeat-style@^5.1.0":
- "integrity" "sha512-IR3uBjc+7mcWGL6CtniKNQ4Rr5fTxwkaDHwMBDGGs1x9IVRkYIT/M4NelZWkAOBdV6v3Z9S46zqaKGlyzHSchw=="
- "resolved" "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-5.1.0.tgz"
- "version" "5.1.0"
- dependencies:
- "postcss-value-parser" "^4.2.0"
-
-"postcss-normalize-string@^5.1.0":
- "integrity" "sha512-oYiIJOf4T9T1N4i+abeIc7Vgm/xPCGih4bZz5Nm0/ARVJ7K6xrDlLwvwqOydvyL3RHNf8qZk6vo3aatiw/go3w=="
- "resolved" "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-5.1.0.tgz"
- "version" "5.1.0"
- dependencies:
- "postcss-value-parser" "^4.2.0"
-
-"postcss-normalize-timing-functions@^5.1.0":
- "integrity" "sha512-DOEkzJ4SAXv5xkHl0Wa9cZLF3WCBhF3o1SKVxKQAa+0pYKlueTpCgvkFAHfk+Y64ezX9+nITGrDZeVGgITJXjg=="
- "resolved" "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-5.1.0.tgz"
- "version" "5.1.0"
- dependencies:
- "postcss-value-parser" "^4.2.0"
-
-"postcss-normalize-unicode@^5.1.0":
- "integrity" "sha512-J6M3MizAAZ2dOdSjy2caayJLQT8E8K9XjLce8AUQMwOrCvjCHv24aLC/Lps1R1ylOfol5VIDMaM/Lo9NGlk1SQ=="
- "resolved" "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-5.1.0.tgz"
- "version" "5.1.0"
- dependencies:
- "browserslist" "^4.16.6"
- "postcss-value-parser" "^4.2.0"
-
-"postcss-normalize-url@^5.1.0":
- "integrity" "sha512-5upGeDO+PVthOxSmds43ZeMeZfKH+/DKgGRD7TElkkyS46JXAUhMzIKiCa7BabPeIy3AQcTkXwVVN7DbqsiCew=="
- "resolved" "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-5.1.0.tgz"
- "version" "5.1.0"
- dependencies:
- "normalize-url" "^6.0.1"
- "postcss-value-parser" "^4.2.0"
-
-"postcss-normalize-whitespace@^5.1.1":
- "integrity" "sha512-83ZJ4t3NUDETIHTa3uEg6asWjSBYL5EdkVB0sDncx9ERzOKBVJIUeDO9RyA9Zwtig8El1d79HBp0JEi8wvGQnA=="
- "resolved" "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-5.1.1.tgz"
- "version" "5.1.1"
- dependencies:
- "postcss-value-parser" "^4.2.0"
-
-"postcss-ordered-values@^5.1.2":
- "integrity" "sha512-wr2avRbW4HS2XE2ZCqpfp4N/tDC6GZKZ+SVP8UBTOVS8QWrc4TD8MYrebJrvVVlGPKszmiSCzue43NDiVtgDmg=="
- "resolved" "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-5.1.2.tgz"
- "version" "5.1.2"
- dependencies:
- "cssnano-utils" "^3.1.0"
- "postcss-value-parser" "^4.2.0"
-
-"postcss-reduce-idents@^5.2.0":
- "integrity" "sha512-BTrLjICoSB6gxbc58D5mdBK8OhXRDqud/zodYfdSi52qvDHdMwk+9kB9xsM8yJThH/sZU5A6QVSmMmaN001gIg=="
- "resolved" "https://registry.npmjs.org/postcss-reduce-idents/-/postcss-reduce-idents-5.2.0.tgz"
- "version" "5.2.0"
- dependencies:
- "postcss-value-parser" "^4.2.0"
-
-"postcss-reduce-initial@^5.1.0":
- "integrity" "sha512-5OgTUviz0aeH6MtBjHfbr57tml13PuedK/Ecg8szzd4XRMbYxH4572JFG067z+FqBIf6Zp/d+0581glkvvWMFw=="
- "resolved" "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-5.1.0.tgz"
- "version" "5.1.0"
- dependencies:
- "browserslist" "^4.16.6"
- "caniuse-api" "^3.0.0"
-
-"postcss-reduce-transforms@^5.1.0":
- "integrity" "sha512-2fbdbmgir5AvpW9RLtdONx1QoYG2/EtqpNQbFASDlixBbAYuTcJ0dECwlqNqH7VbaUnEnh8SrxOe2sRIn24XyQ=="
- "resolved" "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-5.1.0.tgz"
- "version" "5.1.0"
- dependencies:
- "postcss-value-parser" "^4.2.0"
-
-"postcss-selector-parser@^6.0.2", "postcss-selector-parser@^6.0.4", "postcss-selector-parser@^6.0.5", "postcss-selector-parser@^6.0.9":
- "integrity" "sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w=="
- "resolved" "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.10.tgz"
- "version" "6.0.10"
- dependencies:
- "cssesc" "^3.0.0"
- "util-deprecate" "^1.0.2"
-
-"postcss-sort-media-queries@^4.2.1":
- "integrity" "sha512-9VYekQalFZ3sdgcTjXMa0dDjsfBVHXlraYJEMiOJ/2iMmI2JGCMavP16z3kWOaRu8NSaJCTgVpB/IVpH5yT9YQ=="
- "resolved" "https://registry.npmjs.org/postcss-sort-media-queries/-/postcss-sort-media-queries-4.2.1.tgz"
- "version" "4.2.1"
- dependencies:
- "sort-css-media-queries" "2.0.4"
-
-"postcss-svgo@^5.1.0":
- "integrity" "sha512-D75KsH1zm5ZrHyxPakAxJWtkyXew5qwS70v56exwvw542d9CRtTo78K0WeFxZB4G7JXKKMbEZtZayTGdIky/eA=="
- "resolved" "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-5.1.0.tgz"
- "version" "5.1.0"
- dependencies:
- "postcss-value-parser" "^4.2.0"
- "svgo" "^2.7.0"
-
-"postcss-unique-selectors@^5.1.1":
- "integrity" "sha512-5JiODlELrz8L2HwxfPnhOWZYWDxVHWL83ufOv84NrcgipI7TaeRsatAhK4Tr2/ZiYldpK/wBvw5BD3qfaK96GA=="
- "resolved" "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-5.1.1.tgz"
- "version" "5.1.1"
- dependencies:
- "postcss-selector-parser" "^6.0.5"
-
-"postcss-value-parser@^4.1.0", "postcss-value-parser@^4.2.0":
- "integrity" "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ=="
- "resolved" "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz"
- "version" "4.2.0"
-
-"postcss-zindex@^5.1.0":
- "integrity" "sha512-fgFMf0OtVSBR1va1JNHYgMxYk73yhn/qb4uQDq1DLGYolz8gHCyr/sesEuGUaYs58E3ZJRcpoGuPVoB7Meiq9A=="
- "resolved" "https://registry.npmjs.org/postcss-zindex/-/postcss-zindex-5.1.0.tgz"
- "version" "5.1.0"
-
-"postcss@^7.0.0 || ^8.0.1", "postcss@^8.0.9", "postcss@^8.1.0", "postcss@^8.2.15", "postcss@^8.2.2", "postcss@^8.3.11", "postcss@^8.3.5", "postcss@^8.4.13", "postcss@^8.4.14", "postcss@^8.4.4", "postcss@^8.4.7":
- "integrity" "sha512-E398TUmfAYFPBSdzgeieK2Y1+1cpdxJx8yXbK/m57nRhKSmk1GB2tO4lbLBtlkfPQTDKfe4Xqv1ASWPpayPEig=="
- "resolved" "https://registry.npmjs.org/postcss/-/postcss-8.4.14.tgz"
- "version" "8.4.14"
- dependencies:
- "nanoid" "^3.3.4"
- "picocolors" "^1.0.0"
- "source-map-js" "^1.0.2"
-
-"prepend-http@^2.0.0":
- "integrity" "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc= sha512-ravE6m9Atw9Z/jjttRUZ+clIXogdghyZAuWJ3qEzjT+jI/dL1ifAqhZeC5VHzQp1MSt1+jxKkFNemj/iO7tVUA=="
- "resolved" "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz"
- "version" "2.0.0"
-
-"pretty-error@^4.0.0":
- "integrity" "sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw=="
- "resolved" "https://registry.npmjs.org/pretty-error/-/pretty-error-4.0.0.tgz"
- "version" "4.0.0"
- dependencies:
- "lodash" "^4.17.20"
- "renderkid" "^3.0.0"
-
-"pretty-time@^1.1.0":
- "integrity" "sha512-28iF6xPQrP8Oa6uxE6a1biz+lWeTOAPKggvjB8HAs6nVMKZwf5bG++632Dx614hIWgUPkgivRfG+a8uAXGTIbA=="
- "resolved" "https://registry.npmjs.org/pretty-time/-/pretty-time-1.1.0.tgz"
- "version" "1.1.0"
-
-"prism-react-renderer@^1.2.1", "prism-react-renderer@^1.3.1":
- "integrity" "sha512-xUeDMEz074d0zc5y6rxiMp/dlC7C+5IDDlaEUlcBOFE2wddz7hz5PNupb087mPwTt7T9BrFmewObfCBuf/LKwQ=="
- "resolved" "https://registry.npmjs.org/prism-react-renderer/-/prism-react-renderer-1.3.1.tgz"
- "version" "1.3.1"
-
-"prismjs@^1.28.0":
- "integrity" "sha512-8aaXdYvl1F7iC7Xm1spqSaY/OJBpYW3v+KJ+F17iYxvdc8sfjW194COK5wVhMZX45tGteiBQgdvD/nhxcRwylw=="
- "resolved" "https://registry.npmjs.org/prismjs/-/prismjs-1.28.0.tgz"
- "version" "1.28.0"
-
-"process-nextick-args@~2.0.0":
- "integrity" "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag=="
- "resolved" "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz"
- "version" "2.0.1"
-
-"promise@^7.1.1":
- "integrity" "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg=="
- "resolved" "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz"
- "version" "7.3.1"
- dependencies:
- "asap" "~2.0.3"
-
-"prompts@^2.4.2":
- "integrity" "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q=="
- "resolved" "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz"
- "version" "2.4.2"
- dependencies:
- "kleur" "^3.0.3"
- "sisteransi" "^1.0.5"
-
-"prop-types@^15.0.0", "prop-types@^15.6.2", "prop-types@^15.7.2":
- "integrity" "sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ=="
- "resolved" "https://registry.npmjs.org/prop-types/-/prop-types-15.7.2.tgz"
- "version" "15.7.2"
- dependencies:
- "loose-envify" "^1.4.0"
- "object-assign" "^4.1.1"
- "react-is" "^16.8.1"
-
-"property-information@^5.0.0", "property-information@^5.3.0":
- "integrity" "sha512-YUHSPk+A30YPv+0Qf8i9Mbfe/C0hdPXk1s1jPVToV8pk8BQtpw10ct89Eo7OWkutrwqvT0eicAxlOg3dOAu8JA=="
- "resolved" "https://registry.npmjs.org/property-information/-/property-information-5.6.0.tgz"
- "version" "5.6.0"
- dependencies:
- "xtend" "^4.0.0"
-
-"proxy-addr@~2.0.7":
- "integrity" "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg=="
- "resolved" "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz"
- "version" "2.0.7"
- dependencies:
- "forwarded" "0.2.0"
- "ipaddr.js" "1.9.1"
-
-"pump@^3.0.0":
- "integrity" "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww=="
- "resolved" "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz"
- "version" "3.0.0"
- dependencies:
- "end-of-stream" "^1.1.0"
- "once" "^1.3.1"
-
-"punycode@^1.3.2":
- "integrity" "sha1-wNWmOycYgArY4esPpSachN1BhF4= sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ=="
- "resolved" "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz"
- "version" "1.4.1"
-
-"punycode@^2.1.0":
- "integrity" "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A=="
- "resolved" "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz"
- "version" "2.1.1"
-
-"pupa@^2.1.1":
- "integrity" "sha512-l1jNAspIBSFqbT+y+5FosojNpVpF94nlI+wDUpqP9enwOTfHx9f0gh5nB96vl+6yTpsJsypeNrwfzPrKuHB41A=="
- "resolved" "https://registry.npmjs.org/pupa/-/pupa-2.1.1.tgz"
- "version" "2.1.1"
- dependencies:
- "escape-goat" "^2.0.0"
-
-"pure-color@^1.2.0":
- "integrity" "sha1-H+Bk+wrIUfDeYTIKi/eWg2Qi8z4= sha512-QFADYnsVoBMw1srW7OVKEYjG+MbIa49s54w1MA1EDY6r2r/sTcKKYqRX1f4GYvnXP7eN/Pe9HFcX+hwzmrXRHA=="
- "resolved" "https://registry.npmjs.org/pure-color/-/pure-color-1.3.0.tgz"
- "version" "1.3.0"
-
-"q@^1.1.2":
- "integrity" "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc= sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw=="
- "resolved" "https://registry.npmjs.org/q/-/q-1.5.1.tgz"
- "version" "1.5.1"
-
-"qs@6.10.3":
- "integrity" "sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ=="
- "resolved" "https://registry.npmjs.org/qs/-/qs-6.10.3.tgz"
- "version" "6.10.3"
- dependencies:
- "side-channel" "^1.0.4"
-
-"queue-microtask@^1.2.2":
- "integrity" "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A=="
- "resolved" "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz"
- "version" "1.2.3"
-
-"queue@6.0.2":
- "integrity" "sha512-iHZWu+q3IdFZFX36ro/lKBkSvfkztY5Y7HMiPlOUjhupPcG2JMfst2KKEpu5XndviX/3UhFbRngUPNKtgvtZiA=="
- "resolved" "https://registry.npmjs.org/queue/-/queue-6.0.2.tgz"
- "version" "6.0.2"
- dependencies:
- "inherits" "~2.0.3"
-
-"randombytes@^2.1.0":
- "integrity" "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ=="
- "resolved" "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz"
- "version" "2.1.0"
- dependencies:
- "safe-buffer" "^5.1.0"
-
-"range-parser@^1.2.1":
- "integrity" "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg=="
- "resolved" "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz"
- "version" "1.2.1"
-
-"range-parser@~1.2.1":
- "integrity" "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg=="
- "resolved" "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz"
- "version" "1.2.1"
-
-"range-parser@1.2.0":
- "integrity" "sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4= sha512-kA5WQoNVo4t9lNx2kQNFCxKeBl5IbbSNBl1M/tLkw9WCn+hxNBAW5Qh8gdhs63CJnhjJ2zQWFoqPJP2sK1AV5A=="
- "resolved" "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz"
- "version" "1.2.0"
-
-"raw-body@2.5.1":
- "integrity" "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig=="
- "resolved" "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz"
- "version" "2.5.1"
- dependencies:
- "bytes" "3.1.2"
- "http-errors" "2.0.0"
- "iconv-lite" "0.4.24"
- "unpipe" "1.0.0"
-
-"rc@^1.2.8":
- "integrity" "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw=="
- "resolved" "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz"
- "version" "1.2.8"
- dependencies:
- "deep-extend" "^0.6.0"
- "ini" "~1.3.0"
- "minimist" "^1.2.0"
- "strip-json-comments" "~2.0.1"
-
-"react-base16-styling@^0.6.0":
- "integrity" "sha1-7yFW1mz0E5aVyKFniGy2nqZgeSw= sha512-yvh/7CArceR/jNATXOKDlvTnPKPmGZz7zsenQ3jUwLzHkNUR0CvY3yGYJbWJ/nnxsL8Sgmt5cO3/SILVuPO6TQ=="
- "resolved" "https://registry.npmjs.org/react-base16-styling/-/react-base16-styling-0.6.0.tgz"
- "version" "0.6.0"
- dependencies:
- "base16" "^1.0.0"
- "lodash.curry" "^4.0.1"
- "lodash.flow" "^3.3.0"
- "pure-color" "^1.2.0"
-
-"react-dev-utils@^12.0.1":
- "integrity" "sha512-84Ivxmr17KjUupyqzFode6xKhjwuEJDROWKJy/BthkL7Wn6NJ8h4WE6k/exAv6ImS+0oZLRRW5j/aINMHyeGeQ=="
- "resolved" "https://registry.npmjs.org/react-dev-utils/-/react-dev-utils-12.0.1.tgz"
- "version" "12.0.1"
- dependencies:
- "@babel/code-frame" "^7.16.0"
- "address" "^1.1.2"
- "browserslist" "^4.18.1"
- "chalk" "^4.1.2"
- "cross-spawn" "^7.0.3"
- "detect-port-alt" "^1.1.6"
- "escape-string-regexp" "^4.0.0"
- "filesize" "^8.0.6"
- "find-up" "^5.0.0"
- "fork-ts-checker-webpack-plugin" "^6.5.0"
- "global-modules" "^2.0.0"
- "globby" "^11.0.4"
- "gzip-size" "^6.0.0"
- "immer" "^9.0.7"
- "is-root" "^2.1.0"
- "loader-utils" "^3.2.0"
- "open" "^8.4.0"
- "pkg-up" "^3.1.0"
- "prompts" "^2.4.2"
- "react-error-overlay" "^6.0.11"
- "recursive-readdir" "^2.2.2"
- "shell-quote" "^1.7.3"
- "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.1", "react-dom@>= 16.8.0 < 18.0.0":
- "integrity" "sha512-s4h96KtLDUQlsENhMn1ar8t2bEa+q/YAtj8pPPdIjPDGBDIVNsrD9aXNWqspUe6AzKCIG0C1HZZLqLV7qpOBGA=="
- "resolved" "https://registry.npmjs.org/react-dom/-/react-dom-17.0.2.tgz"
- "version" "17.0.2"
- dependencies:
- "loose-envify" "^1.1.0"
- "object-assign" "^4.1.1"
- "scheduler" "^0.20.2"
-
-"react-error-overlay@^6.0.11":
- "integrity" "sha512-/6UZ2qgEyH2aqzYZgQPxEnz33NJ2gNsnHA2o5+o4wW9bLM/JYQitNP9xPhsXwC08hMMovfGe/8retsdDsczPRg=="
- "resolved" "https://registry.npmjs.org/react-error-overlay/-/react-error-overlay-6.0.11.tgz"
- "version" "6.0.11"
-
-"react-fast-compare@^3.2.0":
- "integrity" "sha512-rtGImPZ0YyLrscKI9xTpV8psd6I8VAtjKCzQDlzyDvqJA8XOW78TXYQwNRNd8g8JZnDu8q9Fu/1v4HPAVwVdHA=="
- "resolved" "https://registry.npmjs.org/react-fast-compare/-/react-fast-compare-3.2.0.tgz"
- "version" "3.2.0"
-
-"react-helmet-async@*", "react-helmet-async@^1.3.0":
- "integrity" "sha512-9jZ57/dAn9t3q6hneQS0wukqC2ENOBgMNVEhb/ZG9ZSxUetzVIw4iAmEU38IaVg3QGYauQPhSeUTuIUtFglWpg=="
- "resolved" "https://registry.npmjs.org/react-helmet-async/-/react-helmet-async-1.3.0.tgz"
- "version" "1.3.0"
- dependencies:
- "@babel/runtime" "^7.12.5"
- "invariant" "^2.2.4"
- "prop-types" "^15.7.2"
- "react-fast-compare" "^3.2.0"
- "shallowequal" "^1.1.0"
-
-"react-is@^16.6.0", "react-is@^16.7.0", "react-is@^16.8.1":
- "integrity" "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ=="
- "resolved" "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz"
- "version" "16.13.1"
-
-"react-json-view@^1.21.3":
- "integrity" "sha512-13p8IREj9/x/Ye4WI/JpjhoIwuzEgUAtgJZNBJckfzJt1qyh24BdTm6UQNGnyTq9dapQdrqvquZTo3dz1X6Cjw=="
- "resolved" "https://registry.npmjs.org/react-json-view/-/react-json-view-1.21.3.tgz"
- "version" "1.21.3"
- dependencies:
- "flux" "^4.0.1"
- "react-base16-styling" "^0.6.0"
- "react-lifecycles-compat" "^3.0.4"
- "react-textarea-autosize" "^8.3.2"
-
-"react-lifecycles-compat@^3.0.4":
- "integrity" "sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA=="
- "resolved" "https://registry.npmjs.org/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz"
- "version" "3.0.4"
-
-"react-loadable-ssr-addon-v5-slorber@^1.0.1":
- "integrity" "sha512-lq3Lyw1lGku8zUEJPDxsNm1AfYHBrO9Y1+olAYwpUJ2IGFBskM0DMKok97A6LWUpHm+o7IvQBOWu9MLenp9Z+A=="
- "resolved" "https://registry.npmjs.org/react-loadable-ssr-addon-v5-slorber/-/react-loadable-ssr-addon-v5-slorber-1.0.1.tgz"
- "version" "1.0.1"
- dependencies:
- "@babel/runtime" "^7.10.3"
-
-"react-loadable@*", "react-loadable@npm:@docusaurus/react-loadable@5.5.2":
- "integrity" "sha512-A3dYjdBGuy0IGT+wyLIGIKLRE+sAk1iNk0f1HjNDysO7u8lhL4N3VEm+FAubmJbAztn94F7MxBTPmnixbiyFdQ=="
- "resolved" "https://registry.npmjs.org/@docusaurus/react-loadable/-/react-loadable-5.5.2.tgz"
- "version" "5.5.2"
- dependencies:
- "@types/react" "*"
- "prop-types" "^15.6.2"
-
-"react-router-config@^5.1.1":
- "integrity" "sha512-DuanZjaD8mQp1ppHjgnnUnyOlqYXZVjnov/JzFhjLEwd3Z4dYjMSnqrEzzGThH47vpCOqPPwJM2FtthLeJ8Pbg=="
- "resolved" "https://registry.npmjs.org/react-router-config/-/react-router-config-5.1.1.tgz"
- "version" "5.1.1"
- dependencies:
- "@babel/runtime" "^7.1.2"
-
-"react-router-dom@^5.2.0", "react-router-dom@^5.3.3":
- "integrity" "sha512-Ov0tGPMBgqmbu5CDmN++tv2HQ9HlWDuWIIqn4b88gjlAN5IHI+4ZUZRcpz9Hl0azFIwihbLDYw1OiHGRo7ZIng=="
- "resolved" "https://registry.npmjs.org/react-router-dom/-/react-router-dom-5.3.3.tgz"
- "version" "5.3.3"
- dependencies:
- "@babel/runtime" "^7.12.13"
- "history" "^4.9.0"
- "loose-envify" "^1.3.1"
- "prop-types" "^15.6.2"
- "react-router" "5.3.3"
- "tiny-invariant" "^1.0.2"
- "tiny-warning" "^1.0.0"
-
-"react-router@^5.2.0", "react-router@^5.3.3", "react-router@>=5", "react-router@5.3.3":
- "integrity" "sha512-mzQGUvS3bM84TnbtMYR8ZjKnuPJ71IjSzR+DE6UkUqvN4czWIqEs17yLL8xkAycv4ev0AiN+IGrWu88vJs/p2w=="
- "resolved" "https://registry.npmjs.org/react-router/-/react-router-5.3.3.tgz"
- "version" "5.3.3"
- dependencies:
- "@babel/runtime" "^7.12.13"
- "history" "^4.9.0"
- "hoist-non-react-statics" "^3.1.0"
- "loose-envify" "^1.3.1"
- "mini-create-react-context" "^0.4.0"
- "path-to-regexp" "^1.7.0"
- "prop-types" "^15.6.2"
- "react-is" "^16.6.0"
- "tiny-invariant" "^1.0.2"
- "tiny-warning" "^1.0.0"
-
-"react-textarea-autosize@^8.3.2":
- "integrity" "sha512-2XlHXK2TDxS6vbQaoPbMOfQ8GK7+irc2fVK6QFIcC8GOnH3zI/v481n+j1L0WaPVvKxwesnY93fEfH++sus2rQ=="
- "resolved" "https://registry.npmjs.org/react-textarea-autosize/-/react-textarea-autosize-8.3.3.tgz"
- "version" "8.3.3"
- dependencies:
- "@babel/runtime" "^7.10.2"
- "use-composed-ref" "^1.0.0"
- "use-latest" "^1.0.0"
-
-"react@*", "react@^0.14.0 || ^15.0.0 || ^16.0.0 || ^17.0.0", "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", "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.1", "react@>= 16.8.0 < 18.0.0", "react@>=0.14.9", "react@>=15", "react@17.0.2":
- "integrity" "sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA=="
- "resolved" "https://registry.npmjs.org/react/-/react-17.0.2.tgz"
- "version" "17.0.2"
- dependencies:
- "loose-envify" "^1.1.0"
- "object-assign" "^4.1.1"
-
-"readable-stream@^2.0.1":
- "integrity" "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw=="
- "resolved" "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz"
- "version" "2.3.7"
- dependencies:
- "core-util-is" "~1.0.0"
- "inherits" "~2.0.3"
- "isarray" "~1.0.0"
- "process-nextick-args" "~2.0.0"
- "safe-buffer" "~5.1.1"
- "string_decoder" "~1.1.1"
- "util-deprecate" "~1.0.1"
-
-"readable-stream@^3.0.6", "readable-stream@^3.1.1":
- "integrity" "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA=="
- "resolved" "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz"
- "version" "3.6.0"
- dependencies:
- "inherits" "^2.0.3"
- "string_decoder" "^1.1.1"
- "util-deprecate" "^1.0.1"
-
-"readdirp@~3.6.0":
- "integrity" "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA=="
- "resolved" "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz"
- "version" "3.6.0"
- dependencies:
- "picomatch" "^2.2.1"
-
-"reading-time@^1.5.0":
- "integrity" "sha512-onYyVhBNr4CmAxFsKS7bz+uTLRakypIe4R+5A824vBSkQy/hB3fZepoVEf8OVAxzLvK+H/jm9TzpI3ETSm64Kg=="
- "resolved" "https://registry.npmjs.org/reading-time/-/reading-time-1.5.0.tgz"
- "version" "1.5.0"
-
-"rechoir@^0.6.2":
- "integrity" "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q= sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw=="
- "resolved" "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz"
- "version" "0.6.2"
- dependencies:
- "resolve" "^1.1.6"
-
-"recursive-readdir@^2.2.2":
- "integrity" "sha512-nRCcW9Sj7NuZwa2XvH9co8NPeXUBhZP7CRKJtU+cS6PW9FpCIFoI5ib0NT1ZrbNuPoRy0ylyCaUL8Gih4LSyFg=="
- "resolved" "https://registry.npmjs.org/recursive-readdir/-/recursive-readdir-2.2.2.tgz"
- "version" "2.2.2"
- dependencies:
- "minimatch" "3.0.4"
-
-"regenerate-unicode-properties@^10.0.1":
- "integrity" "sha512-vn5DU6yg6h8hP/2OkQo3K7uVILvY4iu0oI4t3HFa81UPkhGJwkRwM10JEc3upjdhHjs/k8GJY1sRBhk5sr69Bw=="
- "resolved" "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.0.1.tgz"
- "version" "10.0.1"
- dependencies:
- "regenerate" "^1.4.2"
-
-"regenerate@^1.4.2":
- "integrity" "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A=="
- "resolved" "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz"
- "version" "1.4.2"
-
-"regenerator-runtime@^0.13.4":
- "integrity" "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA=="
- "resolved" "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz"
- "version" "0.13.9"
-
-"regenerator-transform@^0.15.0":
- "integrity" "sha512-LsrGtPmbYg19bcPHwdtmXwbW+TqNvtY4riE3P83foeHRroMbH6/2ddFBfab3t7kbzc7v7p4wbkIecHImqt0QNg=="
- "resolved" "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.0.tgz"
- "version" "0.15.0"
- dependencies:
- "@babel/runtime" "^7.8.4"
-
-"regexpu-core@^5.0.1":
- "integrity" "sha512-CriEZlrKK9VJw/xQGJpQM5rY88BtuL8DM+AEwvcThHilbxiTAy8vq4iJnd2tqq8wLmjbGZzP7ZcKFjbGkmEFrw=="
- "resolved" "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.0.1.tgz"
- "version" "5.0.1"
- dependencies:
- "regenerate" "^1.4.2"
- "regenerate-unicode-properties" "^10.0.1"
- "regjsgen" "^0.6.0"
- "regjsparser" "^0.8.2"
- "unicode-match-property-ecmascript" "^2.0.0"
- "unicode-match-property-value-ecmascript" "^2.0.0"
-
-"registry-auth-token@^4.0.0":
- "integrity" "sha512-6gkSb4U6aWJB4SF2ZvLb76yCBjcvufXBqvvEx1HbmKPkutswjW1xNVRY0+daljIYRbogN7O0etYSlbiaEQyMyw=="
- "resolved" "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-4.2.1.tgz"
- "version" "4.2.1"
- dependencies:
- "rc" "^1.2.8"
-
-"registry-url@^5.0.0":
- "integrity" "sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw=="
- "resolved" "https://registry.npmjs.org/registry-url/-/registry-url-5.1.0.tgz"
- "version" "5.1.0"
- dependencies:
- "rc" "^1.2.8"
-
-"regjsgen@^0.6.0":
- "integrity" "sha512-ozE883Uigtqj3bx7OhL1KNbCzGyW2NQZPl6Hs09WTvCuZD5sTI4JY58bkbQWa/Y9hxIsvJ3M8Nbf7j54IqeZbA=="
- "resolved" "https://registry.npmjs.org/regjsgen/-/regjsgen-0.6.0.tgz"
- "version" "0.6.0"
-
-"regjsparser@^0.8.2":
- "integrity" "sha512-J3LABycON/VNEu3abOviqGHuB/LOtOQj8SKmfP9anY5GfAVw/SPjwzSjxGjbZXIxbGfqTHtJw58C2Li/WkStmA=="
- "resolved" "https://registry.npmjs.org/regjsparser/-/regjsparser-0.8.4.tgz"
- "version" "0.8.4"
- dependencies:
- "jsesc" "~0.5.0"
-
-"rehype-parse@^6.0.2":
- "integrity" "sha512-0S3CpvpTAgGmnz8kiCyFLGuW5yA4OQhyNTm/nwPopZ7+PI11WnGl1TTWTGv/2hPEe/g2jRLlhVVSsoDH8waRug=="
- "resolved" "https://registry.npmjs.org/rehype-parse/-/rehype-parse-6.0.2.tgz"
- "version" "6.0.2"
- dependencies:
- "hast-util-from-parse5" "^5.0.0"
- "parse5" "^5.0.0"
- "xtend" "^4.0.0"
-
-"relateurl@^0.2.7":
- "integrity" "sha1-VNvzd+UUQKypCkzSdGANP/LYiKk= sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog=="
- "resolved" "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz"
- "version" "0.2.7"
-
-"remark-admonitions@^1.2.1":
- "integrity" "sha512-Ji6p68VDvD+H1oS95Fdx9Ar5WA2wcDA4kwrrhVU7fGctC6+d3uiMICu7w7/2Xld+lnU7/gi+432+rRbup5S8ow=="
- "resolved" "https://registry.npmjs.org/remark-admonitions/-/remark-admonitions-1.2.1.tgz"
- "version" "1.2.1"
- dependencies:
- "rehype-parse" "^6.0.2"
- "unified" "^8.4.2"
- "unist-util-visit" "^2.0.1"
-
-"remark-emoji@^2.2.0":
- "integrity" "sha512-P3cj9s5ggsUvWw5fS2uzCHJMGuXYRb0NnZqYlNecewXt8QBU9n5vW3DUUKOhepS8F9CwdMx9B8a3i7pqFWAI5w=="
- "resolved" "https://registry.npmjs.org/remark-emoji/-/remark-emoji-2.2.0.tgz"
- "version" "2.2.0"
- dependencies:
- "emoticon" "^3.2.0"
- "node-emoji" "^1.10.0"
- "unist-util-visit" "^2.0.3"
-
-"remark-footnotes@2.0.0":
- "integrity" "sha512-3Clt8ZMH75Ayjp9q4CorNeyjwIxHFcTkaektplKGl2A1jNGEUey8cKL0ZC5vJwfcD5GFGsNLImLG/NGzWIzoMQ=="
- "resolved" "https://registry.npmjs.org/remark-footnotes/-/remark-footnotes-2.0.0.tgz"
- "version" "2.0.0"
-
-"remark-mdx@1.6.22":
- "integrity" "sha512-phMHBJgeV76uyFkH4rvzCftLfKCr2RZuF+/gmVcaKrpsihyzmhXjA0BEMDaPTXG5y8qZOKPVo83NAOX01LPnOQ=="
- "resolved" "https://registry.npmjs.org/remark-mdx/-/remark-mdx-1.6.22.tgz"
- "version" "1.6.22"
- dependencies:
- "@babel/core" "7.12.9"
- "@babel/helper-plugin-utils" "7.10.4"
- "@babel/plugin-proposal-object-rest-spread" "7.12.1"
- "@babel/plugin-syntax-jsx" "7.12.1"
- "@mdx-js/util" "1.6.22"
- "is-alphabetical" "1.0.4"
- "remark-parse" "8.0.3"
- "unified" "9.2.0"
-
-"remark-parse@8.0.3":
- "integrity" "sha512-E1K9+QLGgggHxCQtLt++uXltxEprmWzNfg+MxpfHsZlrddKzZ/hZyWHDbK3/Ap8HJQqYJRXP+jHczdL6q6i85Q=="
- "resolved" "https://registry.npmjs.org/remark-parse/-/remark-parse-8.0.3.tgz"
- "version" "8.0.3"
- dependencies:
- "ccount" "^1.0.0"
- "collapse-white-space" "^1.0.2"
- "is-alphabetical" "^1.0.0"
- "is-decimal" "^1.0.0"
- "is-whitespace-character" "^1.0.0"
- "is-word-character" "^1.0.0"
- "markdown-escapes" "^1.0.0"
- "parse-entities" "^2.0.0"
- "repeat-string" "^1.5.4"
- "state-toggle" "^1.0.0"
- "trim" "0.0.1"
- "trim-trailing-lines" "^1.0.0"
- "unherit" "^1.0.4"
- "unist-util-remove-position" "^2.0.0"
- "vfile-location" "^3.0.0"
- "xtend" "^4.0.1"
-
-"remark-squeeze-paragraphs@4.0.0":
- "integrity" "sha512-8qRqmL9F4nuLPIgl92XUuxI3pFxize+F1H0e/W3llTk0UsjJaj01+RrirkMw7P21RKe4X6goQhYRSvNWX+70Rw=="
- "resolved" "https://registry.npmjs.org/remark-squeeze-paragraphs/-/remark-squeeze-paragraphs-4.0.0.tgz"
- "version" "4.0.0"
- dependencies:
- "mdast-squeeze-paragraphs" "^4.0.0"
-
-"renderkid@^3.0.0":
- "integrity" "sha512-q/7VIQA8lmM1hF+jn+sFSPWGlMkSAeNYcPLmDQx2zzuiDfaLrOmumR8iaUKlenFgh0XRPIUeSPlH3A+AW3Z5pg=="
- "resolved" "https://registry.npmjs.org/renderkid/-/renderkid-3.0.0.tgz"
- "version" "3.0.0"
- dependencies:
- "css-select" "^4.1.3"
- "dom-converter" "^0.2.0"
- "htmlparser2" "^6.1.0"
- "lodash" "^4.17.21"
- "strip-ansi" "^6.0.1"
-
-"repeat-string@^1.5.4":
- "integrity" "sha1-jcrkcOHIirwtYA//Sndihtp15jc= sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w=="
- "resolved" "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz"
- "version" "1.6.1"
-
-"require-from-string@^2.0.2":
- "integrity" "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw=="
- "resolved" "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz"
- "version" "2.0.2"
-
-"require-like@>= 0.1.1":
- "integrity" "sha1-rW8wwTvs15cBDEaK+ndcDAprR/o= sha512-oyrU88skkMtDdauHDuKVrgR+zuItqr6/c//FXzvmxRGMexSDc6hNvJInGW3LL46n+8b50RykrvwSUIIQH2LQ5A=="
- "resolved" "https://registry.npmjs.org/require-like/-/require-like-0.1.2.tgz"
- "version" "0.1.2"
-
-"requires-port@^1.0.0":
- "integrity" "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8= sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ=="
- "resolved" "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz"
- "version" "1.0.0"
-
-"resolve-from@^4.0.0":
- "integrity" "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g=="
- "resolved" "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz"
- "version" "4.0.0"
-
-"resolve-pathname@^3.0.0":
- "integrity" "sha512-C7rARubxI8bXFNB/hqcp/4iUeIXJhJZvFPFPiSPRnhU5UPxzMFIl+2E6yY6c4k9giDJAhtV+enfA+G89N6Csng=="
- "resolved" "https://registry.npmjs.org/resolve-pathname/-/resolve-pathname-3.0.0.tgz"
- "version" "3.0.0"
-
-"resolve@^1.1.6", "resolve@^1.14.2", "resolve@^1.3.2":
- "integrity" "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A=="
- "resolved" "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz"
- "version" "1.20.0"
- dependencies:
- "is-core-module" "^2.2.0"
- "path-parse" "^1.0.6"
-
-"responselike@^1.0.2":
- "integrity" "sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec= sha512-/Fpe5guzJk1gPqdJLJR5u7eG/gNY4nImjbRDaVWVMRhne55TCmj2i9Q+54PBRfatRC8v/rIiv9BN0pMd9OV5EQ=="
- "resolved" "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz"
- "version" "1.0.2"
- dependencies:
- "lowercase-keys" "^1.0.0"
-
-"retry@^0.13.1":
- "integrity" "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg=="
- "resolved" "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz"
- "version" "0.13.1"
-
-"reusify@^1.0.4":
- "integrity" "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw=="
- "resolved" "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz"
- "version" "1.0.4"
-
-"rimraf@^3.0.2":
- "integrity" "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA=="
- "resolved" "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz"
- "version" "3.0.2"
- dependencies:
- "glob" "^7.1.3"
-
-"rtl-detect@^1.0.4":
- "integrity" "sha512-EBR4I2VDSSYr7PkBmFy04uhycIpDKp+21p/jARYXlCSjQksTBQcJ0HFUPOO79EPPH5JS6VAhiIQbycf0O3JAxQ=="
- "resolved" "https://registry.npmjs.org/rtl-detect/-/rtl-detect-1.0.4.tgz"
- "version" "1.0.4"
-
-"rtlcss@^3.5.0":
- "integrity" "sha512-wzgMaMFHQTnyi9YOwsx9LjOxYXJPzS8sYnFaKm6R5ysvTkwzHiB0vxnbHwchHQT65PTdBjDG21/kQBWI7q9O7A=="
- "resolved" "https://registry.npmjs.org/rtlcss/-/rtlcss-3.5.0.tgz"
- "version" "3.5.0"
- dependencies:
- "find-up" "^5.0.0"
- "picocolors" "^1.0.0"
- "postcss" "^8.3.11"
- "strip-json-comments" "^3.1.1"
-
-"run-parallel@^1.1.9":
- "integrity" "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA=="
- "resolved" "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz"
- "version" "1.2.0"
- dependencies:
- "queue-microtask" "^1.2.2"
-
-"rxjs@^7.5.4":
- "integrity" "sha512-sy+H0pQofO95VDmFLzyaw9xNJU4KTRSwQIGM6+iG3SypAtCiLDzpeG8sJrNCWn2Up9km+KhkvTdbkrdy+yzZdw=="
- "resolved" "https://registry.npmjs.org/rxjs/-/rxjs-7.5.5.tgz"
- "version" "7.5.5"
- dependencies:
- "tslib" "^2.1.0"
-
-"safe-buffer@^5.1.0", "safe-buffer@>=5.1.0", "safe-buffer@~5.1.0", "safe-buffer@~5.1.1", "safe-buffer@5.1.2":
- "integrity" "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
- "resolved" "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz"
- "version" "5.1.2"
-
-"safe-buffer@~5.2.0":
- "integrity" "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="
- "resolved" "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz"
- "version" "5.2.1"
-
-"safe-buffer@5.2.1":
- "integrity" "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="
- "resolved" "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz"
- "version" "5.2.1"
-
-"safer-buffer@>= 2.1.2 < 3":
- "integrity" "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
- "resolved" "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz"
- "version" "2.1.2"
-
-"sax@^1.2.4", "sax@~1.2.4":
- "integrity" "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw=="
- "resolved" "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz"
- "version" "1.2.4"
-
-"scheduler@^0.20.2":
- "integrity" "sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ=="
- "resolved" "https://registry.npmjs.org/scheduler/-/scheduler-0.20.2.tgz"
- "version" "0.20.2"
- dependencies:
- "loose-envify" "^1.1.0"
- "object-assign" "^4.1.1"
-
-"schema-utils@^2.6.5":
- "integrity" "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg=="
- "resolved" "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz"
- "version" "2.7.1"
- dependencies:
- "@types/json-schema" "^7.0.5"
- "ajv" "^6.12.4"
- "ajv-keywords" "^3.5.2"
-
-"schema-utils@^3.0.0":
- "integrity" "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw=="
- "resolved" "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz"
- "version" "3.1.1"
- dependencies:
- "@types/json-schema" "^7.0.8"
- "ajv" "^6.12.5"
- "ajv-keywords" "^3.5.2"
-
-"schema-utils@^3.1.0":
- "integrity" "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw=="
- "resolved" "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz"
- "version" "3.1.1"
- dependencies:
- "@types/json-schema" "^7.0.8"
- "ajv" "^6.12.5"
- "ajv-keywords" "^3.5.2"
-
-"schema-utils@^3.1.1":
- "integrity" "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw=="
- "resolved" "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz"
- "version" "3.1.1"
- dependencies:
- "@types/json-schema" "^7.0.8"
- "ajv" "^6.12.5"
- "ajv-keywords" "^3.5.2"
-
-"schema-utils@^4.0.0":
- "integrity" "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg=="
- "resolved" "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz"
- "version" "4.0.0"
- dependencies:
- "@types/json-schema" "^7.0.9"
- "ajv" "^8.8.0"
- "ajv-formats" "^2.1.1"
- "ajv-keywords" "^5.0.0"
-
-"schema-utils@2.7.0":
- "integrity" "sha512-0ilKFI6QQF5nxDZLFn2dMjvc4hjg/Wkg7rHd3jK6/A4a1Hl9VFdQWvgB1UMGoU94pad1P/8N7fMcEnLnSiju8A=="
- "resolved" "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.0.tgz"
- "version" "2.7.0"
- dependencies:
- "@types/json-schema" "^7.0.4"
- "ajv" "^6.12.2"
- "ajv-keywords" "^3.4.1"
-
-"section-matter@^1.0.0":
- "integrity" "sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA=="
- "resolved" "https://registry.npmjs.org/section-matter/-/section-matter-1.0.0.tgz"
- "version" "1.0.0"
- dependencies:
- "extend-shallow" "^2.0.1"
- "kind-of" "^6.0.0"
-
-"select-hose@^2.0.0":
- "integrity" "sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo= sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg=="
- "resolved" "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz"
- "version" "2.0.0"
-
-"selfsigned@^2.0.1":
- "integrity" "sha512-LmME957M1zOsUhG+67rAjKfiWFox3SBxE/yymatMZsAx+oMrJ0YQ8AToOnyCm7xbeg2ep37IHLxdu0o2MavQOQ=="
- "resolved" "https://registry.npmjs.org/selfsigned/-/selfsigned-2.0.1.tgz"
- "version" "2.0.1"
- dependencies:
- "node-forge" "^1"
-
-"semver-diff@^3.1.1":
- "integrity" "sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg=="
- "resolved" "https://registry.npmjs.org/semver-diff/-/semver-diff-3.1.1.tgz"
- "version" "3.1.1"
- dependencies:
- "semver" "^6.3.0"
-
-"semver@^5.4.1":
- "integrity" "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ=="
- "resolved" "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz"
- "version" "5.7.1"
-
-"semver@^6.0.0":
- "integrity" "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw=="
- "resolved" "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz"
- "version" "6.3.0"
-
-"semver@^6.1.1":
- "integrity" "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw=="
- "resolved" "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz"
- "version" "6.3.0"
-
-"semver@^6.1.2":
- "integrity" "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw=="
- "resolved" "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz"
- "version" "6.3.0"
-
-"semver@^6.2.0":
- "integrity" "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw=="
- "resolved" "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz"
- "version" "6.3.0"
-
-"semver@^6.3.0":
- "integrity" "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw=="
- "resolved" "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz"
- "version" "6.3.0"
-
-"semver@^7.3.2", "semver@^7.3.4", "semver@^7.3.5", "semver@^7.3.7":
- "integrity" "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g=="
- "resolved" "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz"
- "version" "7.3.7"
- dependencies:
- "lru-cache" "^6.0.0"
-
-"semver@7.0.0":
- "integrity" "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A=="
- "resolved" "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz"
- "version" "7.0.0"
-
-"send@0.18.0":
- "integrity" "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg=="
- "resolved" "https://registry.npmjs.org/send/-/send-0.18.0.tgz"
- "version" "0.18.0"
- dependencies:
- "debug" "2.6.9"
- "depd" "2.0.0"
- "destroy" "1.2.0"
- "encodeurl" "~1.0.2"
- "escape-html" "~1.0.3"
- "etag" "~1.8.1"
- "fresh" "0.5.2"
- "http-errors" "2.0.0"
- "mime" "1.6.0"
- "ms" "2.1.3"
- "on-finished" "2.4.1"
- "range-parser" "~1.2.1"
- "statuses" "2.0.1"
-
-"serialize-javascript@^6.0.0":
- "integrity" "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag=="
- "resolved" "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz"
- "version" "6.0.0"
- dependencies:
- "randombytes" "^2.1.0"
-
-"serve-handler@^6.1.3":
- "integrity" "sha512-FosMqFBNrLyeiIDvP1zgO6YoTzFYHxLDEIavhlmQ+knB2Z7l1t+kGLHkZIDN7UVWqQAmKI3D20A6F6jo3nDd4w=="
- "resolved" "https://registry.npmjs.org/serve-handler/-/serve-handler-6.1.3.tgz"
- "version" "6.1.3"
- dependencies:
- "bytes" "3.0.0"
- "content-disposition" "0.5.2"
- "fast-url-parser" "1.1.3"
- "mime-types" "2.1.18"
- "minimatch" "3.0.4"
- "path-is-inside" "1.0.2"
- "path-to-regexp" "2.2.1"
- "range-parser" "1.2.0"
-
-"serve-index@^1.9.1":
- "integrity" "sha1-03aNabHn2C5c4FD/9bRTvqEqkjk= sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw=="
- "resolved" "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz"
- "version" "1.9.1"
- dependencies:
- "accepts" "~1.3.4"
- "batch" "0.6.1"
- "debug" "2.6.9"
- "escape-html" "~1.0.3"
- "http-errors" "~1.6.2"
- "mime-types" "~2.1.17"
- "parseurl" "~1.3.2"
-
-"serve-static@1.15.0":
- "integrity" "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g=="
- "resolved" "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz"
- "version" "1.15.0"
- dependencies:
- "encodeurl" "~1.0.2"
- "escape-html" "~1.0.3"
- "parseurl" "~1.3.3"
- "send" "0.18.0"
-
-"setimmediate@^1.0.5":
- "integrity" "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU= sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA=="
- "resolved" "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz"
- "version" "1.0.5"
-
-"setprototypeof@1.1.0":
- "integrity" "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ=="
- "resolved" "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz"
- "version" "1.1.0"
-
-"setprototypeof@1.2.0":
- "integrity" "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw=="
- "resolved" "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz"
- "version" "1.2.0"
-
-"shallow-clone@^3.0.0":
- "integrity" "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA=="
- "resolved" "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz"
- "version" "3.0.1"
- dependencies:
- "kind-of" "^6.0.2"
-
-"shallowequal@^1.1.0":
- "integrity" "sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ=="
- "resolved" "https://registry.npmjs.org/shallowequal/-/shallowequal-1.1.0.tgz"
- "version" "1.1.0"
-
-"shebang-command@^2.0.0":
- "integrity" "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA=="
- "resolved" "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz"
- "version" "2.0.0"
- dependencies:
- "shebang-regex" "^3.0.0"
-
-"shebang-regex@^3.0.0":
- "integrity" "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A=="
- "resolved" "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz"
- "version" "3.0.0"
-
-"shell-quote@^1.7.3":
- "integrity" "sha512-Vpfqwm4EnqGdlsBFNmHhxhElJYrdfcxPThu+ryKS5J8L/fhAwLazFZtq+S+TWZ9ANj2piSQLGj6NQg+lKPmxrw=="
- "resolved" "https://registry.npmjs.org/shell-quote/-/shell-quote-1.7.3.tgz"
- "version" "1.7.3"
-
-"shelljs@^0.8.5":
- "integrity" "sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow=="
- "resolved" "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz"
- "version" "0.8.5"
- dependencies:
- "glob" "^7.0.0"
- "interpret" "^1.0.0"
- "rechoir" "^0.6.2"
-
-"side-channel@^1.0.4":
- "integrity" "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw=="
- "resolved" "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz"
- "version" "1.0.4"
- dependencies:
- "call-bind" "^1.0.0"
- "get-intrinsic" "^1.0.2"
- "object-inspect" "^1.9.0"
-
-"signal-exit@^3.0.2", "signal-exit@^3.0.3":
- "integrity" "sha512-sDl4qMFpijcGw22U5w63KmD3cZJfBuFlVNbVMKje2keoKML7X2UzWbc4XrmEbDwg0NXJc3yv4/ox7b+JWb57kQ=="
- "resolved" "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.6.tgz"
- "version" "3.0.6"
-
-"sirv@^1.0.7":
- "integrity" "sha512-f2AOPogZmXgJ9Ma2M22ZEhc1dNtRIzcEkiflMFeVTRq+OViOZMvH1IPMVOwrKaxpSaHioBJiDR0SluRqGa7atA=="
- "resolved" "https://registry.npmjs.org/sirv/-/sirv-1.0.18.tgz"
- "version" "1.0.18"
- dependencies:
- "@polka/url" "^1.0.0-next.20"
- "mime" "^2.3.1"
- "totalist" "^1.0.0"
-
-"sisteransi@^1.0.5":
- "integrity" "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg=="
- "resolved" "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz"
- "version" "1.0.5"
-
-"sitemap@^7.1.1":
- "integrity" "sha512-mK3aFtjz4VdJN0igpIJrinf3EO8U8mxOPsTBzSsy06UtjZQJ3YY3o3Xa7zSc5nMqcMrRwlChHZ18Kxg0caiPBg=="
- "resolved" "https://registry.npmjs.org/sitemap/-/sitemap-7.1.1.tgz"
- "version" "7.1.1"
- dependencies:
- "@types/node" "^17.0.5"
- "@types/sax" "^1.2.1"
- "arg" "^5.0.0"
- "sax" "^1.2.4"
-
-"slash@^3.0.0":
- "integrity" "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q=="
- "resolved" "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz"
- "version" "3.0.0"
-
-"slash@^4.0.0":
- "integrity" "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew=="
- "resolved" "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz"
- "version" "4.0.0"
-
-"sockjs@^0.3.21":
- "integrity" "sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ=="
- "resolved" "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz"
- "version" "0.3.24"
- dependencies:
- "faye-websocket" "^0.11.3"
- "uuid" "^8.3.2"
- "websocket-driver" "^0.7.4"
-
-"sort-css-media-queries@2.0.4":
- "integrity" "sha512-PAIsEK/XupCQwitjv7XxoMvYhT7EAfyzI3hsy/MyDgTvc+Ft55ctdkctJLOy6cQejaIC+zjpUL4djFVm2ivOOw=="
- "resolved" "https://registry.npmjs.org/sort-css-media-queries/-/sort-css-media-queries-2.0.4.tgz"
- "version" "2.0.4"
-
-"source-list-map@^2.0.0":
- "integrity" "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw=="
- "resolved" "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz"
- "version" "2.0.1"
-
-"source-map-js@^1.0.2":
- "integrity" "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw=="
- "resolved" "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz"
- "version" "1.0.2"
-
-"source-map-support@~0.5.20":
- "integrity" "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w=="
- "resolved" "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz"
- "version" "0.5.21"
- dependencies:
- "buffer-from" "^1.0.0"
- "source-map" "^0.6.0"
-
-"source-map@^0.5.0":
- "integrity" "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w= sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ=="
- "resolved" "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz"
- "version" "0.5.7"
-
-"source-map@^0.6.0", "source-map@^0.6.1", "source-map@~0.6.0", "source-map@~0.6.1":
- "integrity" "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="
- "resolved" "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz"
- "version" "0.6.1"
-
-"source-map@~0.7.2":
- "integrity" "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ=="
- "resolved" "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz"
- "version" "0.7.3"
-
-"space-separated-tokens@^1.0.0":
- "integrity" "sha512-q/JSVd1Lptzhf5bkYm4ob4iWPjx0KiRe3sRFBNrVqbJkFaBm5vbbowy1mymoPNLRa52+oadOhJ+K49wsSeSjTA=="
- "resolved" "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-1.1.5.tgz"
- "version" "1.1.5"
-
-"spdy-transport@^3.0.0":
- "integrity" "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw=="
- "resolved" "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz"
- "version" "3.0.0"
- dependencies:
- "debug" "^4.1.0"
- "detect-node" "^2.0.4"
- "hpack.js" "^2.1.6"
- "obuf" "^1.1.2"
- "readable-stream" "^3.0.6"
- "wbuf" "^1.7.3"
-
-"spdy@^4.0.2":
- "integrity" "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA=="
- "resolved" "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz"
- "version" "4.0.2"
- dependencies:
- "debug" "^4.1.0"
- "handle-thing" "^2.0.0"
- "http-deceiver" "^1.2.7"
- "select-hose" "^2.0.0"
- "spdy-transport" "^3.0.0"
-
-"sprintf-js@~1.0.2":
- "integrity" "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g=="
- "resolved" "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz"
- "version" "1.0.3"
-
-"stable@^0.1.8":
- "integrity" "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w=="
- "resolved" "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz"
- "version" "0.1.8"
-
-"state-toggle@^1.0.0":
- "integrity" "sha512-d/5Z4/2iiCnHw6Xzghyhb+GcmF89bxwgXG60wjIiZaxnymbyOmI8Hk4VqHXiVVp6u2ysaskFfXg3ekCj4WNftQ=="
- "resolved" "https://registry.npmjs.org/state-toggle/-/state-toggle-1.0.3.tgz"
- "version" "1.0.3"
-
-"statuses@>= 1.4.0 < 2":
- "integrity" "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow= sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA=="
- "resolved" "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz"
- "version" "1.5.0"
-
-"statuses@2.0.1":
- "integrity" "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ=="
- "resolved" "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz"
- "version" "2.0.1"
-
-"std-env@^3.0.1":
- "integrity" "sha512-mC1Ps9l77/97qeOZc+HrOL7TIaOboHqMZ24dGVQrlxFcpPpfCHpH+qfUT7Dz+6mlG8+JPA1KfBQo19iC/+Ngcw=="
- "resolved" "https://registry.npmjs.org/std-env/-/std-env-3.0.1.tgz"
- "version" "3.0.1"
-
-"string_decoder@^1.1.1":
- "integrity" "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA=="
- "resolved" "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz"
- "version" "1.3.0"
- dependencies:
- "safe-buffer" "~5.2.0"
-
-"string_decoder@~1.1.1":
- "integrity" "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg=="
- "resolved" "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz"
- "version" "1.1.1"
- dependencies:
- "safe-buffer" "~5.1.0"
-
-"string-width@^4.0.0", "string-width@^4.1.0", "string-width@^4.2.2":
- "integrity" "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="
- "resolved" "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz"
- "version" "4.2.3"
- dependencies:
- "emoji-regex" "^8.0.0"
- "is-fullwidth-code-point" "^3.0.0"
- "strip-ansi" "^6.0.1"
-
-"string-width@^4.2.0":
- "integrity" "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="
- "resolved" "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz"
- "version" "4.2.3"
- dependencies:
- "emoji-regex" "^8.0.0"
- "is-fullwidth-code-point" "^3.0.0"
- "strip-ansi" "^6.0.1"
-
-"string-width@^5.0.1":
- "integrity" "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA=="
- "resolved" "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz"
- "version" "5.1.2"
- dependencies:
- "eastasianwidth" "^0.2.0"
- "emoji-regex" "^9.2.2"
- "strip-ansi" "^7.0.1"
-
-"string.prototype.trimend@^1.0.4":
- "integrity" "sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A=="
- "resolved" "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz"
- "version" "1.0.4"
- dependencies:
- "call-bind" "^1.0.2"
- "define-properties" "^1.1.3"
-
-"string.prototype.trimstart@^1.0.4":
- "integrity" "sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw=="
- "resolved" "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz"
- "version" "1.0.4"
- dependencies:
- "call-bind" "^1.0.2"
- "define-properties" "^1.1.3"
-
-"stringify-object@^3.3.0":
- "integrity" "sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw=="
- "resolved" "https://registry.npmjs.org/stringify-object/-/stringify-object-3.3.0.tgz"
- "version" "3.3.0"
- dependencies:
- "get-own-enumerable-property-symbols" "^3.0.0"
- "is-obj" "^1.0.1"
- "is-regexp" "^1.0.0"
-
-"strip-ansi@^6.0.0", "strip-ansi@^6.0.1":
- "integrity" "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="
- "resolved" "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz"
- "version" "6.0.1"
- dependencies:
- "ansi-regex" "^5.0.1"
-
-"strip-ansi@^7.0.1":
- "integrity" "sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw=="
- "resolved" "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz"
- "version" "7.0.1"
- dependencies:
- "ansi-regex" "^6.0.1"
-
-"strip-bom-string@^1.0.0":
- "integrity" "sha1-5SEekiQ2n7uB1jOi8ABE3IztrZI= sha512-uCC2VHvQRYu+lMh4My/sFNmF2klFymLX1wHJeXnbEJERpV/ZsVuonzerjfrGpIGF7LBVa1O7i9kjiWvJiFck8g=="
- "resolved" "https://registry.npmjs.org/strip-bom-string/-/strip-bom-string-1.0.0.tgz"
- "version" "1.0.0"
-
-"strip-final-newline@^2.0.0":
- "integrity" "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA=="
- "resolved" "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz"
- "version" "2.0.0"
-
-"strip-json-comments@^3.1.1":
- "integrity" "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig=="
- "resolved" "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz"
- "version" "3.1.1"
-
-"strip-json-comments@~2.0.1":
- "integrity" "sha1-PFMZQukIwml8DsNEhYwobHygpgo= sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ=="
- "resolved" "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz"
- "version" "2.0.1"
-
-"style-to-object@^0.3.0", "style-to-object@0.3.0":
- "integrity" "sha512-CzFnRRXhzWIdItT3OmF8SQfWyahHhjq3HwcMNCNLn+N7klOOqPjMeG/4JSu77D7ypZdGvSzvkrbyeTMizz2VrA=="
- "resolved" "https://registry.npmjs.org/style-to-object/-/style-to-object-0.3.0.tgz"
- "version" "0.3.0"
- dependencies:
- "inline-style-parser" "0.1.1"
-
-"stylehacks@^5.1.0":
- "integrity" "sha512-SzLmvHQTrIWfSgljkQCw2++C9+Ne91d/6Sp92I8c5uHTcy/PgeHamwITIbBW9wnFTY/3ZfSXR9HIL6Ikqmcu6Q=="
- "resolved" "https://registry.npmjs.org/stylehacks/-/stylehacks-5.1.0.tgz"
- "version" "5.1.0"
- dependencies:
- "browserslist" "^4.16.6"
- "postcss-selector-parser" "^6.0.4"
-
-"supports-color@^5.3.0":
- "integrity" "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow=="
- "resolved" "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz"
- "version" "5.5.0"
- dependencies:
- "has-flag" "^3.0.0"
-
-"supports-color@^7.1.0":
- "integrity" "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="
- "resolved" "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz"
- "version" "7.2.0"
- dependencies:
- "has-flag" "^4.0.0"
-
-"supports-color@^8.0.0":
- "integrity" "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q=="
- "resolved" "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz"
- "version" "8.1.1"
- dependencies:
- "has-flag" "^4.0.0"
-
-"svg-parser@^2.0.2":
- "integrity" "sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ=="
- "resolved" "https://registry.npmjs.org/svg-parser/-/svg-parser-2.0.4.tgz"
- "version" "2.0.4"
-
-"svgo@^1.2.2":
- "integrity" "sha512-yhy/sQYxR5BkC98CY7o31VGsg014AKLEPxdfhora76l36hD9Rdy5NZA/Ocn6yayNPgSamYdtX2rFJdcv07AYVw=="
- "resolved" "https://registry.npmjs.org/svgo/-/svgo-1.3.2.tgz"
- "version" "1.3.2"
- dependencies:
- "chalk" "^2.4.1"
- "coa" "^2.0.2"
- "css-select" "^2.0.0"
- "css-select-base-adapter" "^0.1.1"
- "css-tree" "1.0.0-alpha.37"
- "csso" "^4.0.2"
- "js-yaml" "^3.13.1"
- "mkdirp" "~0.5.1"
- "object.values" "^1.1.0"
- "sax" "~1.2.4"
- "stable" "^0.1.8"
- "unquote" "~1.1.1"
- "util.promisify" "~1.0.0"
-
-"svgo@^2.5.0":
- "integrity" "sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg=="
- "resolved" "https://registry.npmjs.org/svgo/-/svgo-2.8.0.tgz"
- "version" "2.8.0"
- dependencies:
- "@trysound/sax" "0.2.0"
- "commander" "^7.2.0"
- "css-select" "^4.1.3"
- "css-tree" "^1.1.3"
- "csso" "^4.2.0"
- "picocolors" "^1.0.0"
- "stable" "^0.1.8"
-
-"svgo@^2.7.0":
- "integrity" "sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg=="
- "resolved" "https://registry.npmjs.org/svgo/-/svgo-2.8.0.tgz"
- "version" "2.8.0"
- dependencies:
- "@trysound/sax" "0.2.0"
- "commander" "^7.2.0"
- "css-select" "^4.1.3"
- "css-tree" "^1.1.3"
- "csso" "^4.2.0"
- "picocolors" "^1.0.0"
- "stable" "^0.1.8"
-
-"tapable@^1.0.0":
- "integrity" "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA=="
- "resolved" "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz"
- "version" "1.1.3"
-
-"tapable@^2.0.0", "tapable@^2.1.1", "tapable@^2.2.0":
- "integrity" "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ=="
- "resolved" "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz"
- "version" "2.2.1"
-
-"terser-webpack-plugin@^5.1.3", "terser-webpack-plugin@^5.3.1":
- "integrity" "sha512-GvlZdT6wPQKbDNW/GDQzZFg/j4vKU96yl2q6mcUkzKOgW4gwf1Z8cZToUCrz31XHlPWH8MVb1r2tFtdDtTGJ7g=="
- "resolved" "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.1.tgz"
- "version" "5.3.1"
- dependencies:
- "jest-worker" "^27.4.5"
- "schema-utils" "^3.1.1"
- "serialize-javascript" "^6.0.0"
- "source-map" "^0.6.1"
- "terser" "^5.7.2"
-
-"terser@^5.10.0", "terser@^5.7.2":
- "integrity" "sha512-AMmF99DMfEDiRJfxfY5jj5wNH/bYO09cniSqhfoyxc8sFoYIgkJy86G04UoZU5VjlpnplVu0K6Tx6E9b5+DlHA=="
- "resolved" "https://registry.npmjs.org/terser/-/terser-5.10.0.tgz"
- "version" "5.10.0"
- dependencies:
- "commander" "^2.20.0"
- "source-map" "~0.7.2"
- "source-map-support" "~0.5.20"
-
-"text-table@^0.2.0":
- "integrity" "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ= sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw=="
- "resolved" "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz"
- "version" "0.2.0"
-
-"thunky@^1.0.2":
- "integrity" "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA=="
- "resolved" "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz"
- "version" "1.1.0"
-
-"tiny-invariant@^1.0.2":
- "integrity" "sha512-1Uhn/aqw5C6RI4KejVeTg6mIS7IqxnLJ8Mv2tV5rTc0qWobay7pDUz6Wi392Cnc8ak1H0F2cjoRzb2/AW4+Fvg=="
- "resolved" "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.2.0.tgz"
- "version" "1.2.0"
-
-"tiny-warning@^1.0.0", "tiny-warning@^1.0.3":
- "integrity" "sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA=="
- "resolved" "https://registry.npmjs.org/tiny-warning/-/tiny-warning-1.0.3.tgz"
- "version" "1.0.3"
-
-"to-fast-properties@^2.0.0":
- "integrity" "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4= sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog=="
- "resolved" "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz"
- "version" "2.0.0"
-
-"to-readable-stream@^1.0.0":
- "integrity" "sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q=="
- "resolved" "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-1.0.0.tgz"
- "version" "1.0.0"
-
-"to-regex-range@^5.0.1":
- "integrity" "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ=="
- "resolved" "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz"
- "version" "5.0.1"
- dependencies:
- "is-number" "^7.0.0"
-
-"toidentifier@1.0.1":
- "integrity" "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA=="
- "resolved" "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz"
- "version" "1.0.1"
-
-"totalist@^1.0.0":
- "integrity" "sha512-gduQwd1rOdDMGxFG1gEvhV88Oirdo2p+KjoYFU7k2g+i7n6AFFbDQ5kMPUsW0pNbfQsB/cwXvT1i4Bue0s9g5g=="
- "resolved" "https://registry.npmjs.org/totalist/-/totalist-1.1.0.tgz"
- "version" "1.1.0"
-
-"tr46@~0.0.3":
- "integrity" "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o= sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw=="
- "resolved" "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz"
- "version" "0.0.3"
-
-"trim-trailing-lines@^1.0.0":
- "integrity" "sha512-rjUWSqnfTNrjbB9NQWfPMH/xRK1deHeGsHoVfpxJ++XeYXE0d6B1En37AHfw3jtfTU7dzMzZL2jjpe8Qb5gLIQ=="
- "resolved" "https://registry.npmjs.org/trim-trailing-lines/-/trim-trailing-lines-1.1.4.tgz"
- "version" "1.1.4"
-
-"trim@0.0.1":
- "integrity" "sha1-WFhUf2spB1fulczMZm+1AITEYN0= sha512-YzQV+TZg4AxpKxaTHK3c3D+kRDCGVEE7LemdlQZoQXn0iennk10RsIoY6ikzAqJTc9Xjl9C1/waHom/J86ziAQ=="
- "resolved" "https://registry.npmjs.org/trim/-/trim-0.0.1.tgz"
- "version" "0.0.1"
-
-"trough@^1.0.0":
- "integrity" "sha512-rvuRbTarPXmMb79SmzEp8aqXNKcK+y0XaB298IXueQ8I2PsrATcPBCSPyK/dDNa2iWOhKlfNnOjdAOTBU/nkFA=="
- "resolved" "https://registry.npmjs.org/trough/-/trough-1.0.5.tgz"
- "version" "1.0.5"
-
-"tslib@^2.0.3", "tslib@^2.1.0", "tslib@^2.2.0", "tslib@^2.4.0":
- "integrity" "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ=="
- "resolved" "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz"
- "version" "2.4.0"
-
-"type-fest@^0.20.2":
- "integrity" "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ=="
- "resolved" "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz"
- "version" "0.20.2"
-
-"type-fest@^2.5.0":
- "integrity" "sha512-qt6ylCGpLjZ7AaODxbpyBZSs9fCI9SkL3Z9q2oxMBQhs/uyY+VD8jHA8ULCGmWQJlBgqvO3EJeAngOHD8zQCrQ=="
- "resolved" "https://registry.npmjs.org/type-fest/-/type-fest-2.12.2.tgz"
- "version" "2.12.2"
-
-"type-is@~1.6.18":
- "integrity" "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g=="
- "resolved" "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz"
- "version" "1.6.18"
- dependencies:
- "media-typer" "0.3.0"
- "mime-types" "~2.1.24"
-
-"typedarray-to-buffer@^3.1.5":
- "integrity" "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q=="
- "resolved" "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz"
- "version" "3.1.5"
- dependencies:
- "is-typedarray" "^1.0.0"
-
-"typescript@>= 2.7":
- "integrity" "sha512-9ia/jWHIEbo49HfjrLGfKbZSuWo9iTMwXO+Ca3pRsSpbsMbc7/IU8NKdCZVRRBafVPGnoJeFL76ZOAA84I9fEg=="
- "resolved" "https://registry.npmjs.org/typescript/-/typescript-4.6.4.tgz"
- "version" "4.6.4"
-
-"ua-parser-js@^0.7.30":
- "integrity" "sha512-qLK/Xe9E2uzmYI3qLeOmI0tEOt+TBBQyUIAh4aAgU05FVYzeZrKUdkAZfBNVGRaHVgV0TDkdEngJSw/SyQchkQ=="
- "resolved" "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.31.tgz"
- "version" "0.7.31"
-
-"unbox-primitive@^1.0.1":
- "integrity" "sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw=="
- "resolved" "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.1.tgz"
- "version" "1.0.1"
- dependencies:
- "function-bind" "^1.1.1"
- "has-bigints" "^1.0.1"
- "has-symbols" "^1.0.2"
- "which-boxed-primitive" "^1.0.2"
-
-"unherit@^1.0.4":
- "integrity" "sha512-Ft16BJcnapDKp0+J/rqFC3Rrk6Y/Ng4nzsC028k2jdDII/rdZ7Wd3pPT/6+vIIxRagwRc9K0IUX0Ra4fKvw+WQ=="
- "resolved" "https://registry.npmjs.org/unherit/-/unherit-1.1.3.tgz"
- "version" "1.1.3"
- dependencies:
- "inherits" "^2.0.0"
- "xtend" "^4.0.0"
-
-"unicode-canonical-property-names-ecmascript@^2.0.0":
- "integrity" "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ=="
- "resolved" "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz"
- "version" "2.0.0"
-
-"unicode-match-property-ecmascript@^2.0.0":
- "integrity" "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q=="
- "resolved" "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz"
- "version" "2.0.0"
- dependencies:
- "unicode-canonical-property-names-ecmascript" "^2.0.0"
- "unicode-property-aliases-ecmascript" "^2.0.0"
-
-"unicode-match-property-value-ecmascript@^2.0.0":
- "integrity" "sha512-7Yhkc0Ye+t4PNYzOGKedDhXbYIBe1XEQYQxOPyhcXNMJ0WCABqqj6ckydd6pWRZTHV4GuCPKdBAUiMc60tsKVw=="
- "resolved" "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.0.0.tgz"
- "version" "2.0.0"
-
-"unicode-property-aliases-ecmascript@^2.0.0":
- "integrity" "sha512-5Zfuy9q/DFr4tfO7ZPeVXb1aPoeQSdeFMLpYuFebehDAhbuevLs5yxSZmIFN1tP5F9Wl4IpJrYojg85/zgyZHQ=="
- "resolved" "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.0.0.tgz"
- "version" "2.0.0"
-
-"unified@^8.4.2":
- "integrity" "sha512-JCrmN13jI4+h9UAyKEoGcDZV+i1E7BLFuG7OsaDvTXI5P0qhHX+vZO/kOhz9jn8HGENDKbwSeB0nVOg4gVStGA=="
- "resolved" "https://registry.npmjs.org/unified/-/unified-8.4.2.tgz"
- "version" "8.4.2"
- dependencies:
- "bail" "^1.0.0"
- "extend" "^3.0.0"
- "is-plain-obj" "^2.0.0"
- "trough" "^1.0.0"
- "vfile" "^4.0.0"
-
-"unified@9.2.0":
- "integrity" "sha512-vx2Z0vY+a3YoTj8+pttM3tiJHCwY5UFbYdiWrwBEbHmK8pvsPj2rtAX2BFfgXen8T39CJWblWRDT4L5WGXtDdg=="
- "resolved" "https://registry.npmjs.org/unified/-/unified-9.2.0.tgz"
- "version" "9.2.0"
- dependencies:
- "bail" "^1.0.0"
- "extend" "^3.0.0"
- "is-buffer" "^2.0.0"
- "is-plain-obj" "^2.0.0"
- "trough" "^1.0.0"
- "vfile" "^4.0.0"
-
-"unique-string@^2.0.0":
- "integrity" "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg=="
- "resolved" "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz"
- "version" "2.0.0"
- dependencies:
- "crypto-random-string" "^2.0.0"
-
-"unist-builder@^2.0.0", "unist-builder@2.0.3":
- "integrity" "sha512-f98yt5pnlMWlzP539tPc4grGMsFaQQlP/vM396b00jngsiINumNmsY8rkXjfoi1c6QaM8nQ3vaGDuoKWbe/1Uw=="
- "resolved" "https://registry.npmjs.org/unist-builder/-/unist-builder-2.0.3.tgz"
- "version" "2.0.3"
-
-"unist-util-generated@^1.0.0":
- "integrity" "sha512-cln2Mm1/CZzN5ttGK7vkoGw+RZ8VcUH6BtGbq98DDtRGquAAOXig1mrBQYelOwMXYS8rK+vZDyyojSjp7JX+Lg=="
- "resolved" "https://registry.npmjs.org/unist-util-generated/-/unist-util-generated-1.1.6.tgz"
- "version" "1.1.6"
-
-"unist-util-is@^4.0.0":
- "integrity" "sha512-ZOQSsnce92GrxSqlnEEseX0gi7GH9zTJZ0p9dtu87WRb/37mMPO2Ilx1s/t9vBHrFhbgweUwb+t7cIn5dxPhZg=="
- "resolved" "https://registry.npmjs.org/unist-util-is/-/unist-util-is-4.1.0.tgz"
- "version" "4.1.0"
-
-"unist-util-position@^3.0.0":
- "integrity" "sha512-w+PkwCbYSFw8vpgWD0v7zRCl1FpY3fjDSQ3/N/wNd9Ffa4gPi8+4keqt99N3XW6F99t/mUzp2xAhNmfKWp95QA=="
- "resolved" "https://registry.npmjs.org/unist-util-position/-/unist-util-position-3.1.0.tgz"
- "version" "3.1.0"
-
-"unist-util-remove-position@^2.0.0":
- "integrity" "sha512-fDZsLYIe2uT+oGFnuZmy73K6ZxOPG/Qcm+w7jbEjaFcJgbQ6cqjs/eSPzXhsmGpAsWPkqZM9pYjww5QTn3LHMA=="
- "resolved" "https://registry.npmjs.org/unist-util-remove-position/-/unist-util-remove-position-2.0.1.tgz"
- "version" "2.0.1"
- dependencies:
- "unist-util-visit" "^2.0.0"
-
-"unist-util-remove@^2.0.0":
- "integrity" "sha512-J8NYPyBm4baYLdCbjmf1bhPu45Cr1MWTm77qd9istEkzWpnN6O9tMsEbB2JhNnBCqGENRqEWomQ+He6au0B27Q=="
- "resolved" "https://registry.npmjs.org/unist-util-remove/-/unist-util-remove-2.1.0.tgz"
- "version" "2.1.0"
- dependencies:
- "unist-util-is" "^4.0.0"
-
-"unist-util-stringify-position@^2.0.0":
- "integrity" "sha512-3faScn5I+hy9VleOq/qNbAd6pAx7iH5jYBMS9I1HgQVijz/4mv5Bvw5iw1sC/90CODiKo81G/ps8AJrISn687g=="
- "resolved" "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-2.0.3.tgz"
- "version" "2.0.3"
- dependencies:
- "@types/unist" "^2.0.2"
-
-"unist-util-visit-parents@^3.0.0":
- "integrity" "sha512-1KROIZWo6bcMrZEwiH2UrXDyalAa0uqzWCxCJj6lPOvTve2WkfgCytoDTPaMnodXh1WrXOq0haVYHj99ynJlsg=="
- "resolved" "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-3.1.1.tgz"
- "version" "3.1.1"
- dependencies:
- "@types/unist" "^2.0.0"
- "unist-util-is" "^4.0.0"
-
-"unist-util-visit@^2.0.0", "unist-util-visit@^2.0.1", "unist-util-visit@^2.0.3", "unist-util-visit@2.0.3":
- "integrity" "sha512-iJ4/RczbJMkD0712mGktuGpm/U4By4FfDonL7N/9tATGIF4imikjOuagyMY53tnZq3NP6BcmlrHhEKAfGWjh7Q=="
- "resolved" "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-2.0.3.tgz"
- "version" "2.0.3"
- dependencies:
- "@types/unist" "^2.0.0"
- "unist-util-is" "^4.0.0"
- "unist-util-visit-parents" "^3.0.0"
-
-"universalify@^2.0.0":
- "integrity" "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ=="
- "resolved" "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz"
- "version" "2.0.0"
-
-"unpipe@~1.0.0", "unpipe@1.0.0":
- "integrity" "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw= sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ=="
- "resolved" "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz"
- "version" "1.0.0"
-
-"unquote@~1.1.1":
- "integrity" "sha1-j97XMk7G6IoP+LkF58CYzcCG1UQ= sha512-vRCqFv6UhXpWxZPyGDh/F3ZpNv8/qo7w6iufLpQg9aKnQ71qM4B5KiI7Mia9COcjEhrO9LueHpMYjYzsWH3OIg=="
- "resolved" "https://registry.npmjs.org/unquote/-/unquote-1.1.1.tgz"
- "version" "1.1.1"
-
-"update-notifier@^5.1.0":
- "integrity" "sha512-ItnICHbeMh9GqUy31hFPrD1kcuZ3rpxDZbf4KUDavXwS0bW5m7SLbDQpGX3UYr072cbrF5hFUs3r5tUsPwjfHw=="
- "resolved" "https://registry.npmjs.org/update-notifier/-/update-notifier-5.1.0.tgz"
- "version" "5.1.0"
- dependencies:
- "boxen" "^5.0.0"
- "chalk" "^4.1.0"
- "configstore" "^5.0.1"
- "has-yarn" "^2.1.0"
- "import-lazy" "^2.1.0"
- "is-ci" "^2.0.0"
- "is-installed-globally" "^0.4.0"
- "is-npm" "^5.0.0"
- "is-yarn-global" "^0.3.0"
- "latest-version" "^5.1.0"
- "pupa" "^2.1.1"
- "semver" "^7.3.4"
- "semver-diff" "^3.1.1"
- "xdg-basedir" "^4.0.0"
-
-"uri-js@^4.2.2":
- "integrity" "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg=="
- "resolved" "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz"
- "version" "4.4.1"
- dependencies:
- "punycode" "^2.1.0"
-
-"url-loader@^4.1.1":
- "integrity" "sha512-3BTV812+AVHHOJQO8O5MkWgZ5aosP7GnROJwvzLS9hWDj00lZ6Z0wNak423Lp9PBZN05N+Jk/N5Si8jRAlGyWA=="
- "resolved" "https://registry.npmjs.org/url-loader/-/url-loader-4.1.1.tgz"
- "version" "4.1.1"
- dependencies:
- "loader-utils" "^2.0.0"
- "mime-types" "^2.1.27"
- "schema-utils" "^3.0.0"
-
-"url-parse-lax@^3.0.0":
- "integrity" "sha1-FrXK/Afb42dsGxmZF3gj1lA6yww= sha512-NjFKA0DidqPa5ciFcSrXnAltTtzz84ogy+NebPvfEgAck0+TNg4UJ4IN+fB7zRZfbgUf0syOo9MDxFkDSMuFaQ=="
- "resolved" "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz"
- "version" "3.0.0"
- dependencies:
- "prepend-http" "^2.0.0"
-
-"use-composed-ref@^1.0.0":
- "integrity" "sha512-GLMG0Jc/jiKov/3Ulid1wbv3r54K9HlMW29IWcDFPEqFkSO2nS0MuefWgMJpeHQ9YJeXDL3ZUF+P3jdXlZX/cQ=="
- "resolved" "https://registry.npmjs.org/use-composed-ref/-/use-composed-ref-1.3.0.tgz"
- "version" "1.3.0"
-
-"use-isomorphic-layout-effect@^1.1.1":
- "integrity" "sha512-49L8yCO3iGT/ZF9QttjwLF/ZD9Iwto5LnH5LmEdk/6cFmXddqi2ulF0edxTwjj+7mqvpVVGQWvbXZdn32wRSHA=="
- "resolved" "https://registry.npmjs.org/use-isomorphic-layout-effect/-/use-isomorphic-layout-effect-1.1.2.tgz"
- "version" "1.1.2"
-
-"use-latest@^1.0.0":
- "integrity" "sha512-xA+AVm/Wlg3e2P/JiItTziwS7FK92LWrDB0p+hgXloIMuVCeJJ8v6f0eeHyPZaJrM+usM1FkFfbNCrJGs8A/zw=="
- "resolved" "https://registry.npmjs.org/use-latest/-/use-latest-1.2.1.tgz"
- "version" "1.2.1"
- dependencies:
- "use-isomorphic-layout-effect" "^1.1.1"
-
-"util-deprecate@^1.0.1", "util-deprecate@^1.0.2", "util-deprecate@~1.0.1":
- "integrity" "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw=="
- "resolved" "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz"
- "version" "1.0.2"
-
-"util.promisify@~1.0.0":
- "integrity" "sha512-g9JpC/3He3bm38zsLupWryXHoEcS22YHthuPQSJdMy6KNrzIRzWqcsHzD/WUnqe45whVou4VIsPew37DoXWNrA=="
- "resolved" "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.1.tgz"
- "version" "1.0.1"
- dependencies:
- "define-properties" "^1.1.3"
- "es-abstract" "^1.17.2"
- "has-symbols" "^1.0.1"
- "object.getownpropertydescriptors" "^2.1.0"
-
-"utila@~0.4":
- "integrity" "sha1-ihagXURWV6Oupe7MWxKk+lN5dyw= sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA=="
- "resolved" "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz"
- "version" "0.4.0"
-
-"utility-types@^3.10.0":
- "integrity" "sha512-O11mqxmi7wMKCo6HKFt5AhO4BwY3VV68YU07tgxfz8zJTIxr4BpsezN49Ffwy9j3ZpwwJp4fkRwjRzq3uWE6Rg=="
- "resolved" "https://registry.npmjs.org/utility-types/-/utility-types-3.10.0.tgz"
- "version" "3.10.0"
-
-"utils-merge@1.0.1":
- "integrity" "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM= sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA=="
- "resolved" "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz"
- "version" "1.0.1"
-
-"uuid@^8.3.2":
- "integrity" "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg=="
- "resolved" "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz"
- "version" "8.3.2"
-
-"value-equal@^1.0.1":
- "integrity" "sha512-NOJ6JZCAWr0zlxZt+xqCHNTEKOsrks2HQd4MqhP1qy4z1SkbEP467eNx6TgDKXMvUOb+OENfJCZwM+16n7fRfw=="
- "resolved" "https://registry.npmjs.org/value-equal/-/value-equal-1.0.1.tgz"
- "version" "1.0.1"
-
-"vary@~1.1.2":
- "integrity" "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw= sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg=="
- "resolved" "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz"
- "version" "1.1.2"
-
-"vfile-location@^3.0.0", "vfile-location@^3.2.0":
- "integrity" "sha512-aLEIZKv/oxuCDZ8lkJGhuhztf/BW4M+iHdCwglA/eWc+vtuRFJj8EtgceYFX4LRjOhCAAiNHsKGssC6onJ+jbA=="
- "resolved" "https://registry.npmjs.org/vfile-location/-/vfile-location-3.2.0.tgz"
- "version" "3.2.0"
-
-"vfile-message@^2.0.0":
- "integrity" "sha512-DjssxRGkMvifUOJre00juHoP9DPWuzjxKuMDrhNbk2TdaYYBNMStsNhEOt3idrtI12VQYM/1+iM0KOzXi4pxwQ=="
- "resolved" "https://registry.npmjs.org/vfile-message/-/vfile-message-2.0.4.tgz"
- "version" "2.0.4"
- dependencies:
- "@types/unist" "^2.0.0"
- "unist-util-stringify-position" "^2.0.0"
-
-"vfile@^4.0.0":
- "integrity" "sha512-O6AE4OskCG5S1emQ/4gl8zK586RqA3srz3nfK/Viy0UPToBc5Trp9BVFb1u0CjsKrAWwnpr4ifM/KBXPWwJbCA=="
- "resolved" "https://registry.npmjs.org/vfile/-/vfile-4.2.1.tgz"
- "version" "4.2.1"
- dependencies:
- "@types/unist" "^2.0.0"
- "is-buffer" "^2.0.0"
- "unist-util-stringify-position" "^2.0.0"
- "vfile-message" "^2.0.0"
-
-"wait-on@^6.0.1":
- "integrity" "sha512-zht+KASY3usTY5u2LgaNqn/Cd8MukxLGjdcZxT2ns5QzDmTFc4XoWBgC+C/na+sMRZTuVygQoMYwdcVjHnYIVw=="
- "resolved" "https://registry.npmjs.org/wait-on/-/wait-on-6.0.1.tgz"
- "version" "6.0.1"
- dependencies:
- "axios" "^0.25.0"
- "joi" "^17.6.0"
- "lodash" "^4.17.21"
- "minimist" "^1.2.5"
- "rxjs" "^7.5.4"
-
-"watchpack@^2.3.1":
- "integrity" "sha512-x0t0JuydIo8qCNctdDrn1OzH/qDzk2+rdCOC3YzumZ42fiMqmQ7T3xQurykYMhYfHaPHTp4ZxAx2NfUo1K6QaA=="
- "resolved" "https://registry.npmjs.org/watchpack/-/watchpack-2.3.1.tgz"
- "version" "2.3.1"
- dependencies:
- "glob-to-regexp" "^0.4.1"
- "graceful-fs" "^4.1.2"
-
-"wbuf@^1.1.0", "wbuf@^1.7.3":
- "integrity" "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA=="
- "resolved" "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz"
- "version" "1.7.3"
- dependencies:
- "minimalistic-assert" "^1.0.0"
-
-"web-namespaces@^1.0.0", "web-namespaces@^1.1.2":
- "integrity" "sha512-wYxSGajtmoP4WxfejAPIr4l0fVh+jeMXZb08wNc0tMg6xsfZXj3cECqIK0G7ZAqUq0PP8WlMDtaOGVBTAWztNw=="
- "resolved" "https://registry.npmjs.org/web-namespaces/-/web-namespaces-1.1.4.tgz"
- "version" "1.1.4"
-
-"webidl-conversions@^3.0.0":
- "integrity" "sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE= sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ=="
- "resolved" "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz"
- "version" "3.0.1"
-
-"webpack-bundle-analyzer@^4.5.0":
- "integrity" "sha512-GUMZlM3SKwS8Z+CKeIFx7CVoHn3dXFcUAjT/dcZQQmfSZGvitPfMob2ipjai7ovFFqPvTqkEZ/leL4O0YOdAYQ=="
- "resolved" "https://registry.npmjs.org/webpack-bundle-analyzer/-/webpack-bundle-analyzer-4.5.0.tgz"
- "version" "4.5.0"
- dependencies:
- "acorn" "^8.0.4"
- "acorn-walk" "^8.0.0"
- "chalk" "^4.1.0"
- "commander" "^7.2.0"
- "gzip-size" "^6.0.0"
- "lodash" "^4.17.20"
- "opener" "^1.5.2"
- "sirv" "^1.0.7"
- "ws" "^7.3.1"
-
-"webpack-dev-middleware@^5.3.1":
- "integrity" "sha512-81EujCKkyles2wphtdrnPg/QqegC/AtqNH//mQkBYSMqwFVCQrxM6ktB2O/SPlZy7LqeEfTbV3cZARGQz6umhg=="
- "resolved" "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.1.tgz"
- "version" "5.3.1"
- dependencies:
- "colorette" "^2.0.10"
- "memfs" "^3.4.1"
- "mime-types" "^2.1.31"
- "range-parser" "^1.2.1"
- "schema-utils" "^4.0.0"
-
-"webpack-dev-server@^4.8.1", "webpack-dev-server@^4.9.0":
- "integrity" "sha512-+Nlb39iQSOSsFv0lWUuUTim3jDQO8nhK3E68f//J2r5rIcp4lULHXz2oZ0UVdEeWXEh5lSzYUlzarZhDAeAVQw=="
- "resolved" "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.9.0.tgz"
- "version" "4.9.0"
- dependencies:
- "@types/bonjour" "^3.5.9"
- "@types/connect-history-api-fallback" "^1.3.5"
- "@types/express" "^4.17.13"
- "@types/serve-index" "^1.9.1"
- "@types/sockjs" "^0.3.33"
- "@types/ws" "^8.5.1"
- "ansi-html-community" "^0.0.8"
- "bonjour-service" "^1.0.11"
- "chokidar" "^3.5.3"
- "colorette" "^2.0.10"
- "compression" "^1.7.4"
- "connect-history-api-fallback" "^1.6.0"
- "default-gateway" "^6.0.3"
- "express" "^4.17.3"
- "graceful-fs" "^4.2.6"
- "html-entities" "^2.3.2"
- "http-proxy-middleware" "^2.0.3"
- "ipaddr.js" "^2.0.1"
- "open" "^8.0.9"
- "p-retry" "^4.5.0"
- "rimraf" "^3.0.2"
- "schema-utils" "^4.0.0"
- "selfsigned" "^2.0.1"
- "serve-index" "^1.9.1"
- "sockjs" "^0.3.21"
- "spdy" "^4.0.2"
- "webpack-dev-middleware" "^5.3.1"
- "ws" "^8.4.2"
-
-"webpack-merge@^5.8.0":
- "integrity" "sha512-/SaI7xY0831XwP6kzuwhKWVKDP9t1QY1h65lAFLbZqMPIuYcD9QAW4u9STIbU9kaJbPBB/geU/gLr1wDjOhQ+Q=="
- "resolved" "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.8.0.tgz"
- "version" "5.8.0"
- dependencies:
- "clone-deep" "^4.0.1"
- "wildcard" "^2.0.0"
-
-"webpack-sources@^1.4.3":
- "integrity" "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ=="
- "resolved" "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz"
- "version" "1.4.3"
- dependencies:
- "source-list-map" "^2.0.0"
- "source-map" "~0.6.1"
-
-"webpack-sources@^3.2.3":
- "integrity" "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w=="
- "resolved" "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz"
- "version" "3.2.3"
-
-"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.72.0", "webpack@^5.72.1", "webpack@>= 4", "webpack@>=2", "webpack@>=4.41.1 || 5.x", "webpack@3 || 4 || 5":
- "integrity" "sha512-dXG5zXCLspQR4krZVR6QgajnZOjW2K/djHvdcRaDQvsjV9z9vaW6+ja5dZOYbqBBjF6kGXka/2ZyxNdc+8Jung=="
- "resolved" "https://registry.npmjs.org/webpack/-/webpack-5.72.1.tgz"
- "version" "5.72.1"
- dependencies:
- "@types/eslint-scope" "^3.7.3"
- "@types/estree" "^0.0.51"
- "@webassemblyjs/ast" "1.11.1"
- "@webassemblyjs/wasm-edit" "1.11.1"
- "@webassemblyjs/wasm-parser" "1.11.1"
- "acorn" "^8.4.1"
- "acorn-import-assertions" "^1.7.6"
- "browserslist" "^4.14.5"
- "chrome-trace-event" "^1.0.2"
- "enhanced-resolve" "^5.9.3"
- "es-module-lexer" "^0.9.0"
- "eslint-scope" "5.1.1"
- "events" "^3.2.0"
- "glob-to-regexp" "^0.4.1"
- "graceful-fs" "^4.2.9"
- "json-parse-even-better-errors" "^2.3.1"
- "loader-runner" "^4.2.0"
- "mime-types" "^2.1.27"
- "neo-async" "^2.6.2"
- "schema-utils" "^3.1.0"
- "tapable" "^2.1.1"
- "terser-webpack-plugin" "^5.1.3"
- "watchpack" "^2.3.1"
- "webpack-sources" "^3.2.3"
-
-"webpackbar@^5.0.2":
- "integrity" "sha512-BmFJo7veBDgQzfWXl/wwYXr/VFus0614qZ8i9znqcl9fnEdiVkdbi0TedLQ6xAK92HZHDJ0QmyQ0fmuZPAgCYQ=="
- "resolved" "https://registry.npmjs.org/webpackbar/-/webpackbar-5.0.2.tgz"
- "version" "5.0.2"
- dependencies:
- "chalk" "^4.1.0"
- "consola" "^2.15.3"
- "pretty-time" "^1.1.0"
- "std-env" "^3.0.1"
-
-"websocket-driver@^0.7.4", "websocket-driver@>=0.5.1":
- "integrity" "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg=="
- "resolved" "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz"
- "version" "0.7.4"
- dependencies:
- "http-parser-js" ">=0.5.1"
- "safe-buffer" ">=5.1.0"
- "websocket-extensions" ">=0.1.1"
-
-"websocket-extensions@>=0.1.1":
- "integrity" "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg=="
- "resolved" "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz"
- "version" "0.1.4"
-
-"whatwg-url@^5.0.0":
- "integrity" "sha1-lmRU6HZUYuN2RNNib2dCzotwll0= sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw=="
- "resolved" "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz"
- "version" "5.0.0"
- dependencies:
- "tr46" "~0.0.3"
- "webidl-conversions" "^3.0.0"
-
-"which-boxed-primitive@^1.0.2":
- "integrity" "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg=="
- "resolved" "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz"
- "version" "1.0.2"
- dependencies:
- "is-bigint" "^1.0.1"
- "is-boolean-object" "^1.1.0"
- "is-number-object" "^1.0.4"
- "is-string" "^1.0.5"
- "is-symbol" "^1.0.3"
-
-"which@^1.3.1":
- "integrity" "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ=="
- "resolved" "https://registry.npmjs.org/which/-/which-1.3.1.tgz"
- "version" "1.3.1"
- dependencies:
- "isexe" "^2.0.0"
-
-"which@^2.0.1":
- "integrity" "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA=="
- "resolved" "https://registry.npmjs.org/which/-/which-2.0.2.tgz"
- "version" "2.0.2"
- dependencies:
- "isexe" "^2.0.0"
-
-"widest-line@^3.1.0":
- "integrity" "sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg=="
- "resolved" "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz"
- "version" "3.1.0"
- dependencies:
- "string-width" "^4.0.0"
-
-"widest-line@^4.0.1":
- "integrity" "sha512-o0cyEG0e8GPzT4iGHphIOh0cJOV8fivsXxddQasHPHfoZf1ZexrfeA21w2NaEN1RHE+fXlfISmOE8R9N3u3Qig=="
- "resolved" "https://registry.npmjs.org/widest-line/-/widest-line-4.0.1.tgz"
- "version" "4.0.1"
- dependencies:
- "string-width" "^5.0.1"
-
-"wildcard@^2.0.0":
- "integrity" "sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw=="
- "resolved" "https://registry.npmjs.org/wildcard/-/wildcard-2.0.0.tgz"
- "version" "2.0.0"
-
-"wrap-ansi@^7.0.0":
- "integrity" "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q=="
- "resolved" "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz"
- "version" "7.0.0"
- dependencies:
- "ansi-styles" "^4.0.0"
- "string-width" "^4.1.0"
- "strip-ansi" "^6.0.0"
-
-"wrap-ansi@^8.0.1":
- "integrity" "sha512-QFF+ufAqhoYHvoHdajT/Po7KoXVBPXS2bgjIam5isfWJPfIOnQZ50JtUiVvCv/sjgacf3yRrt2ZKUZ/V4itN4g=="
- "resolved" "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.0.1.tgz"
- "version" "8.0.1"
- dependencies:
- "ansi-styles" "^6.1.0"
- "string-width" "^5.0.1"
- "strip-ansi" "^7.0.1"
-
-"wrappy@1":
- "integrity" "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ=="
- "resolved" "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz"
- "version" "1.0.2"
-
-"write-file-atomic@^3.0.0":
- "integrity" "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q=="
- "resolved" "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz"
- "version" "3.0.3"
- dependencies:
- "imurmurhash" "^0.1.4"
- "is-typedarray" "^1.0.0"
- "signal-exit" "^3.0.2"
- "typedarray-to-buffer" "^3.1.5"
-
-"ws@^7.3.1":
- "integrity" "sha512-BAkMFcAzl8as1G/hArkxOxq3G7pjUqQ3gzYbLL0/5zNkph70e+lCoxBGnm6AW1+/aiNeV4fnKqZ8m4GZewmH2w=="
- "resolved" "https://registry.npmjs.org/ws/-/ws-7.5.5.tgz"
- "version" "7.5.5"
-
-"ws@^8.4.2":
- "integrity" "sha512-AzmM3aH3gk0aX7/rZLYvjdvZooofDu3fFOzGqcSnQ1tOcTWwhM/o+q++E8mAyVVIyUdajrkzWUGftaVSDLn1bw=="
- "resolved" "https://registry.npmjs.org/ws/-/ws-8.6.0.tgz"
- "version" "8.6.0"
-
-"xdg-basedir@^4.0.0":
- "integrity" "sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q=="
- "resolved" "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-4.0.0.tgz"
- "version" "4.0.0"
-
-"xml-js@^1.6.11":
- "integrity" "sha512-7rVi2KMfwfWFl+GpPg6m80IVMWXLRjO+PxTq7V2CDhoGak0wzYzFgUY2m4XJ47OGdXd8eLE8EmwfAmdjw7lC1g=="
- "resolved" "https://registry.npmjs.org/xml-js/-/xml-js-1.6.11.tgz"
- "version" "1.6.11"
- dependencies:
- "sax" "^1.2.4"
-
-"xtend@^4.0.0", "xtend@^4.0.1":
- "integrity" "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ=="
- "resolved" "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz"
- "version" "4.0.2"
-
-"yallist@^4.0.0":
- "integrity" "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="
- "resolved" "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz"
- "version" "4.0.0"
-
-"yaml@^1.10.0", "yaml@^1.10.2", "yaml@^1.7.2":
- "integrity" "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg=="
- "resolved" "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz"
- "version" "1.10.2"
-
-"yocto-queue@^0.1.0":
- "integrity" "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q=="
- "resolved" "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz"
- "version" "0.1.0"
-
-"zwitch@^1.0.0":
- "integrity" "sha512-V50KMwwzqJV0NpZIZFwfOD5/lyny3WlSzRiXgA0G7VUnRlqttta1L6UQIHzd6EuBY/cHGfwTIck7w1yH6Q5zUw=="
- "resolved" "https://registry.npmjs.org/zwitch/-/zwitch-1.0.5.tgz"
- "version" "1.0.5"