diff --git a/spelling.dic b/spelling.dic index 149e5cdee..d48ddd786 100644 --- a/spelling.dic +++ b/spelling.dic @@ -109,6 +109,7 @@ spidey stdin Stdin stdout +struct subo Subo Suborbital's diff --git a/website/docs/how-to/customize-plugins/plugin-editor.md b/website/docs/how-to/customize-plugins/plugin-editor.md index 389e0f163..9a1ff9689 100755 --- a/website/docs/how-to/customize-plugins/plugin-editor.md +++ b/website/docs/how-to/customize-plugins/plugin-editor.md @@ -14,9 +14,9 @@ The editor is hosted at `https://editor.suborbital.network`, and uses URL parame You will host the SE2 builder service in your cloud infrastructure with a configured DNS name. An HTTPS connection to the builder is required to use the editor. To launch the editor, you can either [embed the editor in a frame](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/iframe) within your own webpage, or launch it in a new tab. -## Editor token +## Session token -To authenticate the editor you'll need an [editor token](../../quickstart#obtain-an-editor-token). +To authenticate the editor you'll need an [session token](../../quickstart#obtain-a-session-token). ## Configuration @@ -32,7 +32,7 @@ Let's break it down: **Token**: `&token=K78as0aslwi30l8h5lbF4lS7` -* The editor token retrieved from the control-plane service +* The session token retrieved from the control-plane service **Ident**: `&ident=com.suborbital.customer` diff --git a/website/docs/how-to/deploy/cloud-deployment/configure-capabilities.md b/website/docs/how-to/self-host-se2/deploy/cloud-deployment/configure-capabilities.md similarity index 100% rename from website/docs/how-to/deploy/cloud-deployment/configure-capabilities.md rename to website/docs/how-to/self-host-se2/deploy/cloud-deployment/configure-capabilities.md diff --git a/website/docs/how-to/deploy/cloud-deployment/configure-storage.md b/website/docs/how-to/self-host-se2/deploy/cloud-deployment/configure-storage.md similarity index 100% rename from website/docs/how-to/deploy/cloud-deployment/configure-storage.md rename to website/docs/how-to/self-host-se2/deploy/cloud-deployment/configure-storage.md diff --git a/website/docs/how-to/deploy/cloud-deployment/configure-webhooks.md b/website/docs/how-to/self-host-se2/deploy/cloud-deployment/configure-webhooks.md similarity index 100% rename from website/docs/how-to/deploy/cloud-deployment/configure-webhooks.md rename to website/docs/how-to/self-host-se2/deploy/cloud-deployment/configure-webhooks.md diff --git a/website/docs/how-to/deploy/cloud-deployment/install-se2-in-your-cloud-environment.md b/website/docs/how-to/self-host-se2/deploy/cloud-deployment/install-se2-in-your-cloud-environment.md similarity index 100% rename from website/docs/how-to/deploy/cloud-deployment/install-se2-in-your-cloud-environment.md rename to website/docs/how-to/self-host-se2/deploy/cloud-deployment/install-se2-in-your-cloud-environment.md diff --git a/website/docs/how-to/deploy/other-deployments/minikube.md b/website/docs/how-to/self-host-se2/deploy/other-deployments/minikube.md similarity index 98% rename from website/docs/how-to/deploy/other-deployments/minikube.md rename to website/docs/how-to/self-host-se2/deploy/other-deployments/minikube.md index 21d019145..0ee7eda76 100644 --- a/website/docs/how-to/deploy/other-deployments/minikube.md +++ b/website/docs/how-to/self-host-se2/deploy/other-deployments/minikube.md @@ -172,7 +172,7 @@ Let’s tell minikube to forward requests to port 80 to our cluster! minikube tunnel ``` -### 8. Create an editor token +### 8. Create a session token In order to test our editor, we’re going to come up with a plugin name, and create a token so we can access it! @@ -206,7 +206,7 @@ Let’s install `curl`: apt update; apt install curl ``` -With `curl` installed, we can now get our editor token for testing: +With `curl` installed, we can now get our session token for testing: ```bash curl [http://local.suborbital.network:8081/api/v1/token//default/](http://local.suborbital.network:8081/api/v1/token/com.acmeco.gr9fas97234b/default/httpget) diff --git a/website/docs/how-to/self-host-se2/self-hosted-quickstart.md b/website/docs/how-to/self-host-se2/self-hosted-quickstart.md new file mode 100644 index 000000000..360978b79 --- /dev/null +++ b/website/docs/how-to/self-host-se2/self-hosted-quickstart.md @@ -0,0 +1,193 @@ +--- +pagination_prev: null +pagination_next: null +--- + +# Quickstart + + +This quickstart will help you learn how to create an app plugin using SE2. It will also introduce some of SE2's key features to manage development environments and user access, and the plugin editor. + +## Prerequisites + +- The Subo CLI (installation instructions below) is supported only on MacOS and Linux +- Check out our language support page to see a list of languages and their respective support statuses for SE2 +- Install [Docker](https://docs.docker.com) + +## Create a development environment + +The Subo CLI will create some files on disk to set up your local deployment. Get started by creating a directory somewhere on your filesystem. In the example below, we'll name our directory `suborbital`: + +```bash +mkdir suborbital && cd suborbital +``` + +### Install Subo: the SE2 CLI + +If you use macOS, you can use [Homebrew](https://brew.sh) to install the `subo` command line tool: + +```bash +brew tap suborbital/subo +brew install subo +``` + +Note: this may take a few minutes! Next, run `subo --version` to ensure the installation was successful. + +To install on Linux (or macOS without Homebrew), you can [download Subo directly](https://github.com/suborbital/subo/releases). + +You can set up multiple separate environments within an organization. These could be used for separating production/development/staging environments,or to create different applications for distinct use cases. + +### Generate your env token + +You can get an SE2 Environment token either with our [environment token generator web app](https://suborbital.network/) or with the `subo` command line tool. + +To create your env token, run: + +```bash +subo se2 create token +``` + +A verification code will be sent to your email address, and the env token will be used to authenticate you and link your SE2 installation to you. + +:::tip +Subo will print out your environment token in your terminal, and also cache it on disk for transparent use in later steps. +::: + +If you lose your environment token, just repeat this process to generate a new one. + +## Start SE2 locally + +:::warning Danger, Will Robinson + +If you're coming from Suborbital Compute `v0.3.3` or earlier and would like to develop locally on SE2 `v0.4.0` or greater, you must first [upgrade to Subo `v0.6.0`](./subo#upgrade-subo) and update the deployment templates with `subo se2 deploy --reset`. + +An SE2 migration tool for production deployments of Compute will be available soon. + +::: + +Next, use Subo to start your local SE2 instance. Make sure to do this within the same directory you created above! + +- Make sure Docker is running +- Run: + + ```bash + subo se2 deploy --local + ``` + +- Grab a refreshing beverage while this runs (it'll take a few minutes!) + +You may be asked to enter your environment token, and then Subo will use `docker-compose` to launch your SE2 instance automatically. SE2 runs in the background by default. You can use `docker-compose logs -f` to view the logs of the running containers. Run `docker-compose down` to terminate the containers. + +When you run SE2, it will wait for you to press enter to start a REPL where you can add or edit plugins (see [Meet the Editor](quickstart.md#meet-the-editor)). In the example below, we'll create a plugin named `hello`: + +```bash +⏩ START: preparing deployment +ℹ️ using cached environment token +✅ DONE: ready to start installation +⏩ START: installing... +Network suborbital_se2 Creating +Network suborbital_se2 Created +Container suborbital-se2-builder-1 Creating +Container suborbital-se2-controlplane-1 Creating +Container suborbital-se2-controlplane-1 Created +Container suborbital-e2core-1 Creating +Container suborbital-se2-builder-1 Created +Container suborbital-e2core-1 Created +Container suborbital-se2-builder-1 Starting +Container suborbital-se2-controlplane-1 Starting +Container suborbital-se2-controlplane-1 Started +Container suborbital-e2core-1 Starting +Container suborbital-se2-builder-1 Started +Container suborbital-e2core-1 Started +ℹ️ use `docker ps` and `docker compose logs` to check deployment status + +PROXY: local tunnel to plugin editor started + + +Press enter to launch the local SE2 REPL... +1. Create or edit a plugin + +Choose an option: 1 + +To create or edit a plugin, enter its name (or FQMN): hello + +✅ visit http://local.suborbital.network/?builder=http://local.suborbital.network:8082&token=0PYjmlH10jjjIL2NUOXzAfCA&ident=com.suborbital.acmeco&namespace=default&fn=hello to access the editor +``` + +This will allow you to create plugins and use the plugin editor locally while you work on integrating your application. Follow the instructions in the REPL to create your first plugin. + +The Subo REPL includes a proxy that makes it easy to connect the hosted editor to your local SE2 installation. By default, it makes the editor accessible on [`local.suborbital.network:80`](http://local.suborbital.network:80/). The editor proxy port can be configured with the `subo se2 deploy --local --proxy-port ` option. + +The `local.suborbital.network` subdomain points to `127.0.0.1`, i.e. `localhost`. You may need to substitute a different hostname or IP address depending on your particular network setup. + +## Meet the editor + +The SE2 plugin editor uses SE2's APIs from either [Go](./how-to/se2-go.md) or [JavaScript/TypeScript](./how-to/se2-js.md) to provide a low-friction environment for your users to write, build, test, and deploy plugins to your SE2 an instance in a single place. Alternatively, the [Builder API](https://reference.suborbital.dev/) can be used programmatically, if that better suits your use case. + +### Obtain a session token + +In addition to the `IDENTIFIER` and `ENV_TOKEN`, you’ll also need to set `NAMESPACE` and `fn` to the name of our namespace (e.g. `default`) and the name of our plugin (e.g. `hello`). Copy the `token` field in the response; this is your session token. + +```bash +curl --location --request GET "http://local.suborbital.network:8082/auth/v2/access/${IDENTIFIER}/${NAMESPACE}/${EXT}" \ +--header "Authorization: Bearer ${ENV_TOKEN}" +``` + +### Editor URLs in production + +To edit a plugin via the editor in a production environment, you—or more likely your application—must build a valid URL to pass to the editor. + +Configure the URL like so: + +- Domain: `https://editor.suborbital.network/` +- Query parameters: + - `builder`: `https://your-builder.example.com` + - `token`: The [env token you created above](#create-a-development-environment) + - `ident`: The name of your environment followed by a period, followed by the name of your [tenant](./reference/glossary.md). In our case, it will be `dev.suborbital.user1` + - `namespace`: the name of your namespace if different than “default” + - `fn`: the name of your plugin + - `template`: the name of the language you wish to use (Go or JavaScript) + +Altogether, it should look something like `https://editor.suborbital.network/?builder=https://your-builder.example.com&ident=dev.suborbital.user1&fn=hello&template=javascript` + +## Your first plugin + +Paste the URL you created above into your browser to load the plugin editor. Once inside the editor, you can edit, build, test, and deploy your plugins all in one place! By default, the editor will load pre-populated with the greeting plugin below. You can use it to run the editor for the first time. + +```javascript +import { log } from "@suborbital/runnable"; + +export const run = (input) => { + let message = "Hello, " + input; + + log.info(message); + return message; +}; +``` + +- The plugin provided is complete, so we can just click "Build" +- In the "TEST" field, add some text. Here, we've added "new Suborbital user" +- Click "Run test" +- Toward the bottom of the editor, click "TEST RESULTS". There's our greeting! + +![Editor displaying the greeting plugin above with the test output 'Hello, new Suborbital user!'](../../assets/editor-screen.png) + +### Executing plugins + +Once your first plugin has been built and deployed, it can be run with a request to the Execution API. + +```bash +export ENV_TOKEN= + +curl http://local.suborbital.network:8080/com.suborbital.acmeco/default/hello/v1.0.0 \ + --header "Authorization: Bearer $ENV_TOKEN" \ + -d 'my friend' + +hello, my friend +``` + +## Connect your application + +Now that you've set up SE2 and created your first plugin, you can use SE2's APIs from either [Go](./how-to/se2-go.md) or [JavaScript/TypeScript](./how-to/se2-js.md) to start integrating plugins into your application! diff --git a/website/docs/hosted-quickstart.md b/website/docs/quickstart-with-demo.md similarity index 50% rename from website/docs/hosted-quickstart.md rename to website/docs/quickstart-with-demo.md index 1eea0fe5f..f8872b1c0 100644 --- a/website/docs/hosted-quickstart.md +++ b/website/docs/quickstart-with-demo.md @@ -2,65 +2,41 @@ pagination_prev: null pagination_next: null --- - # Quickstart - - - - -import Tabs from '@theme/Tabs'; -import TabItem from '@theme/TabItem'; - - - - - - +- Managing development environments +- Managing user access +- Using the plugin editor ## Meet PRO.xyz: our demo app -PRO.xyz (read: "proxies") is an imaginary company that operates networking services. Its services can be used to load-balance & cache requests,as well as protect its customers' servers from network attacks. +PRO.xyz (read: "proxies") is an imaginary company that operates networking services. Its services can be used to load-balance & cache requests, as well as protect its customers' servers from network attacks. -Of course this is just a demonstration, so what happens behind the scenes is that our service generates a made-up "request log" of inbound HTTP requests that are being forwarded to upstream hosts.PRO.xyz' clients are able to view these requests in their dashboard. +Of course this is just a demonstration, so what happens behind the scenes is that our service generates a made-up "request log" of inbound HTTP requests that are being forwarded to upstream hosts. PRO.xyz' clients are able to view these requests in their dashboard. -Most providers have their own logic and algorithms that detect abuse,send out alerts or initiate protective measures. They may allow for some customizability, but it's _usually_ very limited. +Most providers have their own logic and algorithms that detect abuse, send out alerts or initiate protective measures. They may allow for some customizability, but it's usually **very** limited. -PRO.xyz, on the other hand, has decided to make it possible _for its users_ to fine-tune protections and alerts using the Suborbital Extension Engine. Suborbital's plugin system is used here to give users additional control and flexibility around deciding how requests are handled. +PRO.xyz, on the other hand, has decided to make it possible for its users to fine-tune protections and alerts using the Suborbital Extension Engine. Suborbital's plugin system is used here to give users additional control and flexibility around deciding how requests are handled. For this demo we'll just focus on tagging suspicious requests, helping the provider improve its protections. ## Preliminary steps -- Create an account on our [admin dashboard](https://suborbital.network) -- Clone the repo for this demo +- [Create an account on our admin dashboard](https://suborbital.network) +- [Clone the repo for this quickstart](https://github.com/suborbital/examples) Let's go! 🚀 ## Create an organization -This is a new account, so we'll need to create our first organization. For this demo, we'll give our organization: +This is a new account, so we'll need to create our first organization: a (potentially shared) account in which one or more users manage(es) their Suborbital subscription . For this demo, we'll give our organization: -- The name `Demo Company` +- The name `DemoCompany` (note: organization names can contain only letters, numbers, and underscores) - The description `Always ready to demo` - +![Organization creation screen with fields for name and description](./../static/img/create-org-screen.png) ## Create an environment @@ -71,113 +47,131 @@ Let's set up our first environment for development! We'll give it: - The name `demo.dev` - The description `development environment` +![Environment creation screen with fields for name and description](../../website/static/img/create-env-screen.png) + Once we've created our environment, we'll be shown our environment's dashboard. The dashboard contains information about various usage metrics related to the Extension Engine. Here we can see a counter for plugin builds and build minutes. Both of these are currently 0 because we still need to set up our first integration. -## Create an access key +![Environment dashboard screen showing zero function builds and zero build minutes](../../website/static/img/env-dashboard-screen.png) -Next, we'll need to create an access key. We'll click on: +## Create an API key -- Manage access keys -- Create new access key +Next, we'll need to create an API key. We'll click on: -Our integration will use this access key to provision resources and execute plugins in SE2. We'll give our access key: +- Manage API keys +- Create new API key -- The name `DemoKey` -- The description: `demo access key` +Our integration will use this API key to provision resources and execute plugins in SE2. We'll give our API key: -We'll only be shown this access key once, so we'll need to store it somewhere safe and secure! +- The name `DemoKey` +- The description: `demo API key` -## The part where the integration happens +![API key creation screen with fields for name and description](../../website/static/img/create-access-key-screen.png) - +```bash +source .env +``` ## Create a tenant (user) -Suborbital lets an application's users create their own secure, sandboxed plugins, carefully isolated from the core of the system and one another. For this reason, we will create a new tenant, which is a user account with its own plugins inside Suborbital. Our application will then connect the tenant with one of its own internally maintained users. - -It's choose your own adventure time! Click one of the tabs below to continue in either our web app or in your command line: - - +Suborbital lets an application's users create their own secure, sandboxed plugins, carefully isolated from the core of the system and one another. For this reason, we will create a new tenant, which is a user account with its own plugins inside Suborbital. Our application will then connect the tenant with one of its own internally-maintained users. - +✨ Tenant API things ✨ -[Type "ada" into the Tenant field] +## Meet the editor -Our environment name ("demo.dev") and tenant name ("ada") together will form the Identifier. Think of this as a bucket to hold all of a user's plugins separate from the others. +The SE2 plugin editor uses SE2's APIs from either [Go](./how-to/se2-go.md) or [JavaScript/TypeScript](./how-to/se2-js.md) to provide a low-friction environment for your users to write, build, test, and deploy plugins to your SE2 an instance in a single place. Alternatively, the [Builder API](https://reference.suborbital.dev/) can be used programmatically, if that better suits your use case. -(TODO: access key) +### Obtain a session token -Should there be need of further namespacing a tenant's modules, Suborbital provides a "namespace" feature. For now, we will just leave this on "default". - - - - - -(TODO: assimilate this wording) - -Set `IDENTIFIER` to the name of your environment followed by a period, followed by the name of the tenant. In our case, it will be `dev.suborbital.user1`. The `ACCESS_KEY` should be set to the access key we copied in step 9. +In addition to the `IDENTIFIER` and `ENV_TOKEN`, you’ll also need to set `NAMESPACE` and `fn` to the name of our namespace (e.g. `default`) and the name of our plugin (e.g. `hello`). Copy the `token` field in the response; this is your session token. ```bash -curl --location --request POST "https://controlplane.stg.suborbital.network/api/v2/tenant/${IDENTIFIER}" \ ---header "Authorization: Bearer ${ACCESS_KEY}" +curl --location --request GET "http://local.suborbital.network:8082/auth/v2/access/${IDENTIFIER}/${NAMESPACE}/${EXT}" \ +--header "Authorization: Bearer ${ENV_TOKEN}" ``` - +### Editor URLs in production - +To edit a plugin via the editor in a production environment, you—or more likely your application—must build a valid URL to pass to the editor. -## A PRO.xyz user journey +Configure the URL like so: -The application architecture itself is nothing out of ordinary; it's a Node.js app communicating with a simple HTML frontend using Vue.js. Our backend, as mentioned, generates fake "ingest logs" of network requests, our WebAssembly plugins will receive this request metadata, and attempt to spot abuse. +- Domain: `https://editor.suborbital.network/` +- Query parameters: + - `builder`: `https://your-builder.example.com` + - `token`: The [env token you created above](#create-an-environment) + - `ident`: The name of your environment followed by a period, followed by the name of your [tenant](./reference/glossary.md). In our case, it will be `dev.suborbital.user1` + - `namespace`: the name of your namespace if different than “default” + - `fn`: the name of your plugin + - `template`: the name of the language you wish to use (Go or JavaScript) -We provide many pre-built components to make all of this a little easier: the frontend integrates with the Suborbital Module Editor, while the backend uses the JS SDK to interface with the SE2 REST API and our hosted Edge Dataplane. +Altogether, it should look something like `https://editor.suborbital.network/?builder=https://your-builder.example.com&ident=dev.suborbital.user1&fn=hello&template=javascript` -So time to put ourselves in the shoes of Ada, a PRO.xyz customer who just received access to Suborbital plugins on PRO.xyz' platform. +## Your first plugin -- We'll give our customer the name `Ada` -- And we can type whatever we like for this pretend password -- Click "Sign in" +Paste the URL you created above into your browser to load the plugin editor. Once inside the editor, you can edit, build, test, and deploy your plugins all in one place! By default, the editor will load pre-populated with the greeting plugin below. You can use it to run the editor for the first time. -After logging in, we see the network requests as they are received by PRO.xyz' servers, and eventually forwarded to our upstream servers. When we pause the logs by clicking the "pause" button, though, we notice something peculiar... +```javascript +import { log } from "@suborbital/runnable"; -There have been some requests to `wp-login.php`. Well, little wonder these were always met with a 404 Not Found response! Ada's servers run PHP indeed, but none of them are Wordpress sites! Clearly, someone is trying to find Wordpress vulnerabilities or exploit weak passwords for Wordpress sites on the internet, and they also ended up probing Ada's sites. To say this was "suspicious" would be a gross understatement. +export const run = (input) => { + let message = "Hello, " + input; -Normally there wouldn't be much Ada could do about this, but thanks to the custom plugins we may actually turn this ship around. + log.info(message); + return message; +}; +``` -## Build a module +- The plugin provided is complete, so we can just click "Build" +- In the "TEST" field, add some text. Here, we've added "new Suborbital user" +- Click "Run test" +- Toward the bottom of the editor, click "TEST RESULTS". There's our greeting! -Suborbital allows users to write custom plugins in their preferred language by clicking the "Language select" button, but unfortunately PHP is not on the list of supported languages—yet!—so Ada chooses JavaScript, another language she's quite comfortable with. +![Editor displaying the greeting plugin above with the test output 'Hello, new Suborbital user!'](./assets/editor-screen.png) - +### Executing plugins - +Once your first plugin has been built and deployed, it can be run with a request to the Execution API. -Clicking on the button that looks like three planes stacked vertically with a "+" next to them , Ada opens up the Suborbital Module Editor that presents her with an interface for writing, compiling, and deploying plugins. +```bash +export ENV_TOKEN= + +curl http://local.suborbital.network:8080/com.suborbital.acmeco/default/hello/v1.0.0 \ + --header "Authorization: Bearer $ENV_TOKEN" \ + -d 'my friend' + +hello, my friend +``` - +## Connect your application - +Now that you've set up SE2 and created your first plugin, you can use SE2's APIs from either [Go](./how-to/se2-go.md) or [JavaScript/TypeScript](./how-to/se2-js.md) to start integrating plugins into your application! +Suborbital allows users to write custom plugins in their preferred language by clicking the "Language select" button, but unfortunately PHP is not on the list of supported languages—yet!—so Ada chooses JavaScript, another language she's quite comfortable with. Go to the plugin editor. Configure the URL like so: @@ -187,7 +181,7 @@ Query params: `token`: The token you received in step 11 -`builder`: `https://builder.stg.suborbital.network` +`builder`: `https://builder.suborbital.network` `ident`: your tenant identifier @@ -195,11 +189,7 @@ Query params: `template`: the name of the language you wish to use -Altogether, it should look something like [`https://editor.suborbital.network/?token=eyJLZXkiOjcsIlNlY3JldCI6IlJTRUlrRWNiYzBleDhhUEEvUkltcVVPN3BmcmEreG9hYkgzdnhIRFhIK2M9In0=&builder=https://builder.stg.suborbital.network&template=javascript&ident=dev.suborbital.user1&fn=foo`] - - - - +Altogether, it should look something like [`https://editor.suborbital.network/?token=eyJLZXkiOjcsIlNlY3JldCI6IlJTRUlrRWNiYzBleDhhUEEvUkltcVVPN3BmcmEreG9hYkgzdnhIRFhIK2M9In0=&builder=https://builder.suborbital.network&template=javascript&ident=dev.suborbital.user1&fn=foo`] PRO.xyz' integration only supports deploying one plugin per user. This is all up to the application, who may choose to allow their users build, deploy and use any number of plugins in any language, the sky is the limit. @@ -281,11 +271,9 @@ There we go, we got our first internet troublemaker exposed, and we've seen how Now that you've know how to get SE2 extensibility powers into your app, you might want to: - Learn more about using SE2's APIs from either [Go](./how-to/se2-go.md) or [JavaScript/TypeScript](./how-to/se2-js.md) -- Make custom [module templates](./how-to/customize-plugins/custom-plugin-templates.md) and [libraries](./how-to/customize-plugins/custom-libraries.md) to help your users get started building their own plugins for your app +- Make custom [plugin templates](./how-to/customize-plugins/custom-plugin-templates.md) and [libraries](./how-to/customize-plugins/custom-libraries.md) to help your users get started building their own plugins for your app - Organize your users' plugins into [namespaces](./how-to/customize-plugins/namespaces.md) for different use cases ## Questions? If you have any questions you can't find answers to in these docs, please email us at team@suborbital.dev! - - diff --git a/website/docs/quickstart.md b/website/docs/quickstart.md index 3649e27ec..28a381e64 100644 --- a/website/docs/quickstart.md +++ b/website/docs/quickstart.md @@ -3,154 +3,273 @@ pagination_prev: null pagination_next: null --- +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + # Quickstart - -This quickstart will help you learn how to create an app plugin using SE2. It will also introduce some of SE2's key features to manage development environments and user access, and the plugin editor. +This quickstart will help you learn how to create an app plugin using SE2. Along the way it'll also introduce some of SE2's key features: + +- Managing development environments +- Managing user access +- Using the plugin editor -## Prerequisites +## Preliminary steps -- The Subo CLI (installation instructions below) is supported only on MacOS and Linux +- [Create an account on our admin dashboard](https://suborbital.network) - Check out our language support page to see a list of languages and their respective support statuses for SE2 -- Install [Docker](https://docs.docker.com) -## Create a development environment +Let's go! 🚀 -The Subo CLI will create some files on disk to set up your local deployment. Get started by creating a directory somewhere on your filesystem. In the example below, we'll name our directory `suborbital`: +## Create an organization -```bash -mkdir suborbital && cd suborbital +This is a new account, so we'll need to create our first organization: a (potentially shared) account in which one or more users manage(es) their Suborbital subscription . For this demo, we'll give our organization: + +- The name `DemoCompany` (note: organization names can contain only letters, numbers, and underscores) +- The description `Always ready to demo` + +![Organization creation screen with fields for name and description](./../static/img/create-org-screen.png) + +## Create an environment + +We can set up multiple separate environments for each of our organizations. These could be used for separating development/staging/production environments or to create different applications for distinct use cases. + +Let's set up our first environment for development! We'll give it: + +- The name `demo.dev` +- The description `development environment` + +![Environment creation screen with fields for name and description](../../website/static/img/create-env-screen.png) + +Once we've created our environment, we'll be shown our environment's dashboard. The dashboard contains information about various usage metrics related to the Extension Engine. + +Here we can see a counter for plugin builds and build minutes. Both of these are currently 0 because we still need to set up our first integration. + +![Environment dashboard screen showing zero function builds and zero build minutes](../../website/static/img/env-dashboard-screen.png) + +## Create an API key + +Next, we'll need to create an API key. We'll click on: + +- Manage API keys +- Create new API key + +Our integration will use this API key to provision resources and execute plugins in SE2. We'll give our API key: + +- The name `DemoKey` +- The description: `demo API key` + +![API key creation screen with fields for name and description](../../website/static/img/create-api-key-screen.png) + +:::tip +We'll only be shown this API key once, so we'll need to store it somewhere safe and secure! +::: + +## Using the SE2 SDK + +SE2 provides client libraries for Go and Node.js. Start by installing the client: + + + + +In your terminal issue the following command to grab the library. + +```sh +go get github.com/suborbital/se2-go@latest ``` -### Install Subo: the SE2 CLI + -If you use macOS, you can use [Homebrew](https://brew.sh) to install the `subo` command line tool: + ```bash -brew tap suborbital/subo -brew install subo +npm install @suborbital/se2-node ``` -Note: this may take a few minutes! Next, run `subo --version` to ensure the installation was successful. + -To install on Linux (or macOS without Homebrew), you can [download Subo directly](https://github.com/suborbital/subo/releases). + -You can set up multiple separate environments within an organization. These could be used for separating production/development/staging environments,or to create different applications for distinct use cases. +Next, initialize the client with your API key: -### Generate your env token + -You can get an SE2 Environment token either with our [environment token generator web app](https://suborbital.network/) or with the `subo` command line tool. + -To create your env token, run: +```go +package main -```bash -subo se2 create token +import ( + "log" + + "github.com/suborbital/se2-go" +) + +func main() { + // Here, we've provided the API key via the `API_KEY` environment variable. + apiKey, ok := os.LookupEnv("API_KEY") + if !ok { + log.Fatal("api key is not set in the API_KEY environment variable") + } + + client, err := se2.NewClient(se2.ModeProduction, apiKey) + if err != nil { + log.Fatalf("encountered new client error: %s", err.Error()) + } + + // client is now ready to use +} ``` -A verification code will be sent to your email address, and the env token will be used to authenticate you and link your SE2 installation to you. + -:::tip -Subo will print out your environment token in your terminal, and also cache it on disk for transparent use in later steps. -::: + + +```js +import { Suborbital } from "@suborbital/se2-node"; -If you lose your environment token, just repeat this process to generate a new one. +// Here, we've provided the API key via the `API_KEY` environment variable. +const suborbital = new Suborbital(process.env.API_KEY); +``` -## Start SE2 locally + -:::warning Danger, Will Robinson + -If you're coming from Suborbital Compute `v0.3.3` or earlier and would like to develop locally on SE2 `v0.4.0` or greater, you must first [upgrade to Subo `v0.6.0`](./subo#upgrade-subo) and update the deployment templates with `subo se2 deploy --reset`. +## Create a tenant (user) -An SE2 migration tool for production deployments of Compute will be available soon. +Suborbital lets an application's users create their own secure, sandboxed plugins, carefully isolated from the core of the system and one another. For this reason, we will create a new tenant, which is a user account with its own plugins inside Suborbital. Our application will then connect the tenant with one of its own internally-maintained users. Typically, you'll want to use your system's unique ID for the user as the name of the tenant. -::: + -Next, use Subo to start your local SE2 instance. Make sure to do this within the same directory you created above! + -- Make sure Docker is running -- Run: +```go +func main() { + tenant, err := client.CreateTenant(ctx, "tenantName", "tenantDescription") + if err != nil { + log.Fatalf("create tenant failed: %s", err.Error()) + } +} +``` - ```bash - subo se2 deploy --local - ``` + -- Grab a refreshing beverage while this runs (it'll take a few minutes!) + + +```js +const tenant = ""; +await suborbital.admin.createTenant({ tenant }); +``` -You may be asked to enter your environment token, and then Subo will use `docker-compose` to launch your SE2 instance automatically. SE2 runs in the background by default. You can use `docker-compose logs -f` to view the logs of the running containers. Run `docker-compose down` to terminate the containers. + -When you run SE2, it will wait for you to press enter to start a REPL where you can add or edit plugins (see [Meet the Editor](quickstart.md#meet-the-editor)). In the example below, we'll create a plugin named `hello`: + ```bash -⏩ START: preparing deployment -ℹ️ using cached environment token -✅ DONE: ready to start installation -⏩ START: installing... -Network suborbital_se2 Creating -Network suborbital_se2 Created -Container suborbital-se2-builder-1 Creating -Container suborbital-se2-controlplane-1 Creating -Container suborbital-se2-controlplane-1 Created -Container suborbital-e2core-1 Creating -Container suborbital-se2-builder-1 Created -Container suborbital-e2core-1 Created -Container suborbital-se2-builder-1 Starting -Container suborbital-se2-controlplane-1 Starting -Container suborbital-se2-controlplane-1 Started -Container suborbital-e2core-1 Starting -Container suborbital-se2-builder-1 Started -Container suborbital-e2core-1 Started -ℹ️ use `docker ps` and `docker compose logs` to check deployment status - -PROXY: local tunnel to plugin editor started - - -Press enter to launch the local SE2 REPL... -1. Create or edit a plugin - -Choose an option: 1 - -To create or edit a plugin, enter its name (or FQMN): hello - -✅ visit http://local.suborbital.network/?builder=http://local.suborbital.network:8082&token=0PYjmlH10jjjIL2NUOXzAfCA&ident=com.suborbital.acmeco&namespace=default&fn=hello to access the editor +curl --request POST \ + --url https://api.suborbital.network/environment/v1/tenant/newTenantName \ + --header 'Authorization: Bearer ' \ + --header 'Content-Type: application/json' \ + --data '{ + "description": "string" +}' ``` -This will allow you to create plugins and use the plugin editor locally while you work on integrating your application. Follow the instructions in the REPL to create your first plugin. + -The Subo REPL includes a proxy that makes it easy to connect the hosted editor to your local SE2 installation. By default, it makes the editor accessible on [`local.suborbital.network:80`](http://local.suborbital.network:80/). The editor proxy port can be configured with the `subo se2 deploy --local --proxy-port ` option. - -The `local.suborbital.network` subdomain points to `127.0.0.1`, i.e. `localhost`. You may need to substitute a different hostname or IP address depending on your particular network setup. + ## Meet the editor -The SE2 plugin editor uses SE2's APIs from either [Go](./how-to/se2-go.md) or [JavaScript/TypeScript](./how-to/se2-js.md) to provide a low-friction environment for your users to write, build, test, and deploy plugins to your SE2 an instance in a single place. Alternatively, the [Builder API](https://reference.suborbital.dev/) can be used programmatically, if that better suits your use case. +The SE2 plugin editor uses SE2's APIs from either [Go](./how-to/se2-go.md) or [JavaScript/TypeScript](./how-to/se2-js.md) to provide a low-friction environment for your users to write, build, test, and deploy plugins to your SE2 an instance in a single place. Alternatively, the [Builder API](https://reference.suborbital.dev/) can be used programmatically, if that better suits your use case. + +### Obtain a session token + +To grant a user access to modify a plugin, you'll need a session token. A session token is bound to a single plugin, and you'll create new tokens each time a user needs access to a plugin. To obtain a session token: + + + + +Call the `CreateSession` method with your tenant's name, the namespace, and the plugin name of your intended plugin. The response will be a struct that contains the session token. All tenant API methods will use this session response struct as input. + +```go +func main() { + session, err := client.CreateSession(ctx, "tenantName", "namespace", "pluginName") + if err != nil { + log.Fatalf("creating session failed with %s", err.Error()) + } + + // To use the session token in a further call + draft, err := client.CreatePluginDraft(ctx, "javascript", session) + if err != nil { + log.Fatalf("creating plugin draft for javascript failed: %s", err.Error()) + } +} +``` + + + + -### Obtain an editor token +```js +const params = { + tenant: "", // the user this plugin belongs to + namespace: "", // the plugin's namespace + name: "", // the name of the plugin +}; +const token = await suborbital.admin.createSession(params); +``` + + -In addition to the `IDENTIFIER` and `ENV_TOKEN`, you’ll also need to set `NAMESPACE` and `fn` to the name of our namespace (e.g. `default`) and the name of our plugin (e.g. `hello`). Copy the `token` field in the response; this is your editor token. + ```bash -curl --location --request GET "http://local.suborbital.network:8082/auth/v2/access/${IDENTIFIER}/${NAMESPACE}/${EXT}" \ ---header "Authorization: Bearer ${ENV_TOKEN}" +curl --request POST \ + --url https://api.suborbital.network/environment/v1/tenant/newTenantName/session \ + --header 'Authorization: Bearer ' \ + --header 'Content-Type: application/json' \ + --data '{ + "namespace": "newNamespace", + "fn": "newPluginName" +}' +# {"token": ""} ``` + + + + ### Editor URLs in production To edit a plugin via the editor in a production environment, you—or more likely your application—must build a valid URL to pass to the editor. + + + + +```js +React version goes here +``` + + + + + Configure the URL like so: - Domain: `https://editor.suborbital.network/` - Query parameters: - - `builder`: `https://your-builder.example.com` - - `token`: The [env token you created above](#create-a-development-environment) - - `ident`: The name of your environment followed by a period, followed by the name of your [tenant](./reference/glossary.md). In our case, it will be `dev.suborbital.user1` - - `namespace`: the name of your namespace if different than “default” - - `fn`: the name of your plugin - - `template`: the name of the language you wish to use (Go or JavaScript) + - `template`: the name of the template you wish to use + - `token`: The [session token you created above](#create-an-environment) + + +Altogether, it should look something like `https://editor.suborbital.network/?template=javascript&token=` + + -Altogether, it should look something like `https://editor.suborbital.network/?builder=https://your-builder.example.com&ident=dev.suborbital.user1&fn=hello&template=javascript` + ## Your first plugin @@ -160,10 +279,10 @@ Paste the URL you created above into your browser to load the plugin editor. Onc import { log } from "@suborbital/runnable"; export const run = (input) => { - let message = "Hello, " + input; + let message = "Hello, " + input; - log.info(message); - return message; + log.info(message); + return message; }; ``` @@ -178,16 +297,59 @@ export const run = (input) => { Once your first plugin has been built and deployed, it can be run with a request to the Execution API. -```bash -export ENV_TOKEN= + + + + +```go +func main() { + response, err := client.Exec(ctx, []byte(`my friend!`), tenantName, namespace, pluginName) + if err != nil { + log.Fatalf("executing plugin failed with %s", err.Error()) + } + + fmt.Printf("result of running the plugin is '%s'", string(response)) +} +``` + + + + -curl http://local.suborbital.network:8080/com.suborbital.acmeco/default/hello/v1.0.0 \ - --header "Authorization: Bearer $ENV_TOKEN" \ - -d 'my friend' +```js +const params = { + tenant: "", // the user this plugin belongs to + namespace: "", // the plugin's namespace + name: "", // the name of the plugin +}; +const result = await suborbital.exec.run(params, "my friend!"); +console.log(result.result); // hello, my friend! +``` + + -hello, my friend + + +```bash +curl --location 'https://edge.suborbital.network/name///' \ +--header 'Authorization: Bearer ' \ +--header 'Content-Type: text/plain' \ +--data 'my friend!' +# hello, my friend! ``` -## Connect your application + + + + +## What else can I do? + +Now that you've know how to get SE2 extensibility powers into your app, you might want to: + +- Learn more about using SE2's APIs from either [Go](./how-to/se2-go.md) or [JavaScript/TypeScript](./how-to/se2-js.md) +- Make custom [plugin templates](./how-to/customize-plugins/custom-plugin-templates.md) and [libraries](./how-to/customize-plugins/custom-libraries.md) to help your users get started building their own plugins for your app +- Organize your users' plugins into [namespaces](./how-to/customize-plugins/namespaces.md) for different use cases + +## Questions? -Now that you've set up SE2 and created your first plugin, you can use SE2's APIs from either [Go](./how-to/se2-go.md) or [JavaScript/TypeScript](./how-to/se2-js.md) to start integrating plugins into your application! +If you have any questions you can't find answers to in these docs, please email us at team@suborbital.dev! diff --git a/website/docs/reference/future-glossary.md b/website/docs/reference/future-glossary.md index dbf29b42c..56ca81a3e 100644 --- a/website/docs/reference/future-glossary.md +++ b/website/docs/reference/future-glossary.md @@ -14,4 +14,4 @@ pagination_next: null | Tenant | words | Identifies the relationship between an Environment and some specific user or collection of users interacting with it. The Environment administrator manages and identifies this relationship including, but not limited to, tenant authentication. | tnt | | Client | words | The application communicating with SE2 on the behalf of some Tenant | | | Environment Token | words | Grants a Client access to an environment | | -| Editor Token | words | Grants a Tenant access to the Builder Service | | +| Session Token | words | Grants a Tenant access to the Builder Service | | diff --git a/website/docs/reference/glossary.md b/website/docs/reference/glossary.md index 8a47c48ad..65b52f599 100644 --- a/website/docs/reference/glossary.md +++ b/website/docs/reference/glossary.md @@ -12,4 +12,4 @@ pagination_next: null | Tenant | Identifies the relationship between an Environment and some specific user or collection of users interacting with it. The Environment administrator manages and identifies this relationship including, but not limited to, tenant authentication. | tnt | | Client | The application communicating with SE2 on the behalf of some Tenant | | | Environment Token | Grants a Client access to an environment | | -| Editor Token | Grants a Tenant access to the Builder Service | | +| Session Token | Grants a Tenant access to the Builder Service | | diff --git a/website/package-lock.json b/website/package-lock.json index 2da083eb6..b2038e53e 100644 --- a/website/package-lock.json +++ b/website/package-lock.json @@ -13,6 +13,7 @@ "@svgr/webpack": "^5.5.0", "clsx": "^1.1.1", "docusaurus-plugin-fathom": "^1.1.0", + "fathom": "^0.3.0", "file-loader": "^6.2.0", "prism-react-renderer": "^1.2.1", "react": "^17.0.1", @@ -5718,6 +5719,19 @@ "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", "license": "ISC" }, + "node_modules/boom": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/boom/-/boom-0.4.2.tgz", + "integrity": "sha512-OvfN8y1oAxxphzkl2SnCS+ztV/uVKTATtgLjWYg/7KwcNyf3rzpHxNQJZCKtsZd4+MteKczhWbSjtEX4bGgU9g==", + "deprecated": "This version has been deprecated in accordance with the hapi support policy (hapi.im/support). Please upgrade to the latest version to get the best features, bug fixes, and security patches. If you are unable to upgrade at this time, paid support is available for older versions (hapi.im/commercial).", + "optional": true, + "dependencies": { + "hoek": "0.9.x" + }, + "engines": { + "node": ">=0.8.0" + } + }, "node_modules/boxen": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/boxen/-/boxen-5.1.2.tgz", @@ -7281,6 +7295,19 @@ "crowdin-cli": "bin/crowdin-cli" } }, + "node_modules/cryptiles": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-0.2.2.tgz", + "integrity": "sha512-gvWSbgqP+569DdslUiCelxIv3IYK5Lgmq1UrRnk+s1WxQOQ16j3GPDcjdtgL5Au65DU/xQi6q3xPtf5Kta+3IQ==", + "deprecated": "This version has been deprecated in accordance with the hapi support policy (hapi.im/support). Please upgrade to the latest version to get the best features, bug fixes, and security patches. If you are unable to upgrade at this time, paid support is available for older versions (hapi.im/commercial).", + "optional": true, + "dependencies": { + "boom": "0.4.x" + }, + "engines": { + "node": ">=0.8.0" + } + }, "node_modules/crypto-random-string": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", @@ -7708,6 +7735,15 @@ "version": "3.0.11", "license": "MIT" }, + "node_modules/ctype": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/ctype/-/ctype-0.5.3.tgz", + "integrity": "sha512-T6CEkoSV4q50zW3TlTHMbzy1E5+zlnNcY+yb7tWVYlTwPhx9LpnfAkd4wecpWknDyptp4k97LUZeInlf6jdzBg==", + "optional": true, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/currently-unhandled": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", @@ -7760,9 +7796,10 @@ } }, "node_modules/decode-uri-component": { - "version": "0.2.0", + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.2.tgz", + "integrity": "sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.10" } @@ -11090,6 +11127,172 @@ "reusify": "^1.0.4" } }, + "node_modules/fathom": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/fathom/-/fathom-0.3.0.tgz", + "integrity": "sha512-pD1tPE/VuIW1gnBAfPUjDCa4bPTs9nT+4mdULpIC4R55pPMJLbH2H/u7kL1PiRaA1s9j4lr72MFhWi0kkNoYLw==", + "dependencies": { + "commander": "~2.1.0", + "request": "~2.33.0" + }, + "bin": { + "fathom": "bin/fathom" + } + }, + "node_modules/fathom/node_modules/asn1": { + "version": "0.1.11", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.1.11.tgz", + "integrity": "sha512-Fh9zh3G2mZ8qM/kwsiKwL2U2FmXxVsboP4x1mXjnhKHv3SmzaBZoYvxEQJz/YS2gnCgd8xlAVWcZnQyC9qZBsA==", + "optional": true, + "engines": { + "node": ">=0.4.9" + } + }, + "node_modules/fathom/node_modules/assert-plus": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.1.5.tgz", + "integrity": "sha512-brU24g7ryhRwGCI2y+1dGQmQXiZF7TtIj583S96y0jjdajIe6wn8BuXyELYhvD22dtIxDQVFk04YTJwwdwOYJw==", + "optional": true, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/fathom/node_modules/async": { + "version": "0.9.2", + "resolved": "https://registry.npmjs.org/async/-/async-0.9.2.tgz", + "integrity": "sha512-l6ToIJIotphWahxxHyzK9bnLR6kM4jJIIgLShZeqLY7iboHoGkdgFl7W2/Ivi4SkMJYGKqW8vSuk0uKUj6qsSw==", + "optional": true + }, + "node_modules/fathom/node_modules/aws-sign2": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.5.0.tgz", + "integrity": "sha512-oqUX0DM5j7aPWPCnpWebiyNIj2wiNI87ZxnOMoGv0aE4TGlBy2N+5iWc6dQ/NOKZaBD2W6PVz8jtOGkWzSC5EA==", + "optional": true, + "engines": { + "node": "*" + } + }, + "node_modules/fathom/node_modules/combined-stream": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-0.0.7.tgz", + "integrity": "sha512-qfexlmLp9MyrkajQVyjEDb0Vj+KhRgR/rxLiVhaihlT+ZkX0lReqtH6Ack40CvMDERR4b5eFp3CreskpBs1Pig==", + "optional": true, + "dependencies": { + "delayed-stream": "0.0.5" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/fathom/node_modules/commander": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.1.0.tgz", + "integrity": "sha512-J2wnb6TKniXNOtoHS8TSrG9IOQluPrsmyAJ8oCUJOBmv+uLBCyPYAZkD2jFvw2DCzIXNnISIM01NIvr35TkBMQ==", + "engines": { + "node": ">= 0.6.x" + } + }, + "node_modules/fathom/node_modules/delayed-stream": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-0.0.5.tgz", + "integrity": "sha512-v+7uBd1pqe5YtgPacIIbZ8HuHeLFVNe4mUEyFDXL6KiqzEykjbw+5mXZXpGFgNVasdL4jWKgaKIXrEHiynN1LA==", + "optional": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/fathom/node_modules/forever-agent": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.5.2.tgz", + "integrity": "sha512-PDG5Ef0Dob/JsZUxUltJOhm/Y9mlteAE+46y3M9RBz/Rd3QVENJ75aGRhN56yekTUboaBIkd8KVWX2NjF6+91A==", + "engines": { + "node": "*" + } + }, + "node_modules/fathom/node_modules/form-data": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-0.1.4.tgz", + "integrity": "sha512-x8eE+nzFtAMA0YYlSxf/Qhq6vP1f8wSoZ7Aw1GuctBcmudCNuTUmmx45TfEplyb6cjsZO/jvh6+1VpZn24ez+w==", + "optional": true, + "dependencies": { + "async": "~0.9.0", + "combined-stream": "~0.0.4", + "mime": "~1.2.11" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/fathom/node_modules/http-signature": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-0.10.1.tgz", + "integrity": "sha512-coK8uR5rq2IMj+Hen+sKPA5ldgbCc1/spPdKCL1Fw6h+D0s/2LzMcRK0Cqufs1h0ryx/niwBHGFu8HC3hwU+lA==", + "optional": true, + "dependencies": { + "asn1": "0.1.11", + "assert-plus": "^0.1.5", + "ctype": "0.5.3" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/fathom/node_modules/mime": { + "version": "1.2.11", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.2.11.tgz", + "integrity": "sha512-Ysa2F/nqTNGHhhm9MV8ure4+Hc+Y8AWiqUdHxsO7xu8zc92ND9f3kpALHjaP026Ft17UfxrMt95c50PLUeynBw==" + }, + "node_modules/fathom/node_modules/oauth-sign": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.3.0.tgz", + "integrity": "sha512-Tr31Sh5FnK9YKm7xTUPyDMsNOvMqkVDND0zvK/Wgj7/H9q8mpye0qG2nVzrnsvLhcsX5DtqXD0la0ks6rkPCGQ==", + "optional": true, + "engines": { + "node": "*" + } + }, + "node_modules/fathom/node_modules/qs": { + "version": "0.6.6", + "resolved": "https://registry.npmjs.org/qs/-/qs-0.6.6.tgz", + "integrity": "sha512-kN+yNdAf29Jgp+AYHUmC7X4QdJPR8czuMWLNLc0aRxkQ7tB3vJQEONKKT9ou/rW7EbqVec11srC9q9BiVbcnHA==", + "engines": { + "node": "*" + } + }, + "node_modules/fathom/node_modules/request": { + "version": "2.33.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.33.0.tgz", + "integrity": "sha512-FqM/Jy/kECM/UjanL+3fyQbeEBMEutBXRgltnneYIpb7R+u/3kWgzrAoj+55DjCyMYQkzXVeW4/JkwDJ1H8HxA==", + "deprecated": "request has been deprecated, see https://github.com/request/request/issues/3142", + "engines": [ + "node >= 0.8.0" + ], + "dependencies": { + "forever-agent": "~0.5.0", + "json-stringify-safe": "~5.0.0", + "mime": "~1.2.9", + "node-uuid": "~1.4.0", + "qs": "~0.6.0" + }, + "optionalDependencies": { + "aws-sign2": "~0.5.0", + "form-data": "~0.1.0", + "hawk": "~1.0.0", + "http-signature": "~0.10.0", + "oauth-sign": "~0.3.0", + "tough-cookie": ">=0.12.0", + "tunnel-agent": "~0.3.0" + } + }, + "node_modules/fathom/node_modules/tunnel-agent": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.3.0.tgz", + "integrity": "sha512-jlGqHGoKzyyjhwv/c9omAgohntThMcGtw8RV/RDLlkbbc08kni/akVxO62N8HaXMVbVsK1NCnpSK3N2xCt22ww==", + "optional": true, + "engines": { + "node": "*" + } + }, "node_modules/faye-websocket": { "version": "0.10.0", "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.10.0.tgz", @@ -12474,6 +12677,22 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/hawk": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/hawk/-/hawk-1.0.0.tgz", + "integrity": "sha512-Sg+VzrI7TjUomO0rjD6UXawsj50ykn5sB/xKNW/IenxzRVyw/wt9A2FLzYpGL/r0QG5hyXY8nLx/2m8UutoDcg==", + "deprecated": "This module moved to @hapi/hawk. Please make sure to switch over as this distribution is no longer supported and may contain bugs and critical security issues.", + "optional": true, + "dependencies": { + "boom": "0.4.x", + "cryptiles": "0.2.x", + "hoek": "0.9.x", + "sntp": "0.2.x" + }, + "engines": { + "node": ">=0.8.0" + } + }, "node_modules/he": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", @@ -12515,6 +12734,16 @@ "value-equal": "^1.0.1" } }, + "node_modules/hoek": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/hoek/-/hoek-0.9.1.tgz", + "integrity": "sha512-ZZ6eGyzGjyMTmpSPYVECXy9uNfqBR7x5CavhUaLOeD6W0vWK1mp/b7O3f86XE0Mtfo9rZ6Bh3fnuw9Xr8MF9zA==", + "deprecated": "This version has been deprecated in accordance with the hapi support policy (hapi.im/support). Please upgrade to the latest version to get the best features, bug fixes, and security patches. If you are unable to upgrade at this time, paid support is available for older versions (hapi.im/commercial).", + "optional": true, + "engines": { + "node": ">=0.8.0" + } + }, "node_modules/hoist-non-react-statics": { "version": "3.3.2", "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", @@ -14249,13 +14478,12 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", - "dev": true, "license": "ISC" }, "node_modules/json5": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.1.tgz", - "integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==", + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", "bin": { "json5": "lib/cli.js" }, @@ -14452,8 +14680,9 @@ } }, "node_modules/loader-utils": { - "version": "2.0.2", - "license": "MIT", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", + "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", "dependencies": { "big.js": "^5.2.2", "emojis-list": "^3.0.0", @@ -15494,6 +15723,15 @@ "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.6.tgz", "integrity": "sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg==" }, + "node_modules/node-uuid": { + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/node-uuid/-/node-uuid-1.4.8.tgz", + "integrity": "sha512-TkCET/3rr9mUuRp+CpO7qfgT++aAxfDRaalQhwPFzI9BY/2rCDn6OfpZOVggi1AXfTPpfkTrg5f5WQx5G1uLxA==", + "deprecated": "Use uuid module instead", + "bin": { + "uuid": "bin/uuid" + } + }, "node_modules/normalize-package-data": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", @@ -17442,7 +17680,7 @@ }, "node_modules/psl": { "version": "1.8.0", - "dev": true, + "devOptional": true, "license": "MIT" }, "node_modules/pump": { @@ -17805,9 +18043,9 @@ } }, "node_modules/react-dev-utils/node_modules/loader-utils": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-3.2.0.tgz", - "integrity": "sha512-HVl9ZqccQihZ7JM85dco1MvO9G+ONvxoGa9rkhzFsneGLKSUg1gJf9bWzhRhcvm2qChhWpebQhP44qxjKIUCaQ==", + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-3.2.1.tgz", + "integrity": "sha512-ZvFw1KWS3GVyYBYb7qkmRM/WwL2TQQBxgCK62rlvm4WpVQ23Nb4tYjApUlfjrEGvOs7KHEsmyUn75OHZrJMWPw==", "engines": { "node": ">= 12.13.0" } @@ -19195,14 +19433,15 @@ } }, "node_modules/serve-handler": { - "version": "6.1.3", - "license": "MIT", + "version": "6.1.5", + "resolved": "https://registry.npmjs.org/serve-handler/-/serve-handler-6.1.5.tgz", + "integrity": "sha512-ijPFle6Hwe8zfmBxJdE+5fta53fdIY0lHISJvuikXB3VYFafRjMRpOffSPvCYsbKyBA7pvy9oYr/BT1O3EArlg==", "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", + "minimatch": "3.1.2", "path-is-inside": "1.0.2", "path-to-regexp": "2.2.1", "range-parser": "1.2.0" @@ -19247,18 +19486,6 @@ "node": ">= 0.6" } }, - "node_modules/serve-handler/node_modules/minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, "node_modules/serve-handler/node_modules/path-to-regexp": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-2.2.1.tgz", @@ -19725,6 +19952,19 @@ "dev": true, "license": "MIT" }, + "node_modules/sntp": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/sntp/-/sntp-0.2.4.tgz", + "integrity": "sha512-bDLrKa/ywz65gCl+LmOiIhteP1bhEsAAzhfMedPoiHP3dyYnAevlaJshdqb9Yu0sRifyP/fRqSt8t+5qGIWlGQ==", + "deprecated": "This module moved to @hapi/sntp. Please make sure to switch over as this distribution is no longer supported and may contain bugs and critical security issues.", + "optional": true, + "dependencies": { + "hoek": "0.9.x" + }, + "engines": { + "node": ">=0.8.0" + } + }, "node_modules/sockjs": { "version": "0.3.24", "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz", @@ -20973,7 +21213,7 @@ "version": "2.5.0", "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", - "dev": true, + "devOptional": true, "license": "BSD-3-Clause", "dependencies": { "psl": "^1.1.28", @@ -20987,7 +21227,7 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", - "dev": true, + "devOptional": true, "license": "MIT", "engines": { "node": ">=6" @@ -26891,6 +27131,15 @@ "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==" }, + "boom": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/boom/-/boom-0.4.2.tgz", + "integrity": "sha512-OvfN8y1oAxxphzkl2SnCS+ztV/uVKTATtgLjWYg/7KwcNyf3rzpHxNQJZCKtsZd4+MteKczhWbSjtEX4bGgU9g==", + "optional": true, + "requires": { + "hoek": "0.9.x" + } + }, "boxen": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/boxen/-/boxen-5.1.2.tgz", @@ -27982,6 +28231,15 @@ "yargs": "^2.3.0" } }, + "cryptiles": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-0.2.2.tgz", + "integrity": "sha512-gvWSbgqP+569DdslUiCelxIv3IYK5Lgmq1UrRnk+s1WxQOQ16j3GPDcjdtgL5Au65DU/xQi6q3xPtf5Kta+3IQ==", + "optional": true, + "requires": { + "boom": "0.4.x" + } + }, "crypto-random-string": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", @@ -28256,6 +28514,12 @@ "csstype": { "version": "3.0.11" }, + "ctype": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/ctype/-/ctype-0.5.3.tgz", + "integrity": "sha512-T6CEkoSV4q50zW3TlTHMbzy1E5+zlnNcY+yb7tWVYlTwPhx9LpnfAkd4wecpWknDyptp4k97LUZeInlf6jdzBg==", + "optional": true + }, "currently-unhandled": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", @@ -28287,7 +28551,9 @@ "dev": true }, "decode-uri-component": { - "version": "0.2.0", + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.2.tgz", + "integrity": "sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==", "dev": true }, "decompress": { @@ -30774,6 +31040,129 @@ "reusify": "^1.0.4" } }, + "fathom": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/fathom/-/fathom-0.3.0.tgz", + "integrity": "sha512-pD1tPE/VuIW1gnBAfPUjDCa4bPTs9nT+4mdULpIC4R55pPMJLbH2H/u7kL1PiRaA1s9j4lr72MFhWi0kkNoYLw==", + "requires": { + "commander": "~2.1.0", + "request": "~2.33.0" + }, + "dependencies": { + "asn1": { + "version": "0.1.11", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.1.11.tgz", + "integrity": "sha512-Fh9zh3G2mZ8qM/kwsiKwL2U2FmXxVsboP4x1mXjnhKHv3SmzaBZoYvxEQJz/YS2gnCgd8xlAVWcZnQyC9qZBsA==", + "optional": true + }, + "assert-plus": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.1.5.tgz", + "integrity": "sha512-brU24g7ryhRwGCI2y+1dGQmQXiZF7TtIj583S96y0jjdajIe6wn8BuXyELYhvD22dtIxDQVFk04YTJwwdwOYJw==", + "optional": true + }, + "async": { + "version": "0.9.2", + "resolved": "https://registry.npmjs.org/async/-/async-0.9.2.tgz", + "integrity": "sha512-l6ToIJIotphWahxxHyzK9bnLR6kM4jJIIgLShZeqLY7iboHoGkdgFl7W2/Ivi4SkMJYGKqW8vSuk0uKUj6qsSw==", + "optional": true + }, + "aws-sign2": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.5.0.tgz", + "integrity": "sha512-oqUX0DM5j7aPWPCnpWebiyNIj2wiNI87ZxnOMoGv0aE4TGlBy2N+5iWc6dQ/NOKZaBD2W6PVz8jtOGkWzSC5EA==", + "optional": true + }, + "combined-stream": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-0.0.7.tgz", + "integrity": "sha512-qfexlmLp9MyrkajQVyjEDb0Vj+KhRgR/rxLiVhaihlT+ZkX0lReqtH6Ack40CvMDERR4b5eFp3CreskpBs1Pig==", + "optional": true, + "requires": { + "delayed-stream": "0.0.5" + } + }, + "commander": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.1.0.tgz", + "integrity": "sha512-J2wnb6TKniXNOtoHS8TSrG9IOQluPrsmyAJ8oCUJOBmv+uLBCyPYAZkD2jFvw2DCzIXNnISIM01NIvr35TkBMQ==" + }, + "delayed-stream": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-0.0.5.tgz", + "integrity": "sha512-v+7uBd1pqe5YtgPacIIbZ8HuHeLFVNe4mUEyFDXL6KiqzEykjbw+5mXZXpGFgNVasdL4jWKgaKIXrEHiynN1LA==", + "optional": true + }, + "forever-agent": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.5.2.tgz", + "integrity": "sha512-PDG5Ef0Dob/JsZUxUltJOhm/Y9mlteAE+46y3M9RBz/Rd3QVENJ75aGRhN56yekTUboaBIkd8KVWX2NjF6+91A==" + }, + "form-data": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-0.1.4.tgz", + "integrity": "sha512-x8eE+nzFtAMA0YYlSxf/Qhq6vP1f8wSoZ7Aw1GuctBcmudCNuTUmmx45TfEplyb6cjsZO/jvh6+1VpZn24ez+w==", + "optional": true, + "requires": { + "async": "~0.9.0", + "combined-stream": "~0.0.4", + "mime": "~1.2.11" + } + }, + "http-signature": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-0.10.1.tgz", + "integrity": "sha512-coK8uR5rq2IMj+Hen+sKPA5ldgbCc1/spPdKCL1Fw6h+D0s/2LzMcRK0Cqufs1h0ryx/niwBHGFu8HC3hwU+lA==", + "optional": true, + "requires": { + "asn1": "0.1.11", + "assert-plus": "^0.1.5", + "ctype": "0.5.3" + } + }, + "mime": { + "version": "1.2.11", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.2.11.tgz", + "integrity": "sha512-Ysa2F/nqTNGHhhm9MV8ure4+Hc+Y8AWiqUdHxsO7xu8zc92ND9f3kpALHjaP026Ft17UfxrMt95c50PLUeynBw==" + }, + "oauth-sign": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.3.0.tgz", + "integrity": "sha512-Tr31Sh5FnK9YKm7xTUPyDMsNOvMqkVDND0zvK/Wgj7/H9q8mpye0qG2nVzrnsvLhcsX5DtqXD0la0ks6rkPCGQ==", + "optional": true + }, + "qs": { + "version": "0.6.6", + "resolved": "https://registry.npmjs.org/qs/-/qs-0.6.6.tgz", + "integrity": "sha512-kN+yNdAf29Jgp+AYHUmC7X4QdJPR8czuMWLNLc0aRxkQ7tB3vJQEONKKT9ou/rW7EbqVec11srC9q9BiVbcnHA==" + }, + "request": { + "version": "2.33.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.33.0.tgz", + "integrity": "sha512-FqM/Jy/kECM/UjanL+3fyQbeEBMEutBXRgltnneYIpb7R+u/3kWgzrAoj+55DjCyMYQkzXVeW4/JkwDJ1H8HxA==", + "requires": { + "aws-sign2": "~0.5.0", + "forever-agent": "~0.5.0", + "form-data": "~0.1.0", + "hawk": "~1.0.0", + "http-signature": "~0.10.0", + "json-stringify-safe": "~5.0.0", + "mime": "~1.2.9", + "node-uuid": "~1.4.0", + "oauth-sign": "~0.3.0", + "qs": "~0.6.0", + "tough-cookie": ">=0.12.0", + "tunnel-agent": "~0.3.0" + } + }, + "tunnel-agent": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.3.0.tgz", + "integrity": "sha512-jlGqHGoKzyyjhwv/c9omAgohntThMcGtw8RV/RDLlkbbc08kni/akVxO62N8HaXMVbVsK1NCnpSK3N2xCt22ww==", + "optional": true + } + } + }, "faye-websocket": { "version": "0.10.0", "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.10.0.tgz", @@ -31740,6 +32129,18 @@ "space-separated-tokens": "^1.0.0" } }, + "hawk": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/hawk/-/hawk-1.0.0.tgz", + "integrity": "sha512-Sg+VzrI7TjUomO0rjD6UXawsj50ykn5sB/xKNW/IenxzRVyw/wt9A2FLzYpGL/r0QG5hyXY8nLx/2m8UutoDcg==", + "optional": true, + "requires": { + "boom": "0.4.x", + "cryptiles": "0.2.x", + "hoek": "0.9.x", + "sntp": "0.2.x" + } + }, "he": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", @@ -31770,6 +32171,12 @@ "value-equal": "^1.0.1" } }, + "hoek": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/hoek/-/hoek-0.9.1.tgz", + "integrity": "sha512-ZZ6eGyzGjyMTmpSPYVECXy9uNfqBR7x5CavhUaLOeD6W0vWK1mp/b7O3f86XE0Mtfo9rZ6Bh3fnuw9Xr8MF9zA==", + "optional": true + }, "hoist-non-react-statics": { "version": "3.3.2", "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", @@ -32929,13 +33336,12 @@ "json-stringify-safe": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", - "dev": true + "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==" }, "json5": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.1.tgz", - "integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==" + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==" }, "jsonfile": { "version": "6.1.0", @@ -33071,7 +33477,9 @@ "version": "4.2.0" }, "loader-utils": { - "version": "2.0.2", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", + "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", "requires": { "big.js": "^5.2.2", "emojis-list": "^3.0.0", @@ -33835,6 +34243,11 @@ "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.6.tgz", "integrity": "sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg==" }, + "node-uuid": { + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/node-uuid/-/node-uuid-1.4.8.tgz", + "integrity": "sha512-TkCET/3rr9mUuRp+CpO7qfgT++aAxfDRaalQhwPFzI9BY/2rCDn6OfpZOVggi1AXfTPpfkTrg5f5WQx5G1uLxA==" + }, "normalize-package-data": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", @@ -35118,7 +35531,7 @@ }, "psl": { "version": "1.8.0", - "dev": true + "devOptional": true }, "pump": { "version": "3.0.0", @@ -35376,9 +35789,9 @@ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" }, "loader-utils": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-3.2.0.tgz", - "integrity": "sha512-HVl9ZqccQihZ7JM85dco1MvO9G+ONvxoGa9rkhzFsneGLKSUg1gJf9bWzhRhcvm2qChhWpebQhP44qxjKIUCaQ==" + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-3.2.1.tgz", + "integrity": "sha512-ZvFw1KWS3GVyYBYb7qkmRM/WwL2TQQBxgCK62rlvm4WpVQ23Nb4tYjApUlfjrEGvOs7KHEsmyUn75OHZrJMWPw==" }, "locate-path": { "version": "6.0.0", @@ -36412,13 +36825,15 @@ } }, "serve-handler": { - "version": "6.1.3", + "version": "6.1.5", + "resolved": "https://registry.npmjs.org/serve-handler/-/serve-handler-6.1.5.tgz", + "integrity": "sha512-ijPFle6Hwe8zfmBxJdE+5fta53fdIY0lHISJvuikXB3VYFafRjMRpOffSPvCYsbKyBA7pvy9oYr/BT1O3EArlg==", "requires": { "bytes": "3.0.0", "content-disposition": "0.5.2", "fast-url-parser": "1.1.3", "mime-types": "2.1.18", - "minimatch": "3.0.4", + "minimatch": "3.1.2", "path-is-inside": "1.0.2", "path-to-regexp": "2.2.1", "range-parser": "1.2.0" @@ -36447,14 +36862,6 @@ "mime-db": "~1.33.0" } }, - "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "requires": { - "brace-expansion": "^1.1.7" - } - }, "path-to-regexp": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-2.2.1.tgz", @@ -36818,6 +37225,15 @@ } } }, + "sntp": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/sntp/-/sntp-0.2.4.tgz", + "integrity": "sha512-bDLrKa/ywz65gCl+LmOiIhteP1bhEsAAzhfMedPoiHP3dyYnAevlaJshdqb9Yu0sRifyP/fRqSt8t+5qGIWlGQ==", + "optional": true, + "requires": { + "hoek": "0.9.x" + } + }, "sockjs": { "version": "0.3.24", "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz", @@ -37734,7 +38150,7 @@ "version": "2.5.0", "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", - "dev": true, + "devOptional": true, "requires": { "psl": "^1.1.28", "punycode": "^2.1.1" @@ -37744,7 +38160,7 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", - "dev": true + "devOptional": true } } }, diff --git a/website/sidebars.js b/website/sidebars.js index 0278811bd..b5503860c 100755 --- a/website/sidebars.js +++ b/website/sidebars.js @@ -7,7 +7,6 @@ module.exports = { items: [ 'introduction', 'quickstart', - 'subo' ] }, { @@ -18,31 +17,39 @@ module.exports = { 'how-to/se2-go', 'how-to/se2-js', { - 'Customize plugins': [ - 'how-to/customize-plugins/plugin-editor', - 'how-to/customize-plugins/custom-plugin-templates', - 'how-to/customize-plugins/namespaces', - ] + 'Customize plugins': [ + 'how-to/customize-plugins/plugin-editor', + 'how-to/customize-plugins/custom-plugin-templates', + 'how-to/customize-plugins/namespaces', + ], }, - { - type: 'category', - label: 'Deploy SE2', - collapsible: true, - items: [ - { - 'Cloud deployment': [ - 'how-to/deploy/cloud-deployment/configure-capabilities', - 'how-to/deploy/cloud-deployment/configure-storage', - 'how-to/deploy/cloud-deployment/configure-webhooks', - 'how-to/deploy/cloud-deployment/install-se2-in-your-cloud-environment' - ], - 'Other deployments': [ - 'how-to/deploy/other-deployments/minikube' - ] - }, - ] - }, - ] + // { // uncomment when this users can deploy the dataplane + // type: 'category', + // label: 'Self-Host SE2', + // collapsible: true, + // items: [ + // 'how-to/self-host-se2/self-hosted-quickstart', + // { + // type: 'category', + // label: 'Deploy SE2', + // collapsible: true, + // items: [ + // { + // 'Cloud deployment': [ + // 'how-to/self-host-se2/deploy/cloud-deployment/configure-capabilities', + // 'how-to/self-host-se2/deploy/cloud-deployment/configure-storage', + // 'how-to/self-host-se2/deploy/cloud-deployment/configure-webhooks', + // 'how-to/self-host-se2/deploy/cloud-deployment/install-se2-in-your-cloud-environment' + // ], + // 'Other deployments': [ + // 'how-to/self-host-se2/deploy/other-deployments/minikube' + // ] + // } + // ], + // }, + // ], + // }, + ], }, { type: 'category', diff --git a/website/static/img/ada-creation.png b/website/static/img/ada-creation.png new file mode 100644 index 000000000..d3f7212d8 Binary files /dev/null and b/website/static/img/ada-creation.png differ diff --git a/website/static/img/app-served.png b/website/static/img/app-served.png new file mode 100644 index 000000000..857ded2c2 Binary files /dev/null and b/website/static/img/app-served.png differ diff --git a/website/static/img/create-access-key-screen.png b/website/static/img/create-access-key-screen.png new file mode 100644 index 000000000..358dc917d Binary files /dev/null and b/website/static/img/create-access-key-screen.png differ diff --git a/website/static/img/create-api-key-screen.png b/website/static/img/create-api-key-screen.png new file mode 100644 index 000000000..b280d823e Binary files /dev/null and b/website/static/img/create-api-key-screen.png differ diff --git a/website/static/img/create-env-screen.png b/website/static/img/create-env-screen.png new file mode 100644 index 000000000..1c211cb7e Binary files /dev/null and b/website/static/img/create-env-screen.png differ diff --git a/website/static/img/create-org-screen.png b/website/static/img/create-org-screen.png new file mode 100644 index 000000000..5c5a4f7fe Binary files /dev/null and b/website/static/img/create-org-screen.png differ diff --git a/website/static/img/env-dashboard-screen.png b/website/static/img/env-dashboard-screen.png new file mode 100644 index 000000000..5ebc74740 Binary files /dev/null and b/website/static/img/env-dashboard-screen.png differ diff --git a/website/static/img/network-requests-logs.png b/website/static/img/network-requests-logs.png new file mode 100644 index 000000000..72cdc957e Binary files /dev/null and b/website/static/img/network-requests-logs.png differ