mirror of
https://github.com/Unleash/unleash.git
synced 2025-04-10 01:16:39 +02:00
Source proxy and Edge docs from GitHub (#3122)
## What The main purpose of this PR is to 1. Delete the proxy docs in this repo and replace them with the proxy's GitHub readme. 2. Add the docs for Unleash Edge. ### Detailed change description This PR contains a lot of small changes in a large number of files. To make it easier to get an overview, here's a detailed description of what happens where: #### In the `website/docs`directory Except for the deletion of the proxy doc, all changes in this directory are rewriting internal links, so that they point to the newly generated document instead. #### `package.json` and `yarn.lock` When including the documentation for Edge, we also want to render the mermaid diagrams it uses. Docusaurus supports this via a plugin. All changes in these files are related to installing that plugin. #### `docusaurus.config.js` There's two types of changes in this file: 1. Mermaid-related changes: we ask docusaurus to render mermaid in markdown files and add the plugin 2. Document generation. There's some rewrites to the sdk doc generation plus an entirely new section that generates docs for Edge and the proxy #### `sidebars.js` Two things: 1. Add the edge docs 2. Move both the Edge and the proxy docs up a level, so that they're directly under "reference docs" instead of nested inside "unleash concepts". #### In the `website/remote-content` directory These are the remote content files. Previously, all of this lived only in a `readme-fns.js` file, but with the introduction of Edge and proxy docs, this has been moved into its own directory and refactored into three files (`shared`, `sdks`, `edge-proxy`). #### `custom.css` Style updates to center mermaid diagrams and provide more space around them. #### In `static/img` The image files that were included in the proxy doc and that have been deleted. ## Why For two reasons: 1. Reduce duplication for the proxy. Have one source of truth. 2. Add docs for edge. ## Discussion points and review wishes This is a big PR, and I don't expect anyone to do a line-by-line review of it, nor do I think that is particularly useful. Instead, I'd like to ask reviewers to: 1. Visit the [documentation preview](https://unleash-docs-git-docs-source-proxy-gh-unleash-team.vercel.app/reference/unleash-proxy) and have a look at both the proxy docs and the Edge docs. Potentially have a look at the SDK docs too to verify that everything still works. 2. Consider whether they think moving the proxy and edge docs up a level (in the sidebar) makes sense. 3. Let me know what slug they'd prefer for the Edge docs. I've gone with `unleash-edge` for now (so that it's `docs.getunleash.io/reference/unleash-edge`), but we could potentially also just use `edge`. WDYT? 4. Read through the detailed changes section. 5. Let me know if they have any other concerns or questions. ## Screenies The new proxy doc:  The new edge doc: 
This commit is contained in:
parent
fca0aba19b
commit
415e1b0596
@ -10,7 +10,7 @@ Placeholders in the code samples below are delimited by angle brackets (i.e. `<p
|
||||
|
||||
:::
|
||||
|
||||
The [Unleash Proxy](../reference/unleash-proxy.md) provides a way for you to consume feature toggles in [front-end clients](../reference/sdks/index.md#front-end-sdks), such as the [JavaScript Proxy client](/docs/generated/sdks/client-side/javascript-browser.md) and [React Proxy client](/docs/generated/sdks/client-side/react.md).
|
||||
The [Unleash Proxy](../generated/unleash-proxy.md) provides a way for you to consume feature toggles in [front-end clients](../reference/sdks/index.md#front-end-sdks), such as the [JavaScript Proxy client](/docs/generated/sdks/client-side/javascript-browser.md) and [React Proxy client](/docs/generated/sdks/client-side/react.md).
|
||||
|
||||
Depending on your setup, the Proxy is most easily run in one of two ways, depending on your situation:
|
||||
|
||||
@ -43,7 +43,7 @@ docker pull unleashorg/unleash-proxy
|
||||
|
||||
### 2. Start the Proxy
|
||||
|
||||
When running the Proxy, you'll need to provide it with at least the configuration options listed below. Check the reference docs for the [full list of configuration options](../reference/unleash-proxy.md#configuration-options).
|
||||
When running the Proxy, you'll need to provide it with at least the configuration options listed below. Check the reference docs for the [full list of configuration options](../generated/unleash-proxy.md#configuration-options).
|
||||
|
||||
```bash title="Run the Unleash Proxy via Docker"
|
||||
docker run \
|
||||
@ -82,7 +82,7 @@ npm install @unleash/proxy
|
||||
|
||||
### 3. Configure and start the proxy
|
||||
|
||||
Import the `createApp` function from `@unleash/proxy` and configure the proxy. You'll need to provide at least the configuration options highlighted below. Check the reference docs for the [full list of configuration options](../reference/unleash-proxy.md#configuration-options).
|
||||
Import the `createApp` function from `@unleash/proxy` and configure the proxy. You'll need to provide at least the configuration options highlighted below. Check the reference docs for the [full list of configuration options](../generated/unleash-proxy.md#configuration-options).
|
||||
|
||||
Here is an example of what running the Proxy as a Node.js app might look like:
|
||||
|
||||
|
@ -81,14 +81,14 @@ The steps to implement a custom strategy for your client depend on the kind of c
|
||||
|
||||
### Option B: Implement the strategy for a front-end client SDK {#step-3-b}
|
||||
|
||||
Front-end client SDKs don't evaluate strategies directly, so you need to implement the **custom strategy in the [Unleash Proxy](../reference/unleash-proxy.md)**. Depending on how you run the Unleash Proxy, follow one of the below series of steps:
|
||||
Front-end client SDKs don't evaluate strategies directly, so you need to implement the **custom strategy in the [Unleash Proxy](../generated/unleash-proxy.md)**. Depending on how you run the Unleash Proxy, follow one of the below series of steps:
|
||||
|
||||
- If you're running the Unleash Proxy as a Docker container, refer to the [steps for using a containerized Proxy](#step-3-b-docker).
|
||||
- If you're using the Unleash Proxy via Node.js, refer to the [steps for using custom strategies via Node.js](#step-3-b-node).
|
||||
|
||||
#### With a containerized proxy {#step-3-b-docker}
|
||||
|
||||
Strategies are stored in separate JavaScript files and loaded into the container at startup. Refer to [the Unleash Proxy documentation](../reference/unleash-proxy.md) for a full overview of all the options.
|
||||
Strategies are stored in separate JavaScript files and loaded into the container at startup. Refer to [the Unleash Proxy documentation](../generated/unleash-proxy.md) for a full overview of all the options.
|
||||
|
||||
1. **Create a strategies directory.** Create a directory that Docker has access to where you can store your strategies. The next steps assume you called it `strategies`
|
||||
2. **Initialize a Node.js project** and **install the Unleash Client**:
|
||||
|
@ -6,7 +6,7 @@ It is powerful to be able to turn a feature on and off instantaneously, without
|
||||
|
||||
Unleash comes with a number of built-in strategies (described below) and also lets you add your own [custom activation strategies](../reference/custom-activation-strategies.md) if you need more control. However, while activation strategies are _defined_ on the server, the server does not _implement_ the strategies. Instead, activation strategy implementation is done client-side. This means that it is _the client_ that decides whether a feature should be enabled or not.
|
||||
|
||||
All [server-side client SDKs](../reference/sdks/index.md#server-side-sdks) and the [Unleash Proxy](../reference/unleash-proxy.md) implement the default strategies (and allow you to add your own [custom strategy implementations](../reference/custom-activation-strategies.md#implementation)). The [front-end client SDKs](../reference/sdks/index.md#front-end-sdks) do not do the evaluation themselves, instead relying on the [Unleash Proxy](../reference/unleash-proxy.md) to take care of the implementation and evaluation.
|
||||
All [server-side client SDKs](../reference/sdks/index.md#server-side-sdks) and the [Unleash Proxy](../generated/unleash-proxy.md) implement the default strategies (and allow you to add your own [custom strategy implementations](../reference/custom-activation-strategies.md#implementation)). The [front-end client SDKs](../reference/sdks/index.md#front-end-sdks) do not do the evaluation themselves, instead relying on the [Unleash Proxy](../generated/unleash-proxy.md) to take care of the implementation and evaluation.
|
||||
|
||||
Some activation strategies require the client to provide the current [Unleash context](unleash-context.md) to the toggle evaluation function for the evaluation to be done correctly.
|
||||
|
||||
|
@ -2,7 +2,7 @@
|
||||
title: API tokens and client keys
|
||||
---
|
||||
|
||||
For Unleash to be of any use, it requires at least a server and a [consuming client](../reference/sdks/index.md). More advanced use cases may call for multiple clients, automated feature toggle updates, the [Unleash proxy](../reference/unleash-proxy.md) and [Unleash proxy clients](../reference/sdks/index.md#front-end-sdks), and more. To facilitate communication between all these moving parts, Unleash uses a system of API tokens and client keys, all with a specific purpose in mind.
|
||||
For Unleash to be of any use, it requires at least a server and a [consuming client](../reference/sdks/index.md). More advanced use cases may call for multiple clients, automated feature toggle updates, the [Unleash proxy](../generated/unleash-proxy.md) and [Unleash proxy clients](../reference/sdks/index.md#front-end-sdks), and more. To facilitate communication between all these moving parts, Unleash uses a system of API tokens and client keys, all with a specific purpose in mind.
|
||||
|
||||
This document details the three kinds of tokens and keys that you will need to fully connect any Unleash system:
|
||||
|
||||
@ -94,13 +94,13 @@ Each client token is only **valid for a single environment**.
|
||||
Use client tokens:
|
||||
|
||||
- In [server-side client SDKs](../reference/sdks/index.md#server-side-sdks)
|
||||
- To connect [the Unleash Proxy](../reference/unleash-proxy.md) to the Unleash API
|
||||
- To connect [the Unleash Proxy](../generated/unleash-proxy.md) to the Unleash API
|
||||
|
||||
Do **not** use client tokens in:
|
||||
|
||||
- [Front-end SDKs](../reference/sdks/index.md#front-end-sdks). You will _not_ be able to connect to the Unleash server due to CORS restrictions. To connect front-end SDKs, choose one of the following options:
|
||||
- Enable the [Unleash front-end API](./front-end-api.md) and create a [front-end token](#front-end-tokens).
|
||||
- Configure an [Unleash Proxy](../reference/unleash-proxy.md) and use [Proxy client keys](#proxy-client-keys).
|
||||
- Configure an [Unleash Proxy](../generated/unleash-proxy.md) and use [Proxy client keys](#proxy-client-keys).
|
||||
|
||||
### Front-end tokens
|
||||
|
||||
@ -177,13 +177,13 @@ Some example client tokens are:
|
||||
|
||||
## Proxy client keys {#proxy-client-keys}
|
||||
|
||||
Use proxy client keys to connect [Proxy client SDKs (front-end SDKs)](../reference/sdks/index.md#front-end-sdks) to the [Unleash Proxy](../reference/unleash-proxy.md). As opposed to the [API tokens](#api-tokens), Proxy client keys are _not_ considered secret and are safe to use on any clients (refer to the [the proxy documentation for more about privacy](../reference/unleash-proxy.md#we-care-about-privacy)). They do _not_ let you connect to the Unleash server API.
|
||||
Use proxy client keys to connect [Proxy client SDKs (front-end SDKs)](../reference/sdks/index.md#front-end-sdks) to the [Unleash Proxy](../generated/unleash-proxy.md). As opposed to the [API tokens](#api-tokens), Proxy client keys are _not_ considered secret and are safe to use on any clients (refer to the [the proxy documentation for more about privacy](../generated/unleash-proxy.md#we-care-about-privacy)). They do _not_ let you connect to the Unleash server API.
|
||||
|
||||
Proxy client keys are arbitrary strings that you _must_ provide the Unleash proxy with on startup. They can be whatever you want and you **create them yourself**.
|
||||
|
||||
:::info Creating proxy client keys
|
||||
|
||||
To designate a string as a proxy client key, add it to the `clientKeys` list when starting the proxy, as mentioned in the [_configuration_ section of the Unleash proxy documentation](../reference/unleash-proxy.md#configuration). Connecting clients should then specify the same string as their client key.
|
||||
To designate a string as a proxy client key, add it to the `clientKeys` list when starting the proxy, as mentioned in the [_configuration_ section of the Unleash proxy documentation](../generated/unleash-proxy.md#configuration). Connecting clients should then specify the same string as their client key.
|
||||
|
||||
:::
|
||||
|
||||
@ -191,7 +191,7 @@ Unleash does not generate proxy client keys for you. Because of this, they have
|
||||
|
||||
Use Proxy client keys to:
|
||||
|
||||
- Connect [Proxy client SDKs](../reference/sdks/index.md#front-end-sdks) to the [Unleash Proxy](../reference/unleash-proxy.md)
|
||||
- Connect [Proxy client SDKs](../reference/sdks/index.md#front-end-sdks) to the [Unleash Proxy](../generated/unleash-proxy.md)
|
||||
- Connect your own custom Proxy clients (or pure HTTP requests) to the Unleash Proxy
|
||||
|
||||
Do **not** use Proxy client keys to:
|
||||
|
@ -62,6 +62,6 @@ If you have not implemented the strategy in your client SDK, the check will alwa
|
||||
|
||||
While custom strategies are _defined_ on the Unleash server, they must be _implemented_ on the client. All official Unleash client SDKs provide a way for you to implement custom strategies. You should refer to the individual SDK's documentation for specifics, but for an example, you can have a look at the [_Node.js client implementation_ section in the _how to use custom strategies_ guide](../how-to/how-to-use-custom-strategies.md#step-3-a).
|
||||
|
||||
The exact method for implementing custom strategies will vary between SDKs, but the server SDKs follow the same patterns. For front-end client SDKs ([Android](/docs/generated/sdks/client-side/android-proxy.md), [JavaScript](/docs/generated/sdks/client-side/javascript-browser.md), [React](/docs/generated/sdks/client-side/react.md), [iOS](/docs/generated/sdks/client-side/ios-proxy.md), [Flutter](/docs/generated/sdks/client-side/flutter.md)), the custom activation strategy must be implemented in the [Unleash Proxy](../reference/unleash-proxy.md).
|
||||
The exact method for implementing custom strategies will vary between SDKs, but the server SDKs follow the same patterns. For front-end client SDKs ([Android](/docs/generated/sdks/client-side/android-proxy.md), [JavaScript](/docs/generated/sdks/client-side/javascript-browser.md), [React](/docs/generated/sdks/client-side/react.md), [iOS](/docs/generated/sdks/client-side/ios-proxy.md), [Flutter](/docs/generated/sdks/client-side/flutter.md)), the custom activation strategy must be implemented in the [Unleash Proxy](../generated/unleash-proxy.md).
|
||||
|
||||
When implementing a strategy in your client, you will get access to the strategy's parameters and the Unleash Context. Again, refer to your specific SDK's documentation for more details.
|
||||
|
@ -8,7 +8,7 @@ The Unleash front-end API was released in Unleash 4.18. You can read more in the
|
||||
|
||||
:::
|
||||
|
||||
The **Unleash front-end API** offers a simplified workflow for connecting a client-side (front-end) applications to Unleash. It provides the exact same API as the [Unleash proxy](../reference/unleash-proxy.md). The front-end API is a quick and easy way to add Unleash to single-page applications and mobile apps.
|
||||
The **Unleash front-end API** offers a simplified workflow for connecting a client-side (front-end) applications to Unleash. It provides the exact same API as the [Unleash proxy](../generated/unleash-proxy.md). The front-end API is a quick and easy way to add Unleash to single-page applications and mobile apps.
|
||||
|
||||
|
||||
Compared to using the Unleash proxy, using the Unleash front-end API has both benefits and drawbacks. The benefits are:
|
||||
|
@ -12,7 +12,7 @@ Unleash can provide you with **impression data** about the toggles in your appli
|
||||
|
||||
:::caution Front-end SDKs and disabled toggles
|
||||
|
||||
Older versions of the front-end SDKs and other SDKs that connect the [Unleash proxy](../reference/unleash-proxy.md) or the [Unleash front-end API](../reference/front-end-api.md) would **not** emit impression events when a toggle is disabled.
|
||||
Older versions of the front-end SDKs and other SDKs that connect the [Unleash proxy](../generated/unleash-proxy.md) or the [Unleash front-end API](../reference/front-end-api.md) would **not** emit impression events when a toggle is disabled.
|
||||
|
||||
This is because impression data is a **per-toggle** setting and the Proxy and front-end API only transmit information about toggles that are enabled. As such, the SDK will never know that it should emit an impression event if a toggle is disabled.
|
||||
|
||||
|
@ -23,7 +23,7 @@ Server-side clients run on your server and communicate directly with your Unleas
|
||||
|
||||
### Client-side SDKs
|
||||
|
||||
Client-side SDKs can connect to the [Unleash Proxy](../unleash-proxy.md) or to the [Unleash front-end API](../front-end-api.md), but _not_ to the regular Unleash client API.
|
||||
Client-side SDKs can connect to the [Unleash Proxy](../../generated/unleash-proxy.md) or to the [Unleash front-end API](../front-end-api.md), but _not_ to the regular Unleash client API.
|
||||
|
||||
|
||||
- [Android SDK](/docs/generated/sdks/client-side/android-proxy.md)
|
||||
@ -51,7 +51,7 @@ If you see an item marked with a ❌ that you would find useful, feel free to re
|
||||
|
||||
:::
|
||||
|
||||
| Capability | [Java](/docs/generated/sdks/server-side/java.md) | [Node.js](/docs/generated/sdks/server-side/node.md) | [Go](/docs/generated/sdks/server-side/go.md) | [Python](/docs/generated/sdks/server-side/python.md) | [Ruby](/docs/generated/sdks/server-side/ruby.md) | [.NET](/docs/generated/sdks/server-side/dotnet.md) | [PHP](/docs/generated/sdks/server-side/php.md) | [Rust](/docs/generated/sdks/server-side/rust.md) | [Unleash Proxy](/reference/unleash-proxy.md) |
|
||||
| Capability | [Java](/docs/generated/sdks/server-side/java.md) | [Node.js](/docs/generated/sdks/server-side/node.md) | [Go](/docs/generated/sdks/server-side/go.md) | [Python](/docs/generated/sdks/server-side/python.md) | [Ruby](/docs/generated/sdks/server-side/ruby.md) | [.NET](/docs/generated/sdks/server-side/dotnet.md) | [PHP](/docs/generated/sdks/server-side/php.md) | [Rust](/docs/generated/sdks/server-side/rust.md) | [Unleash Proxy](../../generated/unleash-proxy.md) |
|
||||
| --- | :-: | :-: | :-: | :-: | :-: | :-: | :-: | :-: | :-: |
|
||||
| **Category: Initialization** | | | | | | | | | |
|
||||
| Async initialization | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ | ✅ | N/A |
|
||||
|
@ -1,281 +0,0 @@
|
||||
---
|
||||
id: unleash-proxy
|
||||
title: Unleash Proxy
|
||||
---
|
||||
import Figure from '@site/src/components/Figure/Figure.tsx'
|
||||
|
||||
:::tip
|
||||
|
||||
Looking for how to run the Unleash proxy? Check out the [_How to run the Unleash Proxy_ guide](../how-to/how-to-run-the-unleash-proxy.mdx)!
|
||||
|
||||
:::
|
||||
|
||||
A lot of our users wanted to use feature toggles in their single-page and native applications. To solve this in a performant and privacy-focused way we built the Unleash proxy.
|
||||
|
||||
The Unleash Proxy sits between the Unleash API and the application. It provides a simple and super-fast API, as it has all the data it needs available in memory.
|
||||
|
||||
The proxy solves three important aspects:
|
||||
|
||||
- **Performance** – The proxy will cache all toggles in memory, and will be running on the edge, close to your end-users. A single instance will be able to handle thousands of request/sec, and you can scale it easily by adding additional instances.
|
||||
- **Security** – The proxy evaluates the feature flags for the user on the server-side, and exposes results for feature flags that are enabled for a specific user (flags not enabled for that specific user are _not_ exposed).
|
||||
- **Privacy** – If you run the proxy yourself (we can host it as well though) we will not see your end users. This means that you still have full control of your end-users, the way it should be!
|
||||
|
||||

|
||||
|
||||
_The Unleash Proxy uses the Unleash SDK and exposes a simple API_. The Proxy will synchronize with the Unleash API in the background and provide a simple HTTP API for clients.
|
||||
|
||||
## Configuration
|
||||
|
||||
:::info
|
||||
|
||||
You **must configure** these three variables for the proxy to start successfully:
|
||||
|
||||
- `unleashUrl` / `UNLEASH_URL`
|
||||
|
||||
- `unleashApiToken` / `UNLEASH_API_TOKEN`
|
||||
|
||||
- `clientKeys` / `UNLEASH_PROXY_CLIENT_KEYS`
|
||||
|
||||
:::
|
||||
|
||||
The Proxy has a large number of configuration options that you can use to adjust it to your specific use case. The table below lists all the available options.
|
||||
|
||||
| Option | Environment Variable | Default value | Required | Description |
|
||||
| --- | --- | --- | :-: | --- |
|
||||
| `clientKeys` | `UNLEASH_PROXY_CLIENT_KEYS` | n/a | yes | List of [client keys](../reference/api-tokens-and-client-keys.mdx#proxy-client-keys) that the proxy should accept. When querying the proxy, Proxy SDKs must set the request's _client keys header_ to one of these values. The default client keys header is `Authorization`. When using an environment variable to set the proxy secrets, the value should be a comma-separated list of strings, such as `secret-one,secret-two`. |
|
||||
| `clientKeysHeaderName` | `CLIENT_KEY_HEADER_NAME` | `"authorization"` | no | The name of the HTTP header to use for client keys. Incoming requests must set the value of this header to one of the Proxy's `clientKeys` to be authorized successfully. |
|
||||
| `customStrategies` | `UNLEASH_CUSTOM_STRATEGIES_FILE` | `[]` | no | Use this option to inject implementation of custom activation strategies. If you are using `UNLEASH_CUSTOM_STRATEGIES_FILE`: provide a valid path to a JavaScript file which exports an array of custom activation strategies. |
|
||||
| `enableOAS` | `ENABLE_OAS` | `false` | no | Set to `true` to expose the proxy's OpenAPI spec at `/docs/openapi.json` and an interactive Swagger interface at `/docs/openapi`. Read more in the [OpenAPI section](#openapi). |
|
||||
| `environment` | `UNLEASH_ENVIRONMENT` | `undefined` | no | If set this will be the `environment` used by the proxy in the Unleash Context. It will not be possible for proxy SDKs to override the environment if set. |
|
||||
| `logLevel` | `LOG_LEVEL ` | `"warn"` | no | Used to set `logLevel`. Supported options: `"debug"`, `"info"`, `"warn"`, `"error"` and `"fatal"` |
|
||||
| `logger` | n/a | `SimpleLogger` | no | Register a custom logger. |
|
||||
| `metricsInterval` | `UNLEASH_METRICS_INTERVAL` | `30000` | no | How often the proxy should send usage metrics back to Unleash, defined in ms. |
|
||||
| `namePrefix` | `UNLEASH_NAME_PREFIX` | `undefined` | no | If set, the Proxy will only fetch toggles whose name start with the provided prefix. |
|
||||
| `projectName` | `UNLEASH_PROJECT_NAME` | `undefined` | no | If set, the Proxy will only fetch toggles belonging to the project with this ID. |
|
||||
| `proxyBasePath` | `PROXY_BASE_PATH` | `""` | no | The base path to run the proxy from. "/proxy" will be added at the end. For instance, if `proxyBasePath` is `"base/path"`, the proxy will run at `/base/path/proxy`. |
|
||||
| `proxyPort` | `PORT` | `3000` | no | The port to run the proxy on. |
|
||||
| `proxySecrets` | `UNLEASH_PROXY_SECRETS` | n/a | no | Deprecated alias for `clientKeys`. Please use `clientKeys` instead. |
|
||||
| `refreshInterval` | `UNLEASH_FETCH_INTERVAL` | `5000` | no | How often the proxy should query Unleash for updates, defined in ms. |
|
||||
| `tags` | `UNLEASH_TAGS` | `undefined` | no | If set, the proxy will only fetch feature toggles with these [tags](../reference/tags.md). The format should be `tagName:tagValue,tagName2:tagValue2` |
|
||||
| `trustProxy` | `TRUST_PROXY ` | `false` | no | If enabled, the Unleash Proxy will know that it is itself sitting behind a proxy and that the `X-Forwarded-*` header fields (which otherwise may be easily spoofed) can be trusted. The proxy will automatically enrich the IP address in the Unleash Context. Can be `true/false` (trust all proxies) or a string (trust only given IP/CIDR (e.g. `'127.0.0.1'`)). If it is a string, it can also be a list of comma separated values (e.g. `'127.0.0.1,192.168.1.1/24'` |
|
||||
| `unleashApiToken` | `UNLEASH_API_TOKEN` | n/a | yes | The [client API token](../reference/api-tokens-and-client-keys.mdx#client-tokens) for connecting to Unleash API. |
|
||||
| `unleashAppName` | `UNLEASH_APP_NAME` | `"unleash-proxy" ` | no | The application name to use when registering with Unleash |
|
||||
| `unleashInstanceId` | `UNLEASH_INSTANCE_ID` | auto-generated | no | A unique(-ish) identifier for your instance. Typically a hostname, pod id or something similar. Unleash uses this to separate metrics from the client SDKs with the same `unleashAppName`. |
|
||||
| `unleashUrl` | `UNLEASH_URL` | n/a | yes | The API URL of the Unleash instance you want to connect to. |
|
||||
|
||||
## Privacy and hosting options {#privacy-and-hosting}
|
||||
|
||||
<div id="we-care-about-privacy"></div>
|
||||
|
||||
The Unleash Proxy is important because you should not expose your entire set of toggle configurations to your end users. Single page apps work in the context of a specific user. The proxy allows you to only provide data that relates to that one user: _The proxy will only return the evaluated toggles (with variants) that should be enabled for that specific user in that specific context._
|
||||
|
||||
Most of our customers prefer to run the Unleash proxy themselves. We actually prefer this as we don’t want to see your users. Running it is pretty simple, it is either a small Node.js process you start or a docker image you use. (We can of course host the proxy for you also.)
|
||||
|
||||
For more information on the various hosting options and their tradeoffs, refer to the [proxy hosting strategies topic document](../topics/proxy-hosting.mdx).
|
||||
|
||||
## Health endpoint
|
||||
|
||||
The proxy will try to synchronize with the Unleash API at startup, until it has successfully done that the proxy will return `HTTP 503 - Not Read?` for all request. You can use the health endpoint to validate that the proxy is ready to recieve requests:
|
||||
|
||||
```bash
|
||||
curl http://localhost:3000/proxy/health -I
|
||||
```
|
||||
|
||||
```bash
|
||||
HTTP/1.1 200 OK
|
||||
Access-Control-Allow-Origin: *
|
||||
Access-Control-Expose-Headers: ETag
|
||||
Content-Type: text/html; charset=utf-8
|
||||
Content-Length: 2
|
||||
ETag: W/"2-eoX0dku9ba8cNUXvu/DyeabcC+s"
|
||||
Date: Fri, 04 Jun 2021 10:38:27 GMT
|
||||
Connection: keep-alive
|
||||
Keep-Alive: timeout=5
|
||||
```
|
||||
|
||||
## Custom activation strategies
|
||||
|
||||
:::info Limitations for hosted proxies
|
||||
|
||||
Custom activation strategies can **not** be used with the Unleash-hosted proxy available to Pro and Enterprise customers.
|
||||
|
||||
:::
|
||||
|
||||
The Unleash Proxy can load [custom activation strategies](../reference/custom-activation-strategies.md) for front-end client SDKs ([Android](/docs/generated/sdks/client-side/android-proxy.md), [JavaScript](/docs/generated/sdks/client-side/javascript-browser.md), [React](/docs/generated/sdks/client-side/react.md), [iOS](/docs/generated/sdks/client-side/ios-proxy.md), [Flutter](/docs/generated/sdks/client-side/flutter.md)). For a step-by-step guide, refer to the [_how to use custom strategies_ guide](../how-to/how-to-use-custom-strategies.md#step-3-b).
|
||||
|
||||
To load custom strategies, use either of these two options:
|
||||
|
||||
- the **`customStrategies`** option: use this if you're running the Unleash Proxy via Node directly.
|
||||
- the **`UNLEASH_CUSTOM_STRATEGIES_FILE`** environment variable: use this if you're running the proxy as a container.
|
||||
|
||||
Both options take a list of file paths to JavaScript files that export custom strategy implementations.
|
||||
|
||||
### Custom activation strategy files format
|
||||
|
||||
Each strategy file must export a list of instantiated strategies. A file can export as many strategies as you'd like.
|
||||
|
||||
Here's an example file that exports two custom strategies:
|
||||
|
||||
```js
|
||||
const { Strategy } = require('unleash-client');
|
||||
|
||||
class MyCustomStrategy extends Strategy {
|
||||
// ... strategy implementation
|
||||
}
|
||||
|
||||
class MyOtherCustomStrategy extends Strategy {
|
||||
// ... strategy implementation
|
||||
}
|
||||
|
||||
// export strategies
|
||||
module.exports = [new MyCustomStrategy(), new MyOtherCustomStrategy()];
|
||||
```
|
||||
|
||||
Refer the [custom activation strategy documentation](../reference/custom-activation-strategies.md#implementation) for more details on how to implement a custom activation strategy.
|
||||
|
||||
## Unleash Proxy API {#unleash-proxy-api}
|
||||
|
||||
The Unleash Proxy has a very simple API. It takes the [Unleash Context](../reference/unleash-context) as input and will return the feature toggles relevant for that specific context.
|
||||
|
||||
<Figure img="/img/The-Unleash-Proxy-API.png" caption="When sending requests to the Unleash proxy's /proxy endpoint, the request should contain the current Unleash context as the payload. The proxy will return all enabled toggles for the provided context."/>
|
||||
|
||||
### OpenAPI integration and API documentation {#openapi}
|
||||
|
||||
:::info Availability
|
||||
|
||||
The OpenAPI integration is available in versions 0.9 and later of the Unleash proxy.
|
||||
|
||||
:::
|
||||
|
||||
The proxy can optionally expose a runtime-generated OpenAPI JSON spec and a corresponding OpenAPI UI for its API. The OpenAPI UI page is an interactive page where you can discover and test the API endpoints the proxy exposes. The JSON spec can be used to generate an OpenAPI client with OpenAPI tooling such as the [OpenAPI generator](https://openapi-generator.tech/).
|
||||
|
||||
To enable the JSON spec and UI, set `ENABLE_OAS` (environment variable) or `enableOAS` (in-code configuration variable) to `true`.
|
||||
|
||||
The spec and UI can then be found at `<base url>/docs/openapi.json` and `<base url>/docs/openapi` respectively.
|
||||
|
||||
### Payload
|
||||
|
||||
The `proxy` endpoint returns information about toggles enabled for the current user. The payload is a JSON object with a `toggles` property, which contains a list of toggles.
|
||||
|
||||
```json
|
||||
{
|
||||
"toggles": [
|
||||
{
|
||||
"name": "demo",
|
||||
"enabled": true,
|
||||
"variant": {
|
||||
"name": "disabled",
|
||||
"enabled": false
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "demoApp.step1",
|
||||
"enabled": true,
|
||||
"variant": {
|
||||
"name": "disabled",
|
||||
"enabled": false
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
#### Toggle data
|
||||
|
||||
The data for a toggle without [variants](../reference/feature-toggle-variants.md) looks like this:
|
||||
|
||||
```json
|
||||
{
|
||||
"name": "basic-toggle",
|
||||
"enabled": true,
|
||||
"variant": {
|
||||
"name": "disabled",
|
||||
"enabled": false
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
- **`name`**: the name of the feature.
|
||||
- **`enabled`**: whether the toggle is enabled or not. Will always be `true`.
|
||||
- **`variant`**: describes whether the toggle has variants and, if it does, what variant is active for this user. If a toggle doesn't have any variants, it will always be `{"name": "disabled", "enabled": false}`.
|
||||
|
||||
:::note The "disabled" variant
|
||||
|
||||
Unleash uses a fallback variant called "disabled" to indicate that a toggle has no variants. However, you are free to create a variant called "disabled" yourself. In that case you can tell them apart by checking the variant's `enabled` property: if the toggle has no variants, `enabled` will be `false`. If the toggle is the "disabled" variant that you created, it will have `enabled` set to `true`.
|
||||
|
||||
:::
|
||||
|
||||
If a toggle has variants, then the variant object can also contain an optional `payload` property. The `payload` will contain data about the variant's payload: what type it is, and what the content is. To learn more about variants and their payloads, check [the feature toggle variants documentation](../reference/feature-toggle-variants.md).
|
||||
|
||||
Variant toggles without payloads look will have their name listed and the `enabled` property set to `true`:
|
||||
|
||||
```json
|
||||
{
|
||||
"name": "toggle-with-variants",
|
||||
"enabled": true,
|
||||
"variant": {
|
||||
"name": "simple",
|
||||
"enabled": true
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
If the variant has a payload, the optional `payload` property will list the payload's type and it's content in a stringified form:
|
||||
|
||||
```json
|
||||
{
|
||||
"name": "toggle-with-variants",
|
||||
"enabled": true,
|
||||
"variant": {
|
||||
"name": "with-payload-string",
|
||||
"payload": {
|
||||
"type": "string",
|
||||
"value": "this string is the variant's payload"
|
||||
},
|
||||
"enabled": true
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
For the `variant` property:
|
||||
|
||||
- **`name`**: is the name of the variant, as shown in the Admin UI.
|
||||
- **`enabled`**: indicates whether the variant is enabled or not. If the toggle has variants, this is always `true`.
|
||||
- **`payload`** (optional): Only present if the variant has a payload. Describes the payload's type and content.
|
||||
|
||||
If the variant has a payload, the `payload` object contains:
|
||||
|
||||
- **`type`**: the type of the variant's payload
|
||||
- **`value`**: the value of the variant's payload
|
||||
|
||||
The `value` will always be the payload's content as a string, escaped as necessary. For instance, a variant with a JSON payload would look like this:
|
||||
|
||||
```json
|
||||
{
|
||||
"name": "toggle-with-variants",
|
||||
"enabled": true,
|
||||
"variant": {
|
||||
"name": "with-payload-json",
|
||||
"payload": {
|
||||
"type": "json",
|
||||
"value": "{\"description\": \"this is data delivered as a json string\"}"
|
||||
},
|
||||
"enabled": true
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## How to connect to the Proxy? {#how-to-connect-to-the-proxy}
|
||||
|
||||
The Unleash Proxy takes the heavy lifting of evaluating toggles and only returns enabled toggles and their values to the client. This means that you would get away with a simple http-client in many common use-cases.
|
||||
|
||||
However in some settings you would like a bit more logic around it to make it as fast as possible, and keep up to date with changes.
|
||||
|
||||
- [Android Proxy SDK](/docs/generated/sdks/client-side/android-proxy.md)
|
||||
- [iOS Proxy SDK](/docs/generated/sdks/client-side/ios-proxy.md)
|
||||
- [Javascript Proxy SDK](/docs/generated/sdks/client-side/javascript-browser.md)
|
||||
- [React Proxy SDK](/docs/generated/sdks/client-side/react.md)
|
||||
- [Svelte Proxy SDK](/docs/generated/sdks/client-side/svelte.md)
|
||||
- [Vue Proxy SDK](/docs/generated/sdks/client-side/vue.md)
|
||||
|
||||
The proxy is also ideal fit for serverless functions such as AWS Lambda. In that scenario the proxy can run on a small container near the serverless function, preferably in the same VPC, giving the lambda extremely fast access to feature flags, at a predictable cost.
|
@ -2,7 +2,7 @@
|
||||
title: Proxy hosting strategies
|
||||
---
|
||||
|
||||
Because the [Unleash proxy](../reference/unleash-proxy.md) is a separate piece of the Unleash architecture and because it should sit close to your application, there are numerous ways of hosting it. Another important distinction is whether you're hosting Unleash yourself or you have a managed solution.
|
||||
Because the [Unleash proxy](../generated/unleash-proxy.md) is a separate piece of the Unleash architecture and because it should sit close to your application, there are numerous ways of hosting it. Another important distinction is whether you're hosting Unleash yourself or you have a managed solution.
|
||||
|
||||
This document describes the three main ways of hosting the proxy alongside the Unleash API and the tradeoffs between hosting the proxy yourself and having Unleash host it for you.
|
||||
|
||||
@ -15,7 +15,7 @@ If you want Unleash to host the proxy for you, you should be aware of the follow
|
||||
- This is only available to Pro and Enterprise customers who have signed up for a managed Unleash instance.
|
||||
- Pro customers will get a total of two (2) proxies: One for the "development" environment and one for the "production" environment.
|
||||
- We do allow short spikes in traffic and our adaptive infrastructure will automatically scale your needs.
|
||||
- Please check the [Fair Use Policy](https://www.getunleash.io/fair-use-policy) to see the limits of the Unleash-hosted proxy.
|
||||
- Please check the [Fair Use Policy](https://www.getunleash.io/fair-use-policy) to see the limits of the Unleash-hosted proxy.
|
||||
- There's no guarantee that it'll be close to your applications. This means you'll get higher response times.
|
||||
- When we host the proxy, we will also receive whatever end user data you put in the [Unleash context](../reference/unleash-context.md). This may or may not be an issue depending on your business requirements.
|
||||
|
||||
|
@ -12,7 +12,7 @@ NOTE: This is a demo instance set up with the Enterprise version. Some of the fu
|
||||
|
||||
### I want to test toggles in a client side environment
|
||||
|
||||
To test toggles in a client-side environment, we recommend that you use the [front-end client API](../reference/front-end-api.md). Client-side SDKs act a little differently from server-side SDKs, so the regular client API won't work for this. For more advanced setups, you can also use the [Unleash proxy](../reference/unleash-proxy.md), which offers greater flexibility than the front-end API, but at the cost of increased complexity.
|
||||
To test toggles in a client-side environment, we recommend that you use the [front-end client API](../reference/front-end-api.md). Client-side SDKs act a little differently from server-side SDKs, so the regular client API won't work for this. For more advanced setups, you can also use the [Unleash proxy](../generated/unleash-proxy.md), which offers greater flexibility than the front-end API, but at the cost of increased complexity.
|
||||
|
||||
#### Create your first toggle
|
||||
|
||||
@ -340,7 +340,7 @@ unleash.start();
|
||||
|
||||
#### Run Unleash and the Unleash proxy with Docker
|
||||
|
||||
We designed the [front-end API](../reference/front-end-api.md) to make it as easy as possible to get started and to cover basic use cases for front-end clients. However, if you need more flexibility, then you can also use the [Unleash proxy](../reference/unleash-proxy.md).
|
||||
We designed the [front-end API](../reference/front-end-api.md) to make it as easy as possible to get started and to cover basic use cases for front-end clients. However, if you need more flexibility, then you can also use the [Unleash proxy](../generated/unleash-proxy.md).
|
||||
|
||||
Follow the steps outlined in the [run Unleash with Docker](#run-unleash-with-docker) section to get the Unleash instance up and running. Once you have done that, you need to first get an API key from your Unleash instance and then use that API key when starting the Unleash proxy.
|
||||
|
||||
|
@ -25,6 +25,6 @@ Before you can connect your application to Unleash you need a Unleash server. Yo
|
||||
- [**The Unleash API**](/reference/api/unleash) - The Unleash instance. This is where you create feature toggles, configure activation strategies, and parameters, etc. The service holding all feature toggles and their configurations. Configurations declare which activation strategies to use and which parameters they should get.
|
||||
- **The Unleash admin UI** - The bundled web interface for interacting with the Unleash instance. Manage toggles, define strategies, look at metrics, and much more. Use the UI to [create feature toggles](how-to/how-to-create-feature-toggles.md), [manage project access roles](../how-to/how-to-create-and-assign-custom-project-roles.md), [create API tokens](how-to/how-to-create-api-tokens.mdx), and more.
|
||||
- [**Unleash SDKs**](../reference/sdks/index.md) - Unleash SDKs integrate into your applications and get feature configurations from the Unleash API. Use them to check whether features are enabled or disabled and to send metrics to the Unleash API. [See all our SDKs](../reference/sdks/index.md)
|
||||
- [**The Unleash proxy**](../reference/unleash-proxy.md) - The Unleash proxy sits between front-end and native applications and the Unleash API. You can scale it independently of the Unleash API to handle large request rates without causing issues for the Unleash API.
|
||||
- [**The Unleash proxy**](../generated/unleash-proxy.md) - The Unleash proxy sits between front-end and native applications and the Unleash API. You can scale it independently of the Unleash API to handle large request rates without causing issues for the Unleash API.
|
||||
|
||||
To be super fast (_we're talking nano-seconds_), the [client SDK](../reference/sdks/index.md) caches all feature toggles and their current configuration in memory. The activation strategies are also implemented in the SDK. This makes it really fast to check if a toggle is on or off because it is just a simple function operating on local state, without the need to poll data from the database.
|
||||
|
@ -1,4 +1,5 @@
|
||||
const { readmes } = require('./readme-fns');
|
||||
const { sdks } = require('./remote-content/sdks');
|
||||
const { docs: edgeAndProxy } = require('./remote-content/edge-proxy');
|
||||
|
||||
// for a given redirect object, modify it's `from` property such that for every
|
||||
// path that doesn't start with `/docs/`, a corresponding path that _does_ start
|
||||
@ -49,6 +50,7 @@ module.exports = {
|
||||
organizationName: 'Unleash', // Usually your GitHub org/user name.
|
||||
projectName: 'unleash.github.io', // Usually your repo name.
|
||||
trailingSlash: false,
|
||||
markdown: { mermaid: true },
|
||||
customFields: {
|
||||
// expose env vars etc here
|
||||
unleashProxyUrl: process.env.UNLEASH_PROXY_URL,
|
||||
@ -612,11 +614,25 @@ module.exports = {
|
||||
// more info at https://github.com/rdilweb/docusaurus-plugin-remote-content#options
|
||||
name: 'content-sdks',
|
||||
sourceBaseUrl: 'https://raw.githubusercontent.com/Unleash/', // gets prepended to all of the documents when fetching
|
||||
outDir: 'docs/generated/sdks', // the base directory to output to.
|
||||
documents: readmes.documentUrls, // the file names to download
|
||||
modifyContent: readmes.modifyContent,
|
||||
outDir: 'docs/generated', // the base directory to output to.
|
||||
documents: sdks.urls, // the file names to download
|
||||
modifyContent: sdks.modifyContent,
|
||||
},
|
||||
],
|
||||
[
|
||||
'docusaurus-plugin-remote-content',
|
||||
{
|
||||
// more info at https://github.com/rdilweb/docusaurus-plugin-remote-content#options
|
||||
name: 'content-external',
|
||||
sourceBaseUrl: 'https://raw.githubusercontent.com/Unleash/', // gets prepended to all of the documents when fetching
|
||||
outDir: 'docs/generated/', // the base directory to output to.
|
||||
documents: edgeAndProxy.urls, // the file names to download
|
||||
modifyContent: edgeAndProxy.modifyContent,
|
||||
},
|
||||
],
|
||||
],
|
||||
themes: ['docusaurus-theme-openapi-docs'], // Allows use of @theme/ApiItem and other components
|
||||
themes: [
|
||||
'docusaurus-theme-openapi-docs', // Allows use of @theme/ApiItem and other components
|
||||
'@docusaurus/theme-mermaid',
|
||||
],
|
||||
};
|
||||
|
@ -25,6 +25,7 @@
|
||||
"@docusaurus/plugin-google-analytics": "2.2.0",
|
||||
"@docusaurus/preset-classic": "2.2.0",
|
||||
"@docusaurus/remark-plugin-npm2yarn": "2.2.0",
|
||||
"@docusaurus/theme-mermaid": "2.2.0",
|
||||
"@mdx-js/react": "1.6.22",
|
||||
"@svgr/webpack": "6.5.1",
|
||||
"browserslist": "^4.16.5",
|
||||
|
@ -1,206 +0,0 @@
|
||||
// Type definitions
|
||||
//
|
||||
// type Readme = {
|
||||
// // This is the name that is placed before "SDK" in the sidebar.
|
||||
// sidebarName: string;
|
||||
//
|
||||
// // The repo's primary branch. Falls back to "main" if nothing is defined
|
||||
// branch?: string;
|
||||
//
|
||||
// // If present, this will be used to construct the slug. If no "slugName" is
|
||||
// // defined, the `sidebarName` will be used to create the slug.
|
||||
// slugName?: string;
|
||||
// };
|
||||
//
|
||||
// type ReadmeData = Readme & { repoUrl: string };
|
||||
|
||||
const CLIENT_SIDE_SDK = 'client-side';
|
||||
const SERVER_SIDE_SDK = 'server-side';
|
||||
|
||||
const serverSideSdks = {
|
||||
'unleash-client-go': {
|
||||
sidebarName: 'Go',
|
||||
branch: 'v3',
|
||||
},
|
||||
'unleash-client-java': {
|
||||
sidebarName: 'Java',
|
||||
},
|
||||
'unleash-client-node': {
|
||||
sidebarName: 'Node',
|
||||
},
|
||||
'unleash-client-php': {
|
||||
sidebarName: 'PHP',
|
||||
},
|
||||
'unleash-client-python': {
|
||||
sidebarName: 'Python',
|
||||
},
|
||||
'unleash-client-ruby': {
|
||||
sidebarName: 'Ruby',
|
||||
},
|
||||
'unleash-client-rust': {
|
||||
sidebarName: 'Rust',
|
||||
},
|
||||
'unleash-client-dotnet': {
|
||||
sidebarName: '.NET',
|
||||
slugName: 'dotnet',
|
||||
},
|
||||
};
|
||||
|
||||
const clientSideSdks = {
|
||||
'unleash-android-proxy-sdk': {
|
||||
sidebarName: 'Android',
|
||||
slugName: 'android-proxy',
|
||||
},
|
||||
unleash_proxy_client_flutter: {
|
||||
sidebarName: 'Flutter',
|
||||
},
|
||||
'unleash-proxy-client-swift': {
|
||||
sidebarName: 'iOS',
|
||||
slugName: 'ios-proxy',
|
||||
},
|
||||
'unleash-proxy-client-js': {
|
||||
sidebarName: 'JavaScript browser',
|
||||
slugName: 'javascript-browser',
|
||||
},
|
||||
'proxy-client-react': {
|
||||
sidebarName: 'React',
|
||||
},
|
||||
'proxy-client-svelte': {
|
||||
sidebarName: 'Svelte',
|
||||
},
|
||||
'proxy-client-vue': {
|
||||
sidebarName: 'Vue',
|
||||
},
|
||||
'unleash-client-nextjs': {
|
||||
sidebarName: 'Next.js',
|
||||
slugName: 'next-js',
|
||||
},
|
||||
};
|
||||
|
||||
const allSdks = () => {
|
||||
const enrich =
|
||||
(sdkType) =>
|
||||
([repoName, repoData]) => {
|
||||
const repoUrl = `https://github.com/Unleash/${repoName}`;
|
||||
const slugName = (
|
||||
repoData.slugName ?? repoData.sidebarName
|
||||
).toLowerCase();
|
||||
const branch = repoData.branch ?? 'main';
|
||||
|
||||
return [
|
||||
repoName,
|
||||
{ ...repoData, repoUrl, slugName, branch, type: sdkType },
|
||||
];
|
||||
};
|
||||
|
||||
const serverSide = Object.entries(serverSideSdks).map(
|
||||
enrich(SERVER_SIDE_SDK),
|
||||
);
|
||||
const clientSide = Object.entries(clientSideSdks).map(
|
||||
enrich(CLIENT_SIDE_SDK),
|
||||
);
|
||||
|
||||
return Object.fromEntries(serverSide.concat(clientSide));
|
||||
};
|
||||
|
||||
const SDKS = allSdks();
|
||||
|
||||
function getReadmeRepoData(filename) {
|
||||
const repoName = filename.split('/')[0];
|
||||
|
||||
const repoData = SDKS[repoName];
|
||||
|
||||
return repoData;
|
||||
}
|
||||
|
||||
const documentUrls = Object.entries(SDKS).map(
|
||||
([repo, { branch }]) => `${repo}/${branch}/README.md`,
|
||||
);
|
||||
|
||||
// Replace links in the incoming readme content.
|
||||
//
|
||||
// There's one cases we want to handle:
|
||||
//
|
||||
// 1. Relative links that point to the repo. These must be prefixed with the
|
||||
// link to the github repo.
|
||||
//
|
||||
// Note: You might be tempted to handle absolute links to docs.getunleash.io and
|
||||
// make them relative. While absolute links will work, they trigger full page
|
||||
// refreshes. Relative links give a slightly smoother user experience.
|
||||
//
|
||||
// However, if the old link goes to a redirect, then the client-side redirect
|
||||
// will not kick in, so you'll end up with a "Page not found".
|
||||
const replaceLinks = ({ content, repo }) => {
|
||||
const markdownLink = /(?<=\[.*\]\(\s?)([^\s\)]+)(?=.*\))/g;
|
||||
|
||||
const replacer = (url) => {
|
||||
try {
|
||||
// This constructor will throw if the URL is relative.
|
||||
// https://developer.mozilla.org/en-US/docs/Web/API/URL/URL
|
||||
const parsedUrl = new URL(url);
|
||||
|
||||
return url;
|
||||
} catch {
|
||||
// case 1
|
||||
if (url.startsWith('#')) {
|
||||
// ignore links to other doc sections
|
||||
return url;
|
||||
} else {
|
||||
const separator = url.startsWith('/') ? '' : '/';
|
||||
return `${repo.url}/blob/${repo.branch}${separator}${url}`;
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
return content.replaceAll(markdownLink, replacer);
|
||||
};
|
||||
|
||||
const modifyContent = (filename, content) => {
|
||||
const sdk = getReadmeRepoData(filename);
|
||||
|
||||
const generationTime = new Date();
|
||||
|
||||
const getConnectionTip = (sdkType) => {
|
||||
switch (sdkType) {
|
||||
case CLIENT_SIDE_SDK:
|
||||
return `To connect to Unleash from a client-side context, you'll need to use the [Unleash front-end API](/reference/front-end-api) ([how do I create an API token?](/how-to/how-to-create-api-tokens.mdx)) or the [Unleash proxy](/reference/unleash-proxy) ([how do I create client keys?](/reference/api-tokens-and-client-keys#proxy-client-keys)).`;
|
||||
|
||||
case SERVER_SIDE_SDK:
|
||||
default:
|
||||
return `To connect to Unleash, you'll need your Unleash API url (e.g. \`https://<your-unleash>/api\`) and a [server-side API token](/reference/api-tokens-and-client-keys.mdx#client-tokens) ([how do I create an API token?](/how-to/how-to-create-api-tokens.mdx)).`;
|
||||
}
|
||||
};
|
||||
|
||||
return {
|
||||
filename: `${sdk.type}/${sdk.slugName}.md`,
|
||||
content: `---
|
||||
title: ${sdk.sidebarName} SDK
|
||||
slug: /reference/sdks/${sdk.slugName}
|
||||
---
|
||||
|
||||
:::info Generated content
|
||||
This document was generated from the README in the [${
|
||||
sdk.sidebarName
|
||||
} SDK's GitHub repository](${sdk.repoUrl}).
|
||||
:::
|
||||
|
||||
:::tip Connecting to Unleash
|
||||
${getConnectionTip(sdk.type)}
|
||||
:::
|
||||
|
||||
${replaceLinks({ content, repo: { url: sdk.repoUrl, branch: sdk.branch } })}
|
||||
|
||||
---
|
||||
|
||||
This content was generated on <time datetime="${generationTime.toISOString()}">${generationTime.toLocaleString(
|
||||
'en-gb',
|
||||
{ dateStyle: 'long', timeStyle: 'full' },
|
||||
)}</time>
|
||||
`,
|
||||
};
|
||||
};
|
||||
|
||||
module.exports.readmes = {
|
||||
documentUrls,
|
||||
modifyContent,
|
||||
};
|
46
website/remote-content/edge-proxy.js
Normal file
46
website/remote-content/edge-proxy.js
Normal file
@ -0,0 +1,46 @@
|
||||
const {
|
||||
enrich,
|
||||
mapObject,
|
||||
modifyContent,
|
||||
getRepoData,
|
||||
getUrls,
|
||||
} = require('./shared');
|
||||
|
||||
const DOCS = mapObject(enrich)({
|
||||
'unleash-proxy': {
|
||||
sidebarName: 'Unleash Proxy',
|
||||
slugName: 'unleash-proxy',
|
||||
},
|
||||
'unleash-edge': {
|
||||
sidebarName: 'Unleash Edge',
|
||||
slugName: 'unleash-edge',
|
||||
},
|
||||
});
|
||||
|
||||
const getAdmonitions = (data) => {
|
||||
const admonitions = {
|
||||
'unleash-proxy': `:::tip
|
||||
|
||||
Looking for how to run the Unleash proxy? Check out the [_how to run the Unleash proxy_ guide](../how-to/how-to-run-the-unleash-proxy.mdx)!
|
||||
|
||||
:::`, 'unleash-edge': `:::caution 🏗️ Under construction!
|
||||
Unleash Edge is currently considered very experimental. Use it at your own risk.
|
||||
|
||||
|
||||
Share your comments in [🗣️ GitHub Discussions](https://github.com/Unleash/unleash/discussions) or the [💬 Unleash community Slack](https://slack.unleash.run/).
|
||||
:::`
|
||||
}
|
||||
|
||||
return [admonitions[data.slugName]]
|
||||
};
|
||||
|
||||
const modifyContent2 = modifyContent({
|
||||
getRepoDataFn: getRepoData(DOCS),
|
||||
urlPath: '/reference/',
|
||||
getAdditionalAdmonitions: getAdmonitions,
|
||||
});
|
||||
|
||||
module.exports.docs = {
|
||||
urls: getUrls(DOCS),
|
||||
modifyContent: modifyContent2,
|
||||
};
|
119
website/remote-content/sdks.js
Normal file
119
website/remote-content/sdks.js
Normal file
@ -0,0 +1,119 @@
|
||||
const {
|
||||
enrichAdditional,
|
||||
modifyContent,
|
||||
getRepoData,
|
||||
getUrls,
|
||||
} = require('./shared');
|
||||
|
||||
// Type definitions
|
||||
//
|
||||
// type Readme = {
|
||||
// // This is the name that is placed before "SDK" in the sidebar.
|
||||
// sidebarName: string;
|
||||
//
|
||||
// // The repo's primary branch. Falls back to "main" if nothing is defined
|
||||
// branch?: string;
|
||||
//
|
||||
// // If present, this will be used to construct the slug. If no "slugName" is
|
||||
// // defined, the `sidebarName` will be used to create the slug.
|
||||
// slugName?: string;
|
||||
// };
|
||||
//
|
||||
// type ReadmeData = Readme & { repoUrl: string };
|
||||
|
||||
const CLIENT_SIDE_SDK = 'client-side';
|
||||
const SERVER_SIDE_SDK = 'server-side';
|
||||
|
||||
const serverSideSdks = {
|
||||
'unleash-client-go': {
|
||||
sidebarName: 'Go',
|
||||
branch: 'v3',
|
||||
},
|
||||
'unleash-client-java': {
|
||||
sidebarName: 'Java',
|
||||
},
|
||||
'unleash-client-node': {
|
||||
sidebarName: 'Node',
|
||||
},
|
||||
'unleash-client-php': {
|
||||
sidebarName: 'PHP',
|
||||
},
|
||||
'unleash-client-python': {
|
||||
sidebarName: 'Python',
|
||||
},
|
||||
'unleash-client-ruby': {
|
||||
sidebarName: 'Ruby',
|
||||
},
|
||||
'unleash-client-rust': {
|
||||
sidebarName: 'Rust',
|
||||
},
|
||||
'unleash-client-dotnet': {
|
||||
sidebarName: '.NET',
|
||||
slugName: 'dotnet',
|
||||
},
|
||||
};
|
||||
|
||||
const clientSideSdks = {
|
||||
'unleash-android-proxy-sdk': {
|
||||
sidebarName: 'Android',
|
||||
slugName: 'android-proxy',
|
||||
},
|
||||
unleash_proxy_client_flutter: {
|
||||
sidebarName: 'Flutter',
|
||||
},
|
||||
'unleash-proxy-client-swift': {
|
||||
sidebarName: 'iOS',
|
||||
slugName: 'ios-proxy',
|
||||
},
|
||||
'unleash-proxy-client-js': {
|
||||
sidebarName: 'JavaScript browser',
|
||||
slugName: 'javascript-browser',
|
||||
},
|
||||
'proxy-client-react': {
|
||||
sidebarName: 'React',
|
||||
},
|
||||
'proxy-client-svelte': {
|
||||
sidebarName: 'Svelte',
|
||||
},
|
||||
'proxy-client-vue': {
|
||||
sidebarName: 'Vue',
|
||||
},
|
||||
'unleash-client-nextjs': {
|
||||
sidebarName: 'Next.js',
|
||||
slugName: 'next-js',
|
||||
},
|
||||
};
|
||||
|
||||
const SDKS = (() => {
|
||||
const serverSide = Object.entries(serverSideSdks).map(
|
||||
enrichAdditional({ type: SERVER_SIDE_SDK }),
|
||||
);
|
||||
const clientSide = Object.entries(clientSideSdks).map(
|
||||
enrichAdditional({ type: CLIENT_SIDE_SDK }),
|
||||
);
|
||||
|
||||
return Object.fromEntries(serverSide.concat(clientSide));
|
||||
})();
|
||||
|
||||
const getAdmonitions = (sdk) => {
|
||||
const admonitions = {
|
||||
[CLIENT_SIDE_SDK]: `To connect to Unleash from a client-side context, you'll need to use the [Unleash front-end API](/reference/front-end-api) ([how do I create an API token?](/how-to/how-to-create-api-tokens.mdx)) or the [Unleash proxy](/reference/unleash-proxy) ([how do I create client keys?](/reference/api-tokens-and-client-keys#proxy-client-keys)).`,
|
||||
[SERVER_SIDE_SDK]: `To connect to Unleash, you'll need your Unleash API url (e.g. \`https://<your-unleash>/api\`) and a [server-side API token](/reference/api-tokens-and-client-keys.mdx#client-tokens) ([how do I create an API token?](/how-to/how-to-create-api-tokens.mdx)).`,
|
||||
};
|
||||
|
||||
const wrap = (text) => `:::tip\n${text}\n:::`;
|
||||
|
||||
return [wrap(admonitions[sdk.type])];
|
||||
};
|
||||
|
||||
const modifyContent2 = modifyContent({
|
||||
getRepoDataFn: getRepoData(SDKS),
|
||||
urlPath: '/reference/sdks',
|
||||
filePath: (sdk) => `sdks/${sdk.type}`,
|
||||
getAdditionalAdmonitions: getAdmonitions,
|
||||
});
|
||||
|
||||
module.exports.sdks = {
|
||||
urls: getUrls(SDKS),
|
||||
modifyContent: modifyContent2,
|
||||
};
|
150
website/remote-content/shared.js
Normal file
150
website/remote-content/shared.js
Normal file
@ -0,0 +1,150 @@
|
||||
const path = require('path');
|
||||
|
||||
module.exports.mapObject = (fn) => (o) =>
|
||||
Object.fromEntries(Object.entries(o).map(fn));
|
||||
|
||||
module.exports.enrichAdditional =
|
||||
(additionalProperties) =>
|
||||
([repoName, repoData]) => {
|
||||
const repoUrl = `https://github.com/Unleash/${repoName}`;
|
||||
const slugName = (
|
||||
repoData.slugName ?? repoData.sidebarName
|
||||
).toLowerCase();
|
||||
const branch = repoData.branch ?? 'main';
|
||||
|
||||
return [
|
||||
repoName,
|
||||
{ ...repoData, repoUrl, slugName, branch, ...additionalProperties },
|
||||
];
|
||||
};
|
||||
module.exports.enrich = module.exports.enrichAdditional({});
|
||||
|
||||
module.exports.getRepoData = (documents) => (filename) => {
|
||||
const repoName = filename.split('/')[0];
|
||||
|
||||
const repoData = documents[repoName];
|
||||
|
||||
return { name: repoName, ...repoData };
|
||||
};
|
||||
|
||||
// Replace links in the incoming readme content.
|
||||
//
|
||||
// There's one cases we want to handle:
|
||||
//
|
||||
// 1. Relative links that point to the repo. These must be prefixed with the
|
||||
// link to the github repo.
|
||||
//
|
||||
// Note: You might be tempted to handle absolute links to docs.getunleash.io and
|
||||
// make them relative. While absolute links will work, they trigger full page
|
||||
// refreshes. Relative links give a slightly smoother user experience.
|
||||
//
|
||||
// However, if the old link goes to a redirect, then the client-side redirect
|
||||
// will not kick in, so you'll end up with a "Page not found".
|
||||
const replaceLinks = ({ content, repo }) => {
|
||||
const replace = (processRelativeUrl) => (url) => {
|
||||
try {
|
||||
// This constructor will throw if the URL is relative.
|
||||
// https://developer.mozilla.org/en-US/docs/Web/API/URL/URL
|
||||
new URL(url);
|
||||
|
||||
return url;
|
||||
} catch {
|
||||
const separator = url.startsWith('/') ? '' : '/';
|
||||
return processRelativeUrl(url, separator);
|
||||
}
|
||||
};
|
||||
|
||||
const replaceMarkdownLink = replace((url, separator) => {
|
||||
// case 1
|
||||
if (url.startsWith('#')) {
|
||||
// ignore links to other doc sections
|
||||
return url;
|
||||
} else {
|
||||
return `${repo.url}/blob/${repo.branch}${separator}${url}`;
|
||||
}
|
||||
});
|
||||
|
||||
const replaceImageSrcLink = replace((url, separator) => {
|
||||
return `https://raw.githubusercontent.com/Unleash/${repo.name}/${repo.branch}${separator}${url}`;
|
||||
});
|
||||
|
||||
// matches the URL portion of markdown links like [I go here](path/link "comment")
|
||||
const markdownLink = /(?<=\[.*\]\(\s?)([^\s\)]+)(?=.*\))/g;
|
||||
|
||||
// matches the URL portion of src links that contain an image file type
|
||||
// extension, e.g. src="./.github/img/get-request.png"
|
||||
const imageSrcLink = /(?<=src=")([^")]+\.(png|svg|jpe?g|webp|gif))(?=")/g;
|
||||
|
||||
return content
|
||||
.replaceAll(markdownLink, replaceMarkdownLink)
|
||||
.replaceAll(imageSrcLink, replaceImageSrcLink);
|
||||
};
|
||||
|
||||
module.exports.modifyContent =
|
||||
({
|
||||
getRepoDataFn,
|
||||
filePath = () => {},
|
||||
urlPath,
|
||||
getAdditionalAdmonitions,
|
||||
}) =>
|
||||
(filename, content) => {
|
||||
const data = getRepoDataFn(filename);
|
||||
|
||||
const generationTime = new Date();
|
||||
|
||||
const processedFilename = (() => {
|
||||
const constructed =
|
||||
path.join(filePath(data) ?? '', data.slugName) + '.md';
|
||||
|
||||
// ensure the file path does *not* start with a leading /
|
||||
return constructed.charAt(0) === '/'
|
||||
? constructed.slice(1)
|
||||
: constructed;
|
||||
})();
|
||||
|
||||
const processedSlug = (() => {
|
||||
const constructed = path.join(urlPath ?? '', data.slugName);
|
||||
// ensure the slug *does* start with a leading /
|
||||
const prefix = constructed.charAt(0) === '/' ? '' : '/';
|
||||
|
||||
return prefix + constructed;
|
||||
})();
|
||||
|
||||
const additionalAdmonitions = (
|
||||
getAdditionalAdmonitions(data) ?? []
|
||||
).join('\n\n');
|
||||
|
||||
return {
|
||||
filename: processedFilename,
|
||||
content: `---
|
||||
title: ${data.sidebarName}
|
||||
slug: ${processedSlug}
|
||||
---
|
||||
|
||||
:::info Generated content
|
||||
This document was generated from the README in the [${
|
||||
data.sidebarName
|
||||
} GitHub repository](${data.repoUrl}).
|
||||
:::
|
||||
|
||||
${additionalAdmonitions}
|
||||
|
||||
${replaceLinks({
|
||||
content,
|
||||
repo: { url: data.repoUrl, branch: data.branch, name: data.name },
|
||||
})}
|
||||
|
||||
---
|
||||
|
||||
This content was generated on <time dateTime="${generationTime.toISOString()}">${generationTime.toLocaleString(
|
||||
'en-gb',
|
||||
{ dateStyle: 'long', timeStyle: 'full' },
|
||||
)}</time>
|
||||
`,
|
||||
};
|
||||
};
|
||||
|
||||
module.exports.getUrls = (documents) =>
|
||||
Object.entries(documents).map(
|
||||
([repo, { branch }]) => `${repo}/${branch}/README.md`,
|
||||
);
|
@ -328,10 +328,11 @@ module.exports = {
|
||||
'reference/tags',
|
||||
'reference/technical-debt',
|
||||
'reference/unleash-context',
|
||||
'reference/unleash-proxy',
|
||||
'reference/change-requests',
|
||||
],
|
||||
},
|
||||
'generated/unleash-edge',
|
||||
'generated/unleash-proxy',
|
||||
],
|
||||
},
|
||||
{
|
||||
|
@ -107,6 +107,13 @@ main :is(p, figure) > img:not([src^="https://img.shields.io/" i], [src*="badge.s
|
||||
margin: auto;
|
||||
}
|
||||
|
||||
/* mermaid diagrams */
|
||||
.docusaurus-mermaid-container {
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
margin-block: calc(1.5 * var(--ifm-spacing-vertical));
|
||||
}
|
||||
|
||||
[class^='docTitle'] {
|
||||
font-size: 2.5rem !important;
|
||||
}
|
||||
|
Binary file not shown.
Before Width: | Height: | Size: 65 KiB |
Binary file not shown.
Before Width: | Height: | Size: 41 KiB |
@ -1415,6 +1415,11 @@
|
||||
resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39"
|
||||
integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==
|
||||
|
||||
"@braintree/sanitize-url@^6.0.0":
|
||||
version "6.0.2"
|
||||
resolved "https://registry.yarnpkg.com/@braintree/sanitize-url/-/sanitize-url-6.0.2.tgz#6110f918d273fe2af8ea1c4398a88774bb9fc12f"
|
||||
integrity sha512-Tbsj02wXCbqGmzdnXNk0SOF19ChhRU70BsroIi4Pm6Ehp56in6vch94mfbdQ17DozxkL3BAVjbZ4Qc1a0HFRAg==
|
||||
|
||||
"@cnakazawa/watch@^1.0.3":
|
||||
version "1.0.4"
|
||||
resolved "https://registry.yarnpkg.com/@cnakazawa/watch/-/watch-1.0.4.tgz#f864ae85004d0fcab6f50be9141c4da368d1656a"
|
||||
@ -1832,6 +1837,20 @@
|
||||
tslib "^2.4.0"
|
||||
utility-types "^3.10.0"
|
||||
|
||||
"@docusaurus/theme-mermaid@2.2.0":
|
||||
version "2.2.0"
|
||||
resolved "https://registry.yarnpkg.com/@docusaurus/theme-mermaid/-/theme-mermaid-2.2.0.tgz#0dc9bb7013c0280726a0c7a26419b1f5e79755f3"
|
||||
integrity sha512-rEhVvWyZ9j9eABTvJ8nhfB5NbyiThva3U9J7iu4RxKYymjImEh9MiqbEdOrZusq6AQevbkoHB7n+9VsfmS55kg==
|
||||
dependencies:
|
||||
"@docusaurus/core" "2.2.0"
|
||||
"@docusaurus/module-type-aliases" "2.2.0"
|
||||
"@docusaurus/theme-common" "2.2.0"
|
||||
"@docusaurus/types" "2.2.0"
|
||||
"@docusaurus/utils-validation" "2.2.0"
|
||||
"@mdx-js/react" "^1.6.22"
|
||||
mermaid "^9.1.1"
|
||||
tslib "^2.4.0"
|
||||
|
||||
"@docusaurus/theme-search-algolia@2.2.0":
|
||||
version "2.2.0"
|
||||
resolved "https://registry.yarnpkg.com/@docusaurus/theme-search-algolia/-/theme-search-algolia-2.2.0.tgz#77fd9f7a600917e6024fe3ac7fb6cfdf2ce84737"
|
||||
@ -5571,6 +5590,11 @@ commander@2.20.3, commander@^2.19.0, commander@^2.20.0:
|
||||
resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33"
|
||||
integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==
|
||||
|
||||
commander@7, commander@^7.2.0:
|
||||
version "7.2.0"
|
||||
resolved "https://registry.yarnpkg.com/commander/-/commander-7.2.0.tgz#a36cb57d0b501ce108e4d20559a150a391d97ab7"
|
||||
integrity sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==
|
||||
|
||||
commander@^4.0.0, commander@^4.1.1, commander@~4.1.1:
|
||||
version "4.1.1"
|
||||
resolved "https://registry.yarnpkg.com/commander/-/commander-4.1.1.tgz#9fd602bd936294e9e9ef46a3f4d6964044b18068"
|
||||
@ -5586,11 +5610,6 @@ commander@^6.2.1:
|
||||
resolved "https://registry.yarnpkg.com/commander/-/commander-6.2.1.tgz#0792eb682dfbc325999bb2b84fddddba110ac73c"
|
||||
integrity sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==
|
||||
|
||||
commander@^7.2.0:
|
||||
version "7.2.0"
|
||||
resolved "https://registry.yarnpkg.com/commander/-/commander-7.2.0.tgz#a36cb57d0b501ce108e4d20559a150a391d97ab7"
|
||||
integrity sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==
|
||||
|
||||
commander@^8.3.0:
|
||||
version "8.3.0"
|
||||
resolved "https://registry.yarnpkg.com/commander/-/commander-8.3.0.tgz#4837ea1b2da67b9c616a67afbb0fafee567bca66"
|
||||
@ -6097,6 +6116,258 @@ cyclist@^1.0.1:
|
||||
resolved "https://registry.yarnpkg.com/cyclist/-/cyclist-1.0.1.tgz#596e9698fd0c80e12038c2b82d6eb1b35b6224d9"
|
||||
integrity sha512-NJGVKPS81XejHcLhaLJS7plab0fK3slPh11mESeeDq2W4ZI5kUKK/LRRdVDvjJseojbPB7ZwjnyOybg3Igea/A==
|
||||
|
||||
"d3-array@2 - 3", "d3-array@2.10.0 - 3", "d3-array@2.5.0 - 3", d3-array@3, d3-array@^3.2.0:
|
||||
version "3.2.2"
|
||||
resolved "https://registry.yarnpkg.com/d3-array/-/d3-array-3.2.2.tgz#f8ac4705c5b06914a7e0025bbf8d5f1513f6a86e"
|
||||
integrity sha512-yEEyEAbDrF8C6Ob2myOBLjwBLck1Z89jMGFee0oPsn95GqjerpaOA4ch+vc2l0FNFFwMD5N7OCSEN5eAlsUbgQ==
|
||||
dependencies:
|
||||
internmap "1 - 2"
|
||||
|
||||
d3-axis@3:
|
||||
version "3.0.0"
|
||||
resolved "https://registry.yarnpkg.com/d3-axis/-/d3-axis-3.0.0.tgz#c42a4a13e8131d637b745fc2973824cfeaf93322"
|
||||
integrity sha512-IH5tgjV4jE/GhHkRV0HiVYPDtvfjHQlQfJHs0usq7M30XcSBvOotpmH1IgkcXsO/5gEQZD43B//fc7SRT5S+xw==
|
||||
|
||||
d3-brush@3:
|
||||
version "3.0.0"
|
||||
resolved "https://registry.yarnpkg.com/d3-brush/-/d3-brush-3.0.0.tgz#6f767c4ed8dcb79de7ede3e1c0f89e63ef64d31c"
|
||||
integrity sha512-ALnjWlVYkXsVIGlOsuWH1+3udkYFI48Ljihfnh8FZPF2QS9o+PzGLBslO0PjzVoHLZ2KCVgAM8NVkXPJB2aNnQ==
|
||||
dependencies:
|
||||
d3-dispatch "1 - 3"
|
||||
d3-drag "2 - 3"
|
||||
d3-interpolate "1 - 3"
|
||||
d3-selection "3"
|
||||
d3-transition "3"
|
||||
|
||||
d3-chord@3:
|
||||
version "3.0.1"
|
||||
resolved "https://registry.yarnpkg.com/d3-chord/-/d3-chord-3.0.1.tgz#d156d61f485fce8327e6abf339cb41d8cbba6966"
|
||||
integrity sha512-VE5S6TNa+j8msksl7HwjxMHDM2yNK3XCkusIlpX5kwauBfXuyLAtNg9jCp/iHH61tgI4sb6R/EIMWCqEIdjT/g==
|
||||
dependencies:
|
||||
d3-path "1 - 3"
|
||||
|
||||
"d3-color@1 - 3", d3-color@3:
|
||||
version "3.1.0"
|
||||
resolved "https://registry.yarnpkg.com/d3-color/-/d3-color-3.1.0.tgz#395b2833dfac71507f12ac2f7af23bf819de24e2"
|
||||
integrity sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==
|
||||
|
||||
d3-contour@4:
|
||||
version "4.0.2"
|
||||
resolved "https://registry.yarnpkg.com/d3-contour/-/d3-contour-4.0.2.tgz#bb92063bc8c5663acb2422f99c73cbb6c6ae3bcc"
|
||||
integrity sha512-4EzFTRIikzs47RGmdxbeUvLWtGedDUNkTcmzoeyg4sP/dvCexO47AaQL7VKy/gul85TOxw+IBgA8US2xwbToNA==
|
||||
dependencies:
|
||||
d3-array "^3.2.0"
|
||||
|
||||
d3-delaunay@6:
|
||||
version "6.0.2"
|
||||
resolved "https://registry.yarnpkg.com/d3-delaunay/-/d3-delaunay-6.0.2.tgz#7fd3717ad0eade2fc9939f4260acfb503f984e92"
|
||||
integrity sha512-IMLNldruDQScrcfT+MWnazhHbDJhcRJyOEBAJfwQnHle1RPh6WDuLvxNArUju2VSMSUuKlY5BGHRJ2cYyoFLQQ==
|
||||
dependencies:
|
||||
delaunator "5"
|
||||
|
||||
"d3-dispatch@1 - 3", d3-dispatch@3:
|
||||
version "3.0.1"
|
||||
resolved "https://registry.yarnpkg.com/d3-dispatch/-/d3-dispatch-3.0.1.tgz#5fc75284e9c2375c36c839411a0cf550cbfc4d5e"
|
||||
integrity sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==
|
||||
|
||||
"d3-drag@2 - 3", d3-drag@3:
|
||||
version "3.0.0"
|
||||
resolved "https://registry.yarnpkg.com/d3-drag/-/d3-drag-3.0.0.tgz#994aae9cd23c719f53b5e10e3a0a6108c69607ba"
|
||||
integrity sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg==
|
||||
dependencies:
|
||||
d3-dispatch "1 - 3"
|
||||
d3-selection "3"
|
||||
|
||||
"d3-dsv@1 - 3", d3-dsv@3:
|
||||
version "3.0.1"
|
||||
resolved "https://registry.yarnpkg.com/d3-dsv/-/d3-dsv-3.0.1.tgz#c63af978f4d6a0d084a52a673922be2160789b73"
|
||||
integrity sha512-UG6OvdI5afDIFP9w4G0mNq50dSOsXHJaRE8arAS5o9ApWnIElp8GZw1Dun8vP8OyHOZ/QJUKUJwxiiCCnUwm+Q==
|
||||
dependencies:
|
||||
commander "7"
|
||||
iconv-lite "0.6"
|
||||
rw "1"
|
||||
|
||||
"d3-ease@1 - 3", d3-ease@3:
|
||||
version "3.0.1"
|
||||
resolved "https://registry.yarnpkg.com/d3-ease/-/d3-ease-3.0.1.tgz#9658ac38a2140d59d346160f1f6c30fda0bd12f4"
|
||||
integrity sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==
|
||||
|
||||
d3-fetch@3:
|
||||
version "3.0.1"
|
||||
resolved "https://registry.yarnpkg.com/d3-fetch/-/d3-fetch-3.0.1.tgz#83141bff9856a0edb5e38de89cdcfe63d0a60a22"
|
||||
integrity sha512-kpkQIM20n3oLVBKGg6oHrUchHM3xODkTzjMoj7aWQFq5QEM+R6E4WkzT5+tojDY7yjez8KgCBRoj4aEr99Fdqw==
|
||||
dependencies:
|
||||
d3-dsv "1 - 3"
|
||||
|
||||
d3-force@3:
|
||||
version "3.0.0"
|
||||
resolved "https://registry.yarnpkg.com/d3-force/-/d3-force-3.0.0.tgz#3e2ba1a61e70888fe3d9194e30d6d14eece155c4"
|
||||
integrity sha512-zxV/SsA+U4yte8051P4ECydjD/S+qeYtnaIyAs9tgHCqfguma/aAQDjo85A9Z6EKhBirHRJHXIgJUlffT4wdLg==
|
||||
dependencies:
|
||||
d3-dispatch "1 - 3"
|
||||
d3-quadtree "1 - 3"
|
||||
d3-timer "1 - 3"
|
||||
|
||||
"d3-format@1 - 3", d3-format@3:
|
||||
version "3.1.0"
|
||||
resolved "https://registry.yarnpkg.com/d3-format/-/d3-format-3.1.0.tgz#9260e23a28ea5cb109e93b21a06e24e2ebd55641"
|
||||
integrity sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA==
|
||||
|
||||
d3-geo@3:
|
||||
version "3.1.0"
|
||||
resolved "https://registry.yarnpkg.com/d3-geo/-/d3-geo-3.1.0.tgz#74fd54e1f4cebd5185ac2039217a98d39b0a4c0e"
|
||||
integrity sha512-JEo5HxXDdDYXCaWdwLRt79y7giK8SbhZJbFWXqbRTolCHFI5jRqteLzCsq51NKbUoX0PjBVSohxrx+NoOUujYA==
|
||||
dependencies:
|
||||
d3-array "2.5.0 - 3"
|
||||
|
||||
d3-hierarchy@3:
|
||||
version "3.1.2"
|
||||
resolved "https://registry.yarnpkg.com/d3-hierarchy/-/d3-hierarchy-3.1.2.tgz#b01cd42c1eed3d46db77a5966cf726f8c09160c6"
|
||||
integrity sha512-FX/9frcub54beBdugHjDCdikxThEqjnR93Qt7PvQTOHxyiNCAlvMrHhclk3cD5VeAaq9fxmfRp+CnWw9rEMBuA==
|
||||
|
||||
"d3-interpolate@1 - 3", "d3-interpolate@1.2.0 - 3", d3-interpolate@3:
|
||||
version "3.0.1"
|
||||
resolved "https://registry.yarnpkg.com/d3-interpolate/-/d3-interpolate-3.0.1.tgz#3c47aa5b32c5b3dfb56ef3fd4342078a632b400d"
|
||||
integrity sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==
|
||||
dependencies:
|
||||
d3-color "1 - 3"
|
||||
|
||||
"d3-path@1 - 3", d3-path@3, d3-path@^3.1.0:
|
||||
version "3.1.0"
|
||||
resolved "https://registry.yarnpkg.com/d3-path/-/d3-path-3.1.0.tgz#22df939032fb5a71ae8b1800d61ddb7851c42526"
|
||||
integrity sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==
|
||||
|
||||
d3-polygon@3:
|
||||
version "3.0.1"
|
||||
resolved "https://registry.yarnpkg.com/d3-polygon/-/d3-polygon-3.0.1.tgz#0b45d3dd1c48a29c8e057e6135693ec80bf16398"
|
||||
integrity sha512-3vbA7vXYwfe1SYhED++fPUQlWSYTTGmFmQiany/gdbiWgU/iEyQzyymwL9SkJjFFuCS4902BSzewVGsHHmHtXg==
|
||||
|
||||
"d3-quadtree@1 - 3", d3-quadtree@3:
|
||||
version "3.0.1"
|
||||
resolved "https://registry.yarnpkg.com/d3-quadtree/-/d3-quadtree-3.0.1.tgz#6dca3e8be2b393c9a9d514dabbd80a92deef1a4f"
|
||||
integrity sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw==
|
||||
|
||||
d3-random@3:
|
||||
version "3.0.1"
|
||||
resolved "https://registry.yarnpkg.com/d3-random/-/d3-random-3.0.1.tgz#d4926378d333d9c0bfd1e6fa0194d30aebaa20f4"
|
||||
integrity sha512-FXMe9GfxTxqd5D6jFsQ+DJ8BJS4E/fT5mqqdjovykEB2oFbTMDVdg1MGFxfQW+FBOGoB++k8swBrgwSHT1cUXQ==
|
||||
|
||||
d3-scale-chromatic@3:
|
||||
version "3.0.0"
|
||||
resolved "https://registry.yarnpkg.com/d3-scale-chromatic/-/d3-scale-chromatic-3.0.0.tgz#15b4ceb8ca2bb0dcb6d1a641ee03d59c3b62376a"
|
||||
integrity sha512-Lx9thtxAKrO2Pq6OO2Ua474opeziKr279P/TKZsMAhYyNDD3EnCffdbgeSYN5O7m2ByQsxtuP2CSDczNUIZ22g==
|
||||
dependencies:
|
||||
d3-color "1 - 3"
|
||||
d3-interpolate "1 - 3"
|
||||
|
||||
d3-scale@4:
|
||||
version "4.0.2"
|
||||
resolved "https://registry.yarnpkg.com/d3-scale/-/d3-scale-4.0.2.tgz#82b38e8e8ff7080764f8dcec77bd4be393689396"
|
||||
integrity sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==
|
||||
dependencies:
|
||||
d3-array "2.10.0 - 3"
|
||||
d3-format "1 - 3"
|
||||
d3-interpolate "1.2.0 - 3"
|
||||
d3-time "2.1.1 - 3"
|
||||
d3-time-format "2 - 4"
|
||||
|
||||
"d3-selection@2 - 3", d3-selection@3:
|
||||
version "3.0.0"
|
||||
resolved "https://registry.yarnpkg.com/d3-selection/-/d3-selection-3.0.0.tgz#c25338207efa72cc5b9bd1458a1a41901f1e1b31"
|
||||
integrity sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==
|
||||
|
||||
d3-shape@3:
|
||||
version "3.2.0"
|
||||
resolved "https://registry.yarnpkg.com/d3-shape/-/d3-shape-3.2.0.tgz#a1a839cbd9ba45f28674c69d7f855bcf91dfc6a5"
|
||||
integrity sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==
|
||||
dependencies:
|
||||
d3-path "^3.1.0"
|
||||
|
||||
"d3-time-format@2 - 4", d3-time-format@4:
|
||||
version "4.1.0"
|
||||
resolved "https://registry.yarnpkg.com/d3-time-format/-/d3-time-format-4.1.0.tgz#7ab5257a5041d11ecb4fe70a5c7d16a195bb408a"
|
||||
integrity sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==
|
||||
dependencies:
|
||||
d3-time "1 - 3"
|
||||
|
||||
"d3-time@1 - 3", "d3-time@2.1.1 - 3", d3-time@3:
|
||||
version "3.1.0"
|
||||
resolved "https://registry.yarnpkg.com/d3-time/-/d3-time-3.1.0.tgz#9310db56e992e3c0175e1ef385e545e48a9bb5c7"
|
||||
integrity sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==
|
||||
dependencies:
|
||||
d3-array "2 - 3"
|
||||
|
||||
"d3-timer@1 - 3", d3-timer@3:
|
||||
version "3.0.1"
|
||||
resolved "https://registry.yarnpkg.com/d3-timer/-/d3-timer-3.0.1.tgz#6284d2a2708285b1abb7e201eda4380af35e63b0"
|
||||
integrity sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==
|
||||
|
||||
"d3-transition@2 - 3", d3-transition@3:
|
||||
version "3.0.1"
|
||||
resolved "https://registry.yarnpkg.com/d3-transition/-/d3-transition-3.0.1.tgz#6869fdde1448868077fdd5989200cb61b2a1645f"
|
||||
integrity sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w==
|
||||
dependencies:
|
||||
d3-color "1 - 3"
|
||||
d3-dispatch "1 - 3"
|
||||
d3-ease "1 - 3"
|
||||
d3-interpolate "1 - 3"
|
||||
d3-timer "1 - 3"
|
||||
|
||||
d3-zoom@3:
|
||||
version "3.0.0"
|
||||
resolved "https://registry.yarnpkg.com/d3-zoom/-/d3-zoom-3.0.0.tgz#d13f4165c73217ffeaa54295cd6969b3e7aee8f3"
|
||||
integrity sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw==
|
||||
dependencies:
|
||||
d3-dispatch "1 - 3"
|
||||
d3-drag "2 - 3"
|
||||
d3-interpolate "1 - 3"
|
||||
d3-selection "2 - 3"
|
||||
d3-transition "2 - 3"
|
||||
|
||||
d3@^7.0.0, d3@^7.7.0:
|
||||
version "7.8.2"
|
||||
resolved "https://registry.yarnpkg.com/d3/-/d3-7.8.2.tgz#2bdb3c178d095ae03b107a18837ae049838e372d"
|
||||
integrity sha512-WXty7qOGSHb7HR7CfOzwN1Gw04MUOzN8qh9ZUsvwycIMb4DYMpY9xczZ6jUorGtO6bR9BPMPaueIKwiDxu9uiQ==
|
||||
dependencies:
|
||||
d3-array "3"
|
||||
d3-axis "3"
|
||||
d3-brush "3"
|
||||
d3-chord "3"
|
||||
d3-color "3"
|
||||
d3-contour "4"
|
||||
d3-delaunay "6"
|
||||
d3-dispatch "3"
|
||||
d3-drag "3"
|
||||
d3-dsv "3"
|
||||
d3-ease "3"
|
||||
d3-fetch "3"
|
||||
d3-force "3"
|
||||
d3-format "3"
|
||||
d3-geo "3"
|
||||
d3-hierarchy "3"
|
||||
d3-interpolate "3"
|
||||
d3-path "3"
|
||||
d3-polygon "3"
|
||||
d3-quadtree "3"
|
||||
d3-random "3"
|
||||
d3-scale "4"
|
||||
d3-scale-chromatic "3"
|
||||
d3-selection "3"
|
||||
d3-shape "3"
|
||||
d3-time "3"
|
||||
d3-time-format "4"
|
||||
d3-timer "3"
|
||||
d3-transition "3"
|
||||
d3-zoom "3"
|
||||
|
||||
dagre-d3-es@7.0.6:
|
||||
version "7.0.6"
|
||||
resolved "https://registry.yarnpkg.com/dagre-d3-es/-/dagre-d3-es-7.0.6.tgz#8cab465ff95aca8a1ca2292d07e1fb31b5db83f2"
|
||||
integrity sha512-CaaE/nZh205ix+Up4xsnlGmpog5GGm81Upi2+/SBHxwNwrccBb3K51LzjZ1U6hgvOlAEUsVWf1xSTzCyKpJ6+Q==
|
||||
dependencies:
|
||||
d3 "^7.7.0"
|
||||
lodash-es "^4.17.21"
|
||||
|
||||
debug@2.6.9, debug@^2.2.0, debug@^2.3.3, debug@^2.6.0:
|
||||
version "2.6.9"
|
||||
resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f"
|
||||
@ -6253,6 +6524,13 @@ del@^6.1.1:
|
||||
rimraf "^3.0.2"
|
||||
slash "^3.0.0"
|
||||
|
||||
delaunator@5:
|
||||
version "5.0.0"
|
||||
resolved "https://registry.yarnpkg.com/delaunator/-/delaunator-5.0.0.tgz#60f052b28bd91c9b4566850ebf7756efe821d81b"
|
||||
integrity sha512-AyLvtyJdbv/U1GkiS6gUUzclRoAY4Gs75qkMygJJhU75LW4DNuSF2RMzpxs9jw9Oz1BobHjTdkG3zdP55VxAqw==
|
||||
dependencies:
|
||||
robust-predicates "^3.0.0"
|
||||
|
||||
delayed-stream@~1.0.0:
|
||||
version "1.0.0"
|
||||
resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619"
|
||||
@ -6506,6 +6784,11 @@ domhandler@^5.0.1, domhandler@^5.0.2, domhandler@^5.0.3:
|
||||
dependencies:
|
||||
domelementtype "^2.3.0"
|
||||
|
||||
dompurify@2.4.1:
|
||||
version "2.4.1"
|
||||
resolved "https://registry.yarnpkg.com/dompurify/-/dompurify-2.4.1.tgz#f9cb1a275fde9af6f2d0a2644ef648dd6847b631"
|
||||
integrity sha512-ewwFzHzrrneRjxzmK6oVz/rZn9VWspGFRDb4/rRtIsM1n36t9AKma/ye8syCpcw+XJ25kOK/hOG7t1j2I2yBqA==
|
||||
|
||||
domutils@^2.5.2, domutils@^2.8.0:
|
||||
version "2.8.0"
|
||||
resolved "https://registry.yarnpkg.com/domutils/-/domutils-2.8.0.tgz#4437def5db6e2d1f5d6ee859bd95ca7d02048135"
|
||||
@ -8267,7 +8550,7 @@ iconv-lite@0.4.24:
|
||||
dependencies:
|
||||
safer-buffer ">= 2.1.2 < 3"
|
||||
|
||||
iconv-lite@0.6.3:
|
||||
iconv-lite@0.6, iconv-lite@0.6.3:
|
||||
version "0.6.3"
|
||||
resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.6.3.tgz#a52f80bf38da1952eb5c681790719871a1a72501"
|
||||
integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==
|
||||
@ -8405,6 +8688,11 @@ internal-slot@^1.0.3:
|
||||
has "^1.0.3"
|
||||
side-channel "^1.0.4"
|
||||
|
||||
"internmap@1 - 2":
|
||||
version "2.0.3"
|
||||
resolved "https://registry.yarnpkg.com/internmap/-/internmap-2.0.3.tgz#6685f23755e43c524e251d29cbc97248e3061009"
|
||||
integrity sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==
|
||||
|
||||
interpret@^1.0.0:
|
||||
version "1.4.0"
|
||||
resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.4.0.tgz#665ab8bc4da27a774a40584e812e3e0fa45b1a1e"
|
||||
@ -9210,6 +9498,11 @@ keyv@^4.0.0:
|
||||
dependencies:
|
||||
json-buffer "3.0.1"
|
||||
|
||||
khroma@^2.0.0:
|
||||
version "2.0.0"
|
||||
resolved "https://registry.yarnpkg.com/khroma/-/khroma-2.0.0.tgz#7577de98aed9f36c7a474c4d453d94c0d6c6588b"
|
||||
integrity sha512-2J8rDNlQWbtiNYThZRvmMv5yt44ZakX+Tz5ZIp/mN1pt4snn+m030Va5Z4v8xA0cQFDXBwO/8i42xL4QPsVk3g==
|
||||
|
||||
kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0:
|
||||
version "3.2.2"
|
||||
resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64"
|
||||
@ -9361,6 +9654,11 @@ locate-path@^6.0.0:
|
||||
dependencies:
|
||||
p-locate "^5.0.0"
|
||||
|
||||
lodash-es@^4.17.21:
|
||||
version "4.17.21"
|
||||
resolved "https://registry.yarnpkg.com/lodash-es/-/lodash-es-4.17.21.tgz#43e626c46e6591b7750beb2b50117390c609e3ee"
|
||||
integrity sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==
|
||||
|
||||
lodash.curry@^4.0.1:
|
||||
version "4.1.1"
|
||||
resolved "https://registry.yarnpkg.com/lodash.curry/-/lodash.curry-4.1.1.tgz#248e36072ede906501d75966200a86dab8b23170"
|
||||
@ -9661,6 +9959,22 @@ merge2@^1.2.3, merge2@^1.3.0, merge2@^1.4.1:
|
||||
resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae"
|
||||
integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==
|
||||
|
||||
mermaid@^9.1.1:
|
||||
version "9.3.0"
|
||||
resolved "https://registry.yarnpkg.com/mermaid/-/mermaid-9.3.0.tgz#8bd7c4a44b53e4e85c53a0a474442e9c273494ae"
|
||||
integrity sha512-mGl0BM19TD/HbU/LmlaZbjBi//tojelg8P/mxD6pPZTAYaI+VawcyBdqRsoUHSc7j71PrMdJ3HBadoQNdvP5cg==
|
||||
dependencies:
|
||||
"@braintree/sanitize-url" "^6.0.0"
|
||||
d3 "^7.0.0"
|
||||
dagre-d3-es "7.0.6"
|
||||
dompurify "2.4.1"
|
||||
khroma "^2.0.0"
|
||||
lodash-es "^4.17.21"
|
||||
moment-mini "^2.24.0"
|
||||
non-layered-tidy-tree-layout "^2.0.2"
|
||||
stylis "^4.1.2"
|
||||
uuid "^9.0.0"
|
||||
|
||||
methods@^1.1.2, methods@~1.1.2:
|
||||
version "1.1.2"
|
||||
resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee"
|
||||
@ -10082,6 +10396,11 @@ mkdirp@^1.0.3, mkdirp@^1.0.4:
|
||||
resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e"
|
||||
integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==
|
||||
|
||||
moment-mini@^2.24.0:
|
||||
version "2.29.4"
|
||||
resolved "https://registry.yarnpkg.com/moment-mini/-/moment-mini-2.29.4.tgz#cbbcdc58ce1b267506f28ea6668dbe060a32758f"
|
||||
integrity sha512-uhXpYwHFeiTbY9KSgPPRoo1nt8OxNVdMVoTBYHfSEKeRkIkwGpO+gERmhuhBtzfaeOyTkykSrm2+noJBgqt3Hg==
|
||||
|
||||
move-concurrently@^1.0.1:
|
||||
version "1.0.1"
|
||||
resolved "https://registry.yarnpkg.com/move-concurrently/-/move-concurrently-1.0.1.tgz#be2c005fda32e0b29af1f05d7c4b33214c701f92"
|
||||
@ -10285,6 +10604,11 @@ node-releases@^2.0.6:
|
||||
resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.6.tgz#8a7088c63a55e493845683ebf3c828d8c51c5503"
|
||||
integrity sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg==
|
||||
|
||||
non-layered-tidy-tree-layout@^2.0.2:
|
||||
version "2.0.2"
|
||||
resolved "https://registry.yarnpkg.com/non-layered-tidy-tree-layout/-/non-layered-tidy-tree-layout-2.0.2.tgz#57d35d13c356643fc296a55fb11ac15e74da7804"
|
||||
integrity sha512-gkXMxRzUH+PB0ax9dUN0yYF0S25BqeAYqhgMaLUFmpXLEk7Fcu8f4emJuOAY0V8kjDICxROIKsTAKsV/v355xw==
|
||||
|
||||
normalize-package-data@^2.3.2, normalize-package-data@^2.3.4, normalize-package-data@^2.5.0:
|
||||
version "2.5.0"
|
||||
resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8"
|
||||
@ -12444,6 +12768,11 @@ ripemd160@^2.0.0, ripemd160@^2.0.1:
|
||||
hash-base "^3.0.0"
|
||||
inherits "^2.0.1"
|
||||
|
||||
robust-predicates@^3.0.0:
|
||||
version "3.0.1"
|
||||
resolved "https://registry.yarnpkg.com/robust-predicates/-/robust-predicates-3.0.1.tgz#ecde075044f7f30118682bd9fb3f123109577f9a"
|
||||
integrity sha512-ndEIpszUHiG4HtDsQLeIuMvRsDnn8c8rYStabochtUeCvfuvNptb5TUbVD68LRAILPX7p9nqQGh4xJgn3EHS/g==
|
||||
|
||||
rsvp@^4.8.4:
|
||||
version "4.8.5"
|
||||
resolved "https://registry.yarnpkg.com/rsvp/-/rsvp-4.8.5.tgz#c8f155311d167f68f21e168df71ec5b083113734"
|
||||
@ -12478,6 +12807,11 @@ run-queue@^1.0.0, run-queue@^1.0.3:
|
||||
dependencies:
|
||||
aproba "^1.1.1"
|
||||
|
||||
rw@1:
|
||||
version "1.3.3"
|
||||
resolved "https://registry.yarnpkg.com/rw/-/rw-1.3.3.tgz#3f862dfa91ab766b14885ef4d01124bfda074fb4"
|
||||
integrity sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==
|
||||
|
||||
rxjs@^7.5.4:
|
||||
version "7.5.7"
|
||||
resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-7.5.7.tgz#2ec0d57fdc89ece220d2e702730ae8f1e49def39"
|
||||
@ -13372,6 +13706,11 @@ stylehacks@^5.1.1:
|
||||
browserslist "^4.21.4"
|
||||
postcss-selector-parser "^6.0.4"
|
||||
|
||||
stylis@^4.1.2:
|
||||
version "4.1.3"
|
||||
resolved "https://registry.yarnpkg.com/stylis/-/stylis-4.1.3.tgz#fd2fbe79f5fed17c55269e16ed8da14c84d069f7"
|
||||
integrity sha512-GP6WDNWf+o403jrEp9c5jibKavrtLW+/qYGhFxFrG8maXhwTBI7gLLhiBb0o7uFccWN+EOS9aMO6cGHWAO07OA==
|
||||
|
||||
sucrase@^3.21.0:
|
||||
version "3.28.0"
|
||||
resolved "https://registry.yarnpkg.com/sucrase/-/sucrase-3.28.0.tgz#7fd8b3118d2155fcdf291088ab77fa6eefd63c4c"
|
||||
@ -14231,6 +14570,11 @@ uuid@^3.3.2:
|
||||
resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee"
|
||||
integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==
|
||||
|
||||
uuid@^9.0.0:
|
||||
version "9.0.0"
|
||||
resolved "https://registry.yarnpkg.com/uuid/-/uuid-9.0.0.tgz#592f550650024a38ceb0c562f2f6aa435761efb5"
|
||||
integrity sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==
|
||||
|
||||
uvu@^0.5.0:
|
||||
version "0.5.6"
|
||||
resolved "https://registry.yarnpkg.com/uvu/-/uvu-0.5.6.tgz#2754ca20bcb0bb59b64e9985e84d2e81058502df"
|
||||
|
Loading…
Reference in New Issue
Block a user