diff --git a/.github/workflows/update-swagger.yml b/.github/workflows/update-swagger.yml new file mode 100644 index 0000000..e69de29 diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..cf99b74 --- /dev/null +++ b/.gitignore @@ -0,0 +1,12 @@ +# dependencies +node_modules +/.pnp +.pnp.js + +# misc +.DS_Store +.idea + +# docs +/build +/.docusaurus \ No newline at end of file diff --git a/.nvmrc b/.nvmrc new file mode 100644 index 0000000..aad5ebe --- /dev/null +++ b/.nvmrc @@ -0,0 +1 @@ +20.8.0 \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..231a499 --- /dev/null +++ b/README.md @@ -0,0 +1,33 @@ +# Website + +This website is built using [Docusaurus 2](https://docusaurus.io/), a modern static website generator. + +## Installation + +```console +yarn install +``` + +## Local Development + +```console +yarn start +``` + +This command starts a local development server and opens up a browser window. Most changes are reflected live without having to restart the server. + +## Build + +```console +yarn build +``` + +This command generates static content into the `build` directory and can be served using any static contents hosting service. + +## Deployment + +```console +GIT_USER= USE_SSH=true yarn deploy +``` + +If you are using GitHub pages for hosting, this command is a convenient way to build the website and push to the `gh-pages` branch. diff --git a/babel.config.js b/babel.config.js new file mode 100644 index 0000000..e00595d --- /dev/null +++ b/babel.config.js @@ -0,0 +1,3 @@ +module.exports = { + presets: [require.resolve('@docusaurus/core/lib/babel/preset')], +}; diff --git a/docs/assets/demo_lightdash.png b/docs/assets/demo_lightdash.png new file mode 100644 index 0000000..5d97226 Binary files /dev/null and b/docs/assets/demo_lightdash.png differ diff --git a/docs/best-practice/assets/tutorial_planning_your_dashboard.png b/docs/best-practice/assets/tutorial_planning_your_dashboard.png new file mode 100644 index 0000000..e395e63 Binary files /dev/null and b/docs/best-practice/assets/tutorial_planning_your_dashboard.png differ diff --git a/docs/best-practice/lightdash-way.md b/docs/best-practice/lightdash-way.md new file mode 100644 index 0000000..5a547fd --- /dev/null +++ b/docs/best-practice/lightdash-way.md @@ -0,0 +1,87 @@ +--- +sidebar_position: 1 +sidebar_label: The Lightdash Way for data access +--- + +# The Lightdash Way: Data Access + +Our mission at Lightdash is: + +> To enable everybody in your company to answer their own questions using data. + +Lightdash is where the data team (πŸ‘·β€β™€οΈ the builders) and the rest of the business (πŸ‘©β€πŸŒΎ the +consumers) come together to make better data-driven decisions. + +We have some pretty strong opinions about how this relationship between data builders +and data consumers should work. So, we thought it would be useful to explain the +principles that make up The Lightdash Way. + +The Lightdash Way isn't just semantics (😏) - it's about the entire experience of +enabling everybody in your company to answer their own data questions. But, we'll start +off slow and just go through one of the principles for now: + +> How should you serve data to people who want to answer their own data questions? + +**⚑️ The Lightdash Way:** + +**Give end users meaningful building blocks to answer their own data questions.** + +Let me explain what we mean... + +## We've come across three ways to let people answer their questions using data: + +_I hope it's obvious which one is our fave_ πŸ˜‡ + +1. You give everyone access to the raw data. +2. If you have a data question, you ask the data builders, and they just give you complete answers. + +**⚑ The Lightdash Way:** + +3. The data builders give you meaningful building blocks to answer your own data questions. + +### 1. You give everyone access to the raw data. πŸ€ͺ + +If everybody in your organization knows SQL and everyone has the context they need to query +the raw data (...and unicorns were real πŸ¦„...), then giving everyone access to the raw data +wouldn't be that bad. + +But, if a single person doesn't know SQL then they're totally dependent on someone helping +them with a data question...no bueno. + +- πŸ‘: very flexible, totally self-serve (as long as everyone knows SQL) +- πŸ‘Ž: everybody has to know sql, everybody needs context of raw data, duplicated work, + bound to be errors + +### 2. If you have a data question, you ask the data builders, and they just give you complete answers. 🎁 + +If nobody knows SQL or they aren't willing to explore data themselves, then dedicated team +members (probably data analysts) will be completely responsible for exploring data. Everybody +relies on the data team for answer questions. + +- πŸ‘: only analysts have to have data skills, fewer errors (since only data experts are answering data questions) +- πŸ‘Ž: doesn't scale, analysts become a bottleneck, this kind of work sort of sucks :( + +### 3. The data builders give you meaningful building blocks to answer your own data questions. 🧱 + +**⚑ The Lightdash Way:** We give your data team the tools they need to build metrics + dimensions +that everyone else can use in a user-friendly interface. + +With this approach, you leave the SQL to the experts: your data team. They become force-multipliers +when they create these pre-defined metrics + dimensions in SQL because anybody in the business can +combine, segment, and filter them to answer their own questions. + +The downside is that the data team need to spend some time defining and maintaining the library of metrics. But, +a small set of metrics can power a huge amount of different analyses, enabling the rest of your team to answer +their own data questions. + +- πŸ‘: you only need a few SQL experts, anyone can ask questions using the data, fewer errors, scaleable +- πŸ‘Ž: you need a data team, this system needs maintenance + +## When we aggregate data, we add value. + +Giving data consumers useful building blocks makes it easier for them to self-serve and answer +their own questions. + +We believe that this way of sharing data insights is a core part of the experience of everyone being able +to answer their own data questions. It's the foundation of a healthy, happy relationship between data builders +and data consumers πŸ‘―β€β™€οΈ. diff --git a/docs/best-practice/planning-your-dashboard.md b/docs/best-practice/planning-your-dashboard.md new file mode 100644 index 0000000..9bdcaeb --- /dev/null +++ b/docs/best-practice/planning-your-dashboard.md @@ -0,0 +1,51 @@ +--- +sidebar_position: 2 +sidebar_label: Planning your dashboard - the Who, What and How of dashboard building. +--- + +# Planning your dashboard: the Who, What and How of building great dashboards. + +For those of you who are just getting started with building dashboards, it it can be useful to do some planning before you get your hands dirty and actually start building the thing. + +So, we thought we'd give you a few tips to help you get comfortable with planning your dashboard build. Specifically, we're going to answer three questions before we build our dashboard: β€œwho? what? and how?” + +Check out our 5 minute video tutorial here: + +[![tutorial planning your dashboard](./assets/tutorial_planning_your_dashboard.png)](https://www.youtube.com/watch?v=g2-dkJkZjiI) + +## Before you start building your dashboard, you should be able to answer three questions: + +1. [**_Who_ is this dashboard for?**](#who-is-this-dashboard-for) +2. [**_What_ is this dashboard trying to accomplish?**](#what-is-this-dashboard-trying-to-accomplish) +3. [**_How_ can I build this dashboard?**](#how-can-i-build-this-dashboard) + +### 1. Who is this dashboard for? + +- Does your audience already know what you're talking about? +- Do you need to add more context to help make your point? + +**Actions**: + +- Think about what context your audience will need and add this to your dashboard. For example, any acronyms that will need clarifying or if an increase in a number is a good or bad thing. + +### 2. What is this dashboard trying to accomplish? + +- Once your audience has seen the dashboard, do you want them to: + 1. take an **_action_**? + 2. **_know_** something they didn't know before? +- What information do they need to take an action/be informed? + +**Actions:** + +- Write out a clear summary of your dashboard's purpose (and add it to your dashboard's description!) +- Write an outline of the questions you want answered in your dashboard's tiles. Start thinking about the story you're trying to tell to your audience. + +### 3. How can I build this dashboard? + +- What data do I have? +- How can I use it to make my point? + +**Actions:** + +- Match datasets to the outline of questions you made in the step above. +- Think about which metrics + dimensions you'll use to make your points (and if these exist yet) diff --git a/docs/contact/_category_.json b/docs/contact/_category_.json new file mode 100644 index 0000000..3dc3348 --- /dev/null +++ b/docs/contact/_category_.json @@ -0,0 +1,4 @@ +{ + "label": "Contact", + "position": 2 +} diff --git a/docs/contact/assets/star_github_action.png b/docs/contact/assets/star_github_action.png new file mode 100644 index 0000000..ee046b9 Binary files /dev/null and b/docs/contact/assets/star_github_action.png differ diff --git a/docs/contact/contact_info.md b/docs/contact/contact_info.md new file mode 100644 index 0000000..017fb42 --- /dev/null +++ b/docs/contact/contact_info.md @@ -0,0 +1,52 @@ +--- +sidebar_position: 2 +--- + +# Contact Us + +There are a few ways you can get in touch with the team. Here's which one to use depending on your situation: + +## I want to report a bug or submit a feature request + +Woo, thanks for helping out! You can [create a new issue in GitHub](https://github.com/lightdash/lightdash/issues) and the team will get back to you ASAP πŸ™‚ + +## I want to give some feedback on the product + +There are a two ways you can give us feedback: + +1. Creating a [new issue on GitHub](https://github.com/lightdash/lightdash/issues) +2. Sending an email to support@lightdash.com + +## I just want to follow along and hear what you're up to + +Well, that's nice 😊 + +There are four things you can do to keep up with all things Lightdash: + +1. Join the [Lightdash Community Slack](https://join.slack.com/t/lightdash-community/shared_invite/zt-2ehqnrvqt-LbCq7cUSFHAzEj_wMuxg4A). + +2. Star our [GitHub repo](https://github.com/lightdash/lightdash) + +![star github action](./assets/star_github_action.png) + +3. [Sign up to our newsletter](https://www.lightdash.com/#wf-form-email-form) at the bottom of the home page (we send out regular updates of all the fun things we've been up to!) + +4. Join in on the fun in [#tools-lightdash](https://getdbt.slack.com/archives/C026WJE4A69) in dbt's Slack space. + +If you're not already a member of dbt's Slack, you can [join the community here](https://www.getdbt.com/community/join-the-community). Once you're in, join us in [#tools-lightdash](https://getdbt.slack.com/archives/C026WJE4A69). + +## I'm having problems setting up or using Lightdash + +We get it, repeated `error` messages can cause [rage clicking](https://www.fullstory.com/blog/rage-clicks-turn-analytics-into-actionable-insights/), and rage clicking is not a happy place to be. + +So, we're here to help. + +First, [check out our FAQs](https://github.com/lightdash/lightdash/discussions/categories/q-a) to see if someone has found a solution to your problem already. + +If you can't find your answer there, the best ways to reach us are: + +1. Post your question [in our Slack Community](https://join.slack.com/t/lightdash-community/shared_invite/zt-2ehqnrvqt-LbCq7cUSFHAzEj_wMuxg4A) +2. Send us a message in the Lightdash app (click on the question mark icon in the navigation bar) +3. Post a [question in our Q&A](https://github.com/lightdash/lightdash/discussions/categories/q-a) +4. [Create a new GitHub issue](https://github.com/lightdash/lightdash/issues) (if it's a bug) +5. Send us an email at support@lightdash.com diff --git a/docs/get-started/_category_.json b/docs/get-started/_category_.json new file mode 100644 index 0000000..b79c4b2 --- /dev/null +++ b/docs/get-started/_category_.json @@ -0,0 +1,4 @@ +{ + "label": "Get started", + "position": 2 +} diff --git a/docs/get-started/assets/oauth-scope.png b/docs/get-started/assets/oauth-scope.png new file mode 100644 index 0000000..5467205 Binary files /dev/null and b/docs/get-started/assets/oauth-scope.png differ diff --git a/docs/get-started/develop-in-lightdash/exploring-your-content.mdx b/docs/get-started/develop-in-lightdash/exploring-your-content.mdx new file mode 100644 index 0000000..e737995 --- /dev/null +++ b/docs/get-started/develop-in-lightdash/exploring-your-content.mdx @@ -0,0 +1,5 @@ +import ExploringYourContent from './../../snippets/exploring-your-content.mdx'; + +# Exploring your content + + diff --git a/docs/get-started/develop-in-lightdash/how-to-create-dimensions.mdx b/docs/get-started/develop-in-lightdash/how-to-create-dimensions.mdx new file mode 100644 index 0000000..4a39e3a --- /dev/null +++ b/docs/get-started/develop-in-lightdash/how-to-create-dimensions.mdx @@ -0,0 +1,5 @@ +import HowToCreateDimensions from './../../snippets/how-to-create-dimensions.mdx'; + +# How to create dimensions + + diff --git a/docs/get-started/develop-in-lightdash/how-to-create-metrics.mdx b/docs/get-started/develop-in-lightdash/how-to-create-metrics.mdx new file mode 100644 index 0000000..dc2fded --- /dev/null +++ b/docs/get-started/develop-in-lightdash/how-to-create-metrics.mdx @@ -0,0 +1,5 @@ +import HowToCreateMetrics from './../../snippets/how-to-create-metrics.mdx'; + +# How to create metrics + + diff --git a/docs/get-started/develop-in-lightdash/intro-metrics-dimensions.mdx b/docs/get-started/develop-in-lightdash/intro-metrics-dimensions.mdx new file mode 100644 index 0000000..ba904c0 --- /dev/null +++ b/docs/get-started/develop-in-lightdash/intro-metrics-dimensions.mdx @@ -0,0 +1,5 @@ +import IntroMetricsDimensions from './../../snippets/intro-metrics-dimensions.mdx'; + +# An intro to metrics and dimensions + + diff --git a/docs/get-started/develop-in-lightdash/intro.mdx b/docs/get-started/develop-in-lightdash/intro.mdx new file mode 100644 index 0000000..217a518 --- /dev/null +++ b/docs/get-started/develop-in-lightdash/intro.mdx @@ -0,0 +1,16 @@ +# πŸ‘©β€πŸ’» Developing in Lightdash + +This tutorial is for people who are new to Lightdash and would like to develop their existing Lightdash project. We'll go over how to use Tables and the Explore view, how to develop Tables in your project, adding your first metrics, and some more advanced configurations for your Lightdash project's content. + +1. [Exploring your content](/get-started/develop-in-lightdash/exploring-your-content) +2. [An intro to metrics and dimensions](/get-started/develop-in-lightdash/intro-metrics-dimensions) +3. [Using Tables and the Explore view](/get-started/develop-in-lightdash/using-explores) +4. [Adding dimensions to Lightdash](/get-started/develop-in-lightdash/how-to-create-dimensions) +5. [Adding your first metrics](/get-started/develop-in-lightdash/how-to-create-metrics) +6. [Share insights with your team](/get-started/develop-in-lightdash/sharing-insights) + +:::tip + +Also check out the [Lightdash Developer Quickstart](https://lightdash.notion.site/Lightdash-developer-quickstart-3192f80173ef4f0bbbe0f0f88b726a76). The quickstart is built in Notion so you can make a copy and follow along, or customize and share with your whole team! + +::: diff --git a/docs/get-started/develop-in-lightdash/sharing-insights.mdx b/docs/get-started/develop-in-lightdash/sharing-insights.mdx new file mode 100644 index 0000000..25ad6c3 --- /dev/null +++ b/docs/get-started/develop-in-lightdash/sharing-insights.mdx @@ -0,0 +1,5 @@ +import SharingInsights from './../../snippets/sharing-insights.mdx'; + +# Share insights with your team + + diff --git a/docs/get-started/develop-in-lightdash/using-explores.mdx b/docs/get-started/develop-in-lightdash/using-explores.mdx new file mode 100644 index 0000000..10721eb --- /dev/null +++ b/docs/get-started/develop-in-lightdash/using-explores.mdx @@ -0,0 +1,5 @@ +import UsingExplores from './../../snippets/using-explores.mdx'; + +# Using Tables and the Explore view + + diff --git a/docs/get-started/exploring-data/_category_.json b/docs/get-started/exploring-data/_category_.json new file mode 100644 index 0000000..0d6aa46 --- /dev/null +++ b/docs/get-started/exploring-data/_category_.json @@ -0,0 +1,4 @@ +{ + "label": "Explore your data", + "position": 2 +} diff --git a/docs/get-started/exploring-data/assets/add_chart_screenshot.png b/docs/get-started/exploring-data/assets/add_chart_screenshot.png new file mode 100644 index 0000000..64de7be Binary files /dev/null and b/docs/get-started/exploring-data/assets/add_chart_screenshot.png differ diff --git a/docs/get-started/exploring-data/assets/all-dashboards.jpg b/docs/get-started/exploring-data/assets/all-dashboards.jpg new file mode 100644 index 0000000..70d5b95 Binary files /dev/null and b/docs/get-started/exploring-data/assets/all-dashboards.jpg differ diff --git a/docs/get-started/exploring-data/assets/browse-dashboards.png b/docs/get-started/exploring-data/assets/browse-dashboards.png new file mode 100644 index 0000000..04181c5 Binary files /dev/null and b/docs/get-started/exploring-data/assets/browse-dashboards.png differ diff --git a/docs/get-started/exploring-data/assets/click_dashboards.png b/docs/get-started/exploring-data/assets/click_dashboards.png new file mode 100644 index 0000000..c6a07b5 Binary files /dev/null and b/docs/get-started/exploring-data/assets/click_dashboards.png differ diff --git a/docs/get-started/exploring-data/assets/click_new_dashboard.png b/docs/get-started/exploring-data/assets/click_new_dashboard.png new file mode 100644 index 0000000..641b629 Binary files /dev/null and b/docs/get-started/exploring-data/assets/click_new_dashboard.png differ diff --git a/docs/get-started/exploring-data/assets/click_save_chart.png b/docs/get-started/exploring-data/assets/click_save_chart.png new file mode 100644 index 0000000..9375538 Binary files /dev/null and b/docs/get-started/exploring-data/assets/click_save_chart.png differ diff --git a/docs/get-started/exploring-data/assets/create-chart-within-dashboard.jpg b/docs/get-started/exploring-data/assets/create-chart-within-dashboard.jpg new file mode 100644 index 0000000..4764c9e Binary files /dev/null and b/docs/get-started/exploring-data/assets/create-chart-within-dashboard.jpg differ diff --git a/docs/get-started/exploring-data/assets/dashboard-add-new-filter-and-select-value.png b/docs/get-started/exploring-data/assets/dashboard-add-new-filter-and-select-value.png new file mode 100644 index 0000000..4fc9f0e Binary files /dev/null and b/docs/get-started/exploring-data/assets/dashboard-add-new-filter-and-select-value.png differ diff --git a/docs/get-started/exploring-data/assets/dashboard-add-new-filter.png b/docs/get-started/exploring-data/assets/dashboard-add-new-filter.png new file mode 100644 index 0000000..8fcb687 Binary files /dev/null and b/docs/get-started/exploring-data/assets/dashboard-add-new-filter.png differ diff --git a/docs/get-started/exploring-data/assets/dashboard-add-new-navbar.png b/docs/get-started/exploring-data/assets/dashboard-add-new-navbar.png new file mode 100644 index 0000000..ba12966 Binary files /dev/null and b/docs/get-started/exploring-data/assets/dashboard-add-new-navbar.png differ diff --git a/docs/get-started/exploring-data/assets/dashboard-add-saved-chart.png b/docs/get-started/exploring-data/assets/dashboard-add-saved-chart.png new file mode 100644 index 0000000..f9a73cd Binary files /dev/null and b/docs/get-started/exploring-data/assets/dashboard-add-saved-chart.png differ diff --git a/docs/get-started/exploring-data/assets/dashboard-add-tile-center.png b/docs/get-started/exploring-data/assets/dashboard-add-tile-center.png new file mode 100644 index 0000000..695522c Binary files /dev/null and b/docs/get-started/exploring-data/assets/dashboard-add-tile-center.png differ diff --git a/docs/get-started/exploring-data/assets/dashboard-click-edit-button.png b/docs/get-started/exploring-data/assets/dashboard-click-edit-button.png new file mode 100644 index 0000000..53a8df9 Binary files /dev/null and b/docs/get-started/exploring-data/assets/dashboard-click-edit-button.png differ diff --git a/docs/get-started/exploring-data/assets/dashboard-new-filter-applied.png b/docs/get-started/exploring-data/assets/dashboard-new-filter-applied.png new file mode 100644 index 0000000..c29a0a2 Binary files /dev/null and b/docs/get-started/exploring-data/assets/dashboard-new-filter-applied.png differ diff --git a/docs/get-started/exploring-data/assets/disabled-filters.png b/docs/get-started/exploring-data/assets/disabled-filters.png new file mode 100644 index 0000000..175beb5 Binary files /dev/null and b/docs/get-started/exploring-data/assets/disabled-filters.png differ diff --git a/docs/get-started/exploring-data/assets/locked-dashboard.png b/docs/get-started/exploring-data/assets/locked-dashboard.png new file mode 100644 index 0000000..2622f4a Binary files /dev/null and b/docs/get-started/exploring-data/assets/locked-dashboard.png differ diff --git a/docs/get-started/exploring-data/assets/move-chart-to-space.jpg b/docs/get-started/exploring-data/assets/move-chart-to-space.jpg new file mode 100644 index 0000000..98e7e19 Binary files /dev/null and b/docs/get-started/exploring-data/assets/move-chart-to-space.jpg differ diff --git a/docs/get-started/exploring-data/assets/required-filters.png b/docs/get-started/exploring-data/assets/required-filters.png new file mode 100644 index 0000000..575cb1b Binary files /dev/null and b/docs/get-started/exploring-data/assets/required-filters.png differ diff --git a/docs/get-started/exploring-data/assets/tutorial_building_first_dashboard.png b/docs/get-started/exploring-data/assets/tutorial_building_first_dashboard.png new file mode 100644 index 0000000..f677276 Binary files /dev/null and b/docs/get-started/exploring-data/assets/tutorial_building_first_dashboard.png differ diff --git a/docs/get-started/exploring-data/dashboard-add-tile.png b/docs/get-started/exploring-data/dashboard-add-tile.png new file mode 100644 index 0000000..d82a922 Binary files /dev/null and b/docs/get-started/exploring-data/dashboard-add-tile.png differ diff --git a/docs/get-started/exploring-data/dashboard-create-new-modal.png b/docs/get-started/exploring-data/dashboard-create-new-modal.png new file mode 100644 index 0000000..771b609 Binary files /dev/null and b/docs/get-started/exploring-data/dashboard-create-new-modal.png differ diff --git a/docs/get-started/exploring-data/dashboard-create-new.png b/docs/get-started/exploring-data/dashboard-create-new.png new file mode 100644 index 0000000..139318d Binary files /dev/null and b/docs/get-started/exploring-data/dashboard-create-new.png differ diff --git a/docs/get-started/exploring-data/dashboards.mdx b/docs/get-started/exploring-data/dashboards.mdx new file mode 100644 index 0000000..02da880 --- /dev/null +++ b/docs/get-started/exploring-data/dashboards.mdx @@ -0,0 +1,199 @@ +import DashboardAddNew from './assets/dashboard-add-new-navbar.png'; +import DashboardAddTileCenter from './assets/dashboard-add-tile-center.png'; +import CreateChartWithinDashboard from './assets/create-chart-within-dashboard.jpg'; +import MoveChartToSpace from './assets/move-chart-to-space.jpg'; +import AddSavedChart from './assets/dashboard-add-saved-chart.png'; +import AllDashboards from './assets/all-dashboards.jpg'; +import AddNewFilter from './assets/dashboard-add-new-filter.png'; +import AddNewFilterAndSetValue from './assets/dashboard-add-new-filter-and-select-value.png'; +import DashboardClickEditButton from './assets/dashboard-click-edit-button.png'; +import DashboardNewFilterApplied from './assets/dashboard-new-filter-applied.png'; +import RequiredFilters from './assets/required-filters.png'; +import DisabledFilters from './assets/disabled-filters.png'; +import LockedDashboard from './assets/locked-dashboard.png'; + +# Creating Dashboards + +Dashboards allow you to arrange multiple charts that are related to each other into a single view. + +Checkout this tutorial on how to create your first dashboard: +[![tutorial building first dashboard](./assets/tutorial_building_first_dashboard.png)](https://youtu.be/olFcN8Pui08) + +## 1. Create a new empty dashboard + +On the nav bar, click "New" to create a new dashboard. + + + +Fill out the details of your new dashboard and hit 'Create'. Once done, you will be redirected to your new Dashboard page: + + + +Next, you'll want to add some tiles to your dashboard by clicking on the `add tile` button. + +## 2. Choose a chart to add to your dashboard + +You can either create a new chart from within your dashboard, or you can add an existing chart. + +### How to create a chart from within your dashboard. + +Creating charts from within a dashboard helps to keep your spaces and projects clutter-free from charts that are used only once in a dashboard. + +Charts that are created from within your dashboard are exclusive to the dashboard. This means that they can't be reused in other dashboards in your project. + +Click "Add tile" and then "New chart" to create a chart that is exclusive to the dashboard. You will be taken to the chart builder. Once you save the chart it will appear at the bottom of your dashboard. + + + +Note: These charts can't be used in other dashboards and won't be shown in the global search or in any space. If you want to make these charts reusable in other dashboards, you can detatch them from the dashboard and save them to a space so they're permanent using the `move to space` option from the chart's three-dot-menu. + + + +### How to add an existing chart to your dashboard. + +You can add an existing chart to your dashboard by clicking "Add tile" and then "Saved chart". Clicking any chart will add it at the bottom of your dashboard. + + + +You can resize charts by dragging the lower-right corner. + +You can position your chart by dragging the center of the chart. + +## 3. Add markdown or other content + +In addition to charts, you can also add markdown tiles or embedded Loom videos to explain the dashboard to people who will be using it. + +### Markdown tiles + +These tiles are very flexible and allow you to enter text with headers, formatting, etc. You can even include code blocks and images within markdown tiles. The built-in editor provides most formatting you'll need. + +One option that isn't available in the editor is text centering. That can be achieved like this: + +``` +

This is my centered title

+``` + +### Loom videos + +All you need to do for embedding Loom videos is click on the Loom video option and enter a URL and title for the tile. + +## 4. Save your dashboard + +When you're happy with the layout, hit "Save". + +You can also see all of the saved dashboards in your project by clicking on `Browse` --> `All Dashboards`. + + + +## 5. Add filters to your dashboards + +Now let's add some filters to your dashboard. First, start by editing your dashboard by clicking on the `Edit dashboard` button. + + + +Click on the `Add filter` button to add a new filter to your dashboard by selecting a field and a value to filter by. + + + +Select a value to filter by and hit `Apply`. You can add as many filters as you like. + + + +Now that you've added a filter, you can see the filter applied to your dashboard. + + + +Hit `Save` to save your dashboard with the new filter. + +### Leaving filters empty + +You might want to add an empty-value filter so that your dashboard viewers can choose their own value and explore the data based on their own criteria. +Your dashboard viewers might also want to add their own filters to your dashboard. + +#### Adding an empty-value filter + +Just edit your filter and ensure that you don't provide a default value. + + + +#### Marking a filter as required for the dashboard to run + +You can mark a filter as required for the dashboard to run. This means that the dashboard will not run unless a value is selected for the filter. +Just edit your filter and check the "Require value for dashboard to run" checkbox. + + + +Until viewers have set a value for the filter, the dashboard will not run. + + + +To learn more about adding filters to your dashboards, check out our guide on [using filters](/guides/limiting-data-using-filters). + +## 6. Share your dashboard + +You might want to share your dashboard with other people in your organisation. You can do this by copying the URL (or by pressing on the πŸ”— button). diff --git a/docs/get-started/exploring-data/exploring-your-content.mdx b/docs/get-started/exploring-data/exploring-your-content.mdx new file mode 100644 index 0000000..e737995 --- /dev/null +++ b/docs/get-started/exploring-data/exploring-your-content.mdx @@ -0,0 +1,5 @@ +import ExploringYourContent from './../../snippets/exploring-your-content.mdx'; + +# Exploring your content + + diff --git a/docs/get-started/exploring-data/intro-metrics-dimensions.mdx b/docs/get-started/exploring-data/intro-metrics-dimensions.mdx new file mode 100644 index 0000000..ba904c0 --- /dev/null +++ b/docs/get-started/exploring-data/intro-metrics-dimensions.mdx @@ -0,0 +1,5 @@ +import IntroMetricsDimensions from './../../snippets/intro-metrics-dimensions.mdx'; + +# An intro to metrics and dimensions + + diff --git a/docs/get-started/exploring-data/intro.mdx b/docs/get-started/exploring-data/intro.mdx new file mode 100644 index 0000000..093421d --- /dev/null +++ b/docs/get-started/exploring-data/intro.mdx @@ -0,0 +1,9 @@ +# πŸ”­ Learning to explore data in Lightdash + +This tutorial is for people who are new to Lightdash and would like to explore the tables, charts and dashboards in their Lightdash project. We'll go over how to use Tables and the Explore view, how to share your insights, and how to build dashboards. + +1. [Exploring your content](/get-started/exploring-data/exploring-your-content) +2. [An intro to metrics and dimensions](/get-started/exploring-data/intro-metrics-dimensions) +3. [Using Tables and the Explore View](/get-started/exploring-data/using-explores) +4. [Share insights with your team](/get-started/exploring-data/sharing-insights) +5. [Creating dashboards](/get-started/exploring-data/dashboards) diff --git a/docs/get-started/exploring-data/sharing-insights.mdx b/docs/get-started/exploring-data/sharing-insights.mdx new file mode 100644 index 0000000..25ad6c3 --- /dev/null +++ b/docs/get-started/exploring-data/sharing-insights.mdx @@ -0,0 +1,5 @@ +import SharingInsights from './../../snippets/sharing-insights.mdx'; + +# Share insights with your team + + diff --git a/docs/get-started/exploring-data/using-explores.mdx b/docs/get-started/exploring-data/using-explores.mdx new file mode 100644 index 0000000..10721eb --- /dev/null +++ b/docs/get-started/exploring-data/using-explores.mdx @@ -0,0 +1,5 @@ +import UsingExplores from './../../snippets/using-explores.mdx'; + +# Using Tables and the Explore view + + diff --git a/docs/get-started/intro.mdx b/docs/get-started/intro.mdx new file mode 100644 index 0000000..61f6972 --- /dev/null +++ b/docs/get-started/intro.mdx @@ -0,0 +1,39 @@ +# Getting started + +Welcome to Lightdash! We're going to try to get you developing, exploring or just browsing your data in no time. + +We've put together a couple of tutorials to get people started with working in Lightdash. To decide which one's the right fit for you, just read the descriptions below: + +## πŸ— Setting up a new project + +If you: + +βœ… are starting a new Lightdash project from scratch +βœ… have a Lightdash project connected, but it's empty/ you still need to set up your tables +βœ… know how to use dbt + +then this tutorial is for you! [πŸ— Setting up a new project](/get-started/setup-lightdash/intro) + +## πŸ‘©β€πŸ’» Developing in Lightdash + +If you: + +βœ… have an existing Lightdash project with some tables and dimensions +βœ… know how to use dbt +βœ… want to add or change some dimensions, metrics, or tables in your project +βœ… want to add formatting or descriptions to existing metrics, dimensions or tables in your project + +then this tutorial is for you! [πŸ‘©β€πŸ’» Developing in Lightdash](/get-started/develop-in-lightdash/intro) + +Also check out our [Lightdash Developer Quickstart](https://lightdash.notion.site/Lightdash-developer-quickstart-3192f80173ef4f0bbbe0f0f88b726a76), which can be copied and customized for you or other Lightdash developers in your organization. + +## πŸ”­ Learning to explore data in Lightdash + +If you: + +βœ… want to explore data in Lightdash +βœ… want to learn how to build charts + dashboards in Lightdash +❌ are **not** someone who uses dbt +❌ aren't responsible for maintaining your metrics + dimension definitions + +then this tutorial is for you! [πŸ”­ Learning to explore data in Lightdash](/get-started/exploring-data/intro) diff --git a/docs/get-started/setup-lightdash/_category_.json b/docs/get-started/setup-lightdash/_category_.json new file mode 100644 index 0000000..3d941bc --- /dev/null +++ b/docs/get-started/setup-lightdash/_category_.json @@ -0,0 +1,4 @@ +{ + "label": "Setting up Lightdash", + "position": 1 +} diff --git a/docs/get-started/setup-lightdash/assets/add-user-email.png b/docs/get-started/setup-lightdash/assets/add-user-email.png new file mode 100644 index 0000000..ec9536e Binary files /dev/null and b/docs/get-started/setup-lightdash/assets/add-user-email.png differ diff --git a/docs/get-started/setup-lightdash/assets/choose-database.png b/docs/get-started/setup-lightdash/assets/choose-database.png new file mode 100644 index 0000000..dcfe501 Binary files /dev/null and b/docs/get-started/setup-lightdash/assets/choose-database.png differ diff --git a/docs/get-started/setup-lightdash/assets/data-location.png b/docs/get-started/setup-lightdash/assets/data-location.png new file mode 100644 index 0000000..c0f916f Binary files /dev/null and b/docs/get-started/setup-lightdash/assets/data-location.png differ diff --git a/docs/get-started/setup-lightdash/assets/databricks-access-screenshot.png b/docs/get-started/setup-lightdash/assets/databricks-access-screenshot.png new file mode 100644 index 0000000..ac144ae Binary files /dev/null and b/docs/get-started/setup-lightdash/assets/databricks-access-screenshot.png differ diff --git a/docs/get-started/setup-lightdash/assets/databricks-connect-screenshot.png b/docs/get-started/setup-lightdash/assets/databricks-connect-screenshot.png new file mode 100644 index 0000000..5eb6b15 Binary files /dev/null and b/docs/get-started/setup-lightdash/assets/databricks-connect-screenshot.png differ diff --git a/docs/get-started/setup-lightdash/assets/dbt-cloud-credentials.png b/docs/get-started/setup-lightdash/assets/dbt-cloud-credentials.png new file mode 100644 index 0000000..f9926f4 Binary files /dev/null and b/docs/get-started/setup-lightdash/assets/dbt-cloud-credentials.png differ diff --git a/docs/get-started/setup-lightdash/assets/dbt-connection-settings.jpg b/docs/get-started/setup-lightdash/assets/dbt-connection-settings.jpg new file mode 100644 index 0000000..0be8ea1 Binary files /dev/null and b/docs/get-started/setup-lightdash/assets/dbt-connection-settings.jpg differ diff --git a/docs/get-started/setup-lightdash/assets/dbt-repo-example.png b/docs/get-started/setup-lightdash/assets/dbt-repo-example.png new file mode 100644 index 0000000..9e5ecd3 Binary files /dev/null and b/docs/get-started/setup-lightdash/assets/dbt-repo-example.png differ diff --git a/docs/get-started/setup-lightdash/assets/example-table.jpg b/docs/get-started/setup-lightdash/assets/example-table.jpg new file mode 100644 index 0000000..c750245 Binary files /dev/null and b/docs/get-started/setup-lightdash/assets/example-table.jpg differ diff --git a/docs/get-started/setup-lightdash/assets/fine-grained-permissions.png b/docs/get-started/setup-lightdash/assets/fine-grained-permissions.png new file mode 100644 index 0000000..13d662f Binary files /dev/null and b/docs/get-started/setup-lightdash/assets/fine-grained-permissions.png differ diff --git a/docs/get-started/setup-lightdash/assets/fine-grained-repo.png b/docs/get-started/setup-lightdash/assets/fine-grained-repo.png new file mode 100644 index 0000000..5965503 Binary files /dev/null and b/docs/get-started/setup-lightdash/assets/fine-grained-repo.png differ diff --git a/docs/get-started/setup-lightdash/assets/get-to-projects.png b/docs/get-started/setup-lightdash/assets/get-to-projects.png new file mode 100644 index 0000000..83f1fd9 Binary files /dev/null and b/docs/get-started/setup-lightdash/assets/get-to-projects.png differ diff --git a/docs/get-started/setup-lightdash/assets/invite_user_action.png b/docs/get-started/setup-lightdash/assets/invite_user_action.png new file mode 100644 index 0000000..b0c7bbb Binary files /dev/null and b/docs/get-started/setup-lightdash/assets/invite_user_action.png differ diff --git a/docs/get-started/setup-lightdash/assets/overview-intro.png b/docs/get-started/setup-lightdash/assets/overview-intro.png new file mode 100644 index 0000000..6ecb255 Binary files /dev/null and b/docs/get-started/setup-lightdash/assets/overview-intro.png differ diff --git a/docs/get-started/setup-lightdash/assets/pending-invites.png b/docs/get-started/setup-lightdash/assets/pending-invites.png new file mode 100644 index 0000000..02578cc Binary files /dev/null and b/docs/get-started/setup-lightdash/assets/pending-invites.png differ diff --git a/docs/get-started/setup-lightdash/assets/personal-access-token.png b/docs/get-started/setup-lightdash/assets/personal-access-token.png new file mode 100644 index 0000000..e5b646c Binary files /dev/null and b/docs/get-started/setup-lightdash/assets/personal-access-token.png differ diff --git a/docs/get-started/setup-lightdash/assets/project-connection-settings.jpg b/docs/get-started/setup-lightdash/assets/project-connection-settings.jpg new file mode 100644 index 0000000..75a8c4d Binary files /dev/null and b/docs/get-started/setup-lightdash/assets/project-connection-settings.jpg differ diff --git a/docs/get-started/setup-lightdash/assets/project-id-list.png b/docs/get-started/setup-lightdash/assets/project-id-list.png new file mode 100644 index 0000000..b643b5d Binary files /dev/null and b/docs/get-started/setup-lightdash/assets/project-id-list.png differ diff --git a/docs/get-started/setup-lightdash/assets/screenshot-ip-address.png b/docs/get-started/setup-lightdash/assets/screenshot-ip-address.png new file mode 100644 index 0000000..80a6e5b Binary files /dev/null and b/docs/get-started/setup-lightdash/assets/screenshot-ip-address.png differ diff --git a/docs/get-started/setup-lightdash/assets/select-settings.jpg b/docs/get-started/setup-lightdash/assets/select-settings.jpg new file mode 100644 index 0000000..f305702 Binary files /dev/null and b/docs/get-started/setup-lightdash/assets/select-settings.jpg differ diff --git a/docs/get-started/setup-lightdash/assets/snowflake-account-url.png b/docs/get-started/setup-lightdash/assets/snowflake-account-url.png new file mode 100644 index 0000000..c217cfa Binary files /dev/null and b/docs/get-started/setup-lightdash/assets/snowflake-account-url.png differ diff --git a/docs/get-started/setup-lightdash/assets/snowflake-database-list.png b/docs/get-started/setup-lightdash/assets/snowflake-database-list.png new file mode 100644 index 0000000..817af16 Binary files /dev/null and b/docs/get-started/setup-lightdash/assets/snowflake-database-list.png differ diff --git a/docs/get-started/setup-lightdash/assets/snowflake-login-form.png b/docs/get-started/setup-lightdash/assets/snowflake-login-form.png new file mode 100644 index 0000000..682cf27 Binary files /dev/null and b/docs/get-started/setup-lightdash/assets/snowflake-login-form.png differ diff --git a/docs/get-started/setup-lightdash/assets/snowflake-roles-list.png b/docs/get-started/setup-lightdash/assets/snowflake-roles-list.png new file mode 100644 index 0000000..647eaf3 Binary files /dev/null and b/docs/get-started/setup-lightdash/assets/snowflake-roles-list.png differ diff --git a/docs/get-started/setup-lightdash/assets/snowflake-users-list.png b/docs/get-started/setup-lightdash/assets/snowflake-users-list.png new file mode 100644 index 0000000..72e56fb Binary files /dev/null and b/docs/get-started/setup-lightdash/assets/snowflake-users-list.png differ diff --git a/docs/get-started/setup-lightdash/assets/snowflake-warehouse-list.png b/docs/get-started/setup-lightdash/assets/snowflake-warehouse-list.png new file mode 100644 index 0000000..47b348c Binary files /dev/null and b/docs/get-started/setup-lightdash/assets/snowflake-warehouse-list.png differ diff --git a/docs/get-started/setup-lightdash/assets/tables-configuration.png b/docs/get-started/setup-lightdash/assets/tables-configuration.png new file mode 100644 index 0000000..7c6d4db Binary files /dev/null and b/docs/get-started/setup-lightdash/assets/tables-configuration.png differ diff --git a/docs/get-started/setup-lightdash/assets/tables-view.jpg b/docs/get-started/setup-lightdash/assets/tables-view.jpg new file mode 100644 index 0000000..77c6f25 Binary files /dev/null and b/docs/get-started/setup-lightdash/assets/tables-view.jpg differ diff --git a/docs/get-started/setup-lightdash/assets/update-connection.jpg b/docs/get-started/setup-lightdash/assets/update-connection.jpg new file mode 100644 index 0000000..71cfbee Binary files /dev/null and b/docs/get-started/setup-lightdash/assets/update-connection.jpg differ diff --git a/docs/get-started/setup-lightdash/connect-project.mdx b/docs/get-started/setup-lightdash/connect-project.mdx new file mode 100644 index 0000000..469f4da --- /dev/null +++ b/docs/get-started/setup-lightdash/connect-project.mdx @@ -0,0 +1,1031 @@ +import ChooseDatabase from './assets/choose-database.png'; +import GetToProjects from './assets/get-to-projects.png'; +import ProjectIdList from './assets/project-id-list.png'; +import DbtCloudCredentials from './assets/dbt-cloud-credentials.png'; +import DataLocation from './assets/data-location.png'; +import SnowflakeAccountUrl from './assets/snowflake-account-url.png'; +import SnowflakeUsersList from './assets/snowflake-users-list.png'; +import SnowflakeLoginForm from './assets/snowflake-login-form.png'; +import SnowflakeRolesList from './assets/snowflake-roles-list.png'; +import SnowflakeDatabaseList from './assets/snowflake-database-list.png'; +import SnowflakeWarehouseList from './assets/snowflake-warehouse-list.png'; +import OauthScope from '../assets/oauth-scope.png'; +import DatabricksConnectScreenshot from './assets/databricks-connect-screenshot.png'; +import DatabricksAccessScreenshot from './assets/databricks-access-screenshot.png'; +import SelectSettings from './assets/select-settings.jpg'; +import ProjectConnectionSettings from './assets/project-connection-settings.jpg'; +import DbtConnectionSettings from './assets/dbt-connection-settings.jpg'; +import FineGrainedRepo from './assets/fine-grained-repo.png'; +import FineGrainedPermissions from './assets/fine-grained-permissions.png'; + +# Update your project connection + +To setup your Lightdash connection you'll need to: + +1. Connect to your data warehouse (bigquery, postgres, redshift, snowflake, databricks) +2. Connect to your dbt project + +## Open up your Lightdash instance to get started. + +**To update an existing connection**, head to: + +1. `Settings` +2. `Project management` +3. `Settings` for your project + +(see steps 1-3 in the image below) + +**To create a new project connection**, head to: + +1. `Settings` +2. `Project management` +3. `Create New` + +(see steps 1, 2 & 4 in the image below) + + + +## 1. Connect to a warehouse + + + +We currently support: + +1. [Bigquery](#bigquery) +2. [Postgres](#postgres) +3. [Redshift](#redshift) +4. [Snowflake](#snowflake) +5. [Databricks](#databricks) +6. [Trino](#Trino) + +We always recommend giving read-only permissions to Lightdash, that way you ensure than no data can be manipulated. See each section below for warehouse specific details. + +:::info + +Since we host your Lightdash for you, you may need to add our static IP addresses to the allow-list for your security group or firewall rules so they don’t block calls from your Lightdash Cloud to your connected databases. + +If you login at: + +- **app.lightdash.cloud** use **35.245.81.252** +- **eu1.lightdash.cloud** use **34.79.239.130** + +If you login at a different domain, look for the IP in the project settings page (see image below). +::: + +![screenshot-ip-address](assets/screenshot-ip-address.png) + +### Bigquery + +#### Project + +This is project ID from Google Cloud Platform for the data that you want to connect Lightdash to. + +To find your project ID, head to the [BigQuery Cloud console](https://console.cloud.google.com/). + +Once you're in there, click on the project name in the top bar. + + + +Then, you should see all of the projects and their project IDs in your organization (that you have access to). + + + +For the project you want to connect Lightdash to, just copy its `id` and pop it into the `project` field in the Warehouse Connection form in Lightdash. + +#### Data set + +This is the default dataset used by dbt to compile and run your dbt project. You can find this in the dbt cloud IDE +or your local `profiles.yml` file. + +If you're a dbt cloud user you can find this under your profile in the dbt cloud IDE: + + + +If you work with dbt locally, then check your `profiles.yml` file at `~/.dbt/profiles.yml` and look for a field +named `dataset`: + +```yaml +my-profile: + target: dev + outputs: + dev: + type: bigquery + method: oauth + project: abc-123 + dataset: my_dataset # look for this one! + ... +``` + +#### Location + +The data location of the dataset in BigQuery where the output of your dbt models is written to. + +`location` may be either a multi-regional location (e.g. `EU`, `US`), or a regional location (e.g. `us-west2` ). Check out the [BigQuery documentation](https://cloud.google.com/bigquery/docs/locations) for more information on dataset locations. + +You can find the location of the dataset you're using for your dbt project [in your dbt `profiles.yml` file](https://docs.getdbt.com/reference/warehouse-profiles/bigquery-profile#dataset-locations), or in your BigQuery console. + + + +#### Key File + +To connect to BigQuery, you'll need to have a service account that you can use with Lightdash. You can read more about [creating and managing service accounts with Google BigQuery in their docs](https://cloud.google.com/iam/docs/creating-managing-service-accounts). + +:::info + +If you're creating a new service account, make sure that you save your JSON key file somewhere safe! You'll need it for connecting to Lightdash. + +::: + +The service account you use with Lightdash will need to have the following roles in your GCP project: + +- `roles/bigquery.dataViewer` (to see data in your project) +- `roles/bigquery.jobUser` (to run queries in your project) + +If you need to provide access to data across multiple BigQuery projects, the service account will need to be granted `roles/bigquery.dataViewer` on each additional BigQuery project. + +Once you have a service account all ready to go, you'll need to add its JSON key file to Lightdash in the `key file` section of the Warehouse Connection page. + +#### Timeout in seconds + +BigQuery supports query timeouts. By default, the timeout is set to 300 seconds. If a query run by Lightdash takes longer than this timeout to complete, then BigQuery may cancel the query and issue the following error: + +``` +Operation did not complete within the designated timeout. +``` + +To change this timeout, use the `Timeout in seconds` configuration. + +#### Priority + +The priority for the BigQuery jobs that Lightdash executes can be configured with the `priority` configuration in your Warehouse Connection settings. The `priority` field can be set to one of `batch` or `interactive`. + +For more information on query priority, [check out the BigQuery documentation.](https://cloud.google.com/bigquery/docs/running-queries) + +#### Retries + +The `retries` configuration specifies the number of times Lightdash should retry queries that result in unhandled server errors. + +For example, setting `retries` to 5 means that Lightdash will retry BigQuery queries 5 times with a delay. If the query does not succeed after the fifth attempt, then Lightdash will raise an error. + +By default, the number of retries is set to 3. + +#### Maximum bytes billed + +If a value for the `Maximum bytes billed` is set, then queries executed by Lightdash will fail if they exceed the configured maximum bytes threshhold. This configuration should be supplied as an integer number of bytes. + +For example, setting this to `1000000000` means if a query would bill more than a gigabyte of data (e.g. 2Gb), then BigQuery will reject the query and you'd get an error like this: + +``` + Query exceeded limit for bytes billed: 1000000000. 2000000000 or higher required. +``` + +#### Start of week + +This controls what day is the start of the week in Lightdash. `Auto` sets it to whatever the default is for your data warehouse. Or, you can customize it and select the day of the week from the drop-down menu. This will be taken into account when using 'WEEK' time interval in Lightdash. + +#### Execution project + +Here you can specify an execution project to bill for query execution, instead of using the project where your dbt resources are materialized. If you leave this blank, all costs get applied to the project from the top of the connection details. + +--- + +### Postgres + +You can see more details in [dbt documentation](https://docs.getdbt.com/reference/warehouse-profiles/postgres-profile). + +#### Host + +This is the host where the database is running. + +#### User + +This is the database user name. + +#### Password + +This is the database user password. + +#### DB name + +This is the database name. + +#### Schema + +This is the default schema used by dbt to compile and run your dbt project. You can find this in the dbt cloud IDE +or your local `profiles.yml` file. + +If you're a dbt cloud user you can find this under your profile in the dbt cloud IDE: + + + +If you work with dbt locally, then check your `profiles.yml` file at `~/.dbt/profiles.yml` and look for a field +named `schema`: + +```yaml +company-name: + target: dev + outputs: + dev: + type: postgres + host: [hostname] + user: [username] + password: [password] + port: [port] + dbname: [database name] + schema: [dbt schema] # look for this one! +``` + +#### Port + +This is the port where the database is running. + +#### Keep alive idle (seconds) + +This specifies the amount of seconds with no network activity after which the operating system should send a TCP keepalive message to the client. +You can see more details in [postgresqlco documentation](https://postgresqlco.nf/doc/en/param/tcp_keepalives_idle/). + +#### Search path + +This controls the Postgres "search path". +You can see more details in [dbt documentation](https://docs.getdbt.com/reference/warehouse-profiles/postgres-profile#search_path). + +#### SSL mode + +This controls how dbt connects to Postgres databases using SSL. +You can see more details in [dbt documentation](https://docs.getdbt.com/reference/warehouse-profiles/postgres-profile#sslmode). + +#### Start of week + +This controls what day is the start of the week in Lightdash. `Auto` sets it to whatever the default is for your data warehouse. Or, you can customize it and select the day of the week from the drop-down menu. This will be taken into account when using 'WEEK' time interval in Lightdash. + +--- + +### Redshift + +You can see more details in [dbt documentation](https://docs.getdbt.com/reference/warehouse-profiles/redshift-profile). + +#### Host + +This is the host where the database is running. + +#### User + +This is the database user name. + +#### Password + +This is the database user password. + +#### DB name + +This is the database name. + +#### Schema + +This is the default schema used by dbt to compile and run your dbt project. You can find this in the dbt cloud IDE +or your local `profiles.yml` file. + +If you're a dbt cloud user you can find this under your profile in the dbt cloud IDE: + + + +If you work with dbt locally, then check your `profiles.yml` file at `~/.dbt/profiles.yml` and look for a field +named `schema`: + +```yaml +company-name: + target: dev + outputs: + dev: + type: redshift + host: hostname.region.redshift.amazonaws.com + user: username + password: password1 + port: 5439 + dbname: analytics + schema: analytics # look for this one! +``` + +#### Port + +This is the port where the database is running. + +#### Keep alive idle (seconds) + +This specifies the amount of seconds with no network activity after which the operating system should send a TCP keepalive message to the client. + +If the database closes its connection while Lightdash is waiting for data, you may see the error `SSL SYSCALL error: EOF detected`. Lowering the [`keepalives_idle` value](https://www.postgresql.org/docs/9.3/libpq-connect.html) may prevent this, because the server will send a ping to keep the connection active more frequently. + +By default, this value is set to 240 seconds, but can be configured lower (perhaps 120 or 60), at the cost of a chattier network connection. + +#### SSL mode + +This controls how dbt connects to Postgres databases using SSL. + +#### RA3 Node + +Allow dbt to use cross-database-resources + +#### Start of week + +This controls what day is the start of the week in Lightdash. `Auto` sets it to whatever the default is for your data warehouse. Or, you can customize it and select the day of the week from the drop-down menu. This will be taken into account when using 'WEEK' time interval in Lightdash. + +--- + +### Snowflake + +You can see more details in [dbt documentation](https://docs.getdbt.com/reference/warehouse-profiles/snowflake-profile). + +#### Account + +This is your Snowflake [account identifer](https://docs.snowflake.com/en/user-guide/admin-account-identifier.html#format-1-preferred-account-name-in-your-organization). + +The easiest way to find this is to login to snowflake in your browser and your account identifier is whatever comes +before `snowflakecomputing.com`. + +For example in the image below, the user logs in via `https://aaa99827.snowflakecomputing.com/console/login#/` so +the account identifier is `aaa99827`. + + + +If you don't have access via the browser, you can use the following format `-` where +`organization_name` and `account_name` can be found by following any of the methods listed in +[Managing accounts in your organization](https://docs.snowflake.com/en/user-guide/organizations-manage-accounts.html#label-viewing-organization-name). + +#### User + +This is the login name for your Snowflake user. This is usually the same username you use to login to +Snowflake. + +Alternatively, you can [create a new user through the snowflake console](https://docs.snowflake.com/en/user-guide/admin-user-management.html) +with a username and password specifically for Lightdash to use. + +If you're a snowflake admin you can list all users available in the snowflake console: + + + +#### Password + +This is the password your Snowflake user. This is usually the same password you use to login to Snowflake: + + + +Alternatively, you can [create a new user through the snowflake console](https://docs.snowflake.com/en/user-guide/admin-user-management.html) +with a username and password specifically for Lightdash to use. + +If you're a Snowflake admin you can list all users available in the snowflake console: + + + +#### Role + +This is the security role that you would like to use when running queries as the specified user. The role must have +access to any warehouses, databases, schemas, and tables you want to use. + +If you're a Snowflake admin you can list all roles available in the snowflake console: + + + +You can configure your role to allow read access to all warehouses, databases, schemas, and tables by following the +guide for +[Creating custom read-only roles](https://docs.snowflake.com/en/user-guide/security-access-control-configure.html#creating-custom-read-only-roles). + +#### Database + +This is the name of your database. The specified user must be granted access to this database. You can see a list of +databases available in the snowflake console: + + + +#### Warehouse + +This is the name of the warehouse you would like to use for running queries. The specified user must be grantend +access to use this warehouse. You can see al list of warehouses available in the snowflake console: + + + +:::info + +If β€œAlways use this warehouse” is set to yes, this warehouse will be used for all queries, even if the dbt configuration specifies a different warehouse using snowflake_warehouse. + +::: + +#### Schema + +This is the default schema used by dbt to compile and run your dbt project. You can find this in the dbt cloud IDE +or your local `profiles.yml` file. + +If you're a dbt cloud user you can find this under your profile in the dbt cloud IDE: + + + +If you work with dbt locally, then check your `profiles.yml` file at `~/.dbt/profiles.yml` and look for a field +named `schema`: + +```yaml +my-snowflake-db: + target: dev + outputs: + dev: + type: snowflake + account: [account id] + user: [username] + password: [password] + role: [user role] + database: [database name] + warehouse: [warehouse name] + schema: [dbt schema] # Look for this one! +``` + +#### Keep client session alive + +This is intended to keep Snowflake sessions alive beyond the typical 4 hour timeout limit. +You can see more details in [dbt documentation](https://docs.getdbt.com/reference/warehouse-profiles/snowflake-profile#client_session_keep_alive). + +#### Query tag + +A value with which to tag all queries, for later searching in [QUERY_HISTORY view](https://docs.snowflake.com/en/sql-reference/account-usage/query_history.html)) + +#### Start of week + +This controls what day is the start of the week in Lightdash. `Auto` sets it to whatever the default is for your data warehouse. Or, you can customize it and select the day of the week from the drop-down menu. This will be taken into account when using 'WEEK' time interval in Lightdash. + +--- + +### Databricks + +The credentials needed to connect to your cluster can be found in the ODBC options in your databricks account: + +1. Go to the `Compute` tab in the sidebar. +2. Click the configuration tab for the cluster that you're connecting to Lightdash. +3. Expand the `Advanced options` tab +4. Open the `JDBC/ODBC` tab + + + +#### Server hostname + +Follow the instructions above to find your ODBC connection instructions. + +#### HTTP Path + +Follow the instructions above to find your ODBC connection instructions. + +#### Port + +Follow the instructions above to find your ODBC connection instructions. + +#### Personal Access Token + +Your personal access token can be found in your user settings in databricks: + +1. Open `Settings` by clicking the cog βš™οΈ in the sidebar and select `User settings` +2. Click `Generate token`. You'll be asked to enter a name and expiry. +3. Copy the token + + + +#### Database + +The default database name used by dbt for this connection. + +#### Start of week + +This controls what day is the start of the week in Lightdash. `Auto` sets it to whatever the default is for your data warehouse. Or, you can customize it and select the day of the week from the drop-down menu. This will be taken into account when using 'WEEK' time interval in Lightdash. + +--- + +### Trino + +We only support [LDAP authentication with Trino](https://trino.io/docs/current/security/ldap.html). You can see more details in [dbt's documentation](https://docs.getdbt.com/reference/warehouse-setups/trino-setup#configuration). + +#### Host + +The hostname of your cluster. E.g. `mycluster.mydomain.com` + +Don't include the http:// or https:// prefix. + +#### User + +The username (of the account) to log in to your cluster. When connecting to Starburst Galaxy clusters, you must include the role of the user as a suffix to the username. + +Format for Starburst Enterprise or Trino: +`user.name` +`user.name@mydomain.com` + +Format for Starburst Galaxy: +`user.name@mydomain.com/role` + +#### Password + +This is the password for authentication. + +#### DB name + +Specify the name of the database that your dbt models are built into. This is the name of a catalog in your cluster. + +e.g. `my_postgres_catalog` + +#### Port + +The port to connect to your cluster. By default, it's 443 for TLS enabled clusters. + +e.g. `443` + +#### SSL mode + +This controls how dbt connects to Trino database using SSL. + +#### Start of week + +This controls what day is the start of the week in Lightdash. `Auto` sets it to whatever the default is for your data warehouse. Or, you can customize it and select the day of the week from the drop-down menu. This will be taken into account when using 'WEEK' time interval in Lightdash. + +## 2. Import a dbt project + +--- + +Connecting Lightdash to a hosted dbt project means that you'll be able to keep your Lightdash instance in sync with the changes in your dbt project. + +To connect your dbt project, just head to your project connection settings in Lightdash: + + + +Then scroll down to your dbt project connection: + + + +Pick your repository type and follow the guide below: + +- [GitHub](#github) +- [Gitlab](#gitlab) +- [Azure DevOps](#azure-devops) +- [Bitbucket](#bitbucket) + +We don't support connecting Lightdash to [dbt Cloud managed repositories](https://docs.getdbt.com/docs/dbt-cloud/cloud-configuring-dbt-cloud/cloud-using-a-managed-repository). If you're using dbt Cloud and you'd like to use Lightdash, you'll need to have a remote repository for your dbt project in one of the services listed above. + +### GitHub + +#### Personal access token + +You can create a personal access token (classic), or a fine-grained access token (beta). + +##### Personal access token (classic) + +This is used to access your repo. +See the [instructions for creating a personal access token here](https://docs.github.com/en/github/authenticating-to-github/keeping-your-account-and-data-secure/creating-a-personal-access-token). + +Select `repo` scope when you're creating the token. + + + +##### Fine-grained access token (beta) + +Fine-grained access tokens are new special tokens that can only give access to individual repositories on your github account. +You can read more about it on the [Github docs](https://docs.github.com/en/authentication/keeping-your-account-and-data-secure/creating-a-personal-access-token#creating-a-fine-grained-personal-access-token). + +1. Go to [settings > Developer access > Personal access tokens > fine-grained token](https://github.com/settings/personal-access-tokens/new) +2. Add the name, expiration, description and owner (we'll need their username later) +3. Add repository access, you might want to give access only to your `dbt` repository + + + +4. On repository permissions, select `Contents` + + + +5. Click `Generate token` and copy the token. + +You could also replace your old tokens with new fine-grained tokens on project settings. + +#### Repository + +This should be in the format `my-org/my-repo`. e.g. `lightdash/lightdash-analytics` + +#### Branch + +This is the branch in your GitHub repo that Lightdash should sync to. e.g. `main`, `master` or `dev` + +By default, we've set this to `main` but you can change it to whatever you'd like. + +#### Project directory path + +This is the folder where your `dbt_project.yml` file is found in the GitHub repository you entered above. + +- Put `/` if your `dbt_project.yml` file is in the main folder of your repo (e.g. lightdash/lightdash-analytics/dbt_project.yml) +- Include the path to the sub-folder where your dbt project is if your dbt project is in a sub-folder in your repo. For example, if my project was in lightdash/lightdash-analytics/dbt/dbt_project.yml, I'd write `/dbt` in this field. + +#### Host domain + +If you've [customized the domain for your GitHub pages](https://docs.github.com/en/pages/configuring-a-custom-domain-for-your-github-pages-site/about-custom-domains-and-github-pages), you can add the custom domain for your project in here. + +By default, this is `github.com` + +#### Target name + +`target` contains information about your dbt connection to your warehouse. + +It's the dataset/schema in your data warehouse that Lightdash will look for your dbt models. By default, we set this to be the same value as you have as the default in your `profiles.yml` file. + +If you want to change this to be something other than the default `target` defined in dbt, you can enter the target of your choice here (for example `dbt_khindson`.) + +To read more about dbt targets, [check out the dbt docs here.](https://docs.getdbt.com/reference/dbt-jinja-functions/target) + +#### Environment variables + +If you've used [environment variables in your dbt `profiles.yml` file](https://docs.getdbt.com/reference/dbt-jinja-functions/env_var), you can add these to Lightdash here. + +For each environment variable, you'll need to add the `key` + `value` pair for the item. + +You'll normally find these values in a file called `.env` in your dbt project directory. + +For example, I might have something like: + +```yaml +profile: + target: prod + outputs: + prod: + type: postgres + host: 127.0.0.1 + user: "{{ env_var('DBT_USER') }}" + .... +``` + +Then a `.env` file like: + +``` +export DBT_USER="myspecialuserkey123" +``` + +So, in Lightdash, I'd add a new environment variable and put `key` as `DBT_USER` and `value` as `myspecialuserkey123`. + +--- + +### GitLab + +#### Personal access token + +This is used to access your repo. +See the [instructions for creating a personal access token here](https://docs.gitlab.com/ee/user/profile/personal_access_tokens.html). + +Select `read_repository` scope when you're creating the token. The token, if using a **project access token**, or the user, when using a **personal access token**, needs to have permission to download the code. Normally this would be the `Reporter` role. + +#### Repository + +You can find this in the GitLab URL when you're in your repo. This should be in the format `my-org/my-repo`. e.g. if my browser had `https://gitlab.com/lightdash/lightdash-analytics.gitlab.io`, I'd put in: `lightdash/lightdash-analytics` as my repository in Lightdash. + +#### Branch + +This is the branch in your GitLab repo that Lightdash should sync to. e.g. `main`, `master` or `dev` + +By default, we've set this to `main` but you can change it to whatever you'd like. + +#### Project directory path + +This is the folder where your `dbt_project.yml` file is found in the GitLab repository you entered above. + +If your `dbt_project.yml` file is in the main folder of your repo (e.g. `lightdash/lightdash-analytics/dbt_project.yml`), +then you don't need to change anything in here. You can just leave the default value we've put in. + +If your dbt project is in a sub-folder in your repo (e.g. `lightdash/lightdash-analytics/dbt/dbt_project.yml`), then +you'll need to include the path to the sub-folder where your dbt project is (e.g. `/dbt`). + +#### Host domain + +If you've [customized the domain for your GitLab pages](https://docs.gitlab.com/ee/user/project/pages/getting_started_part_one.html), you can add the custom domain for your project in here. + +By default, this is `gitlab.io`. + +#### Target name + +`target` contains information about your dbt connection to your warehouse. + +It's the dataset/schema in your data warehouse that Lightdash will look for your dbt models. By default, we set this to be the same value as you have as the default in your `profiles.yml` file. + +If you want to change this to be something other than the default `target` defined in dbt, you can enter the target of your choice here (for example `dbt_khindson`.) + +To read more about dbt targets, [check out the dbt docs here.](https://docs.getdbt.com/reference/dbt-jinja-functions/target) + +#### Environment variables + +If you've used [environment variables in your dbt `profiles.yml` file](https://docs.getdbt.com/reference/dbt-jinja-functions/env_var), you can add these to Lightdash here. + +For each environment variable, you'll need to add the `key` + `value` pair for the item. + +You'll normally find these values in a file called `.env` in your dbt project directory. + +For example, I might have something like: + +```yaml +profile: + target: prod + outputs: + prod: + type: postgres + host: 127.0.0.1 + user: "{{ env_var('DBT_USER') }}" + .... +``` + +Then a `.env` file like: + +``` +export DBT_USER="myspecialuserkey123" +``` + +So, in Lightdash, I'd add a new environment variable and put `key` as `DBT_USER` and `value` as `myspecialuserkey123`. + +--- + +### Azure DevOps + +#### Personal access token + +This is your secret token used to access Azure Devops. See the [instructions to create a personal access token](https://docs.microsoft.com/en-us/azure/devops/organizations/accounts/use-personal-access-tokens-to-authenticate?view=azure-devops&tabs=Windows) +You must specify at least the Repo:Read scope. + +#### Organization + +This is the name of the organization that owns your repository + +#### Project + +This is the name of the project that owns your repository + +#### Repository + +This is the name of the repository. For many projects, this is the same as your project name above. + +#### Branch + +This is the branch in your repository that Lightdash should sync to. e.g. `main`, `master` or `dev` + +By default, we've set this to `main` but you can change it to whatever you'd like. + +#### Project directory path + +This is the folder where your `dbt_project.yml` file is found in the repository you entered above. + +If your `dbt_project.yml` file is in the main folder of your repo (e.g. `lightdash/lightdash-analytics/dbt_project.yml`), +then you don't need to change anything in here. You can just leave the default value we've put in. + +If your dbt project is in a sub-folder in your repo (e.g. `lightdash/lightdash-analytics/dbt/dbt_project.yml`), then +you'll need to include the path to the sub-folder where your dbt project is (e.g. `/dbt`). + +#### Target name + +`target` contains information about your dbt connection to your warehouse. + +It's the dataset/schema in your data warehouse that Lightdash will look for your dbt models. By default, we set this to be the same value as you have as the default in your `profiles.yml` file. + +If you want to change this to be something other than the default `target` defined in dbt, you can enter the target of your choice here (for example `dbt_khindson`.) + +To read more about dbt targets, [check out the dbt docs here.](https://docs.getdbt.com/reference/dbt-jinja-functions/target) + +#### Environment variables + +If you've used [environment variables in your dbt `profiles.yml` file](https://docs.getdbt.com/reference/dbt-jinja-functions/env_var), you can add these to Lightdash here. + +For each environment variable, you'll need to add the `key` + `value` pair for the item. + +You'll normally find these values in a file called `.env` in your dbt project directory. + +For example, I might have something like: + +```yaml +profile: + target: prod + outputs: + prod: + type: postgres + host: 127.0.0.1 + user: "{{ env_var('DBT_USER') }}" + .... +``` + +Then a `.env` file like: + +``` +export DBT_USER="myspecialuserkey123" +``` + +So, in Lightdash, I'd add a new environment variable and put `key` as `DBT_USER` and `value` as `myspecialuserkey123`. + +### Local dbt project + +:::caution Prerequisite + +Unsuitable for production and only available for Lightdash instances installed on your local machine + +::: + +To start Lightdash with the option to connect to a local dbt project, you must specify the directory of the dbt project when +you start docker compose: + +```shell +# Specify the absolute path to your dbt project +# e.g. export DBT_PROJECT_DIR=/Users/elonmusk/mydbtproject +export DBT_PROJECT_DIR= # Enter your path here! +docker compose start +``` + +--- + +### Bitbucket + +#### Username + +This is the login name for your Bitbucket user. This is usually the same username you use to login to +Bitbucket. You can find your username in Bitbucket by: + +1. Going to your avatar in the bottom left and click **Personal settings**. +2. From the **Account settings** page, check the value next to the **Username** + +Alternatively, you can [create a new user through the Bitbucket console](https://confluence.atlassian.com/bitbucketserver/users-and-groups-776640439.html) +with a username and password specifically for Lightdash to use. + +#### Http access token + +Getting a token depends on whether you use Bitbucket Cloud or Bitbucket server: + +- Bitbucket Cloud users should [follow instructions for creating an App Password](https://support.atlassian.com/bitbucket-cloud/docs/create-an-app-password/) +- Bitbucket Server users should [follow instructions for creating a HTTP Access Token](https://confluence.atlassian.com/bitbucketserver/http-access-tokens-939515499.html) + +Select `Project read` and `Repository read` scope when you're creating the token. + +#### Repository + +This should be in the format `my-org/my-repo`. e.g. `lightdash/lightdash-analytics` + +#### Branch + +This is the branch in your Bitbucket repo that Lightdash should sync to. e.g. `main`, `master` or `dev` + +By default, we've set this to `main` but you can change it to whatever you'd like. + +#### Project directory path + +This is the folder where your `dbt_project.yml` file is found in the Bitbucket repository you entered above. + +- Put `/` if your `dbt_project.yml` file is in the main folder of your repo (e.g. lightdash/lightdash-analytics/dbt_project.yml) +- Include the path to the sub-folder where your dbt project is if your dbt project is in a sub-folder in your repo. For example, if my project was in lightdash/lightdash-analytics/dbt/dbt_project.yml, I'd write `/dbt` in this field. + +#### Host domain + +If you've [customized the domain for your Bitbucket server](https://confluence.atlassian.com/bitbucketserver/specify-the-bitbucket-base-url-776640392.html), you can add the custom domain for your project in here. + +#### Target name + +`target` contains information about your dbt connection to your warehouse. + +It's the dataset/schema in your data warehouse that Lightdash will look for your dbt models. By default, we set this to be the same value as you have as the default in your `profiles.yml` file. + +If you want to change this to be something other than the default `target` defined in dbt, you can enter the target of your choice here (for example `dbt_khindson`.) + +To read more about dbt targets, [check out the dbt docs here.](https://docs.getdbt.com/reference/dbt-jinja-functions/target) + +#### Environment variables + +If you've used [environment variables in your dbt `profiles.yml` file](https://docs.getdbt.com/reference/dbt-jinja-functions/env_var), you can add these to Lightdash here. + +For each environment variable, you'll need to add the `key` + `value` pair for the item. + +You'll normally find these values in a file called `.env` in your dbt project directory. + +For example, I might have something like: + +```yaml +profile: + target: prod + outputs: + prod: + type: postgres + host: 127.0.0.1 + user: "{{ env_var('DBT_USER') }}" + .... +``` + +Then a `.env` file like: + +``` +export DBT_USER="myspecialuserkey123" +``` + +So, in Lightdash, I'd add a new environment variable and put `key` as `DBT_USER` and `value` as `myspecialuserkey123`. + +--- diff --git a/docs/get-started/setup-lightdash/get-project-lightdash-ready.mdx b/docs/get-started/setup-lightdash/get-project-lightdash-ready.mdx new file mode 100644 index 0000000..cf4e9ea --- /dev/null +++ b/docs/get-started/setup-lightdash/get-project-lightdash-ready.mdx @@ -0,0 +1,161 @@ +import dbtRepoExample from './assets/dbt-repo-example.png'; +import TablesView from './assets/tables-view.jpg'; +import ExampleTable from './assets/example-table.jpg'; +import Overview from './assets/overview-intro.png'; +import PersonalAccessToken from './assets/personal-access-token.png'; +import UpdateConnection from './assets/update-connection.jpg'; +import HowToInstallTheLightdashCli from './../../snippets/how-to-install-the-lightdash-cli.mdx'; + +# Create your first project in Lightdash + + + +In Lightdash, everything you need for BI is written as code in your dbt project. You use dbt to transform all of the data from your data warehouse, then you use Lightdash to explore it. + +But, before you hook up your dbt project to Lightdash, we need to make sure we have Tables to explore. **In this setup guide, we'll walk you through the steps of installing + using the Lightdash CLI and creating the first Tables in your project.** + +:::tip + +**New to dbt?** If you haven't used dbt before, [follow dbt's getting started guide](https://docs.getdbt.com/tutorial/setting-up) +before proceeding with setting up Lightdash. + +::: + +## What are Tables? + +Tables are the starting point to any data exploration in Lightdash - they're the data in Lightdash that you can query. The beauty of Lightdash is that we're pretty well synced with your dbt project. So, in Lightdash, Tables actually come from dbt models that have been defined in your dbt project's `.yml` files. + +If your dbt model has been defined in a .yml file, it will appear in Lightdash as a Table. + +:::tip + +Not sure what a .yml file is? Make sure to [check out dbt's docs](https://docs.getdbt.com/reference/configs-and-properties) to learn more about building .yml files for your dbt project. + +::: + +Here's an example of our `Community stats daily` model we've defined in dbt. In Lightdash, we can see it in our list of available Tables to explore. + + + +Now that we know what tables are, let's add some and create our first project! + +--- + +## Step 1: Install the Lightdash CLI tool + + + +--- + +## Step 2: Login to the CLI + +We've automatically generated a personal access token that you can use to login to the CLI, so you just need to copy-paste that command in your Terminal. + +It's Step 2. and should look something like this: + +```shell +lightdash login https://{{ lightdash_domain }} --token my-super-secret-token +``` + +Where `{{ lightdash_domain }}` is `app.lightdash.cloud` for Lightdash Cloud users. Or your own domain if self-hosting. If you want to login using another method, then you [can check out our authentication methods here](/guides/cli/cli-authentication.mdx). + +--- + +## Step 3: Add Tables + +:::info + +If you're using dbt Cloud, you'll need to [clone your repo to your local machine](https://docs.github.com/en/repositories/creating-and-managing-repositories/cloning-a-repository) before completing the next steps. + +::: + +To get our dbt project Lightdash-ready, we need to define all of the columns in our dbt models that we want to explore in Lightdash. We've made this really easy to do using our CLI tool and the command: + +```shell +lightdash dbt run +``` + +This will generate Tables and dimensions for your **_entire_** dbt project. It will document all of the columns in your models and these are what we explore in Lightdash as `Dimensions`. + +For example, if we have a `projects.yml` file, we'd have a Table called `Projects` and it would have the dimensions: `Dashboards created num total` and `Days since project created`. + + + +
+ + Error: Not a dbt project (or any of the parent directories). Missing + dbt_project.yml file + + Make sure that you're in your dbt project folder before you try doing `lightdash + dbt run`! Otherwise, you'll run into this error. +
+ +#### If you only want to generate Tables and dimensions for **_some_** of the models in your dbt project, check this out + +
+ Generate Tables and dimensions for some of the models in my dbt project: + There may be a specific set of models that you want to start out with as Tables in Lightdash. If this is the case, we recommend [using dbt's `tags`](https://docs.getdbt.com/reference/resource-configs/tags) to tag these models. You can use sets of existing tags, or you can create a new Lightdash-specific tag. Something like this: + +```yaml +{{ + config( + materialized='table', + tags=['lightdash'] + ) +}} +``` + +The `lightdash dbt run` command supports dbt model selection syntax to generate .yml files for a group of models. This means you can use tags or other model selection syntax to specify which models you want to generate dimensions for in your dbt project. + +```shell +lightdash dbt run -s tag:lightdash # all models with the lightdash tag +lightdash dbt run -s payments # just payments +lightdash dbt run -s payments+ # payments and all children +lightdash dbt run -s +payments # payments and all parents +lightdash dbt run -s payments+ +customers tag:lightdash # mix and match +``` + +
+ +--- + +## Step 4: Create your project + +Now, your dbt project is Lightdash-ready! Just run this command and follow the link to start exploring your data: + +```bash +lightdash deploy --create +``` + +--- + +## Next steps: Update your project connection settings + +We create your first project using your local dbt `profiles.yml` file. So, you might want to update your connection settings to: + +1. Set up a service account for Lightdash to run on (instead of using your personal connection details) +2. Connect Lightdash to your version controlled dbt project so changes are automatically synced. + +Check out details on [updating your connection settings here](/get-started/setup-lightdash/connect-project.mdx). + + diff --git a/docs/get-started/setup-lightdash/how-to-create-metrics.mdx b/docs/get-started/setup-lightdash/how-to-create-metrics.mdx new file mode 100644 index 0000000..dc2fded --- /dev/null +++ b/docs/get-started/setup-lightdash/how-to-create-metrics.mdx @@ -0,0 +1,5 @@ +import HowToCreateMetrics from './../../snippets/how-to-create-metrics.mdx'; + +# How to create metrics + + diff --git a/docs/get-started/setup-lightdash/intro-metrics-dimensions.mdx b/docs/get-started/setup-lightdash/intro-metrics-dimensions.mdx new file mode 100644 index 0000000..ba904c0 --- /dev/null +++ b/docs/get-started/setup-lightdash/intro-metrics-dimensions.mdx @@ -0,0 +1,5 @@ +import IntroMetricsDimensions from './../../snippets/intro-metrics-dimensions.mdx'; + +# An intro to metrics and dimensions + + diff --git a/docs/get-started/setup-lightdash/intro.mdx b/docs/get-started/setup-lightdash/intro.mdx new file mode 100644 index 0000000..6793342 --- /dev/null +++ b/docs/get-started/setup-lightdash/intro.mdx @@ -0,0 +1,10 @@ +# πŸ— Setting up a new project + +This tutorial is for people who are new to Lightdash and would like to learn how to set up a new project. We'll show you how to get your dbt project Lightdash-ready, how to explore your data in Lightdash, and how to add metrics to your project. + +1. [Create your first project in Lightdash](/get-started/setup-lightdash/get-project-lightdash-ready) +2. [Update your project connection](/get-started/setup-lightdash/connect-project) +3. [An intro to dimensions and metrics](/get-started/setup-lightdash/intro-metrics-dimensions) +4. [Using Tables and the Explore View](/get-started/setup-lightdash/using-explores) +5. [Adding metrics](/get-started/setup-lightdash/how-to-create-metrics) +6. [Sharing insights with your team](/get-started/exploring-data/sharing-insights) diff --git a/docs/get-started/setup-lightdash/invite-new-users.mdx b/docs/get-started/setup-lightdash/invite-new-users.mdx new file mode 100644 index 0000000..96add71 --- /dev/null +++ b/docs/get-started/setup-lightdash/invite-new-users.mdx @@ -0,0 +1,43 @@ +import InviteUserAction from './assets/invite_user_action.png'; +import AddUserEmail from './assets/add-user-email.png'; +import PendingInvites from './assets/pending-invites.png'; +import AllowedEmailDomains from './../../snippets/allowed-email-domains.mdx'; + +# Inviting teammates to your Lightdash project + +You can only share things with people you've invited to your Lightdash project. Users with admin access to your project can invite users. + +## Allowing users with certain email domain(s) to join automatically + + + +## Inviting new users individually + +To invite your teammates individually, just click on `Settings` --> `User Management` --> `Add user`. + + + +You then need to input the email address of the user you want to invite and select the role you want to assign them. You can read more about [user roles and permissions in Lightdash here](../../references/roles.mdx). + +Once you hit `send invite`, we'll send an email to the new user with their invite link. + + + +Once you're done inviting users, you can head back to the list of users in the `User Management` tab, scroll to the bottom and see all of the pending invitations for your project. You can also re-generate an invite link if you need to! + + diff --git a/docs/get-started/setup-lightdash/new-to-dbt.mdx b/docs/get-started/setup-lightdash/new-to-dbt.mdx new file mode 100644 index 0000000..ffad2eb --- /dev/null +++ b/docs/get-started/setup-lightdash/new-to-dbt.mdx @@ -0,0 +1,5 @@ +:::note Article deprecated + +This article has been moved here: [Getting your dbt project Lightdash-ready](/get-started/setup-lightdash/get-project-lightdash-ready) + +::: diff --git a/docs/get-started/setup-lightdash/sharing-insights.mdx b/docs/get-started/setup-lightdash/sharing-insights.mdx new file mode 100644 index 0000000..25ad6c3 --- /dev/null +++ b/docs/get-started/setup-lightdash/sharing-insights.mdx @@ -0,0 +1,5 @@ +import SharingInsights from './../../snippets/sharing-insights.mdx'; + +# Share insights with your team + + diff --git a/docs/get-started/setup-lightdash/using-explores.mdx b/docs/get-started/setup-lightdash/using-explores.mdx new file mode 100644 index 0000000..10721eb --- /dev/null +++ b/docs/get-started/setup-lightdash/using-explores.mdx @@ -0,0 +1,5 @@ +import UsingExplores from './../../snippets/using-explores.mdx'; + +# Using Tables and the Explore view + + diff --git a/docs/guides/_category_.json b/docs/guides/_category_.json new file mode 100644 index 0000000..4719ab6 --- /dev/null +++ b/docs/guides/_category_.json @@ -0,0 +1,4 @@ +{ + "label": "How to guides", + "position": 3 +} diff --git a/docs/guides/adding-slack-integration.mdx b/docs/guides/adding-slack-integration.mdx new file mode 100644 index 0000000..233448e --- /dev/null +++ b/docs/guides/adding-slack-integration.mdx @@ -0,0 +1,46 @@ +# Add the Slack integration + +:::info + +Only your Lightdash Organization Admins can add or configure the Slack integration. + +::: + +## Adding Slack to your organization + +Add the Slack integration by navigating to **Organization settings**, then **Integrations**. Click on **Add to Slack**. + +This will open a confirmation page to give permission to the Lightdash Slack App to access your Lightdash and Slack Organizations. If you're not a Slack admin you might need to request approval to add the app. + +Once the app is approved, you're all set! Watch the video below to see the step-by-step process. + +## Walkthrough video + +Here's a two minute video showing you how to install and configure the Lightdash Slack integration: + +
+ +
+ +## Next steps + +Check out the [guide on using the Slack integration](/guides/using-slack-integration) and the [Slack integration reference doc](/references/slack-integration.mdx) to see all the ways Lightdash works with Slack. diff --git a/docs/guides/adding-tables-to-lightdash.mdx b/docs/guides/adding-tables-to-lightdash.mdx new file mode 100644 index 0000000..2822320 --- /dev/null +++ b/docs/guides/adding-tables-to-lightdash.mdx @@ -0,0 +1,259 @@ +import dbtRepoExample from './assets/dbt-repo-example.png'; +import TablesConfiguration from './assets/tables-configuration.jpg'; +import TablesView from './assets/tables-view.jpg'; +import PickTables from './assets/pick-tables.png'; +import LightdashTag from './assets/lightdash-tag.png'; +import ExampleTable from './assets/example-table.jpg'; +import OverviewTables from './assets/overview-tables.png'; + +# Adding and managing Tables in your Lightdash project + + + +In Lightdash, everything you need for BI is written as code in your dbt project. You use dbt to transform all of the data from your data warehouse, then you use Lightdash to explore it. + +So, to add an manage Tables in Lightdash, we use dbt. + +We'll walk you through the steps of installing + using the Lightdash CLI and generating the .yml you need to add a new table to your dbt project. + +:::tip + +**New to dbt?** If you haven't used dbt before, [follow dbt's getting started guide](https://docs.getdbt.com/tutorial/setting-up) +before proceeding with setting up Lightdash. + +::: + +## What are Tables? + +Tables are the starting point to any data exploration in Lightdash - they're the data in Lightdash that you can query. The beauty of Lightdash is that we're pretty well synced with your dbt project. So, in Lightdash, Tables actually come from dbt models that have been defined in your dbt project's `.yml` files. + +If your dbt model has been defined in a .yml file, it will appear in Lightdash as a Table. + +:::tip + +Not sure what a .yml file is? Make sure to [check out dbt's docs](https://docs.getdbt.com/reference/configs-and-properties) to learn more about building .yml files for your dbt project. + +::: + +Here's an example of our `Community stats daily` model we've defined in dbt. In Lightdash, we can see it in our list of available Tables to explore. + + + +--- + +## Adding Tables to your Lightdash project using the CLI + +### Step 1. Install the Lightdash CLI tool (if you haven't already) + +The Lightdash CLI is the recommended way to develop your dbt + Lightdash project. It makes development faster and +easier, as well as giving you options for building more powerful automation to manage your Lightdash instance. + +If you haven't installed the Lightdash CLI yet, then [follow this guide to installing and setting it up](/guides/cli/how-to-install-the-lightdash-cli), then come back to these docs once you're ready! + +### Step 2. Add Tables to Lightdash using `lightdash dbt run -s my_model` + +:::info + +Before you get started with the next steps, you might want to check out onto a new branch if you're working with a version controlled project! + +::: + +To get a model in dbt Lightdash-ready, we need to define all of the columns that we want to explore in Lightdash. We've made this really easy to do using our CLI tool and the command: + +```shell +lightdash dbt run -s my_model +``` + +This will generate the Table and dimensions for the model you've selected. It will document all of the columns in your model and these are what we explore in Lightdash as `Dimensions`. + +For example, if I ran `lightdash dbt run -s projects`, we would get: + +- a `projects.yml` file generated in our dbt project +- in Lightdash, we'd have a Table called `Projects` +- our `Projects` table would have the dimensions: `Dashboards created num total` and `Days since project created`. + + + +### Step 3. Preview your changes using `lightdash preview` + +Once you've generated your Tables in dbt, you can test them out in a Lightdash preview environment. + +**Developer previews** are temporary Lightdash projects where you can safely experiment with your metrics, dimensions and charts +without affecting your production project. + +So, let's spin up a developer preview and check out our changes. In your terminal, run the commands: + +```shell +lightdash preview +``` + +You can read more about [Lightdash preview environments here](/guides/cli/how-to-use-lightdash-preview). + +### Step 4. Make sure your changes are in production, then you're ready to explore! + +If you're working with a version controlled project, make sure to **merge your changes into production** (e.g. `main` or `master`). + +If you're working with a local project that isn't version controlled, you don't need to worry about syncing your changes. + +Once you've merged your changes, you'll want to deploy them to production. To do this, just run these commands in your terminal from your dbt project: + +```shell +git checkout main # checkout main or master - or whatever your production branch name is +git pull +lightdash deploy # --target prod. If you use developer profiles in your dbt project, you might need this flag. See below. +``` + +This will deploy the changes in your dbt project to the Lightdash project you set up on your CLI tool earlier. + +:::info + +**Note:** Lightdash's deploy command will deploy using your **default dbt target** unless you specify to use a different target. For example, if you've set up a developer profile where it targets a dev dataset (like `dbt_khindson.my_model_names`), then you'll need to pass the production target in your `lightdash deploy` command. Something like: `lightdash deploy --target prod`. + +::: + +Now, your Table is Lightdash-ready: so, open up Lightdash and your Table should pop up in your project! + +--- + +## Configuring which Tables appear in your Lightdash project + +Sometimes, there are models in our dbt project with .yml files that we might not want to appear in Lightdash (`base` tables, I'm looking at you πŸ‘€). So, we've made it possible for you to configure which Tables you want to appear in Lightdash. + +To get to your Table Configuration settings, just: + +1. Click `Settings` in the navigation bar +2. Click on `project management` in the sidebar +3. Click on the `Settings` button for the project's tables you want to configure +4. Once you're in your `Project settings`, click on the `Tables configuration` in the sidebar. + + + +Now that you're in the right place, let's get to the juicy stuff. You have three options for configuring the Tables that pop up in Lightdash: + + + +1. **Show entire project**: I hope this one isn't too much of a surprise. If you select this option, it shows _all_ of the models with .yml files in your dbt project in Lightdash. + +2. **Show models with any of these tags**: This option depends on dbt tags. You can learn more about [using tags to manage your project here](#limiting-the-tables-in-lightdash-using-dbt-tags). If you already have a specific model tag (or tags) you want to limit Lightdash to using, this is where you can add them in. For example, all of our production models have the tag `prod`, so we've configured our Tables using that tag. + +3. **Show models in this list**: If you're not keen on using tags then you can manually select the models you want to include as Tables in your Lightdash project using this option. + +--- + +## Changing your Table's labels, adding joins, and more! + +Once you're happy with which Tables are showing up in Lightdash, you can [add configurations to your Tables](/references/tables) like: + +- Changing how the Table name appears in Lightdash (using the `labels` config) +- [Joining your Table to other Tables](/guides/how-to-join-tables) (using the `joins` config) + +All of these configurations and more are outlined in the [Tables reference doc here](/references/tables). + +--- + +## πŸ‘©β€πŸ’» Advanced tips for managing Tables + +### We recommend structuring your dbt project with one .yml file per model (or .sql file). + +We've found that this makes it easier to navigate through your .yml files and easier to manage your dbt models, especially as your project becomes bigger. + +Here's an example of our dbt project at Lightdash too see what that looks like in practice: + +- We have one .sql file per model (these are the files where all of our models' business logic sits) +- We have one .yml file per model (these are the files where all of your Tables' configuration sits) + + + +#### But, in my dbt project, I have a single schema.yml file. Not one for each model. Will that still work? + +Yep! We realize that schema files come in all shapes and sizes. + +Some people prefer to write the .yml files for all of their models in a single .yml file at the directory level, and that's totally fine - it will still work with Lightdash. + +But, like we said just above, if you're trying to decide how to setup your dbt project, **we'd recommend having one .yml file per model.** + +### Limiting the Tables in Lightdash using dbt tags + +There may be a specific set of models that you want include as Tables in Lightdash. If this is the case, we recommend [using dbt's `tags`](https://docs.getdbt.com/reference/resource-configs/tags) to tag these models. You can use sets of existing tags, or you can create a new Lightdash-specific tag. + +You can add tags to your model's `.yml` file like this: + +```yaml +version: 2 + +models: + - name: model_name + config: + tags: ['lightdash'] +``` + +Or, to your model's `.sql` file in the config block: + +```yaml +{{ config( + tags=["lightdash"] +) }} + +select ... +``` + +Then, you'll set your [Table Configuration](#configuring-which-tables-appear-in-your-lightdash-project): + + + +### Select the models you want to run using dbt selection syntax + +The `lightdash dbt run` command supports dbt model selection syntax to generate .yml files for a group of models. This means you can use tags or other model selection syntax to specify which models you want to generate dimensions for in your dbt project. + +```shell +lightdash dbt run -s tag:lightdash # all models with the lightdash tag +lightdash dbt run -s payments # just payments +lightdash dbt run -s payments+ # payments and all children +lightdash dbt run -s +payments # payments and all parents +lightdash dbt run -s payments+ +customers tag:lightdash # mix and match +``` + +### Generate Tables and dimensions for your entire dbt project in one command + +To do this, you just need to run the following on your command line: + +```shell +lightdash dbt run +``` + +This command will run + generate tables for all of the models with `.yml` files. It will also generate dimensions for all of the columns in your dbt project. diff --git a/docs/guides/ai-analyst.mdx b/docs/guides/ai-analyst.mdx new file mode 100644 index 0000000..8573be0 --- /dev/null +++ b/docs/guides/ai-analyst.mdx @@ -0,0 +1,83 @@ +--- +title: AI Analyst +description: Learn how to use Lightdash's AI Analyst to explore your data +--- + +import { + CloudProPill, + CloudEnterprisePill, +} from '@site/src/components/PlanPills'; +import AiTags from './assets/ai-tags.png'; + +
+ + +
+ +The Lightdash AI Analyst transforms the way you interact with your data by allowing you to ask questions in natural language and get meaningful insights back. Currently, you can interact with the AI Analyst via Slack with more options coming soon. + +## How it works + +Simply ask the AI Analyst questions about your data, and it will: + +- Automatically select the most relevant data model and metrics to answer your question +- Build and execute queries with appropriate dimensions, filters, and limits +- Present results in the most insightful format - whether that's a visualization, table, or natural language summary +- Ask clarifying questions when needed to ensure you get exactly what you're looking for + +## Preparing your data for the AI Analyst + +To get the most out of the AI Analyst, it's important to properly prepare your metrics. The quality of the results depend on the quality of your metadata and documentation. + +### Documenting your data + +Good documentation is crucial for AI Analyst to understand your data models and provide meaningful insights. Here are some key tips: + +- Write clear, descriptive names for metrics and dimensions that avoid acronyms or technical jargon +- Add detailed descriptions to all metrics and dimensions explaining what they represent. +- Descriptions can even include example questions that the AI Analyst could answer with the metric (e.g. "Useful for answering questions like 'What is the total revenue for the USA?'"). +- Use business terminology that would make sense to any user, not just technical teams +- Include units of measurement where applicable (e.g. "Revenue in USD" rather than just "Revenue") +- Document any important caveats or limitations about the data + +Remember: If your colleague wouldn't understand your documentation, neither will the AI Analyst. The more context you provide, the better the AI can interpret and analyze your data. + +### Curating the fields used by the AI Analyst + +You can use tags in your metrics and dimensions definitions within your YAML file to control which fields the AI Analyst can access. This helps focus the AI on the most relevant data for analysis. + +#### Adding tags to metrics & dimensions in your .yml + +To configure which fields are used by your AI analyst, you need to add `tags` to your metrics & dimensions in your .yml files. You can then use these tags in your AI analyst setup to filter the metrics & dimensions available in each AI analyst channel connection. + +```yaml +- name: orders + columns: + - name: status + meta: + dimension: + tags: ai # <--------- tagging the dimension + - name: location + meta: + dimension: + tags: ['ai', 'operations'] # <--------- adding many tags + - name: amount + description: Total amount of the order + meta: + metrics: + total_order_amount: + type: sum + format: usd + round: 2 + tags: ai # <--------- tagging the metric +``` + +#### Configuring the tags used by the AI Analyst + +For each AI Analyst Slack channel connection, you can configure which fields are used to answer questions using the tags you've defined in your .yml files. + +You can set this up by going to the `organization settings` --> `Integrations` and adjusting the fields configuration in each channel. + +You can add one or many tags to this list. Fields with **any** of the tags in the list will be considered by the AI Analyst in that Slack channel. + +AI Analyst tags diff --git a/docs/guides/assets/add-filter-dashboard-default-value.png b/docs/guides/assets/add-filter-dashboard-default-value.png new file mode 100644 index 0000000..7a2bd33 Binary files /dev/null and b/docs/guides/assets/add-filter-dashboard-default-value.png differ diff --git a/docs/guides/assets/add-filter-dashboard-empty-value.png b/docs/guides/assets/add-filter-dashboard-empty-value.png new file mode 100644 index 0000000..f83231c Binary files /dev/null and b/docs/guides/assets/add-filter-dashboard-empty-value.png differ diff --git a/docs/guides/assets/add-filter-dashboard.png b/docs/guides/assets/add-filter-dashboard.png new file mode 100644 index 0000000..9a2ebfe Binary files /dev/null and b/docs/guides/assets/add-filter-dashboard.png differ diff --git a/docs/guides/assets/add-filter-results-table.jpg b/docs/guides/assets/add-filter-results-table.jpg new file mode 100644 index 0000000..edb5b13 Binary files /dev/null and b/docs/guides/assets/add-filter-results-table.jpg differ diff --git a/docs/guides/assets/add-filter-sidebar.jpg b/docs/guides/assets/add-filter-sidebar.jpg new file mode 100644 index 0000000..b9386e1 Binary files /dev/null and b/docs/guides/assets/add-filter-sidebar.jpg differ diff --git a/docs/guides/assets/add-filter.jpg b/docs/guides/assets/add-filter.jpg new file mode 100644 index 0000000..a8c0247 Binary files /dev/null and b/docs/guides/assets/add-filter.jpg differ diff --git a/docs/guides/assets/add-more-filters-dashboard.jpg b/docs/guides/assets/add-more-filters-dashboard.jpg new file mode 100644 index 0000000..cdd8d96 Binary files /dev/null and b/docs/guides/assets/add-more-filters-dashboard.jpg differ diff --git a/docs/guides/assets/adding-filters-from-toggle-1.jpg b/docs/guides/assets/adding-filters-from-toggle-1.jpg new file mode 100644 index 0000000..ca1a50a Binary files /dev/null and b/docs/guides/assets/adding-filters-from-toggle-1.jpg differ diff --git a/docs/guides/assets/ai-tags.png b/docs/guides/assets/ai-tags.png new file mode 100644 index 0000000..1045b88 Binary files /dev/null and b/docs/guides/assets/ai-tags.png differ diff --git a/docs/guides/assets/alert-create-new-modal.png b/docs/guides/assets/alert-create-new-modal.png new file mode 100644 index 0000000..1eb5ed5 Binary files /dev/null and b/docs/guides/assets/alert-create-new-modal.png differ diff --git a/docs/guides/assets/alert-three-dot-menu.png b/docs/guides/assets/alert-three-dot-menu.png new file mode 100644 index 0000000..5e9465e Binary files /dev/null and b/docs/guides/assets/alert-three-dot-menu.png differ diff --git a/docs/guides/assets/changing-default-colours.png b/docs/guides/assets/changing-default-colours.png new file mode 100644 index 0000000..d38d17d Binary files /dev/null and b/docs/guides/assets/changing-default-colours.png differ diff --git a/docs/guides/assets/configure-alert.png b/docs/guides/assets/configure-alert.png new file mode 100644 index 0000000..d44499a Binary files /dev/null and b/docs/guides/assets/configure-alert.png differ diff --git a/docs/guides/assets/configure-scheduled-delivery.png b/docs/guides/assets/configure-scheduled-delivery.png new file mode 100644 index 0000000..badb142 Binary files /dev/null and b/docs/guides/assets/configure-scheduled-delivery.png differ diff --git a/docs/guides/assets/convert-to-filter-group.png b/docs/guides/assets/convert-to-filter-group.png new file mode 100644 index 0000000..fa3a9c2 Binary files /dev/null and b/docs/guides/assets/convert-to-filter-group.png differ diff --git a/docs/guides/assets/create-new-modal.png b/docs/guides/assets/create-new-modal.png new file mode 100644 index 0000000..6974cf4 Binary files /dev/null and b/docs/guides/assets/create-new-modal.png differ diff --git a/docs/guides/assets/create-user-attribute.png b/docs/guides/assets/create-user-attribute.png new file mode 100644 index 0000000..96d5968 Binary files /dev/null and b/docs/guides/assets/create-user-attribute.png differ diff --git a/docs/guides/assets/cross-filtering-applied.png b/docs/guides/assets/cross-filtering-applied.png new file mode 100644 index 0000000..212d430 Binary files /dev/null and b/docs/guides/assets/cross-filtering-applied.png differ diff --git a/docs/guides/assets/cross-filtering-dashboard.jpg b/docs/guides/assets/cross-filtering-dashboard.jpg new file mode 100644 index 0000000..15153dc Binary files /dev/null and b/docs/guides/assets/cross-filtering-dashboard.jpg differ diff --git a/docs/guides/assets/cross-filtering.png b/docs/guides/assets/cross-filtering.png new file mode 100644 index 0000000..cc808b2 Binary files /dev/null and b/docs/guides/assets/cross-filtering.png differ diff --git a/docs/guides/assets/custom-metric-create.png b/docs/guides/assets/custom-metric-create.png new file mode 100644 index 0000000..16b2893 Binary files /dev/null and b/docs/guides/assets/custom-metric-create.png differ diff --git a/docs/guides/assets/custom-metric-format.png b/docs/guides/assets/custom-metric-format.png new file mode 100644 index 0000000..a292304 Binary files /dev/null and b/docs/guides/assets/custom-metric-format.png differ diff --git a/docs/guides/assets/dashboard-embed-attribute.png b/docs/guides/assets/dashboard-embed-attribute.png new file mode 100644 index 0000000..78aea81 Binary files /dev/null and b/docs/guides/assets/dashboard-embed-attribute.png differ diff --git a/docs/guides/assets/dashboard-filter-applied.png b/docs/guides/assets/dashboard-filter-applied.png new file mode 100644 index 0000000..5098024 Binary files /dev/null and b/docs/guides/assets/dashboard-filter-applied.png differ diff --git a/docs/guides/assets/dashboard-filters-ready-to-be-saved.png b/docs/guides/assets/dashboard-filters-ready-to-be-saved.png new file mode 100644 index 0000000..fc2a53a Binary files /dev/null and b/docs/guides/assets/dashboard-filters-ready-to-be-saved.png differ diff --git a/docs/guides/assets/dashboard-filters-saved.png b/docs/guides/assets/dashboard-filters-saved.png new file mode 100644 index 0000000..05f05e4 Binary files /dev/null and b/docs/guides/assets/dashboard-filters-saved.png differ diff --git a/docs/guides/assets/dashboard-filters-view-mode.png b/docs/guides/assets/dashboard-filters-view-mode.png new file mode 100644 index 0000000..5cb7a22 Binary files /dev/null and b/docs/guides/assets/dashboard-filters-view-mode.png differ diff --git a/docs/guides/assets/dashboard-temporary-filter-add-new.png b/docs/guides/assets/dashboard-temporary-filter-add-new.png new file mode 100644 index 0000000..84386be Binary files /dev/null and b/docs/guides/assets/dashboard-temporary-filter-add-new.png differ diff --git a/docs/guides/assets/dashboard-temporary-filter-add-tile-edit.png b/docs/guides/assets/dashboard-temporary-filter-add-tile-edit.png new file mode 100644 index 0000000..7bdf8a4 Binary files /dev/null and b/docs/guides/assets/dashboard-temporary-filter-add-tile-edit.png differ diff --git a/docs/guides/assets/dashboard-temporary-filter-add-tile.png b/docs/guides/assets/dashboard-temporary-filter-add-tile.png new file mode 100644 index 0000000..ce8a21e Binary files /dev/null and b/docs/guides/assets/dashboard-temporary-filter-add-tile.png differ diff --git a/docs/guides/assets/dashboard-temporary-filter-filter-dashboard-by.png b/docs/guides/assets/dashboard-temporary-filter-filter-dashboard-by.png new file mode 100644 index 0000000..a572a78 Binary files /dev/null and b/docs/guides/assets/dashboard-temporary-filter-filter-dashboard-by.png differ diff --git a/docs/guides/assets/dashboard-temporary-filter-view-new-filters.png b/docs/guides/assets/dashboard-temporary-filter-view-new-filters.png new file mode 100644 index 0000000..a7776f1 Binary files /dev/null and b/docs/guides/assets/dashboard-temporary-filter-view-new-filters.png differ diff --git a/docs/guides/assets/dashboard-temporary-filter-view.png b/docs/guides/assets/dashboard-temporary-filter-view.png new file mode 100644 index 0000000..a1481dc Binary files /dev/null and b/docs/guides/assets/dashboard-temporary-filter-view.png differ diff --git a/docs/guides/assets/dashboard-url-filter.png b/docs/guides/assets/dashboard-url-filter.png new file mode 100644 index 0000000..e45614d Binary files /dev/null and b/docs/guides/assets/dashboard-url-filter.png differ diff --git a/docs/guides/assets/date-zoom-before-and-after.png b/docs/guides/assets/date-zoom-before-and-after.png new file mode 100644 index 0000000..ed3cd85 Binary files /dev/null and b/docs/guides/assets/date-zoom-before-and-after.png differ diff --git a/docs/guides/assets/date-zoom-indicator.png b/docs/guides/assets/date-zoom-indicator.png new file mode 100644 index 0000000..f4d69d8 Binary files /dev/null and b/docs/guides/assets/date-zoom-indicator.png differ diff --git a/docs/guides/assets/dbt-repo-example.png b/docs/guides/assets/dbt-repo-example.png new file mode 100644 index 0000000..9e5ecd3 Binary files /dev/null and b/docs/guides/assets/dbt-repo-example.png differ diff --git a/docs/guides/assets/default-colours-in-config.png b/docs/guides/assets/default-colours-in-config.png new file mode 100644 index 0000000..5700e6d Binary files /dev/null and b/docs/guides/assets/default-colours-in-config.png differ diff --git a/docs/guides/assets/description-on-hover.png b/docs/guides/assets/description-on-hover.png new file mode 100644 index 0000000..d77c6c0 Binary files /dev/null and b/docs/guides/assets/description-on-hover.png differ diff --git a/docs/guides/assets/drill-by-action-menu.png b/docs/guides/assets/drill-by-action-menu.png new file mode 100644 index 0000000..a4c24df Binary files /dev/null and b/docs/guides/assets/drill-by-action-menu.png differ diff --git a/docs/guides/assets/drill-by-modal.png b/docs/guides/assets/drill-by-modal.png new file mode 100644 index 0000000..03fc6ef Binary files /dev/null and b/docs/guides/assets/drill-by-modal.png differ diff --git a/docs/guides/assets/drill-by-source-example.png b/docs/guides/assets/drill-by-source-example.png new file mode 100644 index 0000000..5a19f1b Binary files /dev/null and b/docs/guides/assets/drill-by-source-example.png differ diff --git a/docs/guides/assets/drill-into-dashboard-chart.png b/docs/guides/assets/drill-into-dashboard-chart.png new file mode 100644 index 0000000..e17af43 Binary files /dev/null and b/docs/guides/assets/drill-into-dashboard-chart.png differ diff --git a/docs/guides/assets/drill-into-modal.png b/docs/guides/assets/drill-into-modal.png new file mode 100644 index 0000000..fc18faf Binary files /dev/null and b/docs/guides/assets/drill-into-modal.png differ diff --git a/docs/guides/assets/drill-into-result-day.png b/docs/guides/assets/drill-into-result-day.png new file mode 100644 index 0000000..aeae73b Binary files /dev/null and b/docs/guides/assets/drill-into-result-day.png differ diff --git a/docs/guides/assets/edit-dashboard.png b/docs/guides/assets/edit-dashboard.png new file mode 100644 index 0000000..fbf31d1 Binary files /dev/null and b/docs/guides/assets/edit-dashboard.png differ diff --git a/docs/guides/assets/edit-delete-alert.png b/docs/guides/assets/edit-delete-alert.png new file mode 100644 index 0000000..b49d13e Binary files /dev/null and b/docs/guides/assets/edit-delete-alert.png differ diff --git a/docs/guides/assets/edit-delete-scheduled-delivery.png b/docs/guides/assets/edit-delete-scheduled-delivery.png new file mode 100644 index 0000000..4470111 Binary files /dev/null and b/docs/guides/assets/edit-delete-scheduled-delivery.png differ diff --git a/docs/guides/assets/edit-or-remove-dashboard-filters.png b/docs/guides/assets/edit-or-remove-dashboard-filters.png new file mode 100644 index 0000000..d201385 Binary files /dev/null and b/docs/guides/assets/edit-or-remove-dashboard-filters.png differ diff --git a/docs/guides/assets/embed-add-dashboard.png b/docs/guides/assets/embed-add-dashboard.png new file mode 100644 index 0000000..d93e47c Binary files /dev/null and b/docs/guides/assets/embed-add-dashboard.png differ diff --git a/docs/guides/assets/embed-create-secret.png b/docs/guides/assets/embed-create-secret.png new file mode 100644 index 0000000..7c6e5bd Binary files /dev/null and b/docs/guides/assets/embed-create-secret.png differ diff --git a/docs/guides/assets/embed-developer.png b/docs/guides/assets/embed-developer.png new file mode 100644 index 0000000..0ba2eeb Binary files /dev/null and b/docs/guides/assets/embed-developer.png differ diff --git a/docs/guides/assets/embed-preview.png b/docs/guides/assets/embed-preview.png new file mode 100644 index 0000000..c36b7ca Binary files /dev/null and b/docs/guides/assets/embed-preview.png differ diff --git a/docs/guides/assets/embedding-preview-all-filters.png b/docs/guides/assets/embedding-preview-all-filters.png new file mode 100644 index 0000000..41c1762 Binary files /dev/null and b/docs/guides/assets/embedding-preview-all-filters.png differ diff --git a/docs/guides/assets/embedding-preview-no-filters.png b/docs/guides/assets/embedding-preview-no-filters.png new file mode 100644 index 0000000..c6abf78 Binary files /dev/null and b/docs/guides/assets/embedding-preview-no-filters.png differ diff --git a/docs/guides/assets/embedding-preview-some-filters.png b/docs/guides/assets/embedding-preview-some-filters.png new file mode 100644 index 0000000..7e4a0db Binary files /dev/null and b/docs/guides/assets/embedding-preview-some-filters.png differ diff --git a/docs/guides/assets/embedding-print.png b/docs/guides/assets/embedding-print.png new file mode 100644 index 0000000..a94fda0 Binary files /dev/null and b/docs/guides/assets/embedding-print.png differ diff --git a/docs/guides/assets/embedding-settings-all-filters.png b/docs/guides/assets/embedding-settings-all-filters.png new file mode 100644 index 0000000..99dfe51 Binary files /dev/null and b/docs/guides/assets/embedding-settings-all-filters.png differ diff --git a/docs/guides/assets/embedding-settings-no-filters.png b/docs/guides/assets/embedding-settings-no-filters.png new file mode 100644 index 0000000..19f63f5 Binary files /dev/null and b/docs/guides/assets/embedding-settings-no-filters.png differ diff --git a/docs/guides/assets/embedding-settings-some-filters.png b/docs/guides/assets/embedding-settings-some-filters.png new file mode 100644 index 0000000..4fc69a8 Binary files /dev/null and b/docs/guides/assets/embedding-settings-some-filters.png differ diff --git a/docs/guides/assets/example-table.jpg b/docs/guides/assets/example-table.jpg new file mode 100644 index 0000000..c750245 Binary files /dev/null and b/docs/guides/assets/example-table.jpg differ diff --git a/docs/guides/assets/filter-tile-adjust.jpg b/docs/guides/assets/filter-tile-adjust.jpg new file mode 100644 index 0000000..d426e63 Binary files /dev/null and b/docs/guides/assets/filter-tile-adjust.jpg differ diff --git a/docs/guides/assets/filter-tiles-tab.png b/docs/guides/assets/filter-tiles-tab.png new file mode 100644 index 0000000..e23f5c1 Binary files /dev/null and b/docs/guides/assets/filter-tiles-tab.png differ diff --git a/docs/guides/assets/find-dbt-cloud-service-token.gif b/docs/guides/assets/find-dbt-cloud-service-token.gif new file mode 100644 index 0000000..ca4d34b Binary files /dev/null and b/docs/guides/assets/find-dbt-cloud-service-token.gif differ diff --git a/docs/guides/assets/find-snowflake-override.gif b/docs/guides/assets/find-snowflake-override.gif new file mode 100644 index 0000000..62d80c4 Binary files /dev/null and b/docs/guides/assets/find-snowflake-override.gif differ diff --git a/docs/guides/assets/group-label.png b/docs/guides/assets/group-label.png new file mode 100644 index 0000000..3285a8c Binary files /dev/null and b/docs/guides/assets/group-label.png differ diff --git a/docs/guides/assets/gsheet-delivery.png b/docs/guides/assets/gsheet-delivery.png new file mode 100644 index 0000000..4875968 Binary files /dev/null and b/docs/guides/assets/gsheet-delivery.png differ diff --git a/docs/guides/assets/gsheet-metadata.png b/docs/guides/assets/gsheet-metadata.png new file mode 100644 index 0000000..79ffc2e Binary files /dev/null and b/docs/guides/assets/gsheet-metadata.png differ diff --git a/docs/guides/assets/lightdash-tag.png b/docs/guides/assets/lightdash-tag.png new file mode 100644 index 0000000..f9ec80f Binary files /dev/null and b/docs/guides/assets/lightdash-tag.png differ diff --git a/docs/guides/assets/multiple-filter-options.jpg b/docs/guides/assets/multiple-filter-options.jpg new file mode 100644 index 0000000..da9c8a5 Binary files /dev/null and b/docs/guides/assets/multiple-filter-options.jpg differ diff --git a/docs/guides/assets/nested-filters.png b/docs/guides/assets/nested-filters.png new file mode 100644 index 0000000..6be5616 Binary files /dev/null and b/docs/guides/assets/nested-filters.png differ diff --git a/docs/guides/assets/new-filters-dashboard.jpg b/docs/guides/assets/new-filters-dashboard.jpg new file mode 100644 index 0000000..827a925 Binary files /dev/null and b/docs/guides/assets/new-filters-dashboard.jpg differ diff --git a/docs/guides/assets/overview-tables.png b/docs/guides/assets/overview-tables.png new file mode 100644 index 0000000..1668c0d Binary files /dev/null and b/docs/guides/assets/overview-tables.png differ diff --git a/docs/guides/assets/pick-tables.png b/docs/guides/assets/pick-tables.png new file mode 100644 index 0000000..d9e9a28 Binary files /dev/null and b/docs/guides/assets/pick-tables.png differ diff --git a/docs/guides/assets/pin-an-item.jpg b/docs/guides/assets/pin-an-item.jpg new file mode 100644 index 0000000..0c4860a Binary files /dev/null and b/docs/guides/assets/pin-an-item.jpg differ diff --git a/docs/guides/assets/pinned-homepage.jpg b/docs/guides/assets/pinned-homepage.jpg new file mode 100644 index 0000000..1ed101e Binary files /dev/null and b/docs/guides/assets/pinned-homepage.jpg differ diff --git a/docs/guides/assets/private-slack-channel.png b/docs/guides/assets/private-slack-channel.png new file mode 100644 index 0000000..06f9040 Binary files /dev/null and b/docs/guides/assets/private-slack-channel.png differ diff --git a/docs/guides/assets/project-default-time-zone.jpg b/docs/guides/assets/project-default-time-zone.jpg new file mode 100644 index 0000000..2883278 Binary files /dev/null and b/docs/guides/assets/project-default-time-zone.jpg differ diff --git a/docs/guides/assets/promote-dashboard-success.png b/docs/guides/assets/promote-dashboard-success.png new file mode 100644 index 0000000..8a59620 Binary files /dev/null and b/docs/guides/assets/promote-dashboard-success.png differ diff --git a/docs/guides/assets/promote-list-chart.png b/docs/guides/assets/promote-list-chart.png new file mode 100644 index 0000000..652b978 Binary files /dev/null and b/docs/guides/assets/promote-list-chart.png differ diff --git a/docs/guides/assets/promote-list-dashboard.png b/docs/guides/assets/promote-list-dashboard.png new file mode 100644 index 0000000..936f9af Binary files /dev/null and b/docs/guides/assets/promote-list-dashboard.png differ diff --git a/docs/guides/assets/promote-select-project.png b/docs/guides/assets/promote-select-project.png new file mode 100644 index 0000000..ce008dc Binary files /dev/null and b/docs/guides/assets/promote-select-project.png differ diff --git a/docs/guides/assets/promote-success.png b/docs/guides/assets/promote-success.png new file mode 100644 index 0000000..44f8d72 Binary files /dev/null and b/docs/guides/assets/promote-success.png differ diff --git a/docs/guides/assets/promote-view-chart.png b/docs/guides/assets/promote-view-chart.png new file mode 100644 index 0000000..fd05eba Binary files /dev/null and b/docs/guides/assets/promote-view-chart.png differ diff --git a/docs/guides/assets/promote-view-dashboard.png b/docs/guides/assets/promote-view-dashboard.png new file mode 100644 index 0000000..272006e Binary files /dev/null and b/docs/guides/assets/promote-view-dashboard.png differ diff --git a/docs/guides/assets/run-query-dbt-metrics.gif b/docs/guides/assets/run-query-dbt-metrics.gif new file mode 100644 index 0000000..4daf6f9 Binary files /dev/null and b/docs/guides/assets/run-query-dbt-metrics.gif differ diff --git a/docs/guides/assets/save-new-filters-dashboard.png b/docs/guides/assets/save-new-filters-dashboard.png new file mode 100644 index 0000000..f49eee2 Binary files /dev/null and b/docs/guides/assets/save-new-filters-dashboard.png differ diff --git a/docs/guides/assets/scheduled-deliveries-create-new-modal.png b/docs/guides/assets/scheduled-deliveries-create-new-modal.png new file mode 100644 index 0000000..7b4157a Binary files /dev/null and b/docs/guides/assets/scheduled-deliveries-create-new-modal.png differ diff --git a/docs/guides/assets/scheduled-deliveries-overview.png b/docs/guides/assets/scheduled-deliveries-overview.png new file mode 100644 index 0000000..30811e6 Binary files /dev/null and b/docs/guides/assets/scheduled-deliveries-overview.png differ diff --git a/docs/guides/assets/scheduled-deliveries-three-dot-menu.png b/docs/guides/assets/scheduled-deliveries-three-dot-menu.png new file mode 100644 index 0000000..79f682b Binary files /dev/null and b/docs/guides/assets/scheduled-deliveries-three-dot-menu.png differ diff --git a/docs/guides/assets/scheduled-delivery-customization.png b/docs/guides/assets/scheduled-delivery-customization.png new file mode 100644 index 0000000..e5c2e39 Binary files /dev/null and b/docs/guides/assets/scheduled-delivery-customization.png differ diff --git a/docs/guides/assets/scheduled-delivery-dashboard-filters.png b/docs/guides/assets/scheduled-delivery-dashboard-filters.png new file mode 100644 index 0000000..0219b64 Binary files /dev/null and b/docs/guides/assets/scheduled-delivery-dashboard-filters.png differ diff --git a/docs/guides/assets/screenshot-create-project.png b/docs/guides/assets/screenshot-create-project.png new file mode 100644 index 0000000..968930e Binary files /dev/null and b/docs/guides/assets/screenshot-create-project.png differ diff --git a/docs/guides/assets/screenshot-delete-project.png b/docs/guides/assets/screenshot-delete-project.png new file mode 100644 index 0000000..a68e803 Binary files /dev/null and b/docs/guides/assets/screenshot-delete-project.png differ diff --git a/docs/guides/assets/screenshot-do-refresh.png b/docs/guides/assets/screenshot-do-refresh.png new file mode 100644 index 0000000..76b019c Binary files /dev/null and b/docs/guides/assets/screenshot-do-refresh.png differ diff --git a/docs/guides/assets/screenshot-forgot-password.png b/docs/guides/assets/screenshot-forgot-password.png new file mode 100644 index 0000000..6a7d393 Binary files /dev/null and b/docs/guides/assets/screenshot-forgot-password.png differ diff --git a/docs/guides/assets/screenshot-joined-tables.png b/docs/guides/assets/screenshot-joined-tables.png new file mode 100644 index 0000000..2b3caf3 Binary files /dev/null and b/docs/guides/assets/screenshot-joined-tables.png differ diff --git a/docs/guides/assets/screenshot-multiple-values-filter.jpg b/docs/guides/assets/screenshot-multiple-values-filter.jpg new file mode 100644 index 0000000..baa73b4 Binary files /dev/null and b/docs/guides/assets/screenshot-multiple-values-filter.jpg differ diff --git a/docs/guides/assets/screenshot-switch-projects.png b/docs/guides/assets/screenshot-switch-projects.png new file mode 100644 index 0000000..72ac2af Binary files /dev/null and b/docs/guides/assets/screenshot-switch-projects.png differ diff --git a/docs/guides/assets/sub-group-label.png b/docs/guides/assets/sub-group-label.png new file mode 100644 index 0000000..1a38c3c Binary files /dev/null and b/docs/guides/assets/sub-group-label.png differ diff --git a/docs/guides/assets/table-calculation-create.png b/docs/guides/assets/table-calculation-create.png new file mode 100644 index 0000000..648d649 Binary files /dev/null and b/docs/guides/assets/table-calculation-create.png differ diff --git a/docs/guides/assets/table-calculation-format.png b/docs/guides/assets/table-calculation-format.png new file mode 100644 index 0000000..a39dd07 Binary files /dev/null and b/docs/guides/assets/table-calculation-format.png differ diff --git a/docs/guides/assets/tables-configuration.jpg b/docs/guides/assets/tables-configuration.jpg new file mode 100644 index 0000000..f22393e Binary files /dev/null and b/docs/guides/assets/tables-configuration.jpg differ diff --git a/docs/guides/assets/tables-view.jpg b/docs/guides/assets/tables-view.jpg new file mode 100644 index 0000000..77c6f25 Binary files /dev/null and b/docs/guides/assets/tables-view.jpg differ diff --git a/docs/guides/assets/underlying-chart-data.png b/docs/guides/assets/underlying-chart-data.png new file mode 100644 index 0000000..084496c Binary files /dev/null and b/docs/guides/assets/underlying-chart-data.png differ diff --git a/docs/guides/assets/underlying-data.jpg b/docs/guides/assets/underlying-data.jpg new file mode 100644 index 0000000..c8b0305 Binary files /dev/null and b/docs/guides/assets/underlying-data.jpg differ diff --git a/docs/guides/assets/unpin-an-item.jpg b/docs/guides/assets/unpin-an-item.jpg new file mode 100644 index 0000000..56b0d98 Binary files /dev/null and b/docs/guides/assets/unpin-an-item.jpg differ diff --git a/docs/guides/assets/version-history-explorer.png b/docs/guides/assets/version-history-explorer.png new file mode 100644 index 0000000..b32c1d2 Binary files /dev/null and b/docs/guides/assets/version-history-explorer.png differ diff --git a/docs/guides/assets/version-history-menu.png b/docs/guides/assets/version-history-menu.png new file mode 100644 index 0000000..804a7ee Binary files /dev/null and b/docs/guides/assets/version-history-menu.png differ diff --git a/docs/guides/assets/version-history-selection.png b/docs/guides/assets/version-history-selection.png new file mode 100644 index 0000000..a161f61 Binary files /dev/null and b/docs/guides/assets/version-history-selection.png differ diff --git a/docs/guides/assets/vs-code-error.png b/docs/guides/assets/vs-code-error.png new file mode 100644 index 0000000..867ae3a Binary files /dev/null and b/docs/guides/assets/vs-code-error.png differ diff --git a/docs/guides/cli/assets/cli-validate.png b/docs/guides/cli/assets/cli-validate.png new file mode 100644 index 0000000..a322fa6 Binary files /dev/null and b/docs/guides/cli/assets/cli-validate.png differ diff --git a/docs/guides/cli/assets/github-actions-stop.png b/docs/guides/cli/assets/github-actions-stop.png new file mode 100644 index 0000000..0200157 Binary files /dev/null and b/docs/guides/cli/assets/github-actions-stop.png differ diff --git a/docs/guides/cli/assets/github-actions.png b/docs/guides/cli/assets/github-actions.png new file mode 100644 index 0000000..def9a56 Binary files /dev/null and b/docs/guides/cli/assets/github-actions.png differ diff --git a/docs/guides/cli/assets/github-run.png b/docs/guides/cli/assets/github-run.png new file mode 100644 index 0000000..944d931 Binary files /dev/null and b/docs/guides/cli/assets/github-run.png differ diff --git a/docs/guides/cli/assets/github-secrets.jpg b/docs/guides/cli/assets/github-secrets.jpg new file mode 100644 index 0000000..e7d58c2 Binary files /dev/null and b/docs/guides/cli/assets/github-secrets.jpg differ diff --git a/docs/guides/cli/assets/personal-access-token.png b/docs/guides/cli/assets/personal-access-token.png new file mode 100644 index 0000000..e5b646c Binary files /dev/null and b/docs/guides/cli/assets/personal-access-token.png differ diff --git a/docs/guides/cli/assets/project-id.png b/docs/guides/cli/assets/project-id.png new file mode 100644 index 0000000..1e9d185 Binary files /dev/null and b/docs/guides/cli/assets/project-id.png differ diff --git a/docs/guides/cli/cli-authentication.mdx b/docs/guides/cli/cli-authentication.mdx new file mode 100644 index 0000000..cc27ca5 --- /dev/null +++ b/docs/guides/cli/cli-authentication.mdx @@ -0,0 +1,98 @@ +import PersonalAccessToken from './assets/personal-access-token.png'; + +# Authenticating your CLI (login) + +## Login + +
+ 1. If you use your email + password in the browser, login with your email and password. + To login to your Lightdash instance run the following command and provide your login email and password: + +```shell +lightdash login https://{{ lightdash_domain }} +``` + +where `{{ lightdash_domain }}` is the address for your running Lightdash instance. For example Lightdash +cloud users in the US would type `lightdash login https://app.lightdash.cloud` if you're in Europe you'd type +`lightdash login https://eu1.lightdash.cloud`. + +
+ +
+ 2. If you use single sign-on (SSO) in the browser, login with a personal access token. + First, you'll need to create a new personal access token in the UI by going to Settings > Personal Access Tokens. + You can't use an existing personal access token! You have to create a new one just for yourself. + +{' '} + + + +Then, run the following command in your project: + +```shell +lightdash login https://{{ lightdash_domain }} --token +``` + +where `https://my-lightdash.domain.com` is the address for your running Lightdash instance. For example Lightdash +cloud users in the US would type `lightdash login https://app.lightdash.cloud` if you're in Europe you'd type +`lightdash login https://eu1.lightdash.cloud`. + +
+ +
+ 3. If you're running in a CI/CD pipeline, login with environment variables + +You can use the following environment variables to authenticate yourself on each command: + +- **LIGHTDASH_API_KEY** a personal access token you can generate in the app under the user settings +- **LIGHTDASH_URL** address for your running Lightdash instance +- **LIGHTDASH_PROXY_AUTHORIZATION** if your Lightdash instance is behind a proxy like [Cloud IAP](https://cloud.google.com/iap) you can set here `Proxy-Authentication` header value + +Example: + +```shell +LIGHTDASH_API_KEY=946fedb74003405646867dcacf1ad345 LIGHTDASH_URL="https://{{ lightdash_domain }}" LIGHTDASH_PROXY_AUTHORIZATION="Bearer " lightdash preview +``` + +Where `{{ lightdash_domain }}` is your domain. For Lightdash Cloud users use `https://app.lightdash.cloud` + +
+ +## Set active project + +When you login you'll be asked to set an active project. + +Your active project is just the one that you're working on/developing in. Your organization might just have one project, so that makes your decision easy! + +You can change your active project by running: + +```shell +lightdash config set-project +``` + +Or you can use the `LIGHTDASH_PROJECT` environment variable to indicate what project UUID the command should use. + +Example: + +```shell +LIGHTDASH_PROJECT="3675b69e-8324-4110-bdca-059031aa8da3" lightdash deploy +``` + +## Now that you've logged in, you're ready to use the CLI! + +You can see all of the actions available on the CLI by typing this in your terminal: + +```shell +lightdash +``` + +Some of our favourites are: + +- [Automatically generating .yml for your dbt models using `lightdash generate`](/guides/cli/how-to-auto-generate-schema-files.mdx) +- [Testing your changes with developer previews using `lightdash preview`](/guides/cli/how-to-use-lightdash-preview.mdx) +- [Deploying your changes to production using `lightdash deploy`](/guides/cli/how-to-use-lightdash-deploy.mdx) diff --git a/docs/guides/cli/how-to-auto-generate-schema-files.mdx b/docs/guides/cli/how-to-auto-generate-schema-files.mdx new file mode 100644 index 0000000..0ac888f --- /dev/null +++ b/docs/guides/cli/how-to-auto-generate-schema-files.mdx @@ -0,0 +1,133 @@ +# Autogenerate Lightdash-ready .yml files for your models + +The beauty of Lightdash is that we're pretty well synced with your dbt project. So, in Lightdash, Tables actually come from dbt models that have been defined in your dbt project's `.yml` files. + +If your dbt model has been defined in a .yml file, it will appear in Lightdash as a Table. + +:::info + +Not too sure what a .yml file or a Table is? Be sure to check out our tutorial on [Adding Tables to Lightdash](/guides/adding-tables-to-lightdash) for more details. + +::: + +## Auto-generate `schema.yml` files + + + + + +To make it faster to write and maintain your `schema.yml` files, the Lightdash CLI will automatically generate and +sync your `schema.yml` files. + +Inside your dbt project, open a terminal and run this command to generate the `schema.yml` file for a model called +`mymodel`: + +```shell +git commit # make sure to commit all your existing project first! +lightdash generate -s mymodel +``` + +This will create or update an existing `schema.yml` file to add any new columns that have appeared in the database. + +## Auto-sync `schema.yml` files after `dbt run` + +Since the `generate` command relies on your database schema to detect which columns are required, you'll often want +to run `dbt run` before running `generate`. You can combine `dbt run` and `lighdash generate` into one command which +will run models and then regenerate the +`schema.yml` files for any models than changed: + +```shell +git commit +lightdash dbt run # Run dbt AND re-sync schema.yml files +``` + +## Generating `schema.yml` for multiple models + +`lightdash generate` supports dbt model selection syntax to generate files for a group of models: + +```shell +lightdash generate # all models +lightdash generate -s payments # just payments +lightdash generate -s payments+ # payments and all children +lightdash generate -s +payments # payments and all parents +lightdash generate -s +payments+ # payments and all children and parents +lightdash generate -s tag:prod # all models with the prod tag +lightdash generate -s payments customers # two specific models +lightdash generate -s payments+ +customers tag:prod # mix and match +``` + +## Using doc blocks to build better .yml files + +[Doc blocks](https://docs.getdbt.com/docs/building-a-dbt-project/documentation#using-docs-blocks) are markdown files defined in your dbt project that are useful for creating consistent documentation in your dbt project. + +For example, if I have a field called `product_category` that's used a bunch of times throughout my project, I can create a doc block for this field: + +```markdown +{% docs product_category %} + +This is a string field that tells us the category of the product that was sold. This is a higher level grouping than the `product_type`. Every `product_type` maps to a single `product_category`. + +The valid product categories are: + +- clothing +- home +- accessories +- beauty + +{% enddocs %} +``` + +I can then reference this doc block in my .yml files like so: + +```yaml +version: 2 + +models: + - name: products + description: 'one row per product ID' + + columns: + - name: product_category + description: '{{ doc("product_category") }}' +``` + +The docs for `product_category` (in Lightdash and in your dbt documentation) will become the doc block I've written above. + +### The Lightdash CLI will automatically add doc blocks to your .yml files + +The nice thing about doc blocks is that Lightdash automatically adds these to the .yml files it generates. For example, if I had a .yml file for my `product_sales` model that looked like this: + +```yaml +version: 2 + +models: + - name: product_sales + + columns: + - name: product_id + - name: product_value + - name: product_category +``` + +Then, I did: + +```shell +lightdash dbt run -s product_sales # or lightdash generate -s product_sales +``` + +Then my `product_sales.yml` file would be updated to include the doc block for `product_category`: + +```yaml +version: 2 + +models: + - name: product_sales + + columns: + - name: product_id + - name: product_value + - name: product_category + description: '{{ doc("product_category") }}' +``` + +We recommend using doc blocks whenever you can! They help with keeping the definitions of fields across your project consistent, and they also allow you to get great docs, completely automatically with the Lightdash CLI. diff --git a/docs/guides/cli/how-to-compile-your-lightdash-project.mdx b/docs/guides/cli/how-to-compile-your-lightdash-project.mdx new file mode 100644 index 0000000..f071ace --- /dev/null +++ b/docs/guides/cli/how-to-compile-your-lightdash-project.mdx @@ -0,0 +1,53 @@ +import NewWorkflowExistingActions from './../../snippets/assets/new-workflow-existing-actions.jpg'; +import GithubRun from './../../snippets/assets/github-run.png'; +import GithubSecrets from './../../snippets/github-secrets.mdx'; + +# Test your changes with Lightdash compile + +If you've connected Lightdash to GitHub, you can setup a `github action` and get Lightdash to compile your project and test your changes whenever you open a pull request. + +Adding this Lightdash compile action will compile your dbt project's .yml files and check to see if there are any errors that will break your Lightdash project. For example, a metric that references a dimension that doesn't exist. + +### Step 1: add the credentials to Github secrets + + + +### Step 2: Create deploy.yml workflow in Github + +Go to your repo, click on `Actions` menu. + +If you don't have any GitHub actions, you'll just need to click on `Configure` + +![Github actions page](./assets/github-actions.png) + +If you have some GitHub actions in your repo already, click on `New workflow`, then select `setup a workflow yourself`. + + + +Now copy [this file](https://github.com/lightdash/cli-actions/blob/main/compile.yml) from our [cli-actions](https://github.com/lightdash/cli-actions) repo. + +:::info +If you only use a subset of your dbt models in Lightdash, then you'll want to specify that subset in your file [here](https://github.com/lightdash/cli-actions/blob/d91de777ed3668b537acd141b734eca75def4e52/compile.yml#L65). For example, to only compile models with the tag `lightdash`, you would change this line to: `run: lightdash compile --select tag:lightdash --project-dir "$PROJECT_DIR" --profiles-dir . --profile prod || lightdash compile --select tag:lightdash --project-dir "$PROJECT_DIR" --profiles-dir .` +::: + +Give it a nice name like `compile-lightdash.yml` + +And commit this to your repo by clicking on `Start commit`. + +### You're done! + +Everytime you open a new pull request on the repository that contains your Lightdash project, `lightdash compile` will run and check to see if any of the changes you made will break your Lightdash instance. + +You can see the log on the `Github actions` page + + diff --git a/docs/guides/cli/how-to-install-the-lightdash-cli.mdx b/docs/guides/cli/how-to-install-the-lightdash-cli.mdx new file mode 100644 index 0000000..d4cab66 --- /dev/null +++ b/docs/guides/cli/how-to-install-the-lightdash-cli.mdx @@ -0,0 +1,9 @@ +import HowToInstallTheLightdashCli from './../../snippets/how-to-install-the-lightdash-cli.mdx'; + +# How to install the Lightdash CLI + + + +## Once you've installed the CLI tool, [you'll want to authenticate it](/guides/cli/cli-authentication) + +[Check out the guide on authenticating your CLI tool ](/guides/cli/cli-authentication)(login and setup an active project). diff --git a/docs/guides/cli/how-to-upgrade-cli.mdx b/docs/guides/cli/how-to-upgrade-cli.mdx new file mode 100644 index 0000000..a37f60f --- /dev/null +++ b/docs/guides/cli/how-to-upgrade-cli.mdx @@ -0,0 +1,17 @@ +# Upgrading your Lightdash CLI + +## Check compatability + +Your Lightdash CLI version should match the version of Lightdash you see in the UI (scroll to the bottom of your screen, and you should see it there!). You can check the version of +your CLI by running: + +```shell +lightdash --version +``` + +If you need to upgrade your version of the Lightdash cli, run the following in your terminal: + +```shell +npm install -g @lightdash/cli +lightdash --version +``` diff --git a/docs/guides/cli/how-to-use-lightdash-deploy.mdx b/docs/guides/cli/how-to-use-lightdash-deploy.mdx new file mode 100644 index 0000000..c33e02f --- /dev/null +++ b/docs/guides/cli/how-to-use-lightdash-deploy.mdx @@ -0,0 +1,27 @@ +import AutomaticallyDeployChangesGithub from './../../snippets/automatically-deploy-your-changes-using-github-action.mdx'; + +# Sync your changes with Lightdash deploy + +## `lightdash deploy` syncs the changes in your dbt project to Lightdash + +If you've made some changes to your dbt project and you'd like to make them available in your Lightdash project, you can easily do this using the `lightdash deploy` command in the Lightdash CLI tool. + +```shell +git checkout main # checkout main or master - or whatever your production branch name is where you've merged your changes +git pull +lightdash deploy # --target prod. If you use developer profiles in your dbt project, you might need this flag. See below. +``` + +This will deploy the changes in your dbt project to the Lightdash project you set up on your CLI tool earlier. + +:::info + +**Note:** Lightdash's deploy command will deploy using your **default dbt profile** unless you specify to use a different target. For example, if you've set up a developer profile where it targets a dev dataset (like `dbt_khindson.my_model_names`), then you'll need to pass the production target in your `lightdash deploy` command. Something like: `lightdash deploy --profile prod`. + +::: + +And voilΓ ! Once it's completed click the URL to head straight to your project where your changes will be ready to be explored. + +## Automatically deploy your changes to Lightdash using a GitHub action + + diff --git a/docs/guides/cli/how-to-use-lightdash-preview.mdx b/docs/guides/cli/how-to-use-lightdash-preview.mdx new file mode 100644 index 0000000..2a33dee --- /dev/null +++ b/docs/guides/cli/how-to-use-lightdash-preview.mdx @@ -0,0 +1,189 @@ +import AutomaticallyDeployChangesGithub from './../../snippets/github-secrets.mdx'; +import GithubSecrets from '../../snippets/github-secrets.mdx'; + +# Lightdash Preview + +**Developer previews** are temporary Lightdash projects where you can safely experiment with your metrics, dimensions and charts +without affecting your production project. + + + + + +Preview environments will copy all spaces/charts/dashboards into your new preview environment, so you can test the content +and also run [validation](/guides/cli/how-to-use-lightdash-validate). This is only copied on preview creation, you can't sync the content afterwards. + +### Run `lightdash preview` from inside your project + +```shell +# This will create a preview and will wait until you press a key to delete the preview project +lightdash preview +``` + +or + +```shell +# This will create a preview and exit, you will have to run lightdash stop-preview to delete it +lightdash start-preview +``` + +Then `cmd` + `click` to open the preview link from your terminal. Once you're in Lightdash go to `Explore` --> `Tables`, then click on the model(s) you just updated to see your changes and play around with them. + +**Problems with credentials?** + +When you create developer previews, Lightdash will use the same warehouse connection settings you have in your +`profiles.yml` file for your current dbt project. This can be a problem if you're using a local database that your +laptop can reach but your Lightdash instance cannot. + +## Set up developer previews on your pull requests + +If you've connected Lightdash to GitHub, you can setup a `github action` and get Lightdash to create new dynamic `preview` projects automatically +when a new `pull request` is created, and it will automatically delete the `preview` project when the `pull request` is closed or merged. + +### Step 1: add the credentials to Github secrets + +If you haven't already set up a GitHub action for Lightdash, you'll need to add some secrets to GitHub. If you already have a GitHub action for Lightdash, then you can use the same Lightdash secrets you created for your other action. + + + +### Step 2: Create start-preview.yml and close-preview.yml workflows in Github + +Go to your repo, click on `Actions` menu, and click on `Configure` + +![Github actions page](./assets/github-actions.png) + +Now copy [this start-preview.yml file](https://github.com/lightdash/cli-actions/blob/main/start-preview.yml) from our [cli-actions](https://github.com/lightdash/cli-actions) repo + +And save by clicking on `Start commit` + +Do the same with [this close-preview.yml file](https://github.com/lightdash/cli-actions/blob/main/close-preview.yml). + +### You're done! + +Everytime you create a new `pull request` , a new `preview` project with your `branch` name will be created on your organization. +Everytime you make a change to that branch, the preview environment will get updated. +Once you close or merge your `pull request`, the `preview` project will get deleted. + +You can see the log on `Github actions` page + +![Github actions stop preview](./assets/github-actions-stop.png) + +## How to use the developer credentials in your preview project + +When developing in dbt, you typically have a different set of credentials and dataset/schema than when you are running in production. +Here are two options on how to set them up based on the developer that opened the Pull Request. + +:::info +If you use dbt cloud IDE to create commits and pull requests you need a few extra steps. +We need to add a step in the GitHub action to fetch the user that created the pull request. + +```yaml +- uses: actions/github-script@v6 + id: get_pr_creator + with: + script: | + return ( + await github.rest.repos.listPullRequestsAssociatedWithCommit({ + commit_sha: context.sha, + owner: context.repo.owner, + repo: context.repo.repo, + }) + ).data[0].user.login; + result-encoding: string +``` + +When copying the following templates, you should replace `${{ github.actor }}` with `${{steps.get_pr_creator.outputs.result}}`. +::: + +### Using profile targets + +Update your `DBT_PROFILES` to have 1 target per developer. The target name should be their GitHub username. + +```yaml +jaffle_shop: + target: prod + outputs: + prod: + type: bigquery + method: oauth + keyfile: keyfile.json + project: jaffle-shop + dataset: prod + katie: # example developer 1, should be GitHub username + type: bigquery + method: oauth + keyfile: keyfile.json + project: jaffle-shop + dataset: dbt_katie + jose: # example developer 2 + type: bigquery + method: oauth + keyfile: keyfile.json + project: jaffle-shop + dataset: dbt_jose +``` + +Then, update your GitHub action to use the username as the `--target` flag for the `lightdash start-preview` command. + +```yaml +run: lightdash start-preview --project-dir "$PROJECT_DIR" --profiles-dir . --name ${GITHUB_REF##*/} --target ${{ github.actor }} +``` + +### Using github environments + +Setup a [GitHub environment](https://docs.github.com/en/actions/deployment/targeting-different-environments/using-environments-for-deployment) for each developer where the secrets are specifically for them. The environment name should be their GitHub username. +Then, update your GitHub action to use the username as the environment. + +```yml +jobs: + preview: + runs-on: ubuntu-latest + environment: ${{ github.actor }} +``` + +## How to use the dbt cloud schema in your preview project + +If you are using a [continuous integration job in dbt cloud](https://docs.getdbt.com/docs/deploy/ci-jobs), you can use the schema that is created by dbt cloud (`dbt_cloud_pr__`) for your preview project. + +First we need to add an environment variable to your profile.yml file that will be used by dbt to connect to the correct schema. + +```yaml +schema: "{{ env_var('DBT_SCHEMA') }}" +``` + +If you are using BigQuery, it should be `dataset` instead of `schema`. + +Then we need to add a step in the GitHub action to fetch the pull request id. + +```yaml +- uses: actions/github-script@v6 + id: pr_id + with: + script: | + if (context.issue.number) { + // Return issue number if present + return context.issue.number; + } else { + // Otherwise return issue number from commit + return ( + await github.rest.repos.listPullRequestsAssociatedWithCommit({ + commit_sha: context.sha, + owner: context.repo.owner, + repo: context.repo.repo, + }) + ).data[0].number; + } + result-encoding: string +``` + +After that we need to add a new env variable to the step "Lightdash CLI start preview" which is the schema that dbt cloud will use. + +Note that in this example we assume the job id is `1234`. You will need to replace this with the actual job id. + +```yaml +env: + # ... keep existing env variables + DBT_SCHEMA: 'dbt_cloud_pr_1234_${{steps.pr_id.outputs.result}}' +``` + +Now dbt will use the correct schema when running in the preview environment. diff --git a/docs/guides/cli/how-to-use-lightdash-validate.mdx b/docs/guides/cli/how-to-use-lightdash-validate.mdx new file mode 100644 index 0000000..ba436d0 --- /dev/null +++ b/docs/guides/cli/how-to-use-lightdash-validate.mdx @@ -0,0 +1,73 @@ +import AutomaticallyDeployChangesGithub from './../../snippets/github-secrets.mdx'; +import ProjectId from './assets/project-id.png'; + +# Lightdash Validate + +You can check to see if your changes break any of the content in your project using `lightdash validate`. This command will run the validator which will return a list of content in your project that is broken and details about the errors. + +You can trigger a validation on a project using the Lightdash CLI so you can check locally if your changes will break anything. You can also add `lightdash validate` to your [GitHub Actions](#configure-github-actions) so changes can't be merged unless they pass the validation. + +## Usage + +![CLI validate](./assets/cli-validate.png) + +### Validate your changes against your project by running lightdash validate + +You can run `lightdash validate` to check if your changes break any of the content in production. +By default, `lightdash validate` will check your changes against the content in the project you've selected on the CLI. +You can change your project using `lightdash config set-project`. + +```bash +lightdash validate +``` + +Optionally you can use the `--preview` argument to validate your last preview environment created from the CLI. + +You will get a list of errors if your local files are going to break some content on your project. +These errors will not be reflected on the validation table on Lightdash settings. + +### Validate any project using the project UUID + +You can run a validation on any project by specifying the project UUID in the `lightdash validate` command. + +```bash +lightdash validate --project +``` + +**Note:** you can get your project UUID from the Lightdash URL by selecting the ID after the `projects/` + + + +### Validate only specific elements of your project + +You can select which parts of your project you would like to validate using the `--only` argument. + +```bash +lightdash validate --only tables charts dashboards +``` + +Available options: + +- `tables` +- `charts` +- `dashboards` + +## Configure Github actions + +This command will create a preview environment, and then validate this preview by specifying `--preview` on the validate command. +`lightdash validate` will return an error (return code 1) if there is at least 1 validation error on your project. +You can use this output to block a deploy on Github actions like this + +```bash +- name: Start preview + run: lightdash start-preview +- name: Validate preview + run: lightdash validate --preview +``` + +To learn more about setting up GitHub actions for Lightdash, check out the docs [here](/snippets/automatically-deploy-your-changes-using-github-action) diff --git a/docs/guides/create-user-attribute.png b/docs/guides/create-user-attribute.png new file mode 100644 index 0000000..96d5968 Binary files /dev/null and b/docs/guides/create-user-attribute.png differ diff --git a/docs/guides/customizing-the-appearance-of-your-project.md b/docs/guides/customizing-the-appearance-of-your-project.md new file mode 100644 index 0000000..1b63935 --- /dev/null +++ b/docs/guides/customizing-the-appearance-of-your-project.md @@ -0,0 +1,13 @@ +# Customizing the appearance of your project + +## Update the default colours used in charts + +You can update the default colours used in your organization's charts so that everything you build is on brand πŸ‘©β€πŸŽ¨ + +You can do this by heading to the `settings` --> `appearances` and you can update any and all of your default colours used in your organization. Once you're done updating the colours you want, just click on `update` to save your changes. + +![changing default colours](./assets/changing-default-colours.png) + +The next time you build a chart, it will default to using these colours for the series. + +![default colours in config](./assets/default-colours-in-config.png) diff --git a/docs/guides/filtering-dashboard-in-url.mdx b/docs/guides/filtering-dashboard-in-url.mdx new file mode 100644 index 0000000..f1a3c77 --- /dev/null +++ b/docs/guides/filtering-dashboard-in-url.mdx @@ -0,0 +1,82 @@ +import DashboardURLFilter from './assets/dashboard-url-filter.png'; + +# Filtering a Dashbaord in the URL + +In this guide you'll learn how to format a dashboard URL to apply dynamic values to saved filters on that dashbaord. You can even set up a dimension so when you click on it you are sent to a dashboard that gets filtered based on the dimension you clicked! + +For example, you might have a sales dashbaord that shows your most profitable Partners, then use a URL so that when you click on a specific partner name it brings you to a new dashboard that is filtered to show KPIs filtered to that partner. + +## Example of dashboard URL Filtering + +Here's a quick walk through video that shows what it looks like once it's complete: + +
+ +
+ +## Setting up dashboard URL filtering + +This is the process for setting it up: + +
+ +
+Steps:{' '} + +1. Open the dashboard you want to dynamically filter. +2. Add a value to the filter you want to filter dynamically. +3. Copy the URL shown after applying the filter. It should look something like the image below. + + + +:::note + +You'll notice there's a `?filters=` key in the URL. Everything after that is a JSON object that has been URL encoded. If you want to see the JSON you can find a URL decoder online to reformat it. + +::: + +4. Replace the filter value that you chose in step 2 with `${ value.formatted | url_encode }` to make it dynamic. In the example the value is `Plant+Paradise` (highlighted in the image). +5. Paste that URL into the YAML file for the model you're working in. See an [example in our demo project here](https://github.com/lightdash/lightdash-demo-data-gardening/blob/5632406cb5b43fdf066a2086142dc3e86a41e947/dbt/models/dbt_orders.yml#L31-L32). diff --git a/docs/guides/formatting-your-fields.mdx b/docs/guides/formatting-your-fields.mdx new file mode 100644 index 0000000..a22577b --- /dev/null +++ b/docs/guides/formatting-your-fields.mdx @@ -0,0 +1,476 @@ +import GroupLabel from './assets/group-label.png'; +import SubGroupLabel from './assets/sub-group-label.png'; +import Description from './assets/description-on-hover.png'; +import CustomMetricCreate from './assets/custom-metric-create.png'; +import CustomMetricFormat from './assets/custom-metric-format.png'; +import TableCalculationCreate from './assets/table-calculation-create.png'; +import TableCalculationFormat from './assets/table-calculation-format.png'; + +# Formatting your fields + +## Formatting your fields in your .yml files + +Sometimes the format of things in your dbt project is different to how you want it to look in Lightdash. That's okay! We've built a bunch of features to help you to format the fields in your dbt project so that the data in your Lightdash project looks exactly like you want it to πŸ₯Έ + +### You can find all of the possible configurations for [metrics](/references/metrics#metric-configuration) and [dimensions](/references/dimensions#dimension-configuration) in the reference docs + +We're going to go through formatting your fields in more detail below, but you can see a list of these configurations and all of the other properties you can customize for your fields in the [dimensions reference doc](/references/dimensions#dimension-configuration) and [metrics reference doc](/references/metrics#metric-configuration). + +### Hiding fields from your dbt YAML files + +Sometimes, we have a bunch of columns in our YAML files that we might not want to include in Lightdash. For example, columns with PII data, or the same date data, but at different levels of date granularity. + +It's easy to hide columns from Lightdash. All you need to do is add two words to your column: `hidden: true`. + +In your dbt YAML file, it'll look something like this: + +```yaml +version: 2 +models: + - name: users + columns: + - name: first_name + meta: + dimension: + hidden: true +``` + +The same thing goes for metrics: + +```yaml +version: 2 +models: + - name: users + columns: + - name: first_name + meta: + metrics: + count_unique_first_names: + type: count_distinct + hidden: true +``` + +By default, all of your dimensions and metrics have been set to `hidden: false`. + +### Grouping your metrics and dimensions in the sidebar + +You can group related metrics and dimensions together using the model meta `group_details` block in combination with the `groups` property in your .yaml files. +You can as well add descriptions to your groups using the property `description` that will be displayed when hovering over the group label. + +:::note Max grouping levels + +There is a max of 2 levels of grouping in the sidebar. + +::: + +For example you might want to group the percentile metrics into two sub categories one being for over 40 percentiles and the other for under 40 percentiles. You can do this by adding the `group` property to your metrics like so: + +```yaml +version: 2 +models: + - name: events + meta: + group_details: + events: + label: Events + description: Event-related fields. + percentile: + label: Percentiles + description: Grouping of percentiles + sub: + label: Percentiles under 40 + description: Grouping of percentiles under 40 + over: + label: Percentiles over 40 + description: Grouping percentiles over 40 + columns: + - name: event_id + description: '' + meta: + dimension: + type: number + groups: ['events'] + metrics: + percentile_25: + type: percentile + percentile: 25 + groups: ['percentile', 'sub'] + percentile_50: + type: percentile + percentile: 50 + groups: ['percentile', 'over'] + percentile_75: + type: percentile + percentile: 75 + groups: ['percentile', 'over'] +``` + + + +:::warning Property Deprecated + +The property `group_label` will be deprecated in favor of the above `groups` functionality. + +The `group_label` property will still work, but it is recommended to use the `groups` property. + +::: + +You can also group related metrics and dimensions together using the `group_label` property in your .yml files. +For example, you might want to group together all of the fields related to your user's `product activity`. To do this, you'd add the same `group_label` to all of the fields you want grouped together, like so: + +```yaml +version: 2 +models: + - name: users + columns: + - name: user_id + - name: logins_num_total + meta: + dimension: + group_label: 'Product activity' + - name: query_executed_num_total + meta: + dimension: + group_label: 'Product activity' + metrics: + sum_query_executed: + type: sum + group_label: 'Product activity' +``` + +This group would appear in the sidebar of my `Users` table like this: + + + +You can use group labels across metrics and dimensions. In the sidebar, your metrics will get grouped together under your label in the `metrics` section, and your dimensions will get grouped together under your label in the `dimensions` section. + +### Adding custom descriptions to your fields + +#### Custom descriptions for dimensions + +By default, Lightdash pulls in the descriptions you've included for your dimensions. But, you can override the description you see in Lightdash using the `description` property. + +```yaml +version: 2 +models: + - name: users + columns: + - name: user_id + description: "Id generated by the Lightdash API on user's first login. On legacy systems, SHA64. On new systems since 2012, FARM_FINGERPRINT()" + meta: + dimension: + description: 'Unique identifier for a user' +``` + +You can see the descriptions of your dimensions when you hover over the fields in Lightdash. + + + +#### Custom descriptions for metrics + +If you don't add a custom description for your metric, Lightdash will show a description for you in the app, by default. To override this default description, you can use the `description` property. + +```yaml +version: 2 +models: + - name: users + columns: + - name: user_id + description: "Id generated by the Lightdash API on user's first login. On legacy systems, SHA64. On new systems since 2012, FARM_FINGERPRINT()" + meta: + metrics: + count_unique_users: + type: count_distinct + description: 'Count the unique number of user IDs' +``` + +Check out [this doc](https://docs.lightdash.com/references/metrics#metric-configuration) to see all of the other properties you can customize for metrics. + +### Changing the name of your fields in Lightdash + +Sometimes, the labels we use for the fields in our dbt project aren't very user friendly. We might want to change these in Lightdash, and we can! + +To change the name you'll see for your field in Lightdash, you just use the `label` property. + +So, if I had a field `user_id_sha64`, I could relabel it to `User ID`. + +```yaml +version: 2 +models: + - name: users + columns: + - name: user_id_sha64 + meta: + dimension: + label: 'User ID' +``` + +Same thing goes for metrics! + +:::info + +Relabelling a metric will not break any saved charts that use the old metric name. Instead, your saved charts will just use the new metric name in their results tables. + +::: + +```yaml +version: 2 +models: + - name: users + columns: + - name: user_id_sha64 + meta: + metrics: + count_unique_user_ids: + type: count_distinct + label: 'Total users' +``` + +Check out [this doc](https://docs.lightdash.com/references/dimensions#dimension-configuration) to see all of the other properties you can customize for dimensions, and [this one](https://docs.lightdash.com/references/metrics#metric-configuration) for all of the other properties you can customize for your metrics. + +### Rounding your metrics and dimensions + +Rounding your metrics is easy to do using the `round` property in your YAML file. + +Here's an example of how different rounding will affect your numbers: + +| Original number | Round value | How it will appear in Lightdash | +| --------------- | ----------- | ------------------------------- | +| 121.854 | 2 | 121.85 | +| 121.854 | 1 | 121.9 | +| 121.854 | 0 | 123 | +| 121.854 | -2 | 100 | + +#### To add rounding to your dimensions, you just need to add `round` to their properties + +Like this: + +```yaml +version: 2 +models: + - name: sales + columns: + - name: revenue + meta: + dimension: + round: 2 +``` + +Check out [this doc](https://docs.lightdash.com/references/dimensions#dimension-configuration) to see all of the other properties you can customize for dimensions. + +#### To add rounding to your metrics, you just need to add `round` to their properties + +Like this: + +```yaml +version: 2 +models: + - name: sales + columns: + - name: revenue + meta: + metrics: + total_revenue: + type: sum + round: 2 +``` + +Check out [this doc](https://docs.lightdash.com/references/metrics#metric-configuration) to see all of the other properties you can customize for metrics. + +### Compacting big numbers + +#### To compact your dimensions, you just need to add `compact` to their properties + +Like this: + +```yaml +version: 2 +models: + - name: sales + columns: + - name: revenue + meta: + dimension: + compact: thousands +``` + +As an example, this option will compact the number value from 1,500 to 1.50K. + +Check out [this doc](https://docs.lightdash.com/references/dimensions#compact-values) to see all the other compact values. + +#### To compact your metrics, you just need to add `compact` to their properties + +Like this: + +```yaml +version: 2 +models: + - name: sales + columns: + - name: revenue + meta: + metrics: + total_revenue: + type: sum + compact: billions +``` + +As an example, this option will compact the number value from 1,500,000,000 to 1.50B. + +Check out [this doc](https://docs.lightdash.com/references/metrics#compact-values) to see all the other compact values. + +### Using the `format` label to add units to your values + +Some columns need a special format to convey what units they're in. For example, if you're a global company, and you have a `revenue` field. Is that in GBP? USD? + +In Lightdash, you can use the `format` label to add units to your fields. + +Here's an example of how different formats will affect your values: + +| Original value | Format value | How it will appear in Lightdash | +| -------------- | ------------ | ------------------------------- | +| 121.854 | 'gbp' | Β£121.854 | +| 121.854 | 'usd' | $121.9 | + +You can see which format types are currently available for [dimensions](https://docs.lightdash.com/references/dimensions#:~:text=number%20of%20digits-,format,-No), and for [metrics.](https://docs.lightdash.com/references/metrics#:~:text=number%20of%20digits-,format,-No) + +#### To add units to your dimensions, you just need to add `format` to their properties + +You can add a `format` to your dimensions this: + +```yaml +version: 2 +models: + - name: sales + columns: + - name: revenue + meta: + dimension: + format: 'gbp' +``` + +To see which format types are available for dimensions, [check the reference docs here.](https://docs.lightdash.com/references/dimensions#:~:text=number%20of%20digits-,format,-No). Check out [this doc](https://docs.lightdash.com/references/dimensions#dimension-configuration) to see all of the other properties you can customize for dimensions. + +#### To add units to your metrics, you just need to add `format` to their properties + +You can add a `format` to your metrics this: + +```yaml +version: 2 +models: + - name: sales + columns: + - name: revenue + meta: + metrics: + total_revenue: + type: sum + format: 'gbp' +``` + +To see which format types are available for metrics, [check the reference docs here.](/references/metrics#:~:text=number%20of%20digits-,format,-No) +Check out [this doc](/references/metrics#metric-configuration) to see all of the other properties you can customize for metrics. + +## Formatting your fields in the Lightdash UI + +You can also format your fields in the Lightdash UI. This is useful if you want to format your fields quickly without having to change your YAML files. + +Currently you can format 2 types of fields in the Lightdash UI: + +- Custom metrics ([reference](/references/custom-fields#custom-metrics)) +- Table calculations ([reference](/references/table-calculations)) + +### Formatting custom metrics + +:::info + +Custom metrics formatting is currently only available for numeric metric types. + +::: + +Firstly, create a custom metric. You can do this by clicking the `...` button on the dimension you want to create a custom metric for, and then clicking on a metric type, e.g.: `count distinct`, `sum`, `average`. + + + +Once you've created your custom metric, you can format it by clicking on the `Format` button. + + + +You can then choose from the following formatting types: + +- `percent`: Formats your metric as a percentage, with the following options: + - `round` value to your metric to round it to a certain number of decimal places + - `separator`, e.g. from `.` to `,` +- `currency`: Formats your metric as a currency + - `round` value to your metric to round it to a certain number of decimal places + - `separator`, e.g. from `.` to `,` + - `currency` symbol, e.g. from `$` to `Β£` + - `compact` value to compact your metric to a certain unit, e.g. from `1,000,000` to `1M` +- `number`: Formats your metric as a number + - `round` value to your metric to round it to a certain number of decimal places + - `separator`, e.g. from `.` to `,` + - `compact` value to compact your metric to a certain unit, e.g. from `1,000,000` to `1M` + - `prefix` value to add a prefix to your metric, e.g. `+` or `-` + - `suffix` value to add a suffix to your metric, e.g. `%` + +### Formatting table calculations + +On the results table, you can add a table calculation by clicking on the button on the right hand side of the section. + + + +Once you've created your table calculation, you can format it by clicking on the `Format` tab: + + + +You can then choose from the following formatting types: + +- `percent`: Formats your metric as a percentage, with the following options: + - `round` value to your metric to round it to a certain number of decimal places + - `separator`, e.g. from `.` to `,` +- `currency`: Formats your metric as a currency + - `round` value to your metric to round it to a certain number of decimal places + - `separator`, e.g. from `.` to `,` + - `currency` symbol, e.g. from `$` to `Β£` + - `compact` value to compact your metric to a certain unit, e.g. from `1,000,000` to `1M` +- `number`: Formats your metric as a number + - `round` value to your metric to round it to a certain number of decimal places + - `separator`, e.g. from `.` to `,` + - `compact` value to compact your metric to a certain unit, e.g. from `1,000,000` to `1M` + - `prefix` value to add a prefix to your metric, e.g. `+` or `-` + - `suffix` value to add a suffix to your metric, e.g. `%` diff --git a/docs/guides/how-to-create-alerts.mdx b/docs/guides/how-to-create-alerts.mdx new file mode 100644 index 0000000..80d9681 --- /dev/null +++ b/docs/guides/how-to-create-alerts.mdx @@ -0,0 +1,96 @@ +import ThreeDotMenu from './assets/alert-three-dot-menu.png'; +import CreateNewModal from './assets/alert-create-new-modal.png'; +import ConfigureNewAlert from './assets/configure-alert.png'; +import EditDeleteAlert from './assets/edit-delete-alert.png'; +import PrivateSlackChannel from './assets/private-slack-channel.png'; + +# Alerts + +Alerts enable you to receive notifications via email or Slack when the value of a saved chart meets your specified conditions. + +At the scheduled time, Lightdash will run the query and check the results. If the first value in the results set meets the alerting condition, the alert will be sent. +This notification will continue to be sent if the condition is true until it is manually disabled or deleted. + +You can create or select an existing saved chart, add an alert to it, and tell Lightdash when you’d like the send out your update. You can set up as many alerts to a saved chart as you like, and if you make any changes to the content, Lightdash will update the alert the next time they’re sent. Alerts can be sent to an email address or into Slack (assuming your org has [added Slack](/guides/adding-slack-integration.mdx)). + +:::info +For security reasons, the delivered files expire after 3 days. This means old emails or Slack shares will have broken images and there is not an option to retrieve them. If you want to keep the sent files, it's best to download them from the alert. +::: + +## Enabling alerts + +Email alerts are available on all Lightdash Cloud plans. + +To set up Slack, an organization admin will have to [add the Slack integration](/guides/adding-slack-integration.mdx). + +## Creating an alert + +Only users with [admin, developer or edit access](/references/roles.mdx) can create alerts. To create an alert, click on the three-dot menu in the top-right corner of your chart, then click on `Alerts`. + + + +You'll get a modal that pops up and shows you the list of existing alerts for your saved chart, and gives you the option to `Create new`. + + + +### Setup + +Once you click on `Create new`, you'll be brought to a configuration screen for your new alert. + + + +Here, you can configure your alert. +The options are: + +- **Alert name**: this is the name of your alert. +- **Conditions**: Configure the condition that is going to be evaluated against the first result(s). + - `Alert field` The numeric field is going to be evaluated + - `Condition`: Operator we are going to use to evaluate your value. + - **is greater/less than**: Check if the `first` value in your results is greater/less than your threshold value. + - **increased/decreased by**: Verify whether the percentage change in the first value relative to the second value exceeds the specified threshold, either by increasing or decreasing. +- **Run frequency**: This is the frequency at which Lightdash runs a query to check your data for changes. (You will be notified if the conditions on the latest value are met) . All times for the scheduler are in UTC. +- **Send to**: here, you can pick if you want to send your alert to Slack, email, or both. You can add as many Slack channels and email addresses as you'd like to here. You can send an alert to a person in Slack using `@persons-name` or to a channel using `#channel-name`. + +## Editing and deleting your alerts + +To edit an alert, click on the pencil-icon next to the alert you want to edit. This will bring you back to the configuration screen for your alert, where you can make any changes you'd like. +In case you want to delete a alert, click on the trash-icon next to the alert you want to delete. + + + +You can also pause alerts by clicking the toggle button on the list of alerts. + +## Sending to private Slack channels + +You can also send alerts to private Slack channels. To do this, simply type the name of the Slack channel exactly as it appears in Slack into the input text box. Then click on it to confirm and save the alert. + + + +:::info +You must add the Lightdash slack bot into the private Slack channel for it to be able to post alert results. +::: diff --git a/docs/guides/how-to-create-dimensions.mdx b/docs/guides/how-to-create-dimensions.mdx new file mode 100644 index 0000000..e38ef2d --- /dev/null +++ b/docs/guides/how-to-create-dimensions.mdx @@ -0,0 +1,5 @@ +import HowToCreateDimensions from './../snippets/how-to-create-dimensions.mdx'; + +# How to create dimensions + + diff --git a/docs/guides/how-to-create-metrics.mdx b/docs/guides/how-to-create-metrics.mdx new file mode 100644 index 0000000..da0dfb5 --- /dev/null +++ b/docs/guides/how-to-create-metrics.mdx @@ -0,0 +1,5 @@ +import HowToCreateMetrics from './../snippets/how-to-create-metrics.mdx'; + +# How to create metrics + + diff --git a/docs/guides/how-to-create-multiple-projects.md b/docs/guides/how-to-create-multiple-projects.md new file mode 100644 index 0000000..7f80e42 --- /dev/null +++ b/docs/guides/how-to-create-multiple-projects.md @@ -0,0 +1,41 @@ +# Creating multiple projects + +With Lightdash, you can have a single organization (e.g. Lightdash), and multiple projects within that organization (e.g. Production, Jaffle Shop, etc.) + +## To create a new project, head to the settings + +To create a new project, click on `settings` --> `project management` --> `create new project`. + +![screenshot-create-project](assets/screenshot-create-project.png) + +Give your project a nice, new name, then get started on setting up the dbt and warehouse connection. + +:::info + +Only users with admin permissions can create new projects. + +::: + +## Set up the dbt + warehouse connection + +You'll need to define the dbt and warehouse connections for your new project. + +Not sure what it all means? Don't worry, we've written [a step-by-step guide](https://docs.lightdash.com/get-started/setup-lightdash/connect-project) that will help you out. + +## Easily switch between projects + +Once you've got multiple projects set up, you can easily switch through the projects in your organization using the drop-down list in the top corner of your screen. + +![screenshot-switch-projects](assets/screenshot-switch-projects.png) + +## Go to the project management settings to delete a project + +Don't need a project anymore? That's okay - you can easily delete a project in the project settings space. + +![screenshot-delete-project](assets/screenshot-delete-project.png) + +:::info + +Only users with admin permissions can delete projects. + +::: diff --git a/docs/guides/how-to-create-scheduled-deliveries.mdx b/docs/guides/how-to-create-scheduled-deliveries.mdx new file mode 100644 index 0000000..f4df826 --- /dev/null +++ b/docs/guides/how-to-create-scheduled-deliveries.mdx @@ -0,0 +1,178 @@ +import ThreeDotMenu from './assets/scheduled-deliveries-three-dot-menu.png'; +import CreateNewModal from './assets/scheduled-deliveries-create-new-modal.png'; +import ConfigureNewDelivery from './assets/configure-scheduled-delivery.png'; +import EditDeleteDelivery from './assets/edit-delete-scheduled-delivery.png'; +import ScheduledDeliveriesOverview from './assets/scheduled-deliveries-overview.png'; +import PrivateSlackChannel from './assets/private-slack-channel.png'; +import GsheetMetadata from './assets/gsheet-metadata.png'; +import GsheetDelivery from './assets/gsheet-delivery.png'; +import DashboardScheduledDeliveryFilters from './assets/scheduled-delivery-dashboard-filters.png'; +import ScheduledDeliveryCustomization from './assets/scheduled-delivery-customization.png'; +import ProjectDefaultTimeZone from './assets/project-default-time-zone.jpg'; + +# Scheduled deliveries + +Scheduled deliveries let you send a dashboard or saved chart, and their results to people via email or Slack - even to people who don't have an account in your Lightdash instance. + +If your Lightdash organization has [Slack](/guides/adding-slack-integration.mdx) set up, you can create or select an existing saved chart or dashboard, add a scheduled delivery to it, and tell Lightdash when you’d like the send out your update. You can set up as many scheduled deliveries to a saved chart or dashboard as you like, and if you make any changes to the content, Lightdash will update the scheduled deliveries the next time they’re sent. + +:::info +For security reasons, the delivered files expire after 3 days. This means old emails or Slack shares will have broken images and there is not an option to retrieve them. If you want to keep the sent files, it's best to download them from the scheduled delivery. +::: + +## Enabling scheduled deliveries + +Emailed scheduled deliveries are available on all Lightdash Cloud plans. + +To set up Slack, an organization admin will have to [add the Slack integration](/guides/adding-slack-integration.mdx). + +## Creating a scheduled delivery + +Only users with [admin, developer or edit access](/references/roles.mdx) can create scheduled deliveries. To create a scheduled delivery, click on the three-dot menu in the top-right corner of your chart or dashboard, then click on `scheduled deliveries`. + + + +You'll get a modal that pops up and shows you the list of existing scheduled deliveries for your saved chart or dashboard, and gives you the option to `create new`. + + + +### Setup + +Once you click on `create new`, you'll be brought to a configuration screen for your new scheduled delivery. + + + +#### Delivery name + +This is the name of your scheduled delivery. This name will appear as the header in your scheduled delivery message. + +#### Delivery frequency + +This is how often your scheduled delivery will be sent. You can make this hourly, daily, weekly, monthly, or custom - each frequency has its own options. + +The **custom** frequency lets you write out your own custom Cron expression if you need something more specific than our standard options. + +You can also customize the **time zone** of your scheduled delivery. By default, the deliveries are set to the project's default time zone. If you update the project's default time zone, then scheduled deliveries where you have not customized the time zone will automatically be updated to the new default time zone. + +#### Format + +Either `Image` or `CSV`. + +- `Image` sends an image of the content (chart or dashboard) to your chosen destination. You may also want to send the image as a PDF attachment if you choose to send it over email. + +- `CSV`: sends a downloadable .csv file of the results table from your chart, or if you're sending a dashboard, it sends a single message with multiple .csv files for the results tables from each of your charts. You can set the `values` to either be `raw` (we remove the formatting applied dates, numbers, or other fields in Lightdash) or `formatted` (the way the values appear in your table in Lightdash is how they'll appear in the .csv). You can also adjust the `limit` and specify the number of rows that you want to be delivered in your .csv. `Results in table` will deliver the number of results that are currently in the results table for your charts. You can also set a custom number of rows to be delivered using `custom`, or set all results to be delivered so there's no maximum row limit for each chart using `all results`. + - **Limit on CSV format**: We limit CSV downloads to 100,000 cells by default, so if you are trying to download more cells, your file will get truncated. + +#### Send to + +You can choose if you want to send your scheduled delivery to Slack, email, or both. You can add as many Slack channels and email addresses as you'd like to here. You can send a scheduled delivery to a person in Slack using `@persons-name` or to a channel using `#channel-name`. + +### Filters + +You can also customise the **saved** filters([more information on how to save filters in dashboards](/guides/limiting-data-using-filters#adding-saved-filters-to-your-dashboard)) applied to your dashboard on the `Filters` tab. This lets you send a different version of your dashboard to different people, without having to create multiple dashboards. + + + +:::info +Filters are only available for Dashboard scheduled deliveries. +::: + +Here, you'll be able to: + +1. Update the filter operator (e.g. from "is" to "is not") +2. Update the filter value (e.g. from "USD" to "GBP") +3. Revert the filter back to its original state (the default value of the filter applied to your dashboard) + +### Customization + + + +Finally, you can customize the message that gets sent with your scheduled delivery on the `Customization` tab. + +## Editing and deleting your scheduled deliveries + +To edit a scheduled delivery, click on the pencil-icon next to the scheduled delivery you want to edit. This will bring you back to the configuration screen for your scheduled delivery, where you can make any changes you'd like. +In case you want to delete a scheduled delivery, click on the trash-icon next to the scheduled delivery you want to delete. + + + +## Overview of your scheduled deliveries + +Users who have an admin role in your project can access an overview of your scheduled deliveries in the project settings. + +In the scheduled deliveries overview page, you can see a list of all of your scheduled deliveries, their most recent delivery status, and a history of all of the previous scheduled deliveries in your project. + +To access the overview page, just head to your project settings, then to the `Syncs & Scheduled Deliveries` tab. + + + +## Sending to private Slack channels + +You can also send scheduled deliveries to private Slack channels. To do this, simply type the name of the Slack channel exactly as it appears in Slack into the input text box. Then click on it to confirm and save the scheduled delivery. + +:::info +You must add the Lightdash slack bot into the private Slack channel for it to be able to post scheduled delivery results. +::: + +## Configuring the default time zone + +Project admins can set the default time zone used for scheduled deliveries across the project in the `Project settings` --> `Syncs & Scheduled deliveries`. + + + +Scheduled deliveries will be set to the project's default time zone that you pick here. + +Users can customize the time zone used in a scheduled delivery. This will override the project default for that scheduled delivery. + +:::info + +If you update the project's default time zone, then scheduled deliveries where the time zone hasn't been customized will automatically be translated to use the new default time zone. + +::: + +For example: + +- my project default time zone is set to UTC +- I have a scheduled delivery set to `Weekly on Monday at 15:00` +- I change the project default time zone to `(UTC -5:00) America/New York` +- my scheduled delivery will now be set to `Weekly on Monday at 10:00` diff --git a/docs/guides/how-to-embed-content.mdx b/docs/guides/how-to-embed-content.mdx new file mode 100644 index 0000000..9437003 --- /dev/null +++ b/docs/guides/how-to-embed-content.mdx @@ -0,0 +1,158 @@ +import EmbedCreateSecret from './assets/embed-create-secret.png'; +import EmbedAddDashboard from './assets/embed-add-dashboard.png'; +import EmbedDeveloper from './assets/embed-developer.png'; +import EmbedPreview from './assets/embed-preview.png'; +import CreateUserAttribute from './assets/create-user-attribute.png'; +import DashboardEmbedAttribute from './assets/dashboard-embed-attribute.png'; + +# How to embed content + +Lightdash allows you to embed your dashboards using expirable URLs and tokens (embed URLs from now on). This is a great way to enable self-serve analytics in your own application and platform by leveraging the insights you've got in Lightdash and making them available to your own users. + +:::info + +Embedding is available to all Lightdash Cloud users, [get in touch](https://lightdash.typeform.com/to/BujU5wg5) to have this feature enabled in your account. + +::: + +## Quick start to embed dashboards + +### Create an embed secret + +First, you need to generate a secret per project. +This secret is like a password that will help you encrypt the URLs so we know the access is valid. + + +. + +You can regenerate the secret by clicking on the `Generate new secret` button. If you do this, people with an old URL will automatically lose access to any previously shared embed URL. + +### Allowed dashboards + +Only selected dashboards can be accessed via embed URLs + + + +### Preview + +Under preview you can generate a one-off shareable embed URL for a single dashboard. + + + +Click on `preview` to see the embed content and click on `Generate & copy URL` to generate an embed URL for this dashboard + +### Developer flow and code snippet + +Although you can generate URLs directly from Lightdash with a long expiration +it is recommended to generate your own JWT tokens in your backend with a short expiration using your `secret` +to make sure people can't be using embed URLs outside your app. + +To make this easier to integrate, we included some code snippets you can copy and use in your app to generate a valid embed URL + + + +:::info + +For more information on embed settings, see the [embedding reference doc](../references/embedding.mdx) + +::: + +## Do I need a Lightdash account to be able to view embedded content? + +No, embedded Lightdash content is available to view by anyone (not just folks with a Lightdash login). + +So, for example, you could embed a dashboard in your product, and anyone who has access to your product would have access to that dashboard. No need to login to Lightdash. + +We make sure that the links are secure and have a set expiry time that you pick. + +## I want to have my embedded dashboard show different values for different users in my app. + +Imagine a scenario where I have a dashboard embedded in my application showing an overview of orders. Ideally, when a user looks at this dashboard, they should only see the orders for their shop (not all of the other shops using my application). You can do this with embedded dashboards using user attributes. Here's how to do it: + +### Create a user attribute in Lightdash + +First, we need to create a [user attribute](../references/user-attributes.mdx) in Lightdash that we can use to assign our users to a specific shop. I create an attribute called `shop_id` and I set the default value to `all`. + + +. + +### Filter the tables used in your dashboard with `sql_filter` + +We need to filter the access to all of the tables we use in our dashboard using this attribute. For example, in my `Order Summary` dashboard, I use the `orders` and the `shops` tables to build all of the charts. So, in these two tables, I'm going to add a [row-level filter](#../references/user-attributes#1-row-filtering-with-sql_filter) using my `shop_id` attribute, like: + +```yaml +version: 2 +models: + - name: orders + meta: + sql_filter: ${lightdash.attributes.shop_id} = 'all' OR ${TABLE}.shop_id = ${lightdash.attributes.shop_id} +``` + +### Add the user attribute to your dashboard embed + +Now that we have our user attribute set up and filtering our data properly, we want to head back to our dashboard emedding configuration. + +There are two ways to use user attributes in your embedded dashboard: + +**Option 1: assign a constant value for your attribute** + +You can assign your dashboard a single, constant value for your attribute by adding it in the `user attributes` section of your embedded dashboard setup. + +For example, if I wanted the embed link to only show data for `shop_id = Thyme to Shine`, then I would add a user attribute `shop_id` with the value `Thyme to Shine`. + + +. + +**Option 2: assign a variable value for your attribute** + +You can adjust the value of the user attribute based on a variable coming from your app so, for example, the user attribute for `shop_id` in the Lightdash embedded dashboard would change depending on which `shop_id` the user belonged to in my app. + +To do this, I would pass Lightdash an external value for `shop_id` in the embed code snippet. This could look something like: + +```node +import jwt from 'jsonwebtoken'; +const LIGHTDASH_EMBED_SECRET = 'secret'; // replace with your secret +const projectUuid = '21eef0b9-5bae-40f3-851e-9554588e71a6'; +const userShopId = await getUserShopIdFromDatabase(); +const data = { + content: { + type: 'dashboard', + dashboardUuid: 'a392ed6d-4c53-4102-89b7-1c57a87df391', + }, + userAttributes: { shop_id: userShopId }, +}; +const token = jwt.sign(data, LIGHTDASH_EMBED_SECRET, { expiresIn: '1 hour' }); +const url = `https://analytics.lightdash.cloud/embed/${projectUuid}/#${token}`; +``` + +And voila! you now have an embedded dashboard that shows different values for different users in your app. diff --git a/docs/guides/how-to-join-tables.md b/docs/guides/how-to-join-tables.md new file mode 100644 index 0000000..d92eb4b --- /dev/null +++ b/docs/guides/how-to-join-tables.md @@ -0,0 +1,34 @@ +--- +sidebar_position: 3 +--- + +# How to join tables + +Learn how to add joins to your YAML files to connect different models to each other. + +## Declare joins in dbt model properties + +Joins let you to connect different models to each other so that you can explore more than one model at the same time in Lightdash and see how different parts of your data relate to each other. + +You add joins to your YAML files under the `meta` tag at the model level: + +```yaml +version: 2 + +models: + - name: users + meta: + joins: + - join: segment_web_sessions + sql_on: ${segment_web_sessions.user_id} = ${users.user_id} + + columns: +``` + +Once you've added a join, you can refresh Lightdash to see your changes in action. The dimensions and metrics of the joined model are included in the list on the left, right below the original model: + +![screenshot-joined-tables](assets/screenshot-joined-tables.png) + +## Next steps + +- Read more about customising joins in the [joins reference](../references/joins.mdx) diff --git a/docs/guides/how-to-promote-content.md b/docs/guides/how-to-promote-content.md new file mode 100644 index 0000000..d26a656 --- /dev/null +++ b/docs/guides/how-to-promote-content.md @@ -0,0 +1,105 @@ +import SelectProject from './assets/promote-select-project.png'; +import PromoteViewChart from './assets/promote-view-chart.png'; +import PromoteListChart from './assets/promote-list-chart.png'; +import SucessMessage from './assets/promote-success.png'; +import PromoteViewDashboard from './assets/promote-view-dashboard.png'; +import PromoteListDashboard from './assets/promote-list-dashboard.png'; +import SucessDashboardMessage from './assets/promote-dashboard-success.png'; + +# How to promote content + +Promoting content enables you to copy content from one project to another. It's especially useful when working with preview or development projects. You can promote charts created in your development projects to production, so it's easy to test and make changes without the fear of breaking things in production. + +## How promoting works + +If you are promoting a chart, from a `development` project to a `production` project, this will happen: + +- If the chart exists in both the `development` project and the `production` project, the chart in `production` will be updated with the changes from `development`. You can always revert this chart to a previous version using [version history](./version-history). Lightdash matches charts based on the name used when you first created them. Even if you change the names later, the two charts will still be linked. +- If the chart is new, we will replicate the `development` chart into the `production` project. We will also create a new space if a space does not exist with the same name. + +## Configure upstream project + +Before you can start promoting content, you need to configure your upstream project. +To do this, on your `development` project go to settings > Data ops. + +Select the project where you want to copy the content to. + + + +## Promote charts + +You can promote charts from the `chart` in view mode or from any listing (like home page or all charts), click on the `...` button and then select `promote chart`. + + + + + +:::info + +You must be a `developer` and have access to the chart and space in both the `development project` and the `upstream project`. +If the chart is in a space that doesn't exist in the `upstream project`, then this space will be created with the same user access and the content will be put in this space. +If the chart is in a space that exists in the `upstream project`, the access to this space will not be updated. + +::: + +Once the chart is promoted, you can click on the `success` banner to open a new tab into this chart in the `production project` + + + +## Promote dashboards + +You can promote dashboards from the `dashboard` in view mode or from any listing (like home page or all dashboards), click on the `...` button and then select `promote dashboard`. + +This will promote the dashboard to the `upstream` project as well as all the charts in this dashboard (for both charts within spaces and charts within this dashboard) and all other non-chart tiles like markdown. + +If the dashboard or charts are in a space that doesn't exist in the upstream project, then these spaces will be created and the content will be put in these spaces. + + + + + +:::info + +You must be a `developer` and have access to the dashboard and space in both the `development project` and the `upstream project` as well as have access to all the charts in the dashboard. +If the dashboard is in a space that doesn't exist in the `upstream project`, then this space will be created with the same user access and the content will be put in this space. +If the dashboard is in a space that exists in the `upstream project`, the access to this space will not be updated. +::: + +Once the dashboard is promoted, you can click on the `success` banner to open a new tab into this dashboard in the `production project`. + + diff --git a/docs/guides/interactive-dashboards.mdx b/docs/guides/interactive-dashboards.mdx new file mode 100644 index 0000000..903fcb0 --- /dev/null +++ b/docs/guides/interactive-dashboards.mdx @@ -0,0 +1,124 @@ +import CrossFilteringImage from './assets/cross-filtering.png'; +import CrossFilteringAppliedImage from './assets/cross-filtering-applied.png'; +import UnderlyingChart from './assets/underlying-chart-data.png'; +import DateZoomBeforeAndAfter from './assets/date-zoom-before-and-after.png'; +import DateZoomIndicator from './assets/date-zoom-indicator.png'; +import DrillIntoDashboardChart from './assets/drill-into-dashboard-chart.png'; +import DrillIntoModal from './assets/drill-into-modal.png'; +import DrillIntoResultDay from './assets/drill-into-result-day.png'; + +# Interacting with your dashboards + +## Viewing the underlying data for a point on a chart + +You can click on any point on a chart and view the records which make up that data point. + +For example, I can find out what the underlying data is for the $4,334.0 in my `What are the sales stats per partner, per month?` chart, by clicking on the bar for that month, and then clicking `View underlying data` in the action menu. +I'd see all of the rows in the underlying table that make up that total. + + + +After viewing the underlying data, I can also: + +- Export this data as a CSV +- Explore from this underlying data, which will take me to a new chart with the underlying data as the starting point + +## Using a chart to filter your dashboard (a.k.a. cross-filtering) + +When you click on the value in a chart (e.g. a bar in your bar chart), you can choose to filter on that value and update all of the other relevant charts in the dashboard. This type of chart-to-dashboard filtering is sometimes called `cross-filtering`. + + + +### You can see which tiles had the filter applied by hovering over the `dashboard filter applied` text on your chart tile. + +Once you've clicked on your filter, all of the tiles in your dashboard with the filter field will be filtered to the value you selected. + +You can see which tiles had the filter applied by hovering over the tile and then on the funnel icon to see the filter that was applied. + + + +### Your cross-filtering will not change the saved chart unless you're in `edit` mode + +The filters you add using cross-filtering won't be saved unless you're in `edit` mode (i.e. you've clicked `edit` in your dashboard) and you save the filters you applied. + +Otherwise, you can cross-filter away without any worry that you'll be changing the chart for everyone else! 😊 + +## Date zoom + +When viewing a dashboard, you can also change the date granularity (e.g. to Week, Year) of the **charts with date dimensions in your dashboard** by clicking on the button `Date Zoom`. + +This is helpful if you want to zoom in to look more closely at something, or zoom out to identify a trend. You're able to quickly date-drill into your data without having to edit the chart. + + + +When the date granularity of a chart is changed, you can hover over the indicator to see the date dimension that was affected, like so: + + +Any chart with results that have at least one date dimension will be affected by +Date Zoom (even if the date dimension is not explicitly shown on the chart). + +:::info +If you have more than one date dimension in your results, date drill will be applied to the first date dimension it scans - this is normally the left-most column in your results. +::: + +Also, you're only temporarily changing the dates in the tiles on your dashboard. So, if you refresh the dashboard, the tiles that you affected using Date Zoom will go back to how they looked before. + +## Drill into a metric in a chart or your results table using `drill into` + +You can drill into a metric in your chart or results table to better understand a point in your chart. Selecting `drill into` lets you group your metric by a dimension, like the total revenue segmented by (or grouped by) product type. Note that `drill into` only works for metrics, not for dimensions or table calculations. + +### Here's an example of drill into + +I have a chart with sales stats (a metric) per partner, per month. As you can see, there's a high spike in sales for one of the partners in the month of May. I want to understand why this spike happened. + +To do this, I click on the data point in my chart, then click `drill into` in the action menu: + + + +I then select the dimension I want to segment my metric by (or "drill into"). In this example, I'm interested to see what shipping country the sales were coming from, so I select `Shipping Country`: + + + +Once I've selected the dimension I want to group by, I click `open in new tab` and see a chart with my metric, grouped by `Shipping Country`. Now I can uncover where this spike in sales is coming from πŸ‘€ + + diff --git a/docs/guides/limiting-data-using-filters.mdx b/docs/guides/limiting-data-using-filters.mdx new file mode 100644 index 0000000..046ac0f --- /dev/null +++ b/docs/guides/limiting-data-using-filters.mdx @@ -0,0 +1,429 @@ +import AddFilter from './assets/add-filter.jpg'; +import AddMoreFiltersDashboard from './assets/add-more-filters-dashboard.jpg'; +import MultipleValuesFilter from './assets/screenshot-multiple-values-filter.jpg'; +import AddingFiltersFromToggle from './assets/adding-filters-from-toggle-1.jpg'; +import AddingFiltersFromSidebar from './assets/add-filter-sidebar.jpg'; +import AddingFiltersResultsTable from './assets/add-filter-results-table.jpg'; +import AddFilterDashboard from './assets/add-filter-dashboard.png'; +import NewFiltersDashboard from './assets/new-filters-dashboard.jpg'; +import CrossFilteringDashboard from './assets/cross-filtering-dashboard.jpg'; +import EditDashboard from './assets/edit-dashboard.png'; +import SaveDashboard from './assets/save-new-filters-dashboard.png'; +import EditRemoveFilters from './assets/edit-or-remove-dashboard-filters.png'; +import DashboardFilterApplied from './assets/dashboard-filter-applied.png'; +import MultipleFilterOptions from './assets/multiple-filter-options.jpg'; +import FilterTilesTab from './assets/filter-tiles-tab.png'; +import FilterTileAdjust from './assets/filter-tile-adjust.jpg'; +import ConvertToFilterGroup from './assets/convert-to-filter-group.png'; +import NestedFilters from './assets/nested-filters.png'; +import AddFilterDashboardDefaultValue from './assets/add-filter-dashboard-default-value.png'; +import AddFilterDashboardEmptyValue from './assets/add-filter-dashboard-empty-value.png'; +import DashboardFiltersSaved from './assets/dashboard-filters-saved.png'; +import DashboardFiltersReadyToBeSaved from './assets/dashboard-filters-ready-to-be-saved.png'; +import DashboardFiltersViewMode from './assets/dashboard-filters-view-mode.png'; +import AddTemporaryFilterDashboard from './assets/dashboard-temporary-filter-add-new.png'; +import AddTemporaryFilterDashboardTile from './assets/dashboard-temporary-filter-add-tile.png'; +import AddTemporaryFilterDashboardTileEdit from './assets/dashboard-temporary-filter-add-tile-edit.png'; +import AddTemporaryFilterDashboardView from './assets/dashboard-temporary-filter-view.png'; +import AddTemporaryFilterDashboardCrossfilter from './assets/dashboard-temporary-filter-filter-dashboard-by.png'; +import AddTemporaryFilterDashboardNewFilters from './assets/dashboard-temporary-filter-view-new-filters.png'; + +# Using Filters + +Filters appear at the top of the Explore view or dashboard and allow users to change the data being pulled into your charts. + +For example, if I built a chart showing the revenue over time, but I wanted it to only have the revenue I made in France, I could add a filter for `country is equal to France`. + +You can [add filters to your charts individually in the Explore view](#adding-filters-in-the-explore-view), or [across all of your charts in your dashboard](#adding-filters-to-your-dashboard). Don't worry, we'll walk you through both and you'll be a filter pro in no time! + +:::info + +If you're a developer, you can add permanent filters to tables using the `sql_filter` yaml option. For more information see [Table configuration](../../references/tables#sql-filter) + +::: + +## General filters tips + +Here are some general tips about filters that apply to using them in both the Explore view and in dashboards. + +### If you want to have multiple filters, just click `+ Add filter` + +In the Explore view: + + + +Or in a dashboard: + + + +### If you add multiple filters, you can choose to have `ALL` or `ANY` of the conditions match + +To choose which option you want, just click on the drop-down menu on the top-left of the filters. + + + +Selecting `ALL` conditions to match means you'd add an `AND` between your conditions in SQL. So, the example in the Explore view above would give us compiled SQL that looks like: + +```sql +WHERE ( + (pages.source) IN ('lightdash_demo', 'lightdash_documentation') + AND (pages.path) = '/20%crunchbase' +``` + +Selecting `ANY` conditions to match means you'd add an `OR` between your conditions in SQL. So, the example in the Explore view above would give us compiled SQL that looks like: + +```sql +WHERE ( + (pages.source) IN ('lightdash_demo', 'lightdash_documentation') + OR (pages.path) = '/20%crunchbase' +``` + +### If you want to include multiple values in your filter, just hit `enter` between each value entry in your list + + + +The listed values are separated by an OR statement in the compiled SQL. E.g. the above would give us: + +```sql +WHERE ( + (pages.source) = 'lightdash_demo' + OR (pages.source) = 'lightdash_documentation' +) +``` + +### To learn about the types of filters we have available, check out the filters reference doc. + +Check out our [filters reference doc here](../references/filters.md) to see a list of all available filters and their uses. + +## Adding filters in the Explore view + +There are a couple of ways that you can add filters in the Explore view. + +### Adding a filter from within the `Filters` tab + +In the Explores view, you can add filters from within the `Filters` tab. Just click to open the toggle, then click `add filter`. + + + +Select the field you would like to filter from the drop-down list, then select the filtering options. + +### Adding a filter from the sidebar + +It's easy to add filters directly from the list of fields in the sidebar. Just click on the `options` for a field, then click `add filter`. + + + +### Adding a filter from the results table + +Once you have some results in your results table, you can add filters by clicking on the three-dot menu of the column you want to filter on, or by clicking on the value you want to filter by. + + + +### Adding nested filters + +You can add nested filters by clicking on the options button on the right-hand side of the filter and then click on `convert to group`. + + + +Then, you can add a new filter to the nested filter by clicking `add filter`. + + + +## Adding filters to your dashboard + +There are a couple of ways that you can add filters to your Dashboards. + +### Adding temporary filters to your dashboard + +If you add a temporary filter to your dasboard, then only you will see the filters you've applied (you won't be changing the dashboard for everyone who comes to look at it). If you want to save the dashboard filters you're adding, then check out [adding saved filters to your dashboard](#adding-saved-filters-to-your-dashboard). + +There are two ways to add temporary filters to your dashboard. + +#### Adding temporary filters using the `add filters` button + +1. Open up your dashboard. +2. Click `add filter`, then specify the field that you want to filter on and the value you want to filter by. + + + +3. If you want, you can adjust which tiles the filter is applied to by clicking on the `Tiles` tab. + + + +You can remove the filter from a certain tile, or you can change which field the filter is applied to in a tile. + + + +4. And voilΓ ! Your filters will pop up on the top of your dashboard. + + + +:::note + +Values for temporary and overriden saved filters are reverted when entering Dashboard edit mode. + +::: + +#### `Cross filtering` your dashboard using values in your tiles + +Cross-filtering lets you interact with one chart and apply that interaction as a filter to other charts in the dashboard. You can filter the dashboard using cross filtering by: + +1. Clicking on one of the values in the chart. +2. Selecting the value you want to filter on from the drop-down list. + + + +3. Now, your filter will pop up on the top of your dashboard. + + + +### Adding saved filters to your dashboard + +If you add a saved filter to your dashboard, then anyone that opens the dashboard will see the saved filters applied. + +To add saved filters, you just: + +1. Open up your dashboard. +2. Make sure you're in `edit` mode (if you're not, you should see the option to click `Edit Dashboard`) + + + +3. Click `add filter`, then specify the dimension or metric that you want to filter on. + + + +4. You can leave the value blank, or you can specify a value that you want to filter by: + + 4.1. If you leave the value blank, then no filter will be applied to the tiles in your dashboard. Importantly, this provides dashboard viewers the option to define a value in the filter, enabling them to tailor the results to their needs. + + + 4.2. If you want to specify a value, ensure you toggle 'Default value' so that + you can apply a filter to the tiles in your dashboard. + + +5. If you want, you can adjust which tiles the filter is applied to by clicking on + the `Tiles` tab. + + + +You can remove the filter from a certain tile, or you can change which field the filter is applied to in a tile. + + + +6. Click `apply`, and your filters will pop up on the top of your dashboard. + + + +7. Once you have all of the filters you want, just hit `save` to save your filter settings. + + + +8. Now, whenever someone opens the dashboard, they'll see your saved filters applied! + + + +9. And if they want to drill-down into the data, they can always change the filters by clicking on the filter and adjusting the values. + + + +:::info + +To add saved filters to your dashboard, you must be an `editor` or an `admin` for your project. + +::: + +### Some things worth mentioning about dashboard filters + +#### Sharing your dashboard with overrides + +You might want to share a dashboard with someone with custom filters applied. To do this, you have to be in _view mode_. Then, you can either/or: + +1. Apply temporary filters to your dashboard and share the link with the filters applied. +2. Apply changes(overrides) to your saved filters and share the link with the filters applied. + +Rules for sharing dashboards with filters applied: + +- In view mode and when adding a temporary filter, you can change the field, value, operator, and tiles this is applied to. But, you can't change the filter type (e.g. from `temporary filter` to `saved filter`). +- In view mode and when overriding a saved filter, you can only change the value and operator, so the field and tile configuration will remain the same. +- In edit mode, when changing a saved filter (with an override present), once you save the changes (click "Apply"), the override for that filter will be removed. + +The same behaviour applies when exporting dashboards or sending them to email or Slack in [scheduled deliveries](/guides/how-to-create-scheduled-deliveries). + +#### You can easily see which dashboard tiles have which filters applied to them + +If a tile in a dashboard has a filter applied to it, you'll see the text `dashboard filter applied` on the tile. + +You can also hover over this to see **_which_** filters have been applied to that tile. + + + +#### Dashboard filters override filters applied in a saved chart + +For example, if I had a chart for Sales in Asia and I filtered to `country` **is** `China`, `India`, `Japan`. Then, on my dashboard I added a filter `country` **is** `India`. My saved chart's filter would be removed, and my new dashboard filter would be applied instead, so the tile in the dashboard would be filtered to: `country` **is** `India`. + +Here's another example using a date filter: If my original saved chart was filtered to only include orders completed on or after April 3rd, 2024. But, I add a date filter to my dashboard to include orders completed on or after August 1st, 2024, then the dashboard filter would override the saved chart filter and I'll end up with the chart filtered by orders completed on or after August 1st, 2022. + +**How charts work in this context:** + +- When you **Explore from here** from a dashboard, the chart will include the same filters you saw on the Dashboard version. Any filters overriden in the dahsboard will be overriden in the **Explore from here** view. Filters NOT overriden in the dashboad will be the same as they were in the original chart. +- If you 'Edit' the chart instead of explore from here, you will see the original chart filters. + +Here's another example using a date filter: If my original saved chart was filtered to only include orders completed on or after April 3rd, 2022. But, I add a date filter to my dashboard to include orders completed on or after August 1st, 2022, then the dashboard filter would be added to the saved chart filter and I'll end up with the chart filtered by orders completed on or after August 1st, 2022. + +#### Dashboard filters autocomplete + +When determining possible values for a dashboard filter, the system will take into account all relevant filters, including those applied to fields from joined tables. + +Example with payments and orders models: + +```yaml +- name: customers +--- +- name: orders + meta: + joins: + - join: customers + sql_on: ${customers.customer_id} = ${orders.customer_id} +--- +- name: payments + meta: + joins: + - join: orders + sql_on: ${orders.order_id} = ${payments.order_id} + - join: customers + sql_on: ${customers.customer_id} = ${orders.customer_id} +``` + +Following this example: + +- when filtering on a field from the `payments` model, the system will consider the filters applied to fields from the `payments`, `orders` and `customers` models +- when filtering on a field from the `orders` model, the system will consider the filters applied to fields from the `orders` and `customers` models +- when filtering on a field from the `customers` model, the system will consider the filters applied to fields from the `customers` model diff --git a/docs/guides/metrics-catalog.mdx b/docs/guides/metrics-catalog.mdx new file mode 100644 index 0000000..cd3ac7f --- /dev/null +++ b/docs/guides/metrics-catalog.mdx @@ -0,0 +1,108 @@ +# Metrics Catalog + +:::note +πŸ—οΈ The metrics catalog is currently work in progress. Some of the functionality might be subject to change. +::: + +You can use the metrics catalog to **search, filter, and explore metrics** across your project. +Each user has their own view of the metrics catalog, depending on the dimensions and metrics they have access to. + +## Current functionality + +Currently, you're able to: + +- **View** all metrics you have access to and **search** them +- **Customize the icon** for a metric +- **Categorize metrics** using tags so you can segment them and find them easier +- **Filter metrics** by table, dimension, and metric type +- **Explore** metrics + +## Exploring a metric + +You are able to explore a metric by clicking on it from the metrics catalog. This will open a new tab with the Explore page where you can run queries using the metric. + +### Serving valuable exploration experiences to your business users + +You can configure the explore page to have a default time period, filters, and metrics. This allows you to serve an accurate exploration experience to your business users. + +### 1. Check the prerequisites + +You have to have permissions to make changes to your Lightdash .yml files so you can set a default time dimension on a table level. This will be used to prefill the time dimension in the explore view. + +### 2. Set a default time dimension on a table level in your Lightdash .yml file + +##### Example + +You want to set a default time dimension on the events table so that every time you explore a metric from the events table, the time dimension `event_date`, with the grain `DAY` within the last 30 days, is prefilled. + +The following is an example of how your events.yml file could look like: + +```yml +version: 2 +models: + - name: events + columns: + - name: event_date + description: 'Event date' + meta: + dimension: + label: 'Event date' + type: date + time_intervals: + - DAY + - name: event + description: 'Event' + meta: + dimension: + type: string + metrics: + count: + type: count +``` + +And now you can set a default time dimension on the table level, like so: + +``` +version: 2 +models: + - name: events + meta: + default_time_dimension: + field: event_date + interval: DAY + columns:... +``` + +Now, you can compile your project and go to the metrics catalog. Metrics with that default time set will be explored with over the event date day granularity in the last 30 days. + +#### Once you have set a default time dimension on a table, compile your project. + +This will introduce the default time dimension in the metrics catalog so every time you explore a metric from that table, the time dimension will be prefilled with the default time filters. +(See [how to compile your project](/references/dbt-projects.mdx) for more information) + +#### Go to the metrics catalog and **Explore a metric** from the table/model you have set a default time dimension on. + +You will be redirected to the explore view with the time dimension prefilled with the default time filters. + +### πŸ™‹ Questions you might have + +**a. What time intervals are supported?** + +- Currently, we only support: DAY, WEEK, MONTH, YEAR + +**b. What prefilled filters are applied?** + +- Time grain Year -> past 5 years +- Time grain Month -> past 12 months +- Time grain Week -> past 12 weeks +- Time grain Day -> past 30 days + +So if one of your business users explores a metric with a default time grain of DAY, metrics will be shown for the past 30 days with granularity of days with the default time dimension prefilled. + +**c. Can I change the prefilled filters?** + +No, not yet. + +**d. Can I set a default time dimension on a column level?** + +No, not yet. diff --git a/docs/guides/pinning.mdx b/docs/guides/pinning.mdx new file mode 100644 index 0000000..d2ae36f --- /dev/null +++ b/docs/guides/pinning.mdx @@ -0,0 +1,46 @@ +import PinnedHomepage from './assets/pinned-homepage.jpg'; +import PinItem from './assets/pin-an-item.jpg'; +import UnpinItem from './assets/unpin-an-item.jpg'; + +# Pinning + +You can pin important items so users are most likely to click on those items when they're navigating through Lightdash. Only users with editor or admin access to a project can pin items. + +## Pinning items to your homepage + +Your homepage is where users land when they first open Lightdash. You can access your homepage by clicking on the Lightdash icon in the top left corner of the app. + +Pinned items on the homepage appear as the first group of items. + + + +You should pin spaces, dashboards, or charts that are important to your organization or things you want everyone to see when they first open Lightdash. Things like a KPI dashboard or a "Key company insights" space are examples of what you might want to pin to your homepage. + +### To pin an item, click on the three-dot-menu and select "Pin to homepage" + +You can pin saved charts, dashboards, and spaces to your homepage. To pin an item, just click on the three-dot-menu beside the item, then click `pin to homepage`. + + + +Only users who have editor or admin access to a project can pin items to the homepage. + +### To unpin an item, click on the three-dot-menu and select "Unpin from homepage" + +To remove an item from the list of pinned items, click on the three-dot-menu and select `unpin from homepage`. + + diff --git a/docs/guides/table-calculations/table-calculation-sql-templates/assets/format-percent.jpg b/docs/guides/table-calculations/table-calculation-sql-templates/assets/format-percent.jpg new file mode 100644 index 0000000..8203ff8 Binary files /dev/null and b/docs/guides/table-calculations/table-calculation-sql-templates/assets/format-percent.jpg differ diff --git a/docs/guides/table-calculations/table-calculation-sql-templates/assets/percent-change.jpg b/docs/guides/table-calculations/table-calculation-sql-templates/assets/percent-change.jpg new file mode 100644 index 0000000..ce3d555 Binary files /dev/null and b/docs/guides/table-calculations/table-calculation-sql-templates/assets/percent-change.jpg differ diff --git a/docs/guides/table-calculations/table-calculation-sql-templates/assets/percent-of-previous.jpg b/docs/guides/table-calculations/table-calculation-sql-templates/assets/percent-of-previous.jpg new file mode 100644 index 0000000..0b8e1a0 Binary files /dev/null and b/docs/guides/table-calculations/table-calculation-sql-templates/assets/percent-of-previous.jpg differ diff --git a/docs/guides/table-calculations/table-calculation-sql-templates/assets/percent-of-total-group.jpg b/docs/guides/table-calculations/table-calculation-sql-templates/assets/percent-of-total-group.jpg new file mode 100644 index 0000000..70df46e Binary files /dev/null and b/docs/guides/table-calculations/table-calculation-sql-templates/assets/percent-of-total-group.jpg differ diff --git a/docs/guides/table-calculations/table-calculation-sql-templates/assets/percent-of-total.jpg b/docs/guides/table-calculations/table-calculation-sql-templates/assets/percent-of-total.jpg new file mode 100644 index 0000000..b74a02d Binary files /dev/null and b/docs/guides/table-calculations/table-calculation-sql-templates/assets/percent-of-total.jpg differ diff --git a/docs/guides/table-calculations/table-calculation-sql-templates/assets/rank-in-column.jpg b/docs/guides/table-calculations/table-calculation-sql-templates/assets/rank-in-column.jpg new file mode 100644 index 0000000..48c01db Binary files /dev/null and b/docs/guides/table-calculations/table-calculation-sql-templates/assets/rank-in-column.jpg differ diff --git a/docs/guides/table-calculations/table-calculation-sql-templates/assets/rolling-window.jpg b/docs/guides/table-calculations/table-calculation-sql-templates/assets/rolling-window.jpg new file mode 100644 index 0000000..b1f05b9 Binary files /dev/null and b/docs/guides/table-calculations/table-calculation-sql-templates/assets/rolling-window.jpg differ diff --git a/docs/guides/table-calculations/table-calculation-sql-templates/assets/running-total.jpg b/docs/guides/table-calculations/table-calculation-sql-templates/assets/running-total.jpg new file mode 100644 index 0000000..5f0ec37 Binary files /dev/null and b/docs/guides/table-calculations/table-calculation-sql-templates/assets/running-total.jpg differ diff --git a/docs/guides/table-calculations/table-calculation-sql-templates/percent-change-from-previous.mdx b/docs/guides/table-calculations/table-calculation-sql-templates/percent-change-from-previous.mdx new file mode 100644 index 0000000..d32d241 --- /dev/null +++ b/docs/guides/table-calculations/table-calculation-sql-templates/percent-change-from-previous.mdx @@ -0,0 +1,59 @@ +import FormatPercent from './assets/format-percent.jpg'; +import PercentChange from './assets/percent-change.jpg'; + +# Percent change from previous + +The percent change gives you the percent change in a value compared to the value in the row above it. + +[Just gimme the code! πŸ‘Ύ](#heres-the-sql-you-can-copy-paste-to-calculate-the-percent-change-from-the-previous) + +Here's an example of a percent change calculation: + + + +And here's the SQL that was used to generate it: + +```sql +( + ${orders.total_order_amount} / + LAG(${orders.total_order_amount}) OVER ( + ORDER BY + ${orders.order_date_week} + ) +) - 1 +``` + +In general, the SQL used for calculating the percent change from the previous value has two bits (with an optional third bit): + +- `column_I_want_to_compare` - this is the column with the values you want to compare +- `column_I_want_to_order_by` - this is the column you want to use to order the values you want to compare +- `optional_other_column_I_want_to_order_by` - this column is optional and you can add as many more `order by` columns as you need. Normally, you'll need to add every dimension in your results table to the `ORDER BY` bit in your SQL. And, the order of these will need to be the same as the ordering you've added to the columns in your results table. + +### Here's the SQL you can copy-paste to calculate the percent change from the previous + +```sql +( + ${table.column_i_want_to_compare} / + LAG(${table.column_i_want_to_compare}) OVER ( + ORDER BY + ${table.column_I_want_to_order_by}, + ${table.optional_other_column_I_want_to_order_by} + ) +) - 1 +``` + +### Make sure to add percent formatting to your calculation + +In the `format` tab, make sure to update the format to `percent` so that your table calculation is shown as a percentage value (instead of a number). + + diff --git a/docs/guides/table-calculations/table-calculation-sql-templates/percent-of-group-pivot-total.mdx b/docs/guides/table-calculations/table-calculation-sql-templates/percent-of-group-pivot-total.mdx new file mode 100644 index 0000000..1e2585d --- /dev/null +++ b/docs/guides/table-calculations/table-calculation-sql-templates/percent-of-group-pivot-total.mdx @@ -0,0 +1,53 @@ +import PercentOfTotalGroup from './assets/percent-of-total-group.jpg'; +import FormatPercent from './assets/format-percent.jpg'; + +# Percent of group/pivot total + +The percent of the group/pivot total will give you the percentage of each value in a group out of the total sum of the values for that group. + +[Just gimme the code! πŸ‘Ύ](#heres-the-sql-you-can-copy-paste-to-calculate-the-percent-of-the-grouppivot-total) + +Here's an example of a percent of the total group/pivot: + + + +And here's the SQL used in the table calculation: + +```sql +${orders.total_order_amount} / + SUM(${orders.total_order_amount}) OVER ( + PARTITION BY + ${orders.status} + ) +``` + +In general, the SQL used for calculating the percent of the total has two important columns: + +- `column_i_want_to_see_the_percent_of_total` - this is the column that you want to see the percent total of. In our example above, that was the `sum of profit`. +- `column_i_want_to_group_by` - this is the column that you want the total to be grouped by. In our example above, that was the `order date - week`. + +### Here's the SQL you can copy-paste to calculate the percent of the group/pivot total + +```sql +${table.column_i_want_to_see_the_percent_of_total} / + SUM(${table.column_i_want_to_see_the_percent_of_total}) OVER ( + PARTITION BY + ${table.column_i_want_to_group_by} + ) +``` + +### Make sure to add percent formatting to your calculation + +In the `format` tab, make sure to update the format to `percent` so that your table calculation is shown as a percentage value (instead of a number). + + diff --git a/docs/guides/table-calculations/table-calculation-sql-templates/percent-of-previous-value.mdx b/docs/guides/table-calculations/table-calculation-sql-templates/percent-of-previous-value.mdx new file mode 100644 index 0000000..5db6539 --- /dev/null +++ b/docs/guides/table-calculations/table-calculation-sql-templates/percent-of-previous-value.mdx @@ -0,0 +1,56 @@ +import PercentOfPrevious from './assets/percent-of-previous.jpg'; +import FormatPercent from './assets/format-percent.jpg'; + +# Percent of previous value + +The percent of previous value gives you the percent of a value compared to the value in the row above it. + +[Just gimme the code! πŸ‘Ύ](#heres-the-sql-you-can-copy-paste-to-calculate-the-percent-of-the-previous-value) + +Here's an example of a percent of previous value calculation: + + + +And here's the SQL that was used to generate it: + +```sql +${orders.total_order_amount} / + LAG(${orders.total_order_amount}) OVER ( + ORDER BY + ${orders.order_date_week}, + ${orders.status} + ) +``` + +In general, the SQL used for calculating the percent of the previous value has two bits (with an optional third bit): + +- `column_I_want_to_compare` - this is the column with the values you want to compare +- `column_I_want_to_order_by` - this is the column you want to use to order the values you want to compare +- `optional_other_column_I_want_to_order_by` - this column is optional and you can add as many more `order by` columns as you need. Normally, you'll need to add every dimension in your results table to the `ORDER BY` bit in your SQL. And, the order of these will need to be the same as the ordering you've added to the columns in your results table. + +### Here's the SQL you can copy-paste to calculate the percent of the previous value + +```sql +${table.column_i_want_to_compare} / + LAG(${table.column_i_want_to_compare}) OVER ( + ORDER BY + ${table.column_I_want_to_order_by}, + ${table.optional_other_column_I_want_to_order_by} + ) +``` + +### Make sure to add percent formatting to your calculation + +In the `format` tab, make sure to update the format to `percent` so that your table calculation is shown as a percentage value (instead of a number). + + diff --git a/docs/guides/table-calculations/table-calculation-sql-templates/percent-of-total-column.mdx b/docs/guides/table-calculations/table-calculation-sql-templates/percent-of-total-column.mdx new file mode 100644 index 0000000..8e6db93 --- /dev/null +++ b/docs/guides/table-calculations/table-calculation-sql-templates/percent-of-total-column.mdx @@ -0,0 +1,45 @@ +import PercentOfTotal from './assets/percent-of-total.jpg'; +import FormatPercent from './assets/format-percent.jpg'; + +# Percent of column total + +The percent of the column total will give you the percentage of each value in the column out of the total sum of the values in the column. + +[Just gimme the code! πŸ‘Ύ](#heres-the-sql-you-can-copy-paste-to-calculate-the-percent-of-the-column-total) + +Here's an example of a percent of the total column: + + + +And here's the SQL used in the table calculation: + +```sql +${orders.total_order_amount} / SUM(${orders.total_order_amount}) OVER() +``` + +In general, the SQL used for calculating the percent of the total has just one important column: + +- `column_i_want_to_see_the_percent_of_total` - this is the column that you want to see each value's percent of the total values in that column + +### Here's the SQL you can copy-paste to calculate the percent of the column total + +```sql +${table.column_i_want_to_see_the_percent_of_total} / + SUM(${table.column_i_want_to_see_the_percent_of_total}) OVER() +``` + +### Make sure to add percent formatting to your calculation + +In the `format` tab, make sure to update the format to `percent` so that your table calculation is shown as a percentage value (instead of a number). + + diff --git a/docs/guides/table-calculations/table-calculation-sql-templates/rank-in-column.mdx b/docs/guides/table-calculations/table-calculation-sql-templates/rank-in-column.mdx new file mode 100644 index 0000000..d7e31f7 --- /dev/null +++ b/docs/guides/table-calculations/table-calculation-sql-templates/rank-in-column.mdx @@ -0,0 +1,41 @@ +import RankInColumn from './assets/rank-in-column.jpg'; + +# Rank in column + +Ranking values in a column is when you set every value as a number either higher than or lower than the other values. The lowest value (rank = 1) indicates the value with the first rank in your set of values. + +[Just gimme the code! πŸ‘Ύ](#heres-the-sql-you-can-copy-paste-to-calculate-your-rank-in-column) + +Here's an example of a percent change calculation: + + + +And here's the SQL used to generate it: + +```sql +ROW_NUMBER() OVER ( + PARTITION BY + ${orders.order_date_month} + ORDER BY + ${orders.total_order_amount} DESC +) +``` + +In general, the SQL used for calculating the rank in a column has just one important column and one other important parameter: + +- `column_i_want_to_rank` - this is the column that you want to rank +- `ASC` and `DESC` - if you want to have the **biggest values** with rank = 1, then you need to add `DESC` to your `ORDER BY` clause. If you want the **smallest values** with rank = 1 then you can add `ASC` to your `ORDER BY` clause (this isn't required, since the ordering is `ASC` by default). + +### Here's the SQL you can copy-paste to calculate your rank in column + +```sql +ROW_NUMBER() OVER ( + ORDER BY + ${table.column_i_want_to_rank} DESC +) +``` diff --git a/docs/guides/table-calculations/table-calculation-sql-templates/rolling-window.mdx b/docs/guides/table-calculations/table-calculation-sql-templates/rolling-window.mdx new file mode 100644 index 0000000..fc41311 --- /dev/null +++ b/docs/guides/table-calculations/table-calculation-sql-templates/rolling-window.mdx @@ -0,0 +1,55 @@ +import RollingWindow from './assets/rolling-window.jpg'; + +# Rolling window + +Rolling windows, or lookbacks, calculate metrics like rolling averages using the current row combined with N previous rows. This can be useful for smoothing out volatile time series data to better understand long term trends. + +[Just gimme the code! πŸ‘Ύ](#heres-the-sql-you-can-copy-paste-to-calculate-rolling-windows) + +Here's an example of a rolling window: + + + +And here's the SQL used in the table calculation: + +```sql +SUM(${dbt_orders.count_distinct_order_id}) OVER ( + ORDER BY + ${dbt_orders.order_date_week} + ROWS BETWEEN 3 PRECEDING AND CURRENT ROW +) / + SUM(${dbt_orders.count_distinct_user_id}) OVER ( + ORDER BY + ${dbt_orders.order_date_week} + ROWS BETWEEN 3 PRECEDING AND CURRENT ROW + ) +``` + +The SQL used for calculating rolling windows has at least two bits, with an optional third: + +- `first_column_I_want_to_sum` is the column with the values you want to add up (sometimes this is an average) +- `column_I_want_to_order_by` is the column you want to order by when defining your lookback window +- `N` is the number of previous rows you want to include in your calculation (don't forget the current row is included, so for a four week lookback window, we'll use N=3) +- `second_column_I_want_to_sum` is optional, another column with values you want to add up to compare to your first column, like when calculating averages (which is how we use it in this example) + +### Here's the SQL you can copy-paste to calculate rolling windows + +Make sure you swap out the columns AND choose a number value for `N`. + +```sql +SUM(${table.column_I_want_to_sum}) OVER ( + ORDER BY + ${table.column_I_want_to_order_by} + ROWS BETWEEN N PRECEDING AND CURRENT ROW +) / + SUM(${table.second_column_I_want_to_sum}) OVER ( + ORDER BY + ${table.column_I_want_to_order_by} + ROWS BETWEEN N PRECEDING AND CURRENT ROW + ) +``` diff --git a/docs/guides/table-calculations/table-calculation-sql-templates/running-total.mdx b/docs/guides/table-calculations/table-calculation-sql-templates/running-total.mdx new file mode 100644 index 0000000..503e62d --- /dev/null +++ b/docs/guides/table-calculations/table-calculation-sql-templates/running-total.mdx @@ -0,0 +1,61 @@ +import RunningTotal from './assets/running-total.jpg'; + +# Running total + +Running totals give you the sum of a value + all of the previous values in that column. + +[Just gimme the code! πŸ‘Ύ](#heres-the-sql-you-can-copy-paste-to-calculate-a-running-total) + +Here's an example of a running total: + + + +And here's the SQL used in the table calculation: + +```sql +SUM(${orders.total_order_amount}) OVER ( + ORDER BY + ${orders.order_date_month} + ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW +) +``` + +In general, the SQL used for calculating running totals has two bits (with an optional third bit): + +- `column_I_want_to_sum` - this is the column with the values you want to add up +- `column_I_want_to_order_by` - this is the column you want to order your running total over +- `optional_other_column_I_want_to_order_by` - this column is optional and you can add as many more `order by` columns as you need. For your running total to only go up an increment of one row, you'll need to add every dimension in your results table to the `ORDER BY` bit in your SQL. And, the order of these will need to be the same as the ordering you've added to the columns in your results table. + +### Here's the SQL you can copy-paste to calculate a running total + +```sql +SUM(${table.column_I_want_to_sum}) OVER ( + ORDER BY + ${table.column_I_want_to_order_by}, + ${table.optional_other_column_I_want_to_order_by} + ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW +) +``` + +:::info + +**πŸ’Ž Level up your SQL**: + +- You can specify if you want to order your columns in ascending order (1, 2, 3, 4) or descending order (4, 3, 2, 1) using the key words `ASC` and `DESC` in your `ORDER BY` clause. + By default, a column will be ordered in ascending order - so if you want it ordered ascending, you don't need to add anything. + +```sql +SUM(${table.column_I_want_to_sum}) OVER ( + ORDER BY + ${table.column_I_want_to_order_by} ASC, + ${table.optional_other_column_I_want_to_order_by} DESC + ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW +) +``` + +::: diff --git a/docs/guides/using-slack-integration.mdx b/docs/guides/using-slack-integration.mdx new file mode 100644 index 0000000..d4dea46 --- /dev/null +++ b/docs/guides/using-slack-integration.mdx @@ -0,0 +1,26 @@ +# Use the Slack integration + +You can use the Slack integration in various ways to make it easier for your team to get the most out of Lightdash. Watch the video below for a walk through! If Slack is not available, your organization admin needs to [add Slack to Lightdash](guides/adding-slack-integration.mdx). For a full list of features, [read the Slack integration reference doc](/references/slack-integration.mdx). + +
+ +
diff --git a/docs/guides/version-history.mdx b/docs/guides/version-history.mdx new file mode 100644 index 0000000..7642050 --- /dev/null +++ b/docs/guides/version-history.mdx @@ -0,0 +1,56 @@ +import HistoryMenu from './assets/version-history-menu.png'; +import HistoryExplorer from './assets/version-history-explorer.png'; +import HistorySelection from './assets/version-history-selection.png'; + +# Chart Version History + +You can roll back to previous versions of charts in Lightdash. In case you make a mistake or simply want to go back to a +previous version of a chart you built, you can easily revert back to previous versions of your charts. It's a great way +to keep track of changes and revert back to previous versions if needed. + +## Exploring version history + +To access version history, click on the `Version History` option under the three dot menu when viewing or editing a chart. + + + +This takes you to the version history of the chart where you can see the previous versions of the chart including +information around who authored the previous versions as well as when they were udpated. You can preview any previous +version by clicking on it. + + + +Once you're happy with the version you want, you can click on the three dot menu next to the version you want to +restore the chart to. + +:::info +**Note:** Lightdash saves all iterations of your chart, so reverting to a previous version does not +delete any existing history. +::: + + + +### Missing some versions? + +Version History is limited depending on the tier of Lightdash Cloud you're using: + +- Cloud Starter: 3 days +- Cloud Pro: 30 days +- Cloud Enterprise: 60 days + +Speak to the team if you're interested in moving tier to get access to more history. diff --git a/docs/guides/vs-code-yaml-validation.mdx b/docs/guides/vs-code-yaml-validation.mdx new file mode 100644 index 0000000..d20b96f --- /dev/null +++ b/docs/guides/vs-code-yaml-validation.mdx @@ -0,0 +1,22 @@ +import VSCodeError from './assets/vs-code-error.png'; + +# How to set up Lightdash YAML validation for VS Code + +If you use VS Code to make edits to your dbt project, we recommend setting up Lightdash YAML validation. The validator will flag any formatting or configuration issues before compiling your project, so you can fix issues faster. + +The validation uses the same logic that Lightdash uses when compiling your project. + +All you have to do is add this snippet to your `settings.json` file in VS Code. [Read this guide](https://code.visualstudio.com/docs/getstarted/settings#_settings-json-file) to details on how to edit your `settings.json`. + +``` + "yaml.schemas": { + "https://raw.githubusercontent.com/lightdash/lightdash/main/packages/common/src/schemas/json/lightdash-dbt-2.0.json": [ + "/**/models/**/*.yml", + "/**/models/**/*.yaml" + ] + }, +``` + +Once it's been added you'll see warnings like this when working on your `schema.yml` files. + + diff --git a/docs/intro.md b/docs/intro.md new file mode 100644 index 0000000..0bda0c4 --- /dev/null +++ b/docs/intro.md @@ -0,0 +1,12 @@ +--- +sidebar_position: 1 +slug: / +--- + +# Lightdash Docs + +Lightdash instantly turns your dbt project into a full-stack BI platform. Analysts write metrics and Lightdash enables self-serve for the entire business. Here are some docs to walk you through it all πŸ˜„ + +We'd love you to [join our Slack Community](https://join.slack.com/t/lightdash-community/shared_invite/zt-2ehqnrvqt-LbCq7cUSFHAzEj_wMuxg4A) to get access to help directly from the team, see sneak previews of new features, and give us your feedback. + +[![demo showing lightdash](./assets/demo_lightdash.png)](https://www.loom.com/share/c0805a236a994de397ac5142fdfe4b7f) diff --git a/docs/references/_category_.json b/docs/references/_category_.json new file mode 100644 index 0000000..5c2c2b4 --- /dev/null +++ b/docs/references/_category_.json @@ -0,0 +1,4 @@ +{ + "label": "References", + "position": 4 +} diff --git a/docs/references/assets/access-spaces.png b/docs/references/assets/access-spaces.png new file mode 100644 index 0000000..089d0c8 Binary files /dev/null and b/docs/references/assets/access-spaces.png differ diff --git a/docs/references/assets/access-sql-runner.jpg b/docs/references/assets/access-sql-runner.jpg new file mode 100644 index 0000000..2b5e4bc Binary files /dev/null and b/docs/references/assets/access-sql-runner.jpg differ diff --git a/docs/references/assets/access-usage-analytics.jpg b/docs/references/assets/access-usage-analytics.jpg new file mode 100644 index 0000000..1061263 Binary files /dev/null and b/docs/references/assets/access-usage-analytics.jpg differ diff --git a/docs/references/assets/add-modal.png b/docs/references/assets/add-modal.png new file mode 100644 index 0000000..81bfc8a Binary files /dev/null and b/docs/references/assets/add-modal.png differ diff --git a/docs/references/assets/add-reference-line.png b/docs/references/assets/add-reference-line.png new file mode 100644 index 0000000..a25755e Binary files /dev/null and b/docs/references/assets/add-reference-line.png differ diff --git a/docs/references/assets/add-table-calc-sql.jpg b/docs/references/assets/add-table-calc-sql.jpg new file mode 100644 index 0000000..bbb69cc Binary files /dev/null and b/docs/references/assets/add-table-calc-sql.jpg differ diff --git a/docs/references/assets/add-users-space.png b/docs/references/assets/add-users-space.png new file mode 100644 index 0000000..4d48e71 Binary files /dev/null and b/docs/references/assets/add-users-space.png differ diff --git a/docs/references/assets/add-within-space.png b/docs/references/assets/add-within-space.png new file mode 100644 index 0000000..b069d18 Binary files /dev/null and b/docs/references/assets/add-within-space.png differ diff --git a/docs/references/assets/bar-chart.png b/docs/references/assets/bar-chart.png new file mode 100644 index 0000000..a0c924c Binary files /dev/null and b/docs/references/assets/bar-chart.png differ diff --git a/docs/references/assets/big-value-chart.png b/docs/references/assets/big-value-chart.png new file mode 100644 index 0000000..4e776bc Binary files /dev/null and b/docs/references/assets/big-value-chart.png differ diff --git a/docs/references/assets/build-chart-sql-runner.jpg b/docs/references/assets/build-chart-sql-runner.jpg new file mode 100644 index 0000000..cdc7bc9 Binary files /dev/null and b/docs/references/assets/build-chart-sql-runner.jpg differ diff --git a/docs/references/assets/chart-types.jpg b/docs/references/assets/chart-types.jpg new file mode 100644 index 0000000..ff26e3a Binary files /dev/null and b/docs/references/assets/chart-types.jpg differ diff --git a/docs/references/assets/cli-lightdash-help.png b/docs/references/assets/cli-lightdash-help.png new file mode 100644 index 0000000..d4abf21 Binary files /dev/null and b/docs/references/assets/cli-lightdash-help.png differ diff --git a/docs/references/assets/cli-lightdash-validate-help.png b/docs/references/assets/cli-lightdash-validate-help.png new file mode 100644 index 0000000..2e6bb67 Binary files /dev/null and b/docs/references/assets/cli-lightdash-validate-help.png differ diff --git a/docs/references/assets/cli-verbose-example.png b/docs/references/assets/cli-verbose-example.png new file mode 100644 index 0000000..27e4264 Binary files /dev/null and b/docs/references/assets/cli-verbose-example.png differ diff --git a/docs/references/assets/clickable-dimension-link.jpg b/docs/references/assets/clickable-dimension-link.jpg new file mode 100644 index 0000000..ebd738b Binary files /dev/null and b/docs/references/assets/clickable-dimension-link.jpg differ diff --git a/docs/references/assets/color-ranges-example.jpg b/docs/references/assets/color-ranges-example.jpg new file mode 100644 index 0000000..80ad7dc Binary files /dev/null and b/docs/references/assets/color-ranges-example.jpg differ diff --git a/docs/references/assets/columns-rows-metrics-example.jpg b/docs/references/assets/columns-rows-metrics-example.jpg new file mode 100644 index 0000000..5ae95f8 Binary files /dev/null and b/docs/references/assets/columns-rows-metrics-example.jpg differ diff --git a/docs/references/assets/conditional-formatting-rule.png b/docs/references/assets/conditional-formatting-rule.png new file mode 100644 index 0000000..f1f61cd Binary files /dev/null and b/docs/references/assets/conditional-formatting-rule.png differ diff --git a/docs/references/assets/conditional-formatting.png b/docs/references/assets/conditional-formatting.png new file mode 100644 index 0000000..b12fafd Binary files /dev/null and b/docs/references/assets/conditional-formatting.png differ diff --git a/docs/references/assets/config-button.jpg b/docs/references/assets/config-button.jpg new file mode 100644 index 0000000..0d34236 Binary files /dev/null and b/docs/references/assets/config-button.jpg differ diff --git a/docs/references/assets/configure-axes-range.png b/docs/references/assets/configure-axes-range.png new file mode 100644 index 0000000..f31944a Binary files /dev/null and b/docs/references/assets/configure-axes-range.png differ diff --git a/docs/references/assets/configure-layout.png b/docs/references/assets/configure-layout.png new file mode 100644 index 0000000..6ea0d80 Binary files /dev/null and b/docs/references/assets/configure-layout.png differ diff --git a/docs/references/assets/create-new-table-calc.jpg b/docs/references/assets/create-new-table-calc.jpg new file mode 100644 index 0000000..e0695d8 Binary files /dev/null and b/docs/references/assets/create-new-table-calc.jpg differ diff --git a/docs/references/assets/create-pat.jpg b/docs/references/assets/create-pat.jpg new file mode 100644 index 0000000..5d70e3d Binary files /dev/null and b/docs/references/assets/create-pat.jpg differ diff --git a/docs/references/assets/create-preview.jpg b/docs/references/assets/create-preview.jpg new file mode 100644 index 0000000..2f68b3c Binary files /dev/null and b/docs/references/assets/create-preview.jpg differ diff --git a/docs/references/assets/create-virtual-view.jpg b/docs/references/assets/create-virtual-view.jpg new file mode 100644 index 0000000..7b83cdd Binary files /dev/null and b/docs/references/assets/create-virtual-view.jpg differ diff --git a/docs/references/assets/currency-format.png b/docs/references/assets/currency-format.png new file mode 100644 index 0000000..a313477 Binary files /dev/null and b/docs/references/assets/currency-format.png differ diff --git a/docs/references/assets/custom-dimension-bins.png b/docs/references/assets/custom-dimension-bins.png new file mode 100644 index 0000000..c8c5351 Binary files /dev/null and b/docs/references/assets/custom-dimension-bins.png differ diff --git a/docs/references/assets/custom-dimension-creating.png b/docs/references/assets/custom-dimension-creating.png new file mode 100644 index 0000000..6ad6ded Binary files /dev/null and b/docs/references/assets/custom-dimension-creating.png differ diff --git a/docs/references/assets/custom-dimension-sql-add.png b/docs/references/assets/custom-dimension-sql-add.png new file mode 100644 index 0000000..897a2df Binary files /dev/null and b/docs/references/assets/custom-dimension-sql-add.png differ diff --git a/docs/references/assets/custom-dimension-sql-form.png b/docs/references/assets/custom-dimension-sql-form.png new file mode 100644 index 0000000..4e0645b Binary files /dev/null and b/docs/references/assets/custom-dimension-sql-form.png differ diff --git a/docs/references/assets/custom-dimension-sql-result.png b/docs/references/assets/custom-dimension-sql-result.png new file mode 100644 index 0000000..c567375 Binary files /dev/null and b/docs/references/assets/custom-dimension-sql-result.png differ diff --git a/docs/references/assets/custom-metric-add-filter-while-creating.png b/docs/references/assets/custom-metric-add-filter-while-creating.png new file mode 100644 index 0000000..09e8489 Binary files /dev/null and b/docs/references/assets/custom-metric-add-filter-while-creating.png differ diff --git a/docs/references/assets/custom-metric-add-filter-while-editing.png b/docs/references/assets/custom-metric-add-filter-while-editing.png new file mode 100644 index 0000000..68e5300 Binary files /dev/null and b/docs/references/assets/custom-metric-add-filter-while-editing.png differ diff --git a/docs/references/assets/custom-metric-added.jpg b/docs/references/assets/custom-metric-added.jpg new file mode 100644 index 0000000..c2c7730 Binary files /dev/null and b/docs/references/assets/custom-metric-added.jpg differ diff --git a/docs/references/assets/custom-metric-creating.png b/docs/references/assets/custom-metric-creating.png new file mode 100644 index 0000000..bc0d09b Binary files /dev/null and b/docs/references/assets/custom-metric-creating.png differ diff --git a/docs/references/assets/custom-metric-deleting.png b/docs/references/assets/custom-metric-deleting.png new file mode 100644 index 0000000..76d38c1 Binary files /dev/null and b/docs/references/assets/custom-metric-deleting.png differ diff --git a/docs/references/assets/dbt-cloud-run-automatically.jpg b/docs/references/assets/dbt-cloud-run-automatically.jpg new file mode 100644 index 0000000..8606675 Binary files /dev/null and b/docs/references/assets/dbt-cloud-run-automatically.jpg differ diff --git a/docs/references/assets/dbt-job-url-example.png b/docs/references/assets/dbt-job-url-example.png new file mode 100644 index 0000000..b16daaf Binary files /dev/null and b/docs/references/assets/dbt-job-url-example.png differ diff --git a/docs/references/assets/dbt-semantic-layer-service-token.jpg b/docs/references/assets/dbt-semantic-layer-service-token.jpg new file mode 100644 index 0000000..72124c8 Binary files /dev/null and b/docs/references/assets/dbt-semantic-layer-service-token.jpg differ diff --git a/docs/references/assets/dbt-sl-selection.gif b/docs/references/assets/dbt-sl-selection.gif new file mode 100644 index 0000000..807ad4f Binary files /dev/null and b/docs/references/assets/dbt-sl-selection.gif differ diff --git a/docs/references/assets/dbt-write-back.jpg b/docs/references/assets/dbt-write-back.jpg new file mode 100644 index 0000000..c8ed9fb Binary files /dev/null and b/docs/references/assets/dbt-write-back.jpg differ diff --git a/docs/references/assets/delete-preview.jpg b/docs/references/assets/delete-preview.jpg new file mode 100644 index 0000000..ba49d61 Binary files /dev/null and b/docs/references/assets/delete-preview.jpg differ diff --git a/docs/references/assets/dismiss-errors.png b/docs/references/assets/dismiss-errors.png new file mode 100644 index 0000000..dba70b3 Binary files /dev/null and b/docs/references/assets/dismiss-errors.png differ diff --git a/docs/references/assets/edit-delete-table-calc.jpg b/docs/references/assets/edit-delete-table-calc.jpg new file mode 100644 index 0000000..13f50a4 Binary files /dev/null and b/docs/references/assets/edit-delete-table-calc.jpg differ diff --git a/docs/references/assets/edit-delete-virtual-view.jpg b/docs/references/assets/edit-delete-virtual-view.jpg new file mode 100644 index 0000000..2c62322 Binary files /dev/null and b/docs/references/assets/edit-delete-virtual-view.jpg differ diff --git a/docs/references/assets/edit-space-access.jpg b/docs/references/assets/edit-space-access.jpg new file mode 100644 index 0000000..dd9a3a8 Binary files /dev/null and b/docs/references/assets/edit-space-access.jpg differ diff --git a/docs/references/assets/embedding-download-csv.png b/docs/references/assets/embedding-download-csv.png new file mode 100644 index 0000000..ce10a9d Binary files /dev/null and b/docs/references/assets/embedding-download-csv.png differ diff --git a/docs/references/assets/find-dbt-cloud-jobs.png b/docs/references/assets/find-dbt-cloud-jobs.png new file mode 100644 index 0000000..82ffef3 Binary files /dev/null and b/docs/references/assets/find-dbt-cloud-jobs.png differ diff --git a/docs/references/assets/format-table-calc.jpg b/docs/references/assets/format-table-calc.jpg new file mode 100644 index 0000000..1517308 Binary files /dev/null and b/docs/references/assets/format-table-calc.jpg differ diff --git a/docs/references/assets/funnel-chart-general.png b/docs/references/assets/funnel-chart-general.png new file mode 100644 index 0000000..6d62788 Binary files /dev/null and b/docs/references/assets/funnel-chart-general.png differ diff --git a/docs/references/assets/funnel-chart.png b/docs/references/assets/funnel-chart.png new file mode 100644 index 0000000..03a2320 Binary files /dev/null and b/docs/references/assets/funnel-chart.png differ diff --git a/docs/references/assets/groups-management-page.jpg b/docs/references/assets/groups-management-page.jpg new file mode 100644 index 0000000..a0d482d Binary files /dev/null and b/docs/references/assets/groups-management-page.jpg differ diff --git a/docs/references/assets/groups.png b/docs/references/assets/groups.png new file mode 100644 index 0000000..b29597f Binary files /dev/null and b/docs/references/assets/groups.png differ diff --git a/docs/references/assets/hide-join-table-columns.jpg b/docs/references/assets/hide-join-table-columns.jpg new file mode 100644 index 0000000..67f6440 Binary files /dev/null and b/docs/references/assets/hide-join-table-columns.jpg differ diff --git a/docs/references/assets/hide-joined-table-from-tables-list.jpg b/docs/references/assets/hide-joined-table-from-tables-list.jpg new file mode 100644 index 0000000..8f5f25c Binary files /dev/null and b/docs/references/assets/hide-joined-table-from-tables-list.jpg differ diff --git a/docs/references/assets/horizontal-bar-chart.png b/docs/references/assets/horizontal-bar-chart.png new file mode 100644 index 0000000..bbe741b Binary files /dev/null and b/docs/references/assets/horizontal-bar-chart.png differ diff --git a/docs/references/assets/hundred-stacked-bar-chart.png b/docs/references/assets/hundred-stacked-bar-chart.png new file mode 100644 index 0000000..0423718 Binary files /dev/null and b/docs/references/assets/hundred-stacked-bar-chart.png differ diff --git a/docs/references/assets/legend.png b/docs/references/assets/legend.png new file mode 100644 index 0000000..703aa16 Binary files /dev/null and b/docs/references/assets/legend.png differ diff --git a/docs/references/assets/line-chart.png b/docs/references/assets/line-chart.png new file mode 100644 index 0000000..36dc19a Binary files /dev/null and b/docs/references/assets/line-chart.png differ diff --git a/docs/references/assets/locked-column.jpg b/docs/references/assets/locked-column.jpg new file mode 100644 index 0000000..2fd74b2 Binary files /dev/null and b/docs/references/assets/locked-column.jpg differ diff --git a/docs/references/assets/loom-adding-dbt-metrics.png b/docs/references/assets/loom-adding-dbt-metrics.png new file mode 100644 index 0000000..21db4c8 Binary files /dev/null and b/docs/references/assets/loom-adding-dbt-metrics.png differ diff --git a/docs/references/assets/margins.png b/docs/references/assets/margins.png new file mode 100644 index 0000000..f61d849 Binary files /dev/null and b/docs/references/assets/margins.png differ diff --git a/docs/references/assets/metrics-as-rows.jpg b/docs/references/assets/metrics-as-rows.jpg new file mode 100644 index 0000000..65bb020 Binary files /dev/null and b/docs/references/assets/metrics-as-rows.jpg differ diff --git a/docs/references/assets/missing-user-attribute-email-error.png b/docs/references/assets/missing-user-attribute-email-error.png new file mode 100644 index 0000000..3df885a Binary files /dev/null and b/docs/references/assets/missing-user-attribute-email-error.png differ diff --git a/docs/references/assets/mixed-chart-configure.png b/docs/references/assets/mixed-chart-configure.png new file mode 100644 index 0000000..25893d1 Binary files /dev/null and b/docs/references/assets/mixed-chart-configure.png differ diff --git a/docs/references/assets/mixed-chart-convert-to-one.png b/docs/references/assets/mixed-chart-convert-to-one.png new file mode 100644 index 0000000..d5fe2e7 Binary files /dev/null and b/docs/references/assets/mixed-chart-convert-to-one.png differ diff --git a/docs/references/assets/mixed-chart.png b/docs/references/assets/mixed-chart.png new file mode 100644 index 0000000..85d7eea Binary files /dev/null and b/docs/references/assets/mixed-chart.png differ diff --git a/docs/references/assets/move-between-space.png b/docs/references/assets/move-between-space.png new file mode 100644 index 0000000..53c4cba Binary files /dev/null and b/docs/references/assets/move-between-space.png differ diff --git a/docs/references/assets/multi-line-chart.png b/docs/references/assets/multi-line-chart.png new file mode 100644 index 0000000..8d83a86 Binary files /dev/null and b/docs/references/assets/multi-line-chart.png differ diff --git a/docs/references/assets/multiple-series-configure.png b/docs/references/assets/multiple-series-configure.png new file mode 100644 index 0000000..cfbed19 Binary files /dev/null and b/docs/references/assets/multiple-series-configure.png differ diff --git a/docs/references/assets/pie-chart-color.png b/docs/references/assets/pie-chart-color.png new file mode 100644 index 0000000..8c87617 Binary files /dev/null and b/docs/references/assets/pie-chart-color.png differ diff --git a/docs/references/assets/pie-chart-display.png b/docs/references/assets/pie-chart-display.png new file mode 100644 index 0000000..43c3c20 Binary files /dev/null and b/docs/references/assets/pie-chart-display.png differ diff --git a/docs/references/assets/pie-chart-layout.png b/docs/references/assets/pie-chart-layout.png new file mode 100644 index 0000000..9b84b46 Binary files /dev/null and b/docs/references/assets/pie-chart-layout.png differ diff --git a/docs/references/assets/pie-chart-series.png b/docs/references/assets/pie-chart-series.png new file mode 100644 index 0000000..54048d1 Binary files /dev/null and b/docs/references/assets/pie-chart-series.png differ diff --git a/docs/references/assets/pie-chart.png b/docs/references/assets/pie-chart.png new file mode 100644 index 0000000..6064a84 Binary files /dev/null and b/docs/references/assets/pie-chart.png differ diff --git a/docs/references/assets/pivoted-table.jpg b/docs/references/assets/pivoted-table.jpg new file mode 100644 index 0000000..71bb276 Binary files /dev/null and b/docs/references/assets/pivoted-table.jpg differ diff --git a/docs/references/assets/public-access-space.png b/docs/references/assets/public-access-space.png new file mode 100644 index 0000000..597630b Binary files /dev/null and b/docs/references/assets/public-access-space.png differ diff --git a/docs/references/assets/query-history.jpg b/docs/references/assets/query-history.jpg new file mode 100644 index 0000000..62a6bf7 Binary files /dev/null and b/docs/references/assets/query-history.jpg differ diff --git a/docs/references/assets/quick-table-calculation.png b/docs/references/assets/quick-table-calculation.png new file mode 100644 index 0000000..2dc9d66 Binary files /dev/null and b/docs/references/assets/quick-table-calculation.png differ diff --git a/docs/references/assets/reference-line-config.png b/docs/references/assets/reference-line-config.png new file mode 100644 index 0000000..aa846fb Binary files /dev/null and b/docs/references/assets/reference-line-config.png differ diff --git a/docs/references/assets/rename-delete-space.png b/docs/references/assets/rename-delete-space.png new file mode 100644 index 0000000..eabaf89 Binary files /dev/null and b/docs/references/assets/rename-delete-space.png differ diff --git a/docs/references/assets/restricted-access-space.jpg b/docs/references/assets/restricted-access-space.jpg new file mode 100644 index 0000000..82054e5 Binary files /dev/null and b/docs/references/assets/restricted-access-space.jpg differ diff --git a/docs/references/assets/scatter-chart-grouped.png b/docs/references/assets/scatter-chart-grouped.png new file mode 100644 index 0000000..8c685b1 Binary files /dev/null and b/docs/references/assets/scatter-chart-grouped.png differ diff --git a/docs/references/assets/scatter-chart.png b/docs/references/assets/scatter-chart.png new file mode 100644 index 0000000..784600e Binary files /dev/null and b/docs/references/assets/scatter-chart.png differ diff --git a/docs/references/assets/scim/scim-azure-configure-provisioning.png b/docs/references/assets/scim/scim-azure-configure-provisioning.png new file mode 100644 index 0000000..67d186b Binary files /dev/null and b/docs/references/assets/scim/scim-azure-configure-provisioning.png differ diff --git a/docs/references/assets/scim/scim-azure-create-app.png b/docs/references/assets/scim/scim-azure-create-app.png new file mode 100644 index 0000000..e0e4681 Binary files /dev/null and b/docs/references/assets/scim/scim-azure-create-app.png differ diff --git a/docs/references/assets/scim/scim-azure-edit-app.png b/docs/references/assets/scim/scim-azure-edit-app.png new file mode 100644 index 0000000..048a71e Binary files /dev/null and b/docs/references/assets/scim/scim-azure-edit-app.png differ diff --git a/docs/references/assets/scim/scim-lightdash-generate-token.png b/docs/references/assets/scim/scim-lightdash-generate-token.png new file mode 100644 index 0000000..a502e18 Binary files /dev/null and b/docs/references/assets/scim/scim-lightdash-generate-token.png differ diff --git a/docs/references/assets/scim/scim-lightdash-generated-token.png b/docs/references/assets/scim/scim-lightdash-generated-token.png new file mode 100644 index 0000000..0fff737 Binary files /dev/null and b/docs/references/assets/scim/scim-lightdash-generated-token.png differ diff --git a/docs/references/assets/scim/scim-lightdash-tokens-list.png b/docs/references/assets/scim/scim-lightdash-tokens-list.png new file mode 100644 index 0000000..4b20a97 Binary files /dev/null and b/docs/references/assets/scim/scim-lightdash-tokens-list.png differ diff --git a/docs/references/assets/scim/scim-lightdash-user-settings.png b/docs/references/assets/scim/scim-lightdash-user-settings.png new file mode 100644 index 0000000..6f389dc Binary files /dev/null and b/docs/references/assets/scim/scim-lightdash-user-settings.png differ diff --git a/docs/references/assets/scim/scim-lightdash-view-url.png b/docs/references/assets/scim/scim-lightdash-view-url.png new file mode 100644 index 0000000..ec3729a Binary files /dev/null and b/docs/references/assets/scim/scim-lightdash-view-url.png differ diff --git a/docs/references/assets/scim/scim-okta-assign-users.png b/docs/references/assets/scim/scim-okta-assign-users.png new file mode 100644 index 0000000..ab1079b Binary files /dev/null and b/docs/references/assets/scim/scim-okta-assign-users.png differ diff --git a/docs/references/assets/scim/scim-okta-configure-api-integration.png b/docs/references/assets/scim/scim-okta-configure-api-integration.png new file mode 100644 index 0000000..63d3666 Binary files /dev/null and b/docs/references/assets/scim/scim-okta-configure-api-integration.png differ diff --git a/docs/references/assets/scim/scim-okta-create-integration.png b/docs/references/assets/scim/scim-okta-create-integration.png new file mode 100644 index 0000000..6d4586c Binary files /dev/null and b/docs/references/assets/scim/scim-okta-create-integration.png differ diff --git a/docs/references/assets/scim/scim-okta-name-app.png b/docs/references/assets/scim/scim-okta-name-app.png new file mode 100644 index 0000000..cba8e21 Binary files /dev/null and b/docs/references/assets/scim/scim-okta-name-app.png differ diff --git a/docs/references/assets/scim/scim-okta-provisioning.png b/docs/references/assets/scim/scim-okta-provisioning.png new file mode 100644 index 0000000..9a37ff9 Binary files /dev/null and b/docs/references/assets/scim/scim-okta-provisioning.png differ diff --git a/docs/references/assets/screenshot-column-descriptions.png b/docs/references/assets/screenshot-column-descriptions.png new file mode 100644 index 0000000..0ba9a47 Binary files /dev/null and b/docs/references/assets/screenshot-column-descriptions.png differ diff --git a/docs/references/assets/screenshot-default-intervals.png b/docs/references/assets/screenshot-default-intervals.png new file mode 100644 index 0000000..9b834cc Binary files /dev/null and b/docs/references/assets/screenshot-default-intervals.png differ diff --git a/docs/references/assets/screenshot-intervals-off.png b/docs/references/assets/screenshot-intervals-off.png new file mode 100644 index 0000000..c1469dd Binary files /dev/null and b/docs/references/assets/screenshot-intervals-off.png differ diff --git a/docs/references/assets/screenshot-joined-table.png b/docs/references/assets/screenshot-joined-table.png new file mode 100644 index 0000000..9146463 Binary files /dev/null and b/docs/references/assets/screenshot-joined-table.png differ diff --git a/docs/references/assets/screenshot-multiple-values-filter.png b/docs/references/assets/screenshot-multiple-values-filter.png new file mode 100644 index 0000000..a77cc98 Binary files /dev/null and b/docs/references/assets/screenshot-multiple-values-filter.png differ diff --git a/docs/references/assets/screenshot-refresh-dbt.png b/docs/references/assets/screenshot-refresh-dbt.png new file mode 100644 index 0000000..e2377a9 Binary files /dev/null and b/docs/references/assets/screenshot-refresh-dbt.png differ diff --git a/docs/references/assets/semantic-layer-integrations.jpg b/docs/references/assets/semantic-layer-integrations.jpg new file mode 100644 index 0000000..f2b579b Binary files /dev/null and b/docs/references/assets/semantic-layer-integrations.jpg differ diff --git a/docs/references/assets/series-configure.png b/docs/references/assets/series-configure.png new file mode 100644 index 0000000..9e17d0b Binary files /dev/null and b/docs/references/assets/series-configure.png differ diff --git a/docs/references/assets/slack-ai-analyst.png b/docs/references/assets/slack-ai-analyst.png new file mode 100644 index 0000000..d605c7d Binary files /dev/null and b/docs/references/assets/slack-ai-analyst.png differ diff --git a/docs/references/assets/slack-alert.png b/docs/references/assets/slack-alert.png new file mode 100644 index 0000000..c22ea45 Binary files /dev/null and b/docs/references/assets/slack-alert.png differ diff --git a/docs/references/assets/slack-chart-unfurl.png b/docs/references/assets/slack-chart-unfurl.png new file mode 100644 index 0000000..35d679a Binary files /dev/null and b/docs/references/assets/slack-chart-unfurl.png differ diff --git a/docs/references/assets/slack-dashboard-unfurl.png b/docs/references/assets/slack-dashboard-unfurl.png new file mode 100644 index 0000000..0cbdc31 Binary files /dev/null and b/docs/references/assets/slack-dashboard-unfurl.png differ diff --git a/docs/references/assets/slack-scheduled-chart.png b/docs/references/assets/slack-scheduled-chart.png new file mode 100644 index 0000000..f4aefda Binary files /dev/null and b/docs/references/assets/slack-scheduled-chart.png differ diff --git a/docs/references/assets/slack-scheduled-dashboard.png b/docs/references/assets/slack-scheduled-dashboard.png new file mode 100644 index 0000000..56381be Binary files /dev/null and b/docs/references/assets/slack-scheduled-dashboard.png differ diff --git a/docs/references/assets/slack-settings.png b/docs/references/assets/slack-settings.png new file mode 100644 index 0000000..37965cf Binary files /dev/null and b/docs/references/assets/slack-settings.png differ diff --git a/docs/references/assets/spaces.png b/docs/references/assets/spaces.png new file mode 100644 index 0000000..13ac74a Binary files /dev/null and b/docs/references/assets/spaces.png differ diff --git a/docs/references/assets/sql-runner-components.jpg b/docs/references/assets/sql-runner-components.jpg new file mode 100644 index 0000000..f61995a Binary files /dev/null and b/docs/references/assets/sql-runner-components.jpg differ diff --git a/docs/references/assets/stacked-area-chart.png b/docs/references/assets/stacked-area-chart.png new file mode 100644 index 0000000..750828d Binary files /dev/null and b/docs/references/assets/stacked-area-chart.png differ diff --git a/docs/references/assets/stacked-bar-chart.png b/docs/references/assets/stacked-bar-chart.png new file mode 100644 index 0000000..72a274c Binary files /dev/null and b/docs/references/assets/stacked-bar-chart.png differ diff --git a/docs/references/assets/subtotals.png b/docs/references/assets/subtotals.png new file mode 100644 index 0000000..cc06d90 Binary files /dev/null and b/docs/references/assets/subtotals.png differ diff --git a/docs/references/assets/sync-with-google-sheets-create-modal.png b/docs/references/assets/sync-with-google-sheets-create-modal.png new file mode 100644 index 0000000..84bc063 Binary files /dev/null and b/docs/references/assets/sync-with-google-sheets-create-modal.png differ diff --git a/docs/references/assets/sync-with-google-sheets-create-new-modal-filled.png b/docs/references/assets/sync-with-google-sheets-create-new-modal-filled.png new file mode 100644 index 0000000..d4ea418 Binary files /dev/null and b/docs/references/assets/sync-with-google-sheets-create-new-modal-filled.png differ diff --git a/docs/references/assets/sync-with-google-sheets-create-new-modal.png b/docs/references/assets/sync-with-google-sheets-create-new-modal.png new file mode 100644 index 0000000..f844de0 Binary files /dev/null and b/docs/references/assets/sync-with-google-sheets-create-new-modal.png differ diff --git a/docs/references/assets/sync-with-google-sheets-dashboard-overview-three-dot-menu.png b/docs/references/assets/sync-with-google-sheets-dashboard-overview-three-dot-menu.png new file mode 100644 index 0000000..981c40b Binary files /dev/null and b/docs/references/assets/sync-with-google-sheets-dashboard-overview-three-dot-menu.png differ diff --git a/docs/references/assets/sync-with-google-sheets-dashboard-overview.png b/docs/references/assets/sync-with-google-sheets-dashboard-overview.png new file mode 100644 index 0000000..b8cd37a Binary files /dev/null and b/docs/references/assets/sync-with-google-sheets-dashboard-overview.png differ diff --git a/docs/references/assets/sync-with-google-sheets-edit-delete-options.png b/docs/references/assets/sync-with-google-sheets-edit-delete-options.png new file mode 100644 index 0000000..2630f91 Binary files /dev/null and b/docs/references/assets/sync-with-google-sheets-edit-delete-options.png differ diff --git a/docs/references/assets/sync-with-google-sheets-three-dot-menu.png b/docs/references/assets/sync-with-google-sheets-three-dot-menu.png new file mode 100644 index 0000000..4f4bc26 Binary files /dev/null and b/docs/references/assets/sync-with-google-sheets-three-dot-menu.png differ diff --git a/docs/references/assets/table-calculations-add.jpg b/docs/references/assets/table-calculations-add.jpg new file mode 100644 index 0000000..928b73c Binary files /dev/null and b/docs/references/assets/table-calculations-add.jpg differ diff --git a/docs/references/assets/table-chart.png b/docs/references/assets/table-chart.png new file mode 100644 index 0000000..4e4c577 Binary files /dev/null and b/docs/references/assets/table-chart.png differ diff --git a/docs/references/assets/table-group-label.png b/docs/references/assets/table-group-label.png new file mode 100644 index 0000000..a68b6dd Binary files /dev/null and b/docs/references/assets/table-group-label.png differ diff --git a/docs/references/assets/tables-configuration-write-back.jpg b/docs/references/assets/tables-configuration-write-back.jpg new file mode 100644 index 0000000..d05c489 Binary files /dev/null and b/docs/references/assets/tables-configuration-write-back.jpg differ diff --git a/docs/references/assets/tables-lower-total.png b/docs/references/assets/tables-lower-total.png new file mode 100644 index 0000000..ae9eabf Binary files /dev/null and b/docs/references/assets/tables-lower-total.png differ diff --git a/docs/references/assets/user-activity-dashboard.jpg b/docs/references/assets/user-activity-dashboard.jpg new file mode 100644 index 0000000..28c6bfd Binary files /dev/null and b/docs/references/assets/user-activity-dashboard.jpg differ diff --git a/docs/references/assets/user-attribute-default-value.png b/docs/references/assets/user-attribute-default-value.png new file mode 100644 index 0000000..9d9400b Binary files /dev/null and b/docs/references/assets/user-attribute-default-value.png differ diff --git a/docs/references/assets/user-attributes-default.png b/docs/references/assets/user-attributes-default.png new file mode 100644 index 0000000..9d1fd72 Binary files /dev/null and b/docs/references/assets/user-attributes-default.png differ diff --git a/docs/references/assets/user-attributes-override.png b/docs/references/assets/user-attributes-override.png new file mode 100644 index 0000000..6d33a40 Binary files /dev/null and b/docs/references/assets/user-attributes-override.png differ diff --git a/docs/references/assets/using-virtual-views.jpg b/docs/references/assets/using-virtual-views.jpg new file mode 100644 index 0000000..f367630 Binary files /dev/null and b/docs/references/assets/using-virtual-views.jpg differ diff --git a/docs/references/assets/validate-dashboard.jpg b/docs/references/assets/validate-dashboard.jpg new file mode 100644 index 0000000..d3556db Binary files /dev/null and b/docs/references/assets/validate-dashboard.jpg differ diff --git a/docs/references/assets/write-back-pull-request.jpg b/docs/references/assets/write-back-pull-request.jpg new file mode 100644 index 0000000..46c36db Binary files /dev/null and b/docs/references/assets/write-back-pull-request.jpg differ diff --git a/docs/references/chart-types.mdx b/docs/references/chart-types.mdx new file mode 100644 index 0000000..dec3f59 --- /dev/null +++ b/docs/references/chart-types.mdx @@ -0,0 +1,644 @@ +import ConfigureAxesRange from './assets/configure-axes-range.png'; +import Legend from './assets/legend.png'; +import Margins from './assets/margins.png'; +import AreaChart from './assets/stacked-area-chart.png'; +import ChartTypes from './assets/chart-types.jpg'; +import ConfigButton from './assets/config-button.jpg'; +import BigValue from './assets/big-value-chart.png'; +import TableChart from './assets/table-chart.png'; +import BarChart from './assets/bar-chart.png'; +import StackedBarChart from './assets/stacked-bar-chart.png'; +import HundredStackedBarChart from './assets/hundred-stacked-bar-chart.png'; +import LineChart from './assets/line-chart.png'; +import MultipleLineChart from './assets/multi-line-chart.png'; +import HorizontalBarChart from './assets/horizontal-bar-chart.png'; +import ScatterChart from './assets/scatter-chart.png'; +import ScatterChartGrouped from './assets/scatter-chart-grouped.png'; +import MixedChart from './assets/mixed-chart.png'; +import MixedChartConfigure from './assets/mixed-chart-configure.png'; +import MixedChartConvertToOne from './assets/mixed-chart-convert-to-one.png'; +import ConfigureLayout from './assets/configure-layout.png'; +import ConfigureSeries from './assets/series-configure.png'; +import ConfigureMultipleSeries from './assets/multiple-series-configure.png'; +import AddReferenceLine from './assets/add-reference-line.png'; +import ReferenceLineConfig from './assets/reference-line-config.png'; +import LockedColumn from './assets/locked-column.jpg'; +import ConditionalFormatting from './assets/conditional-formatting.png'; +import ConditionalFormattingRule from './assets/conditional-formatting-rule.png'; +import ColumnsRowsMetricsExample from './assets/columns-rows-metrics-example.jpg'; +import MetricsAsRows from './assets/metrics-as-rows.jpg'; +import PivotedTable from './assets/pivoted-table.jpg'; +import TablesLowerTotal from './assets/tables-lower-total.png'; +import PieChartLayout from './assets/pie-chart-layout.png'; +import PieChartSeries from './assets/pie-chart-series.png'; +import PieChartDisplay from './assets/pie-chart-display.png'; +import PieChart from './assets/pie-chart.png'; +import FunnelChart from './assets/funnel-chart.png'; +import FunnelChartGeneral from './assets/funnel-chart-general.png'; +import ColorRangesExample from './assets/color-ranges-example.jpg'; +import Subtotals from './assets/subtotals.png'; + +# Chart types + +Results tables can be useful for finding specific numbers or checking out your data, but it's usually easier to see trends and make sense of your data using charts. + +In Lightdash, the data in your results tables can be visualized in a bunch of different ways: + +- [Big Value](#big-value) +- [Table](#table) +- [Pie chart](#pie-chart) +- [Funnel chart](#funnel-chart) +- [Bar chart](#bar-chart) +- [Area chart](#area-chart) +- [Line chart](#line-chart) +- [Horizontal bar chart](#horizontal-bar-chart) +- [Scatter chart](#scatter-chart) +- [Mixed chart](#mixed-chart) + +The visualization type that you pick determines how Lightdash shows the data series in your chart. To change how your data is displayed, go into the `charts` tab in the Explore view. You have the option to change the chart type shown by selecting a style from the drop-down: + + + +You can also adjust all of the configuration settings for your chart type by clicking on the `configure` button: + + + +Once you've finished creating your chart, you can share it using the URL, save the chart, download it as an image, or save it to a dashboard. + +## Chart types and options + +Each chart type has its own configuration options. Click the `configure` button next to the chart type in the `chart` tab to see your options. + +### Big value + + + +The Big value option is for displaying a single value, well, big. + +The Big value works for any type of value: string, numeric, boolean, you name it! We always display the first value from the field in your results table. + +The options for Big value include: + +- Selecting which field you want to use for your Big value. +- Updating the label below the Big value value. +- Adding a comparison to the previous row + +### Table + + + +The Table option is good for looking at (surprise, surprise) tabular data, or for lists of things like user IDs or transactions. + +The options for Tables include: + +- Renaming the columns in your table. +- Showing/hiding the columns in your table. +- Showing/hiding the table name from the column labels. +- Showing/hiding the totals for your columns. +- Pivoting by a column. +- Transposing your table (a.k.a. pivoting your metrics) +- Locking a column from scrolling in your table. +- Adding conditional formatting to your cells. + +By default, we attach the table name to your field name (just in case you've got any duplicate fields from joined tables). But, you can easily turn this off in your table viz with a toggle. + +#### Columns, Rows, and Metrics + +Table visualizations have three components: + +- **Rows**: When a field is chosen for the row area, all of the unique values for that field are populated as values in the _rows_ of your table. + +- **Columns**: When a field is chosen for the column area, all of the unique values for that field are populated as values in the _columns_ of your table. + +- **Metrics**: If you have metrics in your table, then each metric cell shows the summarized information for a given row + column combination. + + + +#### Pivot tables (dimensions as columns) + +Pivot tables help you more easily summarize larger sets of data in table visualizations. They're also helpful to identify trends between two dimensions in your data using a table visualization. + +To add a pivot in your table, move a dimension to the `column` section of your table configuration. This will change the dimension from having its values populate the rows values of your table, to having it populate the column values of your table. + + + +You can move up to 3 dimensions as columns and there is a limit of 60 column values in your table (e.g. pivoting by a dimension with 30 months, and another with 4 statuses won't work because that will generate 4 x 30 = 120 column values). + +#### Transposing your table (metrics as rows) + +You can transpose your table so that your metrics become rows in your table instead of columns. This can be helpful if you want to compare a lot of metrics to each other (e.g. how my metrics are changing over time). + +To move your metrics to rows in your table, you need to have at least 1 dimension as a column (i.e. at least one pivot) then, you can click on `show metrics as rows` in the table configuration. + + + +#### Totals + +You can add column totals or row totals (in pivot tables) to your tables by selecting `Show column totals` or `Show row totals` in the chart configuration panel. ​The column totals in your results and table visualizations are calculated using the underlying data from your table, not only the values that are visible in the table. + +:::info + +Totals are not calculated for table calculations. Also, in pivot tables, totals are not shown for `count distinct`, `average`, `max`, `min`, and `median` metric types. + +::: + +#### My Totals are not what I expect + +**Why are my totals lower?​** + +When using the `count_distinct` metric type, you can sometimes get totals that are smaller than if you sum up the values seen in the table. + +For example, if you count the distinct number of devices that viewed pages on our website each month, it would look something like this: + +; + +If you manually add each row in the `Anonymous device count` column, the value you get is much higher than the total shown in the table. This is because the same device can view pages on our website across many months. So, when you add up the values in the table, you'll be counting some devices more than once. + +Lightdash uses a SQL query to calculate the distinct number of devices across all of the months so we avoid double-counting devices. + +**Why are my totals higher?​** + +There are two reasons why this could be happening: + +1. You've set a row limit in your query that's truncating the results. If the number of possible results from your query is larger than the row limit you've set, Lightdash will calculate the totals using all of the results (including the rows that have been removed from your table because of the limit). +2. You're using metric or table calculation filters. When you use metric or table calculation filters, the totals are calculated before the filters are applied. + +**How do I calculate totals based on what's shown in my table?​** + +If you want to calculate totals based on just the values shown in your table, you can create a new column using a table calculation to do this. + +Here's the table calculation you'll need to use to do this: + +```sql +SUM(${my_table_name.my_metric_name}) OVER() +``` + +:::note + +This calculation isn't a "true" total when you're using metrics types that are `count_distinct`! + +::: + +#### Subtotals + +You can add subtotals to your tables by selecting `Show subtotals` in the chart configuration panel. + + + +Subtotals are only calculated for `count` and `sum` metrics. Other metric types or table calculations are not supported yet. + +To use subtotals, you need to have at least 2 or more dimensions in your table visualization. + +#### Locking columns from scroll + +If you have a very wide table, you may want some columns to always be locked to the left while you're scrolling. In Lightdash, you can just click on the lock icon beside the columns you want to keep pinned to the left of your table visualization. Now, if someone is looking at your table, they'll always see those columns, locked in view. + + + +#### Conditional formatting + +Sometimes it’s helpful to highlight certain values in your tables when they meet a specific condition. You can set up conditional formatting rules by going to the Configure tab then clicking on Conditional Formatting. + + + +When you add a new rule, you’ll first need to pick which column should be affected, the type of rule you'd like to use (`single color` or `color range`), then you'll need to choose condition you want to match and the colour to change the cell if it matches that condition. + + + +You can set as many rules on a table as you want. If two or more rules disagree with each other, the rule that’s on the bottom of your list of rules will win. + +To use color ranges for your rules, select `color range` as the type. The color range option highlights cells with color shades according to the value in a particular cell. + + + +By default, the color range will use a set of 5 colors mapped across the min and max colors selected in your rule. + +### Pie chart + + + +Pie charts can be useful visualize data that adds up to a meaningful "whole". For example, the split of total revenue across each of our product lines. + +To use a pie chart type, you need at least one metric and one dimension in your query results. + +#### Layout + + + +To use a pie chart type, you need at least one metric and one dimension in your query results. You can add multiple dimensions to create more granular `groups` in your pie charts. + +By default, pie charts are shown in a donut shape (i.e. with the center removed) but you can easily toggle the `donut` toggle to switch between a traditional pie and donut chart. + +#### Series + + + +You can adjust the labels and colors for each of the slices of your pie chart in the `series` tab. You also have the option to show or hide value labels in your chart. + +#### Display + + + +You can choose to show or hide the legend for your pie chart in the `display` tab. + +### Funnel chart + + + +Funnel charts work well for showing pipeline performance, product conversion metrics, onboarding flows, or any other process where things move from one discrete stage to another. + +To use a funnel chart, you should have discrete stages of a process and numeric counts of entities in each stage. + +The funnel will show the count at each stage and the percentage that number represents of the starting count, making it easy to visualize the proportion moving from one stage to the next. + +#### General settings + + + +With the Lightdash funnel chart, you can use either a row or a column to describe the stages in your funnel. + +Use the `Data orientation` switch to specify which orientation you would like to use. + +When `rows` is selected, each row of your data represent one step. The first column in the data will be treated as the labels for the steps, and you can choose which **numeric** column to treat as the value of the step. + +When `columns` is selected, you should have a numeric column for each step you want to display. Only the first row of data will be represented and the column names will be used as the step labels. Non-numeric columns will be ignored. + +### Bar chart + + + +Bar charts are helpful to: + +- compare things between different groups (e.g. the number of orders you have by product type) +- track how a number changes over time if you have a _smaller number of x-axis values_ (e.g. number of new users per month over a year). + +#### Stacked bar chart + + + +You can also stack bar charts to compare proportions across different groups. + +Stacked bar charts work best when: + +- **the focus of the chart is to compare the totals and _one part_ of the totals.** It's hard to compare bars if they don't start at the same baseline. So, if you're trying to build a chart to compare multiple parts of your total with each other, consider keeping your bar chart unstacked! +- **you're trying to show the parts of _multiple_ totals**. If you only want to show parts of one total, consider an unstacked bar chart instead. If you only want to communicate one part of one total, consider if you should be using a big value chart instead. + +Check out more details about bar chart configurations [here](#configure-your-bar-line-and-scatter-charts). + +#### 100% Stacked Bar Chart + + + +You can create a 100% stacked bar chart by setting up a [table calculation for percent of group total](/guides/table-calculations/table-calculation-sql-templates/percent-of-group-pivot-total). Use your x-axis dimension as the `column_i_want_to_group_by`, then in your chart configuration choose your x-axis, group dimension, and the new table calculation as your y-axis. + +100% Stacked Bar Charts are useful when you need to visualize how the composition of a metric changes over time, or how the composition changes across different groups. + +### Area chart + + + +Area charts are best if: + +- **you want to show how values develop over time.** If you want to show how values differ in different categories, consider a (stacked) bar, or horizontal bar chart instead. +- **the total is as important as its parts**. If the total (= the height of all your stacked areas) is not important, consider a line chart instead. Many readers will have an easier time understanding a line chart than an area chart. +- **there are big differences between your values**. If the differences between your values are very small, consider a line chart instead. Compared to an area chart, the y-axis of a line chart doesn’t need to start at zero. This means that your y-axis can be stretched to show the tiny differences. +- **you're showing multiple series over time**. If you just want to show one value over time, also consider a line chart instead; especially if you don’t want your y-axis to start at zero. If you only have a few dates, you can also consider using a column chart. In both cases, labelling will be better. +- **you have many data points**. If you have less than ten or so data points, consider a stacked bar chart instead. + +### Line chart + + + +Line charts are used to show changes in a number over a short or long period of time. + +They're a good option when: + +- **you have small changes between your values**. The y-axis of a line chart doesn’t need to start at zero. This means that your y-axis can be stretched to show the tiny differences. +- **you have lots of x-axis values**. In this case, line charts are better to use than bar charts. + +Line charts with multiple lines can also be used to compare changes over the same period of time for more than one group. + + + +You can see more details about line chart configurations [here](#configure-your-bar-line-and-scatter-charts). + +### Horizontal bar chart + + + +Horizontal bar charts are just bar charts, except the columns are placed on the chart horizontally instead of vertically. + +Horizontal bar charts are useful when: + +- you're trying to group a number by something with a lot of possible values. +- your groups have really long label names. + +You can see more details about horizontal bar chart configurations [here](#configure-your-bar-line-and-scatter-charts). + +### Scatter chart + + + +A scatter chart is useful if you want to to look at the relationship, a.k.a. correlation, between two variables. Something like the age of your users vs. the amount of time they've spent on your website. + +You can group your scatter chart using a third variable. This will make the points on the scatter the same colour if they have the same group value. + + + +You can see more details about scatter chart configurations [here](#configure-your-bar-line-and-scatter-charts). + +### Mixed chart + + + +You can combine bars, line, and scatter charts on the same chart using a Mixed chart. + +To use a Mixed chart, you'll need to start with either a line, scatter or horizontal bar chart type and have two or more series on your chart. Either from having two or more fields selected for your y-axis or from having a group with two or more groups. + +Once you have the series you want on your chart, you can pick and choose the different chart types you'd like for each series in the `series` tab of the `Configure` space. + + + +You can easily revert all of the series on your chart to a single type using the `chart type` toggle list in the `series` tab. + + + +You can see more details about mixed chart configurations [here](#configure-your-bar-line-and-scatter-charts). + +## Configure your bar, line and scatter charts + +These chart types have very similar configuration options, so we thought it would be easiest to talk about them all together: + +### Layout + +This is where you can pick the columns from your results table that you want to plot on your x and y axes or that you want to group by. + +You can group by up to 3 fields in your chart. + +For bar charts, this is also where you have the option to stack your bars, or leave them unstacked (grouped). + + + +### Series + +The series tab is where you can adjust how your chart shows each data series. A **data series** is a set of related data points plotted on a chart. For example, the number of new users created each day over a set of dates is a series. In a bar chart, a series is represented by bars of the same color; in a line chart, a series is represented by a single line. You can see a list of the series for your chart in the `series` menu, and on the chart legend. + + + +The options available in here will depend on the data in your chart. But, in here you can: + +- Set the chart type of your series. +- Put your series on a left or right y-axis. +- Show the value labels on data points. +- Show or hide a series from your chart. + +If you have multiple series in your chart, you can adjust these settings for **_all_** of the series in your chart at once using the configuration options at the top. Or, you can adjust these setting for each of the series individually. + + + +### Axes + +Here’s where you can customize the axes on your plot. + +You have the options to: + +- change the text for your axes labels. +- set the axis limits for your y-axes. You can either leave the auto-axis range or manually enter your own limits. + + + +### Display + +This tab is where you're able to control the legend and reference lines in your chart. + +#### Reference lines + +You can add reference lines to your charts to easily visualize goals or thresholds. + + + +To add a reference line, you just need to click `+ Add` under the reference lines option, then configure your reference line in the drop-down. + +You can: + +- select a field you want to apply your reference line to +- select the value you want to set your line at +- customize the label on your reference line +- change the colour of your reference line + + + +If you select a field plotted on your x-axis, then your line will be vertical. If you select a field plotted on your y-axis, then your line will be horizontal. + +**Note:** if your reference line label is cropped off your chart, try adjusting your [right margin](#margins). + +#### Legend + +You can add and adjust the legend in your chart to help people understand what data's been plotted. + +- Show/hide the legend +- Adjust the position of the legend on your chart + - The values in `position` are the coordinates of the legend on your chart. They can either be numbers or percent. We suggest using %. + - If you want the position to be in the bottom right, you would set: Right = 0%, Bottom = 0%. For the legend to be in the middle of the chart, you'd set: Top = 50%, Left = 50%. +- Set your legend to scroll (if you have so many groups that they overlap your chart). +- Orientate the values in your legened to form a list vertically, or horizontally + + + +### Margins + +The Margin tab is where you're able to add or remove margin around the grid (aka your chart with its plotted values). Removing margin means that your chart will fill more of the space in the chart tab. Adding margin will shrink your chart into a smaller space. + +You can either add numbers (e.g. 50) or percent values (e.g. 50%) to the margin settings listed. The default margin is set to `top` = 70, `bottom` = 30, `left` = 5%, `right` = 5% + + diff --git a/docs/references/custom-fields.mdx b/docs/references/custom-fields.mdx new file mode 100644 index 0000000..0a7a1d1 --- /dev/null +++ b/docs/references/custom-fields.mdx @@ -0,0 +1,174 @@ +import CustomDimensionCreating from './assets/custom-dimension-creating.png'; +import CustomDimensionBins from './assets/custom-dimension-bins.png'; +import CustomDimensionSqlAdd from './assets/custom-dimension-sql-add.png'; +import CustomDimensionSqlForm from './assets/custom-dimension-sql-form.png'; +import CustomDimensionSqlResult from './assets/custom-dimension-sql-result.png'; + +import CustomMetricAdded from './assets/custom-metric-added.jpg'; +import CustomMetricCreating from './assets/custom-metric-creating.png'; +import CustomMetricDeleting from './assets/custom-metric-deleting.png'; +import CustomMetricAddFilterWhenCreating from './assets/custom-metric-add-filter-while-creating.png'; +import CustomMetricAddFilterWhenEditing from './assets/custom-metric-add-filter-while-editing.png'; + +# Using custom fields + +The fields that you see in your `dimensions` and `metrics` are created by the people maintaining your Lightdash project. + +But, you can create new custom dimensions or metrics for quick calculations and binning on the fly. On this page, we'll explain what custom dimensions and metrics are and how to use them. + +## Custom metrics + +To create a custom metric, you just need to: + +1. Click on the dimension's three-dot `options` menu +2. Click on one of the options available (e.g. `Count Distinct`) +3. Confirm your changes + + + +Then, your new metric will be added to your results table automatically and will appear in the `custom metrics` space in your sidebar. + + + +If you want to delete the custom metric, you can just click on the three-dot `options` menu and hit `Remove custom metric` + + + +### Custom metric types + +To learn more about the custom metric types, read the [metrics reference documentation here](/references/metrics). Only aggregate metric types are available as custom metrics. + +### Adding filters to your custom metric + +You can add filters to limit the rows included in your metric aggregation. You can add filters when: + +1. You create a custom metric: + + + +2. You edit an existing custom metric: + + +--- + +## Custom dimensions + +Dimensions are used to group results in your query, or filter values from your results. + +Sometimes, a group or filter that you need hasn't been added to your project, so you can use a custom dimension to create a grouping or filter on-the-fly. + +These dimensions are not saved to the table permanently. They are only available in the saved chart or query that they were created in. + +### Bin + +Bins are used to split out values of a numeric dimension into custom sets of ranges. Bins can only be used with dimensions that are numeric. Fixed bins (fixed number and fixed width) will update automatically if the min or max values of your dimension change. + +To create a bin custom dimension, you just need to: + +1. Click on a dimension's three-dot `options` menu +2. Click on the `bin` option +3. Setup + create your dimension + + + +Then, your new dimension will be added to your results table automatically and will appear in the `custom dimensions` space in your sidebar. + + + +There are three ways that you can set up your bins: + +**1. Fixed number of bins** + +You pick the number of bins that you want to group your dimension into and Lightdash automatically defines the ranges for your bins. The ranges that Lightdash generates for the bins are equal to the range of the values in your dimension divided by the number of bins you selected. + +**2. Fixed width** + +You pick the width (a.k.a. ranges) for your bins and Lightdash automatically defines a set of bins with those widths. The number of bins that Lightdash generates is equal to the range of values in your dimension divided by the fixed width that you picked for your bins. + +**3. Custom range** + +You manually define the min and max values for each bin. The custom range option is the only binning option that will not automatically update if the min or max values of your dimension change (you would need to manually adjust your custom bins or some values could not be included in your bins). + +--- + +### Custom SQL + +You can use completely custom SQL to create a custom dimension. The SQL you use to create these custom dimensions can reference other dimensions from the main table and joined tables in your explore. + +:::info + +Only users with developer access or above can create custom SQL dimensions. + +::: + +In this example, let's explore the `orders` table and create a custom dimension that categorizes my orders' totals into three categories: `low`, `medium`, and `high`. + +You can click on the button to add a custom dimension on the sidebar: + + + +Then you can write your SQL query to create your custom dimension: + +```sql +CASE + WHEN ${orders.subtotal} < 100 THEN 'low' + WHEN ${orders.subtotal} < 500 THEN 'medium' + ELSE 'high' +END +``` + + + +And after you run your query, you will see your new custom dimension categorising your orders' totals: + + diff --git a/docs/references/dbt-projects.mdx b/docs/references/dbt-projects.mdx new file mode 100644 index 0000000..0b69253 --- /dev/null +++ b/docs/references/dbt-projects.mdx @@ -0,0 +1,36 @@ +import AutomaticallyDeployChangesGithub from './../snippets/automatically-deploy-your-changes-using-github-action.mdx'; + +# dbt Projects + +You can easily make changes in dbt and see them updated in your Lightdash project. + +:::info + +Lightdash supports dbt v1.4.0 and above. If you are using an older version of dbt, you will need to upgrade to sync +your project to Lightdash + +::: + +--- + +## 1. Automatically: deploy your changes to Lightdash using a GitHub action + + + +## 2. In the UI: Syncing your dbt changes using `refresh dbt` + +Whenever you make changes to your YAML files, you can sync Lightdash and see these changes by clicking the `refresh dbt` button in the Explore view of the app. + +![screenshot-refresh-dbt](assets/screenshot-refresh-dbt.png) + +If you're using a git connection (like GitHub, Gitlab or Bitbucket), you'll need to push + merge your changes to the branch that your Lightdash project is connected to before you run `refresh dbt`. + +## 3. From the command line: Syncing your dbt changes using `lightdash deploy` + +If you're using the [Lightdash CLI](/guides/cli/how-to-install-the-lightdash-cli), you can use the `lightdash deploy` command to deploy your changes to your Lightdash project. + +To read more about how to use `lightdash deploy`, [check out our docs](/guides/cli/how-to-use-lightdash-deploy). + +## Note: If you've made any changes to the underlying data, you need to run dbt first + +If you've made any changes to the underlying data (for example, adding a new column in your `model.sql` file or changing the SQL logic of an existing dimension), then you need to run: `dbt run -m yourmodel` before you click `refresh dbt` in Lightdash. diff --git a/docs/references/dbt-semantic-layer.mdx b/docs/references/dbt-semantic-layer.mdx new file mode 100644 index 0000000..cb69e07 --- /dev/null +++ b/docs/references/dbt-semantic-layer.mdx @@ -0,0 +1,79 @@ +import SemanticLayerIntegrations from './assets/semantic-layer-integrations.jpg'; +import DbtSemanticLayerServiceToken from './assets/dbt-semantic-layer-service-token.jpg'; + +# dbt Semantic Layer + +You can use Lightdash to explore the semantic models you've defined in [dbt's Semantic Layer](https://www.getdbt.com/product/semantic-layer). + +Note that this integration is **_separate_** to the Lightdash Semantic Layer (which is configured in your dbt project under the `meta` tags in your .yml files). + +:::info + +The dbt Semantic Layer integration is only available to [Lightdash Cloud users](https://www.lightdash.com/pricing). To have the dbt Semantic Layer integration activated on your account, please message support@lightdash.com. + +::: + +## Connect Lightdash to your dbt Semantic Layer + +Before you can connect your dbt Semantic Layer to Lightdash, you need to: + +- have an active dbt Cloud account (i.e. a paid dbt Cloud subscription). +- [have the dbt Semantic Layer configured](https://docs.getdbt.com/guides/sl-snowflake-qs?step=14)\*\* in on of your dbt Cloud projects. + +### Set up your Semantic Layer Integration + +1. Click on `settings` --> `project connection settings` +2. From the sidebar, head to `Semantic Layer Integrations` +3. Select `dbt Semantic Layer` from the list of Semantic Layer integrations + + + +### Service token + +This is a service token to connect to the project configured with the dbt Semantic Layer. You need to create this service token from your dbt Cloud account. + +To generate a service token: + +1. Go to https://cloud.getdbt.com/next/settings +2. From the sidebar, click on `API tokens` --> `service tokens`, then `create new token` +3. Give your token at least `Semantic Layer Only` permissions and select the project where you've [configured the dbt Semantic Layer](https://docs.getdbt.com/docs/use-dbt-semantic-layer/setup-sl#set-up-dbt-semantic-layer). +4. Choose the Semantic Layer Credentials that you want to give to the token. +5. Hit `save` + +Copy-paste the token into `Service Token` in the Lightdash Semantic Layer Integration page. + + + +### Domain + +This is the domain where you dbt Cloud instance is being hosted. + +### Environment + +This is the unique identifier for the dbt production environment. This should match the environment that you selected when you [configured your dbt Semantic Layer connection](https://docs.getdbt.com/docs/use-dbt-semantic-layer/setup-sl#1-select-environment) for your dbt Cloud project. + +You can get this from the dbt Cloud URL when you navigate to `Environments` under `Deploy`. If your URL ends with .../environments/222222, your environmentId is 222222. + +## Run queries using the dbt Semantic Layer + +Once you have your dbt Semantic Layer connected to a project in Lightdash, you can explore your Semantic Layer connection by clicking `new` --> `query using dbt Semantic Layer`. + +## Build dashboards using dbt Semantic Layer queries + +You can save charts from your dbt Semantic Layer queries and use these to build dashboards. + +:::info + +Dashboards can only contain charts from one semantic layer connection. That means charts created using the Lightdash Semantic Layer cannot be used on dashboards that contain charts created from the dbt Semantic Layer. + +::: diff --git a/docs/references/dbt-write-back.mdx b/docs/references/dbt-write-back.mdx new file mode 100644 index 0000000..846269f --- /dev/null +++ b/docs/references/dbt-write-back.mdx @@ -0,0 +1,85 @@ +import dbtWriteBack from './assets/dbt-write-back.jpg'; +import WriteBackPullRequest from './assets/write-back-pull-request.jpg'; +import TablesConfigurationWriteBack from './assets/tables-configuration-write-back.jpg'; +import dbtCloudRunAutomatically from './assets/dbt-cloud-run-automatically.jpg'; + +# dbt Write-Back + +dbt Write-Back allows you to create models in dbt from queries you've built in the [SQL Runner](/references/sql-runner). You can then explore these models as Tables in Lightdash. Unlike [Virtual Views](/references/virtual-views), these models will be saved to and managed in your dbt project. + +We recommend using dbt Write-Back if you're planning to use a query regularly so it can be governed and managed like other dbt models available in your Lightdash project. + +:::info + +dbt Write-Back is currently only available for dbt projects hosted in GitHub. + +::: + +## Getting started with dbt Write-Back + +Writing back to dbt will create a new branch and start a pull request in your dbt project to create a new .sql and .yml file based off of your SQL Runner query. + +To get started, select the `Write back to dbt` option from the `save` drop-down. + + + +You'll be asked to enter a name that will be used as the model name and file names in your dbt project. Clicking `open pull request` will open a pull request created by Lightdash against your dbt project in GitHub. + + + +The new model will be written to your dbt project in a `models/lightdash/` directory. The model will have the tag `created-by-lightdash` included in the model config. + +## Configuring your dbt write-back models in Lightdash + +### Getting your model to appear as a `Table` in Lightdash + +You might need to adjust your Table Configuration settings in your project to have your new models appear as Tables in Lightdash. + +If you've selected: + +- `show entire project` then you don't need to do anything. The models should appear automatically if you refresh your dbt project connection. +- `show models with any of these tags`, you'll need to add `created-by-lightdash` to the list of accepted tags. By default, models that you write back to dbt will have the tag `created-by-lightdash` included in the model config. +- `show models in this list`, you'll need to manually add the new models to the list of accepted models here. + + + +### Running your models in dbt + +If you get an `Error: not found your_table_name`, it's likely because you haven't built the table generated by your new model in your data warehouse yet. There are a couple of ways to handle this: + +#### Manual approach + +Once your model is merged to your dbt project, you can run `dbt run -s your_model_name_here` to create the table in your data warehouse. You might need to add `--target prod` if your default profile is set to `dev`! + +#### Automated approach using dbt Cloud + +If you're using dbt Cloud to manage your dbt project, you can create a job that will automatically run any new models with the tag `created-by-lightdash`. + +To create a job that does this, you'll want to: + +1. open dbt Cloud, head to `Deploy` --> `Jobs` and click `create new job` +2. toggle on `triggered by pull requests` in the `Git Trigger` section +3. add the command `dbt run --select tag:created-by-lightdash` +4. set `compare changes against environment` to `prod`. This will make sure that this job only runs when a model is changed from your pull request + + diff --git a/docs/references/dimensions.mdx b/docs/references/dimensions.mdx new file mode 100644 index 0000000..f3e3dc0 --- /dev/null +++ b/docs/references/dimensions.mdx @@ -0,0 +1,662 @@ +import ClickableDimension from './assets/clickable-dimension-link.jpg'; +import PieChartColor from './assets/pie-chart-color.png'; +import Groups from './assets/groups.png'; + +# Dimensions reference + +Dimensions are the columns in your table. They are the "attributes" of your data. For example, `user_id` in your users table is a dimension. + +Dimensions usually match 1:1 with columns in your dbt models (see [additional dimensions](#additional-dimensions) for counterexamples). + +--- + +## Adding dimensions to your project + +Read more about [adding dimensions to your project in our docs here](/guides/how-to-create-dimensions). + +For a dimension to appear in Lightdash, you just need to declare it in your dbt model's YAML file. + +```yaml +version: 2 + +models: + - name: my_model + columns: + - name: user_id # will be "User id" in LightDash + description: 'Unique identifier for a user." +``` + +## Dimension configuration + +To customize the dimension, you can do it in your dbt model's YAML file. + +If you want to declare multiple dimensions based on the same column, check [additional dimensions](#additional-dimensions) section. + +```yaml +version: 2 + +models: + - name: sales_stats + meta: + group_details: + finance: + label: Finance + description: Finance-related fields. + joins: + - join: web_sessions + sql_on: ${web_sessions.date} = ${sales_stats.date} + columns: + - name: revenue_gbp_total_est + description: 'Total estimated revenue in GBP based on forecasting done by the finance team.' + meta: + dimension: + type: string + label: 'Total revenue' # this is the label you'll see in Lightdash + description: 'My custom description' # you can override the description you'll see in Lightdash here + sql: 'IF(${TABLE}.revenue_gbp_total_est = NULL, 0, ${registered_user_email})' # custom SQL applied to the column from dbt used to define the dimension + hidden: false + round: 2 + format: 'gbp' + groups: ['finance'] + - name: forecast_date + description: 'Date of the forecasting.' + meta: + dimension: + type: date + time_intervals: ['DAY', 'WEEK', 'MONTH', 'QUARTER'] # not required: the default time intervals for dates are `['DAY', 'WEEK', 'MONTH', 'YEAR']` + urls: + - label: 'Open in forecasting tool' + url: 'https://finance.com/forceasts/weeks/${ value.raw }' + - label: Open in Google Calendar + url: 'https://calendar.google.com/calendar/u/0/r/day/${ value.formatted |split: "-" |join: "/"}' + required_attributes: + is_admin: 'true' + - name: date + meta: + dimension: + type: date + additional_dimensions: + dimension_name_one: + type: number + label: 'Day of Week' + sql: 'day_of_week(${date})' + dimension_name_two: + type: boolean + label: 'Weekday or Weekend' + sql: "case when day_of_week(${date}) < 5 then 'weekday' else 'weekend' end" +``` + +All the properties you can customize: + +| Property | Required | Value | Description | +| ------------------------------------------- | -------- | ------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| label | No | string | Custom label. If you set this property, this is what you'll see in Lightdash instead of the dimension name. | +| [type](#type) | No | Dimension type | The dimension type is automatically pulled from your table schemas in Lightdash but you can override the type using this property. | +| description | No | string | Description of the dimension in Lightdash. You can use this to override the description you have for the dimension in dbt. | +| sql | No | string | Custom SQL applied to the column used to define the dimension. | +| [time_intervals](#time-intervals) | No | `'default'` or `OFF` or an array[] containing elements of [date](#date-options), [numeric](#numeric-options) or [string](#string-options) options | `'default'` (or not setting the `time_intervals` property) will be converted into `['DAY', 'WEEK', 'MONTH', 'YEAR']` for dates and `['RAW', 'DAY', 'WEEK', 'MONTH', 'YEAR']` for timestamps; if you want no time intervals set `'OFF'`. | +| hidden | No | boolean | If set to `true`, the dimension is hidden from Lightdash. By default, this is set to `false` if you don't include this property. | +| round | No | number | Rounds a number to a specified number of digits | +| [format](#format) | No | string | This option will format the output value on the result table and CSV export. Currently supports one of the following: `['km', 'mi', 'usd', 'gbp', 'eur', 'percent', 'id']` | +| [compact](#compact-values) | No | string | This option will compact the number value (e.g. 1,500 to 1.50K). Currently supports one of the following: `['thousands', 'millions', 'billions', 'trillions']` | +| [groups](#groups) | No | string or string[] | If you set this property, the dimension will be grouped in the sidebar with other dimensions with the same group label. | +| [urls](#urls) | No | Array of { url, label } | Adding urls to a dimension allows your users to click dimension values in the UI and take actions, like opening an external tool with a url, or open at a website. You can use liquid templates to customise the link based on the value of the dimension. | +| [required_attributes](#required-attributes) | No | Object with { user_attribute, value } | Limits access to users with those attributes | +| [colors](#colors) | No | Object with { value, color } | Color for the values in the chart | + +## Type + +The types of your dimensions are pulled from your data warehouse, automatically. You can override these types using the `type` meta tag in your .yml file. If you run `lightdash generate` to generate your .yml files, then Lightdash will add the `type` from your data warehouse to your .yml files automatically. + +```yaml +- name: user_created_date + meta: + dimension: + type: date +``` + +We currently support these dimension types: + +| Dimension Types | +| --------------- | +| string | +| number | +| timestamp | +| date | +| boolean | + +## Description + +Column descriptions in your YAML file are automatically pulled into Lightdash and you can spot them if you hover over the dimension name πŸ‘€ + +![screenshot-column-descriptions](assets/screenshot-column-descriptions.png) + +Descriptions support any formatting that works with YAML, but the three characters used most often are: + +### Quotes for escaping + +When you surround text with double or single quotes it will escape the text between so that any special characters recognized by YAML will still pass through to the Lightdash UI. + +```yaml +description: 'The contents of this column include this & that.' +``` + +### Greater than symbol for folded text blocks + +When you use `>-` it allows you to type descriptions that are multiple lines long in the YAML file, but the text will be combined into a single line when parsed. The `lightdash generate` command will automatically add this to keep YAML files easy to read. + +This description in YAML: + +```yaml +- name: product_tier + description: >- + This is a longer description... + ...that requires multiple lines + and it will be combined in the Lightdash UI +``` + +Will appear like this in the Lightdash UI: + +``` +This is a longer description......that requires multiple lines and it will be combined in the Lightdash UI +``` + +### Vertical bar for preserving line breaks + +If you need line breaks to stay in place when they show up in the Lightdash UI, you can use a `|` character like this: + +```yaml +- name: product_tier + description: | + This is a longer description... + ...that requires multiple lines + and it will stay on multiple lines +``` + +And in Lightdash UI it will appear like this: + +``` +This is a longer description... +...that requires multiple lines +and it will stay on multiple lines +``` + +### Using dbt doc blocks + +You can also use dbt docs blocks in descriptions, [more on that here](/guides/cli/how-to-auto-generate-schema-files#using-doc-blocks-to-build-better-yml-files). + +## Compact values + +You can compact values in your YAML. For example, if I wanted all of my revenue values to be shown in thousands (e.g. `1,500` appears as `1.50K`), then I would write something like this in my .yml: + +```yaml + version: 2 + models: + - name: sales + columns: + - name: revenue + meta: + dimension: + compact: thousands # You can also use 'K' +``` + +| Value | Alias | Example output | +| --------- | ------------------ | -------------- | +| thousands | "K" and "thousand" | 1K | +| millions | "M" and "million" | 1M | +| billions | "B" and "billion" | 1B | +| trillions | "T" and "trillion" | 1T | + +## Time intervals + +Lightdash automatically adds intervals for dimensions that are timestamps or dates, so you don't have to! + +For example, here we have the timestamp dimension `created` defined in our dbt project: + +```yaml +- name: created + description: 'Timestamp when the user was created.' +``` + +Lightdash breaks this out into the default intervals automatically. So, this is how `created` appears in our Lightdash project: + +![screenshot-default-intervals](assets/screenshot-default-intervals.png) + +### By default, the time intervals we use are: + +**Date**: ['DAY', 'WEEK', 'MONTH', 'YEAR'] + +**Timestamp**: ['RAW', 'DAY', 'WEEK', 'MONTH', 'YEAR'] + +### To turn off time intervals for a dimension, set `time_intervals: OFF` + +If you want to turn off time intervals for a dimension, you can simply set the `time_intervals` property to `OFF`. + +In this example, `created` would now appear as a single, timestamp dimension without a drop-down list of time intervals in Lightdash: + +```yaml +- name: created + description: 'Timestamp when the user was created.' + meta: + dimension: + time_intervals: OFF +``` + +![screenshot-intervals-off](assets/screenshot-intervals-off.png) + +### To customize the time intervals for a dimension, you can use the `time_intervals` parameter. + +If you specify time intervals manually, then this overrides the default time intervals used by Lightdash. + +```yaml +- name: created + description: 'Timestamp when the user was created.' + meta: + dimension: + time_intervals: ['DAY', 'WEEK', 'MONTH', 'YEAR', 'QUARTER'] +``` + +You can see all of the interval options for date and timestamp fields below. + +### Date options + +| Option | Description | Type | Displayed value | Notes | +| ----------- | --------------------------------------------- | --------------- | ----------------------------------------- | ------------------------------------------------------------- | +| RAW | Original value | Date / DateTime | 2019-01-01 / 2019-01-01, 09:30:30:300 UTC | | +| YEAR | Date truncated to the nearest year | Date | 2019 | | +| QUARTER | Date truncated to the nearest quarter | Date | 2019-Q1 | | +| MONTH | Date truncated to the nearest month | Date | 2019-01-01 | | +| WEEK | Date truncated to the nearest week | Date | 2019-01-01 | The start of the week depends on your warehouse configuration | +| DAY | Date truncated to the nearest day | Date | 2019-01-01 | | +| HOUR | Datetime truncated to the nearest hour | DateTime | 2019-01-01, 09 UTC | | +| MINUTE | Datetime truncated to the nearest minute | DateTime | 2019-01-01, 09:30 UTC | | +| SECOND | Datetime truncated to the nearest second | DateTime | 2019-01-01, 09:30:30 UTC | | +| MILLISECOND | Datetime truncated to the nearest millisecond | DateTime | 2019-01-01, 09:30:30:300 UTC | | + +### Numeric options + +| Option | Description | Type | Displayed value | Notes | +| ------------------ | ---------------------------- | ------ | --------------- | ----------------------------------------------------------------------------- | +| DAY_OF_WEEK_INDEX | Index of the day of the week | Number | 0 | The value range and start of the week depends on your warehouse configuration | +| DAY_OF_MONTH_NUM | Day of the month | Number | 21 | | +| DAY_OF_YEAR_NUM | Day of the year | Number | 127 | | +| WEEK_NUM | Week number | Number | 37 | | +| MONTH_NUM | Month number | Number | 7 | | +| QUARTER_NUM | Quarter number | Number | 3 | | +| YEAR_NUM | Year number | Number | 2019 | | +| MINUTE_OF_HOUR_NUM | Minute number | Number | 50 | | +| HOUR_OF_DAY_NUM | Hour number | Number | 22 | | + +### String options + +| Option | Description | Type | Displayed value | +| ---------------- | --------------- | ------ | --------------- | +| DAY_OF_WEEK_NAME | Day of the week | String | Monday | +| MONTH_NAME | Month name | String | March | +| QUARTER_NAME | Quarter name | String | Q3 | + +## Format + +You can use the `format` parameter to have your dimensions show in a particular format in Lightdash. + +```yaml +- name: revenue + description: 'Timestamp when the user was created.' + meta: + dimension: + format: 'usd' + metrics: + total_revenue: + type: sum + format: 'usd' +``` + +These are the options: + +| Option | Description | Raw value | Displayed value | +| ------- | ----------------------------------------------------------------------------------- | ---------- | --------------- | +| km | Adds the suffix `km` to your value | 10 | 10 km | +| mi | Adds the suffix `mile` to your value | 10 | 10 mi | +| usd | Adds the `$` symbol to your number value | 10 | $10.00 | +| gbp | Adds the `Β£` symbol to your number value | 10 | Β£10.00 | +| eur | Adds the `€` symbol to your number value | 10 | €10.00 | +| percent | Adds the `%` symbol and multiplies your value by 100 | 0.1 | %10 | +| id | Removes commas and spaces from number or string types so that they appear like IDs. | 12,389,572 | 12389572 | + +## Groups + +You can group your dimensions and metrics in the sidebar using the `groups` parameter. + +To do this, you need to set up `group_details` in the model's configuration. Then, you can use these groups to organize metrics and dimensions. You can create nested groups up to 3 levels. + +```yaml +version: 2 +models: + - name: baskets + meta: + group_details: + product_details: + label: Product Details + description: 'Fields that have information about the products in the basket.' + item_details: + label: Item Details + description: 'Fields that have information about the items in the basket.' + + columns: + - name: basket_item_id + description: 'ID for the product item within the basket.' + meta: + dimension: + groups: ['product_details', 'item_details'] # this would add the dimension to a nested group: `product details` --> `item details` + - name: product_name + description: 'Full name of the product.' + meta: + dimension: + label: 'Product name' + groups: ['product_details'] # this would add the dimension under the group label: `product_details` +``` + +This example would look like this in the sidebar: + + + +## URLs + +Lightdash users can interact with dimension values by clicking on them. By adding custom `urls` you can configure +the actions available to your users. Like linking to external tools, or taking actions in other tools. + + + +In the example below, users can click on a company name and open a corresponding record in their CRM or search for +the company in google or open that company's Slack channel. + +```yaml +columns: + - name: company_name + label: Registered trading name of the company + meta: + dimension: + urls: + - label: Search for company in Google + url: 'https://google.com/search?${ value.formatted | url_encode }' + - label: Open in CRM + url: 'https://mycrm.com/companies/${ row.company.company_id.raw | url_encode }' +``` + +The `${ value.formatted }` will be replaced with the value of the company name in the Lightdash UI at query run time. +The `${ row.company.company_id.raw }` will be replaced with the value of the company id in the Lightdash UI at query run time. +The action will be disabled if the column "company_id" from table "company" is not part of the query. + +### You can reference values from other columns in your URLs + +You can reference another dimension from your table in your URL. For these URLs to work, the other column you've referenced needs to be included in your results table. +For example, say I’ve added a URL to `company_name` and it uses the field `customer_id`: + +``` +columns: + - name: company_name + label: Registered trading name of the company + meta: + dimension: + urls: + - label: "Open company" + url: "https://example.com/company/${row.customers.customer_id.raw | url_encode }" +``` + +This URL will only work if I have `customer_id` included in my results table. + +### Liquid Templating + +Use templates to configure the url values depending on the query, this allows your urls to depend on the results of queries. + +**Available liquid tags** + +| Tag | Description | +| ------------------------------------------- | -------------------------------------------------------------------------------------------- | +| `${ value.formatted }` | The exact value of the dimension as seen in the Lightdash UI. For example "$1,427.20" | +| `${ value.raw }` | The raw value of the dimension returned from the underlying SQL query. For example "1427.2 " | +| `${ row.table_name.column_name.formatted }` | The exact value of the column as seen in the Lightdash UI. For example "$1,427.20" | +| `${ row.table_name.column_name.raw }` | The raw value of the dimension returned from the underlying SQL query. For example "1427.2 " | + +**Available liquid filters** + +Filters can be used to make small transformations of your values: + +| Filter | Description | Example usage | +| ---------- | ---------------------------------------------------------------------- | --------------------- | ----------------- | +| url_encode | Encode a string as url safe, for example it replaces spaces with `%20` | `${value.formatted \ | url_encode }` | +| downcase | Convert string to all lowercase | `${value.formatted \ | downcase }` | +| append | Append a string to another | `${value.formatted \ | append: ".html"}` | + +There are [many more filters available in the Liquid documentation](https://liquidjs.com/filters/overview.html). + +## Required attributes + +Lightdash can use `user attributes` to limit some dimensions to some users. + +In the example below, only users with `is_admin` attribute `true` can use the `salary` dimension on `user` table. Users without access to this dimension will not see it or the custom metrics created from this dimension on the `explore page`. + +``` +columns: + - name: + description: User name + - salary: + description: User salary + meta: + dimension: + required_attributes: + is_admin: "true" +``` + +If a user without access to this dimension runs a query that contains this dimension, they will get a `Forbidden` error. + +### Current limitations + +Lightdash dimensions and custom metrics are protected by this feature, however, +it is possible to write custom SQL to bypass this filter, for example: + +- Developers and admins running SQL queries on SQL runner. +- Custom SQL or subqueries on `table calculations` + +:::info + +Scheduler deliveries will run against the user who created the scheduled delivery, be careful when sharing required attributes with other users. + +::: + +## Colors + +You can predefine colors for your string type dimensions, these colors will be used instead of your default organization colors for the right value when you use +a grouped bar chart or a pie chart. + +``` + - name: status + description: "{{ doc(\"orders_status\") }}" + meta: + dimension: + colors: + "placed": "#e6fa0f" + "completed": "#558B2F" + "shipped": "#29B6F6" + "return_pending": "#FF6F00" + "returned": "#E91E63" +``` + + + +:::info + +We recommend using #HEX colors, other color types like rgba,rgba or color name (eg: orange) are also supported on charts, but they are not yet supported on the chart config. + +::: + +:::info + +You can manually override these dimension colors by going into the chart config and +manually picking a color for that serie. + +These colors will also take precedence over the organization color palette. + +::: + +## Using special characters or capital letters in your column names + +If you use special characters on your column names, you might get errors when using those columns on explore. +For example, having a column named `Status` with capital S on a table named `orders` in postgres throws the following error: + +``` +column orders.status does not exist +``` + +To fix this, we can add the quoted column to our `sql` meta tag on dimensions + +``` +- name: status + meta: + dimension: + type: string + sql: '"orders"."Status"' # you can also use '${TABLE}."Status"' + +``` + +This will quote the `Status` columns on the SQL query + +``` +SELECT + "orders".order_id AS "orders_order_id", + "orders"."Status" AS "orders_status" +FROM "postgres"."jaffle"."orders" AS "orders" +``` + +## Additional dimensions + +Additional dimensions let you define multiple dimensions off of a single column from your dbt model. This is useful when [adding different formatting](#adding-different-formatting) to a column, [comparing or combining columns](#comparing-or-combining-columns), [parsing JSON +columns](#parsing-json-columns), or creating persisted groups/buckets based off of a column. + +A "normal" dimension is a column created in your .sql file in dbt that is written to your data warehouse. +An additional dimension is not included in your dbt .sql file, so it's not written to your data warehouse. When used in Lightdash, it just adds the dimension definition to your SQL query (so it's "created" at runtime). + +All [dimension configurations](#dimension-configuration) are available for additional dimensions. You can also [use additional dimensions when defining metrics](#using-additional-dimensions-in-metrics). + +:::info + +Additional dimensions names need to be unique in the model. + +::: + +### Adding different formatting + +```yaml +columns: + - name: revenue + meta: + dimension: + type: number + additional_dimensions: + revenue_in_thousands: + type: number + compact: thousands + revenue_in_millions: + type: number + compact: million +``` + +### Comparing or combining columns + +When defining additional dimensions, you can reference other dimensions, even from joined tables (`organizations` is a joined table in the example below). + +```yaml +columns: + - name: created_date + meta: + dimension: + type: date + additional_dimensions: + days_to_first_query_run: + type: number + description: 'Number of days between a user being created and their first query run.' + sql: ${first_query_date} - ${created_date} + days_to_organization_first_payment: + type: number + description: 'Number of days between a user being created and their organization making its first payment. This will be negative for users who joined after the first payment.' + sql: ${created_date} - ${organizations.first_payment_date} +``` + +### Parsing JSON columns + +Usually you'll want to add `hidden:true` for the main JSON dimension since raw JSON is not useful in charts. + +```yaml +columns: + - name: metadata # this is a jsonb column with metadata + meta: + dimension: + hidden: true + additional_dimensions: + version: + type: number + sql: JSON_VALUE(${metadata}, '$.version') # custom SQL applied to get the "version" value inside metadata +``` + +### Adding multiple timezones for the same dimension + +You can use additional dimensions to convert a timestamp into multiple timezones: + +```yaml +columns: + - name: created_at + description: 'The time that the thing was created' + meta: + dimension: + label: 'Created (UTC)' + type: timestamp + additional_dimensions: + created_at_est: + type: timestamp + label: 'Created (EST)' + description: 'The time that the thing was created, in EST' + sql: "convert_timezone('UTC', 'America/New_York', ${TABLE}.created_at)" +``` + +### Using additional dimensions in metrics + +To define metrics based on additional dimensions, you need to add them to the model's meta metrics, or use custom SQL in +defining them under the column's meta. + +```yaml +models: + - name: users + meta: + metrics: + highest_version_model_metric_example: + type: max + sql: ${version} + columns: + - name: metadata + meta: + dimension: + hidden: true + additional_dimensions: + version: + type: number + sql: JSON_VALUE(${metadata}, '$.version') + metrics: + highest_version: + type: max + sql: ${version} +``` diff --git a/docs/references/embedding.mdx b/docs/references/embedding.mdx new file mode 100644 index 0000000..d23bcba --- /dev/null +++ b/docs/references/embedding.mdx @@ -0,0 +1,237 @@ +import EmbedCreateSecret from '../guides/assets/embed-create-secret.png'; +import EmbedAddDashboard from '../guides/assets/embed-add-dashboard.png'; +import EmbedDeveloper from '../guides/assets/embed-developer.png'; +import EmbedPreview from '../guides/assets/embed-preview.png'; +import CreateUserAttribute from '../guides/assets/create-user-attribute.png'; +import EmbeddingSettingsAllFilters from '../guides/assets/embedding-settings-all-filters.png'; +import EmbeddingSettingsSomeFilters from '../guides/assets/embedding-settings-some-filters.png'; +import EmbeddingSettingsNoFilters from '../guides/assets/embedding-settings-no-filters.png'; +import EmbeddingPreviewAllFilters from '../guides/assets/embedding-preview-all-filters.png'; +import EmbeddingPreviewSomeFilters from '../guides/assets/embedding-preview-some-filters.png'; +import EmbeddingPreviewNoFilters from '../guides/assets/embedding-preview-no-filters.png'; +import EmbeddingPrint from '../guides/assets/embedding-print.png'; +import EmbeddingDownloadCsv from './assets/embedding-download-csv.png'; + +# Embedding + +You can embed Lightdash content in your website or application securely using Lightdash embedding. + +Embedded Lightdash content is available to view by anyone (not just folks with a Lightdash login). + +So, for example, you could embed a dashboard in your product, and anyone who has access to your product would have access to that dashboard. No need to login to Lightdash. + +We make sure that the links are secure and have a set expiry time that you pick (more on that below). + +:::info + +Embedding is a beta feature available to all Lightdash Cloud users, [get in touch](https://lightdash.typeform.com/to/BujU5wg5) to have this feature enabled in your account. + +::: + +For more of a deep dive into setting up and using embedding in Lightdash, check out our [How to embed content guide](../guides/how-to-embed-content.mdx). + +## Known limitations + +Since embedding is a beta feature it's still frequently being worked on by the Lightdash team. As of right now there are a few known limitations: + +- Embedding only works for dashboards, not table explores or single charts (unless the single chart is pinned to a dashboard first). +- Dashboard filters will not populate with values from your database to choose from. All values will require manual input by users. +- The **Filter dashboard to** option when clicking on individual chart segments will not work on embedded dashboards. + +If you're interested in embedding and one or more of these items are blockers, please reach out! Some of these things have been left out due to low demand, so it's possible we can add it quickly. + +## Embed secret + +The embed secret is used to generate tokens for embedding dashboards. + +This secret is like a password that will help you encrypt the URLs so we know the access is valid. + + +. + +You can regenerate the secret by clicking on the `Generate new secret` button. If you do this, people with an old URL will automatically lose access to any previously shared embed URL. + +## Allowed dashboards + +Only dashboards included in the `allowed dashboards` can be accessed using embed URLs. To embed a dashboard, you need to first add it to the `allowed dashboards` list. + + + +## Configure + +Configure the embed URL. Then preview your settings and copy it to your clipboard. + + + +### Dashboard + +Select the dashboard that you want to embed. Only dashboards included in the `allowed dashboards` list appear here. + +### Expires in + +Set the amount of time it takes before your embed token expires. + +Although you can generate URLs directly from Lightdash with a long expiration using [`generate and copy URL`](#generate--copy-url), it is recommended to generate your own JWT embed tokens in your backend (using the [`code snippet`](#code-snippet)) with a short expiration using your `secret` to make sure people can't be using embed URLs outside your app. + +### User attributes + +Use user attributes to limit access to certain data in the embedded dashboard. You can use any [user attribute](/references/user-attributes.mdx) that you've defined in your organization in the embedded dashboard. + +To learn about getting your embedded dashboard to show different values for different users in your app, [check out the guide here](../guides/how-to-embed-content.mdx#i-want-to-have-my-embedded-dashboard-show-different-values-for-different-users-in-my-app). + +### Interactivity + +There are options to enable certain dashboard interactivity features on your embedded dashboard in this section. By default, all interactivity is disabled on an embedded dashboard. + +#### Allow users to change dashboard filters + +You can choose which filters are displayed in your embedded dashboard. + +The filters shown in the embedded dashboard will act like they do in Lightdash. Users interacting with the embedded dashboard will be able to change the value and operator of your filters. They cannot add new filters, remove existing filters, change the field used in the filter, or change the tiles the filter is applied to. + +- **No filters** + + + + No filters will be shown in the embedded dashboard. All dashboard filters are still applied. + + + +- **Some filters** + + + + Only the filters you select will be shown in the embedded dashboard. All dashboard filters are still applied. + + + +- **All filters** + + + + All dashboard filters will be shown in the embedded dashboard. + + + +#### Can download CSV + +Enabling this option allows users to download all chart results as CSV files. + +On the embedded dashboard, this `download button` is accessible from the `...` options menu located in the top right corner when hovering over the chart tile. + +{' '} + + + +### Preview + +Clicking on `preview` allows you to preview the configuration for your embedded dashboard. This what people viewing your embedded dashboard will see. + +### Generate & Copy URL + +Clicking `generate & copy url` will generate an embed URL based on the configuration that you've set. + +You can embed this one-off URL directly into your application, but you will manually need to update the URL each time the embed URL expires. Alternatively, you can add the [`code snippet`](#code-snippet) to your app to automatically generate embed URLs in your application. + +## Code snippet + +Although you can generate URLs directly from Lightdash with a long expiration, it is recommended to generate your own JWT embed tokens in your backend with a short expiration using your `secret` to make sure people can't be using embed URLs outside your app. + +To make this easier to integrate, we included some code snippets you can copy and use in your app to generate a valid embed URL. + + + +### User metadata + +You can pass user metadata (specifically, an external user ID) from your application so that anytime someone views your embedded dashboard and runs queries in Lightdash, these query logs are enriched with this user metadata. Specifcally, this user metadata gets added to the [query tags](/references/usage-analytics.mdx#query-tags) for queries run in Lightdash. + +To assign an external ID, you can update the embed code snippet like this: + +```node +import jwt from 'jsonwebtoken'; +const LIGHTDASH_EMBED_SECRET = 'secret'; // replace with your secret +const projectUuid = 'my-project-uuid'; +const data = { + user: { + externalId: 'your_user_id_123', // Add this to assign an external ID + }, + content: { + type: 'dashboard', + dashboardUuid: 'your dashboard uuid', + }, +}; +const token = jwt.sign(data, LIGHTDASH_EMBED_SECRET, { expiresIn: '1 hour' }); +const url = `https://analytics.lightdash.cloud/embed/${projectUuid}/#${token}`; +``` + +If you don't assign an external ID in your embed code, then we will automatically generate and an assign an external ID based on the embed token. + +## PDF Export Functionality + +In the embedded dashboard, you have the ability to export the current page as a PDF document. +This feature can be accessed by clicking on the Print icon located in the upper right corner of the interface. + + + +Upon selecting the Print icon, a dialog box will emerge, presenting you with several print options. +Within this dialog, you have the option to choose "Export as PDF" as your desired output format. diff --git a/docs/references/filters.md b/docs/references/filters.md new file mode 100644 index 0000000..0883044 --- /dev/null +++ b/docs/references/filters.md @@ -0,0 +1,60 @@ +# Filters reference + +Filters appear at the top of the Explore view and allow users to change the data being pulled in. + +## Using filters + +To learn more about using filters, check out our docs on limiting data using filters. + +## Filter types + +### Numeric filters + +| Filter | logic | +| --------------- | ----------------------------------------------------------------------------------------------------- | +| is null | Only pulls in rows where the values are null for the field selected. | +| is not null | Only pulls in rows where the values are not null for the field selected. | +| is | Only pulls in rows where the values are equal to the values listed. | +| is not | Only pulls in rows where the values are not equal to the values listed. | +| is less than | Only pulls in rows where the values for the field selected are strictly less than the value listed. | +| is greater than | Only pulls in rows where the values for the field selectedare strictly greater than the value listed. | + +### String filters + +| Filter | logic | +| ----------- | -------------------------------------------------------------------------------------------------- | +| is null | Only pulls in rows where the values are null for the field selected. | +| is not null | Only pulls in rows where the values are not null for the field selected. | +| is | Only pulls in rows where the values are equal to the values listed. | +| is not | Only pulls in rows where the values are not equal to the values listed. | +| starts with | Only pulls in rows where the values for the field selected start with characters you've entered. | +| includes | Only pulls in rows where the values for the field selected includes the characters you've entered. | +| ends with | Only pulls in rows where the values for the field selected end with the characters you've entered. | + +### Boolean filters + +| Filter | logic | +| ----------- | ------------------------------------------------------------------------ | +| is null | Only pulls in rows where the values are null for the field selected. | +| is not null | Only pulls in rows where the values are not null for the field selected. | +| is | Only pulls in rows where the values are equal to the values listed. | + +### Date filters + +| Filter | logic | +| ------------------ | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| is null | Only pulls in rows where the values are null for the field selected. | +| is not null | Only pulls in rows where the values are not null for the field selected. | +| is | Only pulls in rows where the values are equal to the values listed. | +| is not | Only pulls in rows where the values are not equal to the values listed. | +| in the last | Only pulls in rows where the dates for the field selected are in the last time period you entered: "in the last 3 days", "in the last 2 completed weeks", "in the last 3 quarters" etc. | +| not in the last | Only pulls in rows where the dates for the field selected are not in the last time period you entered. | +| in the next | Only pulls in rows where the dates for the field selected are in the next time period you entered: "in the next 3 days", "in the next 2 completed weeks", "in the next 3 quarters" etc. | +| not in the next | Only pulls in rows where the dates for the field selected are not in the next time period you entered. | +| in the current | Only pulls in rows where the dates for the field selected are in the current time period you entered: "in the current day", "in the current week", "in the current quarter" etc. | +| not in the current | Only pulls in rows where the dates for the field selected are not in the current time period you entered. | +| is before | Only pulls in rows where the dates for the field selected are strictly before the date you entered. | +| is on or before | Only pulls in rows where the dates for the field selected are on or before the date you entered. | +| is after | Only pulls in rows where the dates for the field selected are strictly after the date you entered. | +| is on or after | Only pulls in rows where the dates for the field selected are on or after the date you entered. | +| is between | Only pulls in rows where the dates for the field selected are on or between the dates you entered: "between 2001-12-23 and 2003-01-02". | diff --git a/docs/references/google-sheets.mdx b/docs/references/google-sheets.mdx new file mode 100644 index 0000000..35eaad0 --- /dev/null +++ b/docs/references/google-sheets.mdx @@ -0,0 +1,110 @@ +import CreateNewButtonModal from './assets/sync-with-google-sheets-create-modal.png'; +import CreateNewModalFilled from './assets/sync-with-google-sheets-create-new-modal-filled.png'; +import CreateNewModal from './assets/sync-with-google-sheets-create-new-modal.png'; +import DashboardOverviewThreeDotMenu from './assets/sync-with-google-sheets-dashboard-overview-three-dot-menu.png'; +import DashboardOverview from './assets/sync-with-google-sheets-dashboard-overview.png'; +import EditDeleteSync from './assets/sync-with-google-sheets-edit-delete-options.png'; +import ThreeDotMenu from './assets/sync-with-google-sheets-three-dot-menu.png'; + +# Google Sheets + +## Syncs + +Syncs let you send your chart results to a Google Sheet in your Google Drive on a schedule. You can set up as many syncs as you like, and if you make any changes to the content, Lightdash will update the syncs the next time they’re sent. + +## Enabling scheduled deliveries + +If you are self-hosting Lightdash, make sure you have the Google Sheets integration configured before you start. See [setting up Google Sheets](self-host/customize-deployment/google-sheets-integration.mdx) for more information. + +If you're using Lightdash Cloud, this is already set up and available for you to use immediately. + +## Creating a Sync + +All users with editor access or above can create Syncs.. To create a Sync, click on the three-dot menu in the top-right corner of your chart, then click on `Google Sheets Sync`. + + + +The pop-up shows you a list of any existing Syncs for the saved chart, you also have the option to `Create new Sync`. + + + +Clicking `Create new Sync` takes you to the configuration screen to setup a new Google Sheets Sync. + + + +When you create a Sync, Lightdash also creates a special tab in your Google Sheet called metadata which includes information on when the sheet was last updated and the frequency interval. This allows users to easily understand how often data is refreshed inside their Google Sheet. + +> Note: If you are uploading data from a chart, the data will be uploaded to the first tab in your selected Google Spreadsheet and it will overwrite all the content. + +## Sync options + +- **Name**: this is the name of your Sync in Lightdash +- **Frequency**: this is how often your Google Sheet will be synced. You can make this hourly, daily, weekly, monthly, or custom - each frequency has its own options. For example, with a monthly schedule, you set the day of the month and the time that you want your Sync to be happen. The custom frequency lets you write out your own custom Cron expression if you need something more specific than our standard options. All times for the scheduler are in UTC. +- **Select Google Sheet**: Use the file picker to select the Google Sheet that you'd like to sync your chart results to. Note: You need to sync to an existing Google Sheet, so ensure you have created it before you can select it here. + +This is what a Sync looks like when it's been set up: + + + +Once you've set up all of your Sync options, you can click `Sync`. + +## Editing and deleting your Syncs + +To remove a Sync from a chart, click on the three-dot-menu beside the Sync name. From there, you can choose to `edit` or `delete` it. + + + +## Overview of your Syncs + +Users who have an admin role in your project can access an overview of your Syncs in the Project Settings. + +In the `Syncs & Scheduled deliveries` overview page, you can see a list of all of your Syncs (along with your Scheduled Deliveries), their most recent delivery status, and a history of all of the previous deliveries in your project. + +To access the overview page, just head to your Project Settings, then to the `Syncs & Scheduled deliveries` tab. + + + +Here, you can also click on the three-dot-menu beside each Sync to edit or delete it. + + + +Editing a Sync from the overview page will bring you to the same configuration screen as when you create a new Sync. Deleting a Sync from the overview page will remove it from your chart. + +## Google API Services User Data Policy + +Lightdash's use and transfer of information received from Google APIs adhere to [Google API Services User Data Policy](https://developers.google.com/terms/api-services-user-data-policy), including the Limited Use requirements. diff --git a/docs/references/groups.mdx b/docs/references/groups.mdx new file mode 100644 index 0000000..8d6291c --- /dev/null +++ b/docs/references/groups.mdx @@ -0,0 +1,66 @@ +import GroupsManagementPage from './assets/groups-management-page.jpg'; + +# Groups + +Groups are a way to manage access to multiple users at the same time. A user can belong to multiple groups. + +:::info + +Groups are only available on Lightdash Cloud Pro, Enterprise plans, and Self-Hosted instances. For more information on our plans, visit our [pricing page](https://www.lightdash.com/pricing). + +::: + +To view and manage your groups, go to the `Organization Settings` > `Users & groups` tab. Only users with an `organization admin` role can manage groups. + + +. + +## Creating groups + +To create a new group, go to `Organization Settings` > `Users & groups` > `Add group`. You can name your group and add users in your organization to the group. By default, newly created groups don’t have access to anything. + +## Editing groups + +To edit a group, click on the edit button to the right of a group in the list. You can add or remove users from a group and change the group name. + +To remove someone from that group, click on the `x` to the right of the group member. + +## Deleting groups + +To delete a group, click the delete icon to the right of a group in the list to remove it. + +## Adding roles to groups + +To assign a role to a group, use the `Project access` page in the `Organization settings` menu. From there, you can assign a group or groups to a role which determines their access to the project. For more information, see the [Project roles](/references/roles.mdx#project-roles) page. + +## Assigning user attributes to groups + +You can assign user attributes to groups as well as individual users. To learn more about managing data access for groups using user attributes, check out the [user attributes docs here](/references/user-attributes.mdx#assigning-user-attributes-to-users-and-groups). + +## Using OKTA to manage groups in Lightdash + +:::warning Deprecated feature + +This feature is deprecated and will be removed in a future release. +For more information on how to provision users and groups in Lightdash, see the [SCIM integration](/references/scim-integration.mdx) documentation. + +::: + +If your Lightdash instance is configured to [use OKTA as an authentication provider](../self-host/customize-deployment/use-sso-login-for-self-hosted-lightdash.mdx#okta), then users will automatically be assigned to the same groups in Lightdash as they are in OKTA. See the guide to [setting up OKTA](../self-host/customize-deployment/use-sso-login-for-self-hosted-lightdash.mdx#okta) for more information on setting the correct environment variables as well as Okta configuration: with/without custom authorization server. + +:::info + +Note that users will only be assigned to groups that exist in Lightdash (groups won't be created automatically) and exactly match the name of the group in OKTA. + +::: + +To manage groups in Lightdash using OKTA, you'll need to: + +1. [Setup groups in your directory in OKTA](https://help.okta.com/en-us/content/topics/users-groups-profiles/usgp-bulk-assign-group-people.htm) +2. [Allow groups to login in to Lightdash from Okta](https://help.okta.com/en-us/content/topics/users-groups-profiles/usgp-assign-app-group.htm) +3. Finally for group sync to work you need to [configure Okta to share groups with Lightdash](https://developer.okta.com/docs/guides/customize-tokens-groups-claim/main/#add-a-groups-claim-for-a-custom-authorization-server) diff --git a/docs/references/joins.mdx b/docs/references/joins.mdx new file mode 100644 index 0000000..7e523b9 --- /dev/null +++ b/docs/references/joins.mdx @@ -0,0 +1,340 @@ +import HideJoinTableColumns from './assets/hide-join-table-columns.jpg'; +import HideJoinedTableFromTablesList from './assets/hide-joined-table-from-tables-list.jpg'; + +# Joins reference + +Joins let you connect different models to each other so that you can explore more than one model at the same time in Lightdash and see how different parts of your data relate to each other. + +--- + +## Adding joins in your models + +Joins are defined at the same level as the model parameters in your YAML file. + +```yaml +version: 2 +models: + - name: accounts + meta: + joins: + - join: deals + type: left + sql_on: ${accounts.id} = ${deals.account_id} + fields: [unique_deals, new_deals, won_deals, lost_deals, stage] +``` + +When you open Lightdash, the dimensions and metrics from your joined model will appear below the ones in your selected model. + +![screenshot-joined-table](assets/screenshot-joined-table.png) + +:::tip + +- You can omit `fields` to include all metrics and dimensions defined in the joined table. +- When joined fields reference other fields, those other fields must also be included. +- The `sql_on` statement can include references to [user attributes](./user-attributes.mdx) for row-level filtering. + +::: + +## Rename a joined model + +When joining a model B onto a model A, you may want to rename the model for readability. This can be done with the +`label` tag, for example on this `messages` model it's more suitable for our business to call the joined user a +"sender": + +```yaml +models: + - name: messages + meta: + joins: + - join: users + label: Sender + sql_on: ${messages.sent_by} = ${users.user_id} +``` + +## Join the same table multiple times with an `alias` + +If you need to join a table multiple times, you can use an `alias` to distinguish between the different tables. A +common use case is joining a user table multiple times to another table depending on the type of user. For example +this `messages` model has both a sender and a recipient: + +```yaml +models: + - name: messages + meta: + joins: + - join: users + alias: sender + sql_on: ${messages.sent_by} = ${sender.user_id} + - join: users + alias: recipient + sql_on: ${messages.sent_to} = ${recipient.user_id} +``` + +Note the following important differences when aliasing models in joins: + +1. You must reference the fields in the model using the new alias. Notice that the joins above use `${sender.user_id} ` rather than `${users.user_id}`. +2. Because of the above, any fields in the base model or joined model that reference any field `${users.*}` will + fail to compile. Be careful of aliasing tables that are used in the base model. +3. Joined models are automatically relabelled with the alias but you may also customise this using the `label:` + field as above. + +## Specify your join type using `type` + +If you want to specify the type of join to be used in your SQL query, use the type field in your YAML configuration file. Set its value to one of the following: inner, left, right, or full. This will determine how the tables are joined in your query, aligning with SQL's INNER JOIN, LEFT OUTER JOIN, RIGHT OUTER JOIN, or FULL OUTER JOIN respectively. + +here's an example of how to specify a join type: + +```yaml +models: + - name: messages + meta: + joins: + - join: users + type: inner + sql_on: ${messages.sent_by} = ${users.user_id} +``` + +:::info + +By default, if no `type` is specified, all joins are `LEFT OUTER` joins. + +::: + +Here's a table to help you understand what each join type means and how it translates to SQL: + +| Join Type | Generated SQL | Description | +| ---------------------- | ------------------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| [`inner`](#type-inner) | `INNER JOIN` | Returns rows that have matching values in both tables. | +| [`left`](#type-left) | `LEFT OUTER JOIN` | Returns all rows from the left table, and the matching rows from the right table. Non-matching rows will have `NULL` for right table's columns. | +| [`right`](#type-right) | `RIGHT OUTER JOIN` | Returns all rows from the right table, and the matching rows from the left table. Non-matching rows will have `NULL` for left table's columns. | +| [`full`](#type-full) | `FULL OUTER JOIN` | Returns all rows when there is a match in either the left or right table records. Non-matching rows will have `NULL` for columns of the table that lacks a match. | + +### inner + +An inner join returns rows that have matching values in both tables. For example, if you have a `users` table and a `subscriptions` table, an inner join would return only the users who have a subscription. + +Here's an example of how to specify an inner join: + +```yaml +models: + - name: users + meta: + joins: + - join: subscriptions + sql_on: ${users.user_id} = ${subscriptions.user_id} + type: inner +``` + +### left + +A left join returns all rows from the left table (i.e. the model where you're adding the `join` to), and the matching rows from the right table (i.e. the model you've specified in `- join:`). Non-matching rows will have `NULL` for right table's columns. For example, if you have a `users` table and a `subscriptions` table, a left join would return all users, and the subscription information for users who have a subscription. + +Here's an example of how to specify a left join: + +```yaml +models: + - name: users + meta: + joins: + - join: subscriptions + sql_on: ${users.user_id} = ${subscriptions.user_id} + type: left # you can omit this, as left is the default +``` + +### right + +A right join returns all rows from the right table (i.e. the model you've specified in `- join: `), and the matching rows from the left table (i.e. the model where you're adding the `join` to). Non-matching rows will have `NULL` for left table's columns. For example, if you have a `users` table and a `subscriptions` table, a right join would return all subscriptions, and the user information for users who have a subscription. + +Here's an example of how to specify a right join: + +```yaml +models: + - name: users + meta: + joins: + - join: subscriptions + sql_on: ${users.user_id} = ${subscriptions.user_id} + type: right +``` + +### full + +A full join returns all rows when there is a match in either the left or right table records. Non-matching rows will have `NULL` for columns of the table that lacks a match. For example, if you have a `users` table and a `subscriptions` table, a full join would return all users and all subscriptions, and the subscription information for users who have a subscription. + +## Always join a table + +If you need a table to always be joined, you can set the `always` field to `true`. + +```yaml +models: + - name: messages + meta: + joins: + - join: users + sql_on: ${messages.sent_by} = ${users.user_id} + always: true +``` + +This will make sure that even when you don't select any of the fields from the joined table it will still be joined in the query. + +## Only select a subset of fields from a join + +Use the `fields` tag to select a subset of fields from a join. This is useful if you want to join a model but only a +few of its fields are useful in the joined context. For example this `messages` model only needs the `name` and +`email` fields from the `users` model. Note we must also include the `user_id` field since it's needed for the join. + +```yaml +models: + - name: messages + meta: + joins: + - join: users + sql_on: ${messages.sent_by} = ${users.user_id} + fields: [user_id, email, name] +``` + +## Using joined dimensions or metrics in your YAML + +Once you've joined a model, you can reference the metrics and dimensions from your joined model in your configurations. + +For example, I can filter one of my metrics using a dimension from my joined model, like this: + +```yaml +version: 2 + +models: + - name: users + meta: + joins: + - join: web_sessions + sql_on: ${web_sessions.user_id} = ${users.user_id} + - join: subscriptions + sql_on: ${subscriptions.user_id} = ${users.user_id} AND ${subscriptions.is_active} + + columns: + - name: user_id + meta: + metrics: + num_unique_premium_user_ids: + type: count_distinct + filters: + - subscriptions.plan: premium +``` + +You can also reference these joined metrics and dimensions in custom sql, like this: + +```yaml +version: 2 + +models: + - name: users + meta: + joins: + - join: web_sessions + sql_on: ${web_sessions.user_id} = ${users.user_id} + - join: subscriptions + sql_on: ${subscriptions.user_id} = ${users.user_id} AND ${subscriptions.is_active} + + columns: + - name: user_id + meta: + dimension: + sql: IF(${subscriptions.plan} IS NULL, NULL, ${user_id}) + metrics: + num_unique_premium_user_ids: + type: count_distinct + sql: IF(${subscriptions.plan} = 'premium', ${user_id}, NULL) +``` + +:::warning + +**Every joined field that you reference in a YAML file adds a dependency that you'll have to include in all future references to that model.** + +For example, you might define `deals.unique_enterprise_deals` by using a joined field in a filter: `${accounts.segment} = 'Enterprise'`. + +Then later you need to join `deals` to a `marketing_attribution` model. + +The `unique_enterprise_deals` metric must be excluded from the join unless you also join `accounts` to get the `accounts.segment` field. + +::: + +Check out our [dimensions](/references/dimensions) and [metrics](/references/metrics) reference docs to see all of the other configurations you can use with your joined fields. + +## Hide joined tables + +Sometimes, you need to use an intermediate model to join two models together and don't want to show its columns in the list of available metrics/dimensions. +You can add a `hidden: true` tag to joins, like this to hide these intermediate models: + +```yaml +models: + - name: users + meta: + joins: + - join: map_users_organizations + sql_on: users.user_id = map_users_organizations.user_id + hidden: true + - join: organizations + sql_on: organizations.organization_id = map_users_organizations.organization_id +``` + +Using just the `hidden` tag in the join and changing nothing else will remove the joined table from the sidebar of metrics/dimensions in `users`, but it will still appear in the "Tables" list as a table to explore on its own. + + +. + +### Hiding joined tables/helper tables from the main "Tables" list + +Sometimes, you might want to use a model as a join, but you don't want it to appear as a table to explore on its own in the list of Tables. You can use labels in your dbt project to help manage these tables and the `table configuration` settings in your Lightdash project. + +#### Step 1: Add tags to your models + +Models that are used in joins still need to be compiled in Lightdash. So, we suggest using some labels to tag the models that need to compiled in Lightdash with `lightdash`. Then, tag the models that you want users to explore with `lightdash-explore`. + +For example, `map_users_organizations` in our example below is a table we want to use as a join, but we don't want it to appear as a table on its own that can be explored. So, in the `dbt_project.yml` file, we'll add the `tag: lightdash`, but we won't add the tag `lightdash-explore` + +```yaml +models: + - name: users + meta: + joins: + - join: map_users_organizations + sql_on: users.user_id = map_users_organizations.user_id + hidden: true + - join: organizations + sql_on: organizations.organization_id = map_users_organizations.organization_id +``` + +Here we add our model tags in the `dbt_project.yml` file: + +```yaml +models: + users: + +tags: + - 'lightdash' + - 'lightdash-explore' + + map_users_organizations: + +tags: + - 'lightdash' +``` + +When deploying lightdash via the CLI or using GitHub actions, you should use the dbt selector `-s lightdash` to make sure you don't compile unnecessary models. + +#### Step 2: Update your Tables Configuration in the Lightdash app + +In the Lightdash app, under the `project settings` --> `tables configuration`, you can filter by `lightdash-explore` so all the intermediary joins are hidden and users have a small and curated list of models then can explore from. + +Doing this (combined with using the `hidden` label for the joined table above) would hide it both from the Tables list, and from the sidebar in the `Users` table. + + +. diff --git a/docs/references/lightdash-cli.mdx b/docs/references/lightdash-cli.mdx new file mode 100644 index 0000000..8918a66 --- /dev/null +++ b/docs/references/lightdash-cli.mdx @@ -0,0 +1,442 @@ +# Lightdash CLI reference + +The Lightdash CLI is the recommended way to develop your Lightdash project. It makes development faster and easier, as well as giving you options for building more powerful automation to manage your Lightdash projects. + +--- + +## Global options + +There are three global options that can be used with any Lightdash CLI command: [version](#version), [help](#help), and [verbose](#verbose). + +### Version + +`--version` or `-V` + +Ignores the preceding command and shows the installed CLI version. Usually it's used right after `lightdash`, like this: + +```bash +lightdash --version +``` + +### Help + +`--help` or `-h` + +Tells you what the preceding command does and lists all command-specific options. You can view the Lightdash CLI help like this: + +```console +lightdash --help +``` + +That returns the Lightdash CLI help menu: + +![lightdash help CLI results](./assets/cli-lightdash-help.png) + +When you use the `--help` or `-h` option with a speific command: + +```console +lightdash validate -h +``` + +That returns details and examples for the command itself: + +![lightdash validate help CLI results](./assets/cli-lightdash-validate-help.png) + +### Verbose + +`--verbose` + +Defaults to OFF. When included, each step will print logs as it progresses through the command. For example, here's a `--verbose` version of `lightdash generate-exposures`: + +![lightdash generate-exposures verbose example](./assets/cli-verbose-example.png) + +## Commands + +The table below includes a complete list of all commands available in the Lightdash CLI. + +For examples and command-specific options, click through the command in the table for docs, or install the Lightdash CLI and use the [global help option](#help). + +|
Command
| Description | +| ----------------------------------------------------- | ------------------------------------------------------------------------------- | +| [`login`](#lightdash-login) | Log in to a Lightdash instance using email/password or a token | +| [`config set-project`](#lightdash-config-set-project) | Choose or set the Lightdash project you are working on | +| [`compile`](#lightdash-compile) | Compile lightdash resources using your local project files | +| [`preview`](#lightdash-preview) | Create a temporary preview project, then wait for a keypress to stop | +| [`start-preview`](#lightdash-start-preview) | Create a preview project that stays open until it is stopped | +| [`stop-preview`](#lightdash-stop-preview) | Shut down an open preview project | +| [`deploy`](#lightdash-deploy) | Compile and deploy a Lightdash project using your local project and credentials | +| [`refresh`](#lightdash-refresh) | Refresh Lightdash project with remote repository | +| [`validate`](#lightdash-validate) | Validates content from your active project against your local project files | +| [`generate`](#lightdash-generate) | Generates or updates schema.yml file(s) for the selected model(s) | +| [`generate-exposures`](#lightdash-generate-exposures) | [Experimental command] Generates a .yml file for Lightdash exposures | +| [`dbt run`](#lightdash-dbt-run) | Executes dbt run, then `lightdash generate` to add/update `schema.yml` files | + +--- + +### `lightdash login` + +Log in to a Lightdash instance using email and password or a token. + +```console +lightdash login [URL] +``` + +**Argument:** + +- `[URL]` + - The URL for your Lightdash instance (see examples below) + +**Options:** + +- `--token` + - For logging in with an access token (common for SSO users) + - Exclude this to log in with email and password + +**Examples:** + +Log in to Lightdash Cloud US instance (for most Starter customers): + +```bash +lightdash login https://app.lightdash.cloud +``` + +Log in to Lightdash Cloud EU instance while showing detailed logs of login process: + +```bash +lightdash login https://eu1.lightdash.cloud --verbose +``` + +Log in to a custom domain with a personal access token (exclude `--token` to log in with email and password): + +```bash +lightdash login https://custom.lightdash.domain --token bv6105f53cb127087189cfib180a3131 +``` + +### `lightdash config set-project` + +Choose the project you're developing in so the CLI knows which project content to look at for other commands like `lightdash validate` and `lightdash preview`. If your organization only has one project you won't need to use this! + +```bash +lightdash config set-project +``` + +This command will bring up an interactive list of projects in your organization to choose from. + +If you need to set the project non-interactively, you can use one of the two optional arguments below. + +**Options:** + +- `--name` + - Set the project non-interactively by passing an explicit project name +- `--uuid` + - Set the project non-interactively by passing an explicit project UUID + +**Examples:** + +Set project to "Healthcare Demo": + +```bash +lightdash config set-project --name "Healthcare Demo" +``` + +Set project to the one with this UUID: + +```bash +lightdash config set-project --uuid "d75379bc-f6e9-4e52-86b2-d897cabacd0c" +``` + +### `lightdash compile` + +Compile Lightdash resources using your local project and database credentials. dbt gets compiled first, then your Lightdash explores. If you use [dbt node selection](#dbt-node-selection) to only compile a subset of models, Lightdash will also compile models joined to those models to ensure no field references are broken. + +All standard [dbt options](#dbt-options) work with `lightdash compile`. + +**Examples:** + +Compile the whole project: + +```bash +lightdash compile +``` + +Compile only the `accounts` dbt model, then your Lightdash explores: + +```bash +lightdash compile -s accounts +``` + +Compile your project using the `production` profile from your local `profiles.yml` file: + +```bash +lightdash compile --profile production +``` + +### `lightdash preview` + +Spin up a temporary preview project using your local project files and content (charts and dashboards) copied from your [selected project](#lightdash-config-set-project). + +All standard [dbt options](#dbt-options) work with `lightdash preview`. + +**Options:** + +- `--name [preview name]` + - Custom name for the preview project. If a name is not provided, a unique, randomly generated name will be created. +- `--start-of-week [number]` + - Specifies the first day of the week (used by week-related date functions). + - 0 (Monday) to 6 (Sunday) +- `--skip-dbt-compile` + - (default: false) + - Skip `dbt compile` and deploy from the existing ./target/manifest.json +- `--skip-warehouse-catalog` + - (default: false) + - Skip fetch warehouse catalog and use types defined in the YAML. +- `--use-dbt-list [true/false]` + - (default: true) + - Use `dbt list` instead of `dbt compile` to generate dbt manifest.json +- `--ignore-errors` + - (default: false) + - Allows deploy with errors on compile + +**Example:** + +Create a preview project with the name **PR: Add Revenue Metric** and ignore validation errors while spinning it up: + +```bash +lightdash preview --name "PR: Add Revenue Metric" --ignore errors +``` + +### `lightdash start-preview` + +Create a persistent preview project using your local project files and content (charts and dashboards) copied from your [selected project](#lightdash-config-set-project). + +All standard [dbt options](#dbt-options) work with `lightdash start-preview`. + +**Required argument:** + +- `--name [preview name]` + - Name for the preview project. If a preview project with this name already exists, it will be updated, otherwise it will create a new preview project. + +**Options:** + +- `--start-of-week [number]` + - Specifies the first day of the week (used by week-related date functions). + - 0 (Monday) to 6 (Sunday) +- `--skip-dbt-compile` + - (default: false) + - Skip `dbt compile` and deploy from the existing ./target/manifest.json +- `--skip-warehouse-catalog` + - (default: false) + - Skip fetch warehouse catalog and use the types defined in YAML +- `--use-dbt-list [true/false]` + - (default: true) + - Use `dbt list` instead of `dbt compile` to generate dbt manifest.json +- `--ignore-errors` + - (default: false) + - Allows deploy with errors on compile + +### `lightdash stop-preview` + +Shuts down a project that was created with [`lightdash start-preview`](#lightdash-start-preview). + +This command does not support using dbt options. + +**Required argument:** + +- `--name [preview name]` + - Name of the preview project to be deleted. + +**Example:** + +Shut down the preview project named **neon unicorn**. + +```bash +lightdash stop-preview "neon unicorn" +``` + +### `lightdash deploy` + +Compiles and deploys the current project to your [selected Lightdash Cloud project](#lightdash-config-set-project). + +:::warning + +This command is usually [used in Github Actions](/guides/cli/how-to-use-lightdash-deploy#automatically-deploy-your-changes-to-lightdash-using-a-github-action) or other deploy scripts. It is not common practice to use `lightdash deploy` to push your local changes up to Lightdash Cloud outside of your initial project creation. + +::: + +All standard [dbt options](#dbt-options) work with `lightdash deploy`. + +**Options:** + +- `--create [project_name]` + - Create a new project. If a project name is not provided, you'll be prompted for one on creation. +- `--ignore-errors` + - (default: false) + - Allows deploy with errors on compile. +- `--start-of-week [number]` + - Specifies the first day of the week (used by week-related date functions). + - 0 (Monday) to 6 (Sunday) +- `--skip-dbt-compile` + - (default: false) + - Skip `dbt compile` and deploy from the existing ./target/manifest.json. +- `--skip-warehouse-catalog` + - (default: false) + - Skip fetch warehouse catalog and use types defined in the YAML. +- `--use-dbt-list [true|false]` + - (default: true) + - Use `dbt list` instead of `dbt compile` to generate dbt manifest.json. + +### `lightdash refresh` + +Refreshes your hosted Lightdash project using the latest code from your linked Github repository. This is equivalent to pressing **Refresh dbt** in the UI as an admin. + +This command does not support using dbt options. + +### `lightdash validate` + +Validates a project by comparing the content in your currently selected project against your local project files. Returns all charts and dashboards that have errors. + +All standard [dbt options](#dbt-options) work with `lightdash validate`. + +**Options:** + +- `--project [project uuid]` + - Project UUID to validate, if not provided, the last preview will be used +- `--preview` + - (default: false) + - Validate the last preview if available. +- `--skip-dbt-compile` + - (default: false) + - Skip `dbt compile` and deploy from the existing ./target/manifest.json. +- `--skip-warehouse-catalog` + - (default: false) + - Skip fetch warehouse catalog and use types defined in the YAML. +- `--use-dbt-list [true/false]` + - (default: true) + - Use `dbt list` instead of `dbt compile` to generate dbt manifest.json. +- `--only [elems...]` + - (default: ["charts","dashboards","tables"]) + - Specify project elements to validate. + +**Example:** + +Validate only dashboards and use the existing compiled dbt manifest: + +```bash +lightdash validate --only ["dashboards"] --skip-dbt-compile +``` + +### `lightdash generate` + +Generates a new `schema.yml` file or updates existing `schema.yml` for selected model(s). + +All standard [dbt options](#dbt-options) work with `lightdash generate`. + +**Options:** + +- `-y` or `--assume-yes` + - (default: false) + - assume yes to prompts +- `--exclude-meta` + - (default: false) + - exclude Lightdash metadata from the generated .yml + +**Example:** + +Generate or update YAML file for a single dbt model to cover all columns in the database: + +```bash +lightdash generate -s mymodel +``` + +### `lightdash generate-exposures` + +Generates a `schema.yml` file for Lightdash exposures. + +:::warning + +This command is still in beta and may be removed or updated without warning. + +::: + +This command does not support using dbt options. + +**Options:** + +- `--project-dir [path]` + - (default: ".") + - The directory of the dbt project +- `--output [path]` + - The path where the output exposures YAML file will be written + +**Example:** + +Create or update YAML file called `lightdash-exposures.yml` in the current directory with all exposures in Lightdash: + +```bash +lightdash generate-exposures --output ./lightdash-exposures.yml +``` + +### `lightdash dbt run` + +Runs dbt and then generates or updates `schema.yml` file(s) for models that have columns missing or changed from the existing `schema.yml` files. + +Any dbt option that works with `dbt run` will also work with `lightdash dbt run`. That includes all the [Lightdash dbt options](#dbt-options), and more ([see dbt run docs](https://docs.getdbt.com/reference/commands/run)). + +**Options:** + +- `--exclude-meta` + - (default: false) + - exclude Lightdash metadata from the generated .yml +- `-y` or `--assume-yes` + - assume yes to prompts (default: false) + +**Examples:** + +Run a single model and create or update its `schema.yml` file: + +```bash +lightdash dbt run --select mymodel +``` + +## dbt options + +These are options from the dbt Core CLI that also work with some Lightdash CLI commands. + +### dbt node selection + +You can select a subset of your dbt models by using the following options on any Lightdash commands that support dbt options. + +**Node selection:** + +- `-s [models...]` or `--select [models...]` + - [Read the dbt docs on select](https://docs.getdbt.com/reference/node-selection/syntax#shorthand) +- `-m [models...]` or `--models [models...]` + - This is a legacy term for `--select` +- `--exclude [models...]` + - [Read the dbt docs on exclude](https://docs.getdbt.com/reference/node-selection/exclude) +- `--selector [selector_name]` + - [Read the dbt docs on selector](https://docs.getdbt.com/reference/node-selection/yaml-selectors) + +### dbt flags + +These dbt flags work with Lightdash commands that support dbt options. [Read the dbt docs on global config flags](https://docs.getdbt.com/reference/global-configs/about-global-configs#available-flags) for details. + +- `--project-dir [path]` +- `--profiles-dir [path]` +- `--profile [name]` +- `--target [name]` +- `--no-version-check` +- `--state [state]` +- `--full-refresh` + +### dbt project variables + +You can set dbt project variables in Lightdash commands that support dbt options. [Read the dbt docs on project variables](https://docs.getdbt.com/docs/build/project-variables) for details. + +`--vars [vars]` + +### dbt threads + +You can set the number of threads for dbt in Lightdash commands that support dbt options. [Read the dbt docs on threads](https://docs.getdbt.com/docs/running-a-dbt-project/using-threads) for details. + +`--threads [number]` diff --git a/docs/references/metrics.mdx b/docs/references/metrics.mdx new file mode 100644 index 0000000..12af4db --- /dev/null +++ b/docs/references/metrics.mdx @@ -0,0 +1,721 @@ +import UnderlyingData from '../guides/assets/underlying-data.jpg'; + +# Metrics reference + +A metric is a value that describes or summarizes features from a collection of data points. +For example, `Num unique user ids` is a metric. It describes the unique number of `user_id`s in a collection of `user_id` data points. + +In Lightdash, metrics are used to summarize dimensions or, sometimes, other metrics. + +--- + +## Adding metrics to your project using the `meta` tag. + +### 1. Using the column `meta` tag (Suggested) + +To add a metric to Lightdash using the `meta` tag, you define it in your dbt project under the dimension name you're trying to describe/summarize. + +```version: 2 + +models: + - name: my_model + columns: + - name: user_id # dimension name of your metric + meta: + metrics: + num_unique_user_ids: # name of your metric + type: count_distinct # metric type + num_user_ids: + type: count +``` + +Once you've got the hang of what these metrics look like, read more about the [metric types you can use below.](#metric-types) + +### 2. Using the model `meta` tag + +Sometimes a metric references many columns, in these cases you can define the metric at the model level: + +```yaml +version: 2 + +models: + - name: my_model + meta: + metrics: + num_unique_user_ids: + type: count_distinct + sql: ${TABLE}.user_id +``` + +## Metric Categories + +Each metric type falls into one of these categories. The metric categories tell you whether the metric type is an aggregation and what type of fields the metric can reference: + +### Aggregate metrics + +Aggregate metric types perform (surprise, surprise) aggregations. Sums and averages are examples of aggregate metrics: they are measurements summarizing a collection of data points. + +Aggregate metrics can _only_ reference dimensions, not other metrics. + +### Non-aggregate metrics + +Non-aggregate metrics are metric types that, you guessed it, do _not_ perform aggregations. + +Numbers and booleans are examples of non-aggregate metrics. These metric types perform a calculation on a single data point, so they can only reference aggregate metrics. They _cannot_ reference dimensions. + +## Metric configuration + +You can customize your metrics in your dbt model's YAML file. Here's an example of the properties used in defining a metric: + +```yaml +version: 2 + +models: + - name: sales_stats + meta: + joins: + - join: web_sessions + sql_on: ${web_sessions.date} = ${sales_stats.date} + group_details: + product_details: + label: Product Details + description: 'Fields that have information about the products in the basket.' + item_details: + label: Item Details + description: 'Fields that have information about the items in the basket.' + columns: + - name: revenue + description: 'Total estimated revenue in GBP based on forecasting done by the finance team.' + meta: + metrics: + total_revenue: + label: 'Total revenue GBP' + type: SUM + description: 'Total revenue in GBP' + sql: 'IF(${revenue} IS NULL, 10, ${revenue})' + groups: ['product_details', 'item_details'] # this would add the metric to a nested group: `product details` --> `item details` + hidden: false + round: 0 + format: 'gbp' + show_underlying_values: + - revenue + - forecast_date + - web_sessions.session_id # field from joined table + filters: + - is_adjusted: true +``` + +Here are all of the properties you can customize: + +| Property | Required | Value | Description | +| --------------------------------------------------- | -------- | ------------------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| label | No | string | Custom label. This is what you'll see in Lightdash instead of the metric name. | +| [type](#metric-types) | Yes | metric type | Metrics must be one of the supported types. | +| [description](#adding-your-own-metric-descriptions) | No | string | Description of the metric that appears in Lightdash. A default description is created by Lightdash if this isn't included | +| [sql](#using-custom-sql-in-aggregate-metrics) | No | string | Custom SQL used to define the metric. | +| hidden | No | boolean | If set to `true`, the metric is hidden from Lightdash. By default, this is set to `false` if you don't include this property. | +| round | No | number | Rounds a number to a specified number of digits | +| [format](#format) | No | string | This option will format the output value on the result table and CSV export. Currently supports one of the following: `['km', 'mi', 'usd', 'gbp', 'eur', 'percent', 'id']` | +| [compact](#compact-values) | No | string | This option will compact the number value (e.g. 1,500 to 1.50K). Currently supports one of the following: `['thousands', 'millions', 'billions', 'trillions']` | +| [groups](#groups) | No | string or string[] | If you set this property, the metric will be grouped in the sidebar with other metrics with the same group label. | +| [urls](./dimensions.mdx#urls) | No | Array of { url, label } | Adding urls to a metric allows your users to click metric values in the UI and take actions, like opening an external tool with a url, or open at a website. You can use liquid templates to customise the link based on the value of the dimension. | +| [show_underlying_values](#show-underlying-values) | No | Array of dimension names | You can limit which dimensions are shown for a field when a user clicks `View underlying data`. The list must only include dimension names from the base model or from any joined models. | +| [filters](#filters) | No | Array of {filter field: value} | You can add filter logic to limit the values included in the metric calculation. You can add many filters. See which filter types are supported [here](#filters). | + +## Metric types + +| Type | Category | Description | +| --------------------------------- | ------------- | --------------------------------------------------------- | +| [percentile](#percentile) | Aggregate | Generates a percentile of values within a column | +| [median](#median) | Aggregate | Generates the 50th percentile of values within a column | +| [average](#average) | Aggregate | Generates an average (mean) of values within a column | +| [boolean](#boolean) | Non-aggregate | For fields that will show if something is true or false | +| [count](#count) | Aggregate | Counts the total number of values in the dimension | +| [count_distinct](#count_distinct) | Aggregate | Counts the total unique number of values in the dimension | +| [date](#date) | Non-aggregate | For adding calculations to metrics that return dates. | +| [max](#max) | Aggregate | Generates the maximum value within a numeric column | +| [min](#min) | Aggregate | Generates the minimum value within a numeric column | +| [number](#number) | Non-aggregate | For adding calculations to metrics that return numbers. | +| [string](#string) | Non-aggregate | For metrics that contain letters or special characters | +| [sum](#sum) | Aggregate | Generates a sum of values within a column | + +### percentile + +Takes the percentile of the values in the given field. Like SQL's `PERCENTILE_CONT` function. + +The `percentile` metric can be used on any numeric dimension or, [for custom SQL](#using-custom-sql-in-aggregate-metrics), any valid SQL expression that gives a numeric table column. + +For example, this creates a metric `median_price` by taking the 50% percentile of the `item_price` dimension: + +```yaml +columns: + - name: item_price + meta: + metrics: + median_price: + type: percentile + percentile: 50 +``` + +### median + +Takes the 50th percentile of the values in the given field. Like SQL's `PERCENTILE_CONT(0.5)` function. + +The `median` metric can be used on any numeric dimension or, [for custom SQL](#using-custom-SQL-in-aggregate-metrics), any valid SQL expression that gives a numeric table column. + +For example, this creates a metric `median_price` by taking the 50% percentile of the `item_price` dimension: + +```yaml +columns: + - name: item_price + meta: + metrics: + median_price: + type: median +``` + +### average + +Takes the average (mean) of the values in the given field. Like SQL's `AVG` function. + +The `average` metric can be used on any numeric dimension or, [for custom SQL](#using-custom-SQL-in-aggregate-metrics), any valid SQL expression that gives a numeric table column. + +For example, this creates a metric `avg_price` by taking the average of the `item_price` dimension: + +```yaml +columns: + - name: item_price + meta: + metrics: + avg_price: + type: average +``` + +### boolean + +Tells you whether something is True or False. + +The `boolean` metric can be used on any valid SQL expression that gives you a `TRUE` or `FALSE` value. It can only be used on aggregations, which means either aggregate metrics _or_ [custom SQL that references other metrics](#using-custom-sql-in-non-aggregate-metrics). You cannot build a `boolean` metric by referencing other unaggregated dimensions from your model. + +`boolean` metrics don't do any aggregations; they just reference other aggregations. + +For example, the `avg_price` metric below is an average of all of the `item_price` values in our product table. A second metric called `is_avg_price_above_20` is a `boolean` type metric. The `is_avg_price_above_20` metric has a custom SQL expression that tells us whether the `avg_price` value is greater than 20. + +```yaml +columns: + - name: item_price + meta: + metrics: + avg_price: + type: average + is_avg_price_above_20: + type: boolean + sql: 'IF(${avg_price} > 20, TRUE, FALSE)' +``` + +### count + +Does a table count, like SQL’s `COUNT` function. + +The `count` metric can be used on any dimension or, [for custom SQL](#using-custom-SQL-in-aggregate-metrics), any valid SQL expression that gives a set of values. + +For example, this creates a metric `number_of_users` by counting the number of `user_id` values in the table: + +```yaml +columns: + - name: user_id + meta: + metrics: + number_of_users: + type: count +``` + +### count_distinct + +Counts the number of distinct values in a given field. It's like SQL’s `COUNT DISTINCT` function. + +The `count_distinct` metric can be used on any dimension or, [for custom SQL](#using-custom-SQL-in-aggregate-metrics), any valid SQL expression that gives a set of values. + +For example, this creates a metric `number_of_unique_users` by counting the number of unique `user_id` values in the table: + +```yaml +columns: + - name: user_id + meta: + metrics: + number_of_unique_users: + type: count_distinct +``` + +### date + +Gives you a date value from an expression. + +The `date` metric can be used on any valid SQL expression that gives you a date value. It can only be used on aggregations, which means either aggregate metrics _or_ [custom SQL that references other metrics](#using-custom-sql-in-non-aggregate-metrics). You cannot build a `date` metric by referencing other unaggregated dimensions from your model. + +**Creating a max or min date metric with `type: date`** + +If you want to create a metric of a maximum or minimum date, you can't use `type: max` or of `type: min` metrics because these are only compatible with numeric type fields. Instead, you can calculate a maximum or minimum date by defining a metric of `type: date` and using some custom sql, like this: + +```yaml +- name: created_at_date + meta: + dimension: + type: date + metrics: + max_created_at_date: + type: date + sql: MAX(${TABLE}.created_at_date) +``` + +### max + +Max gives you the largest value in a given numeric field. It's like SQL’s `MAX` function. + +The `max` metric can be used on any numeric dimension or, [for custom SQL](#using-custom-SQL-in-aggregate-metrics), any valid SQL expression that gives a numeric value. + +Because `type: max` metrics only work with numerical fields, you can't use them to find a maximum date. Instead, you can use the `MAX()` function in the `sql` parameter of a metric of `type: date` to get a maximum date (you can see an [example of this in the `date` section](#date). + +For example, this creates a metric `max_delivery_cost` by looking at the `delivery_cost` dimension and taking the largest value it finds: + +```yaml +columns: + - name: delivery_cost + meta: + metrics: + max_delivery_cost: + type: max +``` + +### min + +Min gives you the smallest value in a given numeric field. It's like SQL’s `MIN` function. + +The `min` metric can be used on any numeric dimension or, [for custom SQL](#using-custom-SQL-in-aggregate-metrics), any valid SQL expression that gives a numeric value. + +Because `type: min` metrics only work with numerical fields, you can't use them to find a minimum date. Instead, you can use the `MIN()` function in the `sql` parameter of a metric of `type: date` to get a minimum date (you can see an [example of this in the `date` section](#date). + +For example, this creates a metric `min_delivery_cost` by looking at the `delivery_cost` dimension and taking the smallest value it finds: + +```yaml +columns: + - name: delivery_cost + meta: + metrics: + min_delivery_cost: + type: min +``` + +### number + +Used with numbers or integers. A `number` metric doesn't perform any aggregation but can be used to perform simple transformations on other metrics. + +The `number` metric can be used on any valid SQL expression that gives you a numeric or integer value. It can only be used on aggregations, which means either aggregate metrics _or_ [custom SQL that references other metrics](#using-custom-sql-in-non-aggregate-metrics). You cannot build a `number` metric by referencing other unaggregated dimensions from your model. + +For example, this creates a metric called `total_gross_profit_margin_percentage` based on the `total_sale_price` and `total_gross_profit_margin` aggregate metrics: + +```yaml +columns: + - name: sale_price + meta: + metrics: + total_sale_price: + type: sum + - name: gross_profit_margin + meta: + metrics: + total_gross_profit_margin: + type: sum + total_gross_profit_margin_percentage: + type: number + sql: '(${total_gross_profit_margin}/ NULLIF(${total_sale_price},0))' +``` + +The example above also uses the NULLIF() SQL function to avoid division-by-zero errors. + +### sum + +Adds up the values in a given field. Like SQL’s `SUM` function. + +The `sum` metric can be used on any numeric dimension or, [for custom SQL](#using-custom-SQL-in-aggregate-metrics), any valid SQL expression that gives a numeric table column. + +For example, this creates a metric `total_revenue` by adding up the values in the `revenue` dimension: + +```yaml +columns: + - name: revenue + meta: + metrics: + total_revenue: + type: sum +``` + +### string + +Used with fields that include letters or special characters. + +The `string` metric can be used on any valid SQL expression that gives you a string value. It can only be used on aggregations, which means either aggregate metrics _or_ [custom SQL that references other metrics](#using-custom-sql-in-non-aggregate-metrics). You cannot build a `string` metric by referencing other unaggregated dimensions from your model. + +`string` metrics are rarely used because most SQL aggregate functions don't return strings. One common exception is MySQL’s `GROUP_CONCAT` function. + +For example, this creates a metric `product_name_group` by combining the unique values of a dimension called `product_name`: + +```yaml +columns: + - name: product_name + meta: + metrics: + product_name_group: + type: string + sql: 'GROUP_CONCAT(${TABLE}.product_name)' +``` + +## Adding your own metric descriptions + +We add default descriptions to all of the metrics you include in your model. But, you can override these using the description parameter when you define your metric. + +```yaml +metrics: + num_user_ids: + type: count + description: 'Total number of user IDs. NOTE: this is NOT counting unique user IDs' +``` + +## Using custom SQL in aggregate metrics + +You can include custom SQL in your metric definition to build more advanced metrics using the sql parameter. +Inside the sql parameter, you can reference any other dimension from the given model and any joined models. You **can’t reference other metrics.** + +You can reference dimensions from the same model like this: `sql: "${dimension_in_this_model}"` +Or from joined models like this: `sql: "${other_model.dimension_in_other_model}"` + +```yaml +metrics: + num_unique_7d_web_active_user_ids: + type: count_distinct # metric type + sql: 'IF(${is_7d_web_active}, ${user_id}, NULL)' + num_unique_paid_user_ids: + type: count_distinct + sql: 'IF(${subscriptions.is_active}, ${user_id}, NULL)' +``` + +## Using custom SQL in non-aggregate metrics + +In non-aggregate metrics, you can reference any other metric from the given model and any joined models. You **can’t reference other dimensions.** + +You can reference metrics from the same model like this: `sql: "${metric_in_this_model}"` +Or from joined models like this: `sql: "${other_model.metric_in_other_model}"` + +```yaml +metrics: + num_unique_users: + type: count_distinct + is_num_unique_users_above_100: + type: boolean + sql: 'IF(${num_unique_users} > 100, TRUE, FALSE)' + percentage_user_growth_daily: + type: number + sql: '(${num_unique_users} - ${growth_model.num_unique_users_lag_1d}) / NULLIF(${growth_model.num_unique_users_lag_1d}, 0)' +``` + +## Show underlying values + +By default, we show all of the dimensions from the Table when you click `View underlying data`. If you have fields from a joined table included in your results table, then we'll also show you all of the fields from the joined Table. + + + +You can limit which dimensions are shown for a field when a user clicks `View underlying data` by adding the list of dimensions to your `.yml` files: + +```yaml +version: 2 + +models: + - name: sales_stats + meta: + joins: + - join: web_sessions + sql_on: ${web_sessions.date} = ${sales_stats.date} + columns: + - name: user_id + description: 'Unique ID for users.' + meta: + dimension: + type: string + metrics: + count_users: + type: count_distinct + show_underlying_values: + - revenue_gbp_total_est + - actual_date + - web_sessions.session_id # field from joined table +``` + +The list of fields must be made of dimension names (no metrics) from the base table or from any joined tables. To reference a field from a joined table, you just need to prefix the dimension name with the joined table name, like this: `my_joined_table_name.my_dimension`. + +The order that the fields are listed in `show_underlying_values` is the order that they'll appear in on the `view underlying data` table. + +## Compact values + +You can compact values in your YAML. For example, if I wanted all of my revenue values to be shown in thousands (e.g. `1,500` appears as `1.50K`), then I would write something like this in my .yml: + +```yaml + version: 2 + models: + - name: sales + columns: + - name: revenue + meta: + dimension: + compact: thousands # You can also use 'K' +``` + +| Value | Alias | Example output | +| --------- | ------------------ | -------------- | +| thousands | "K" and "thousand" | 1K | +| millions | "M" and "million" | 1M | +| billions | "B" and "billion" | 1B | +| trillions | "T" and "trillion" | 1T | + +## Groups + +You can group your dimensions and metrics in the sidebar using the `groups` parameter. + +To do this, you need to set up `group_details` in the model's configuration. Then, you can use these groups to organize metrics and dimensions. You can create nested groups up to 2 levels. + +```yaml +version: 2 +models: + - name: baskets + meta: + group_details: + product_details: + label: Product Details + description: 'Fields that have information about the products in the basket.' + item_details: + label: Item Details + description: 'Fields that have information about the items in the basket.' + + columns: + - name: basket_item_id + description: 'ID for the product item within the basket.' + meta: + dimension: + groups: ['product_details', 'item_details'] # this would add the dimension to a nested group: `product details` --> `item details` + metrics: + count_total_basket_items: + type: count_distinct + groups: ['product_details', 'item_details'] # this would add the metric to a nested group: `product details` --> `item details` + - name: product_name + description: 'Full name of the product.' + meta: + dimension: + label: 'Product name' + groups: ['product_details'] # this would add the dimension under the group label: `product_details` + metrics: + count_total_product_types: + type: count_distinct + groups: ['product_details'] # this would add the metric under the group label: `product_details` +``` + +## Filters + +Filters are applied to metrics any time that metric is used in Lightdash. Filters can only be used with [aggregate metric types](#metric-categories). + +For example, we could add a filter to our users count to make sure it didn't include user IDs with closed accounts, like this: + +```yaml +version: 2 + +models: + - name: sales_stats + columns: + - name: user_id + description: 'Unique ID for users.' + meta: + dimension: + type: string + metrics: + count_users: + type: count_distinct + filters: + - is_closed_account: false +``` + +These filters do not appear in the `Filters` tab in the Explore view, instead, they are applied automatically in the SQL query that fetches your results. That means filters added using the `filter` parameter can't be removed in the UI and won't be visible to users unless they look at the SQL query. + +:::info + +To use special characters such as `%!_>` in your filter value you can either put the value in quotes, or escape special characters with a backslash `\`. For example, +if you wanted to filter for subscription status of `is_subscribed` you can write the metric in one of these ways: + +```yaml +filters: + - subscription_status: 'is_subscribed' +``` + +```yaml +filters: + - subscription_status: is\_subscribed +``` + +::: + +### Available filter types + +| Type | Example (in English) | Example (as code) | +| ----------------------------- | ---------------------------------------------- | ----------------------------- | +| is | User name is equal to katie | `user_name: "katie"` | +| is not | User name is not equal to katie | `user_name: "!katie"` | +| contains | User name contains katie | `user_name: "%katie%"` | +| does not contain | User name does not contain katie | `user_name: "!%katie%"` | +| starts with | User name starts with katie | `user_name: "katie%"` | +| ends with | User name ends with katie | `user_name: "%katie"` | +| is greater than (number) | Number of orders is greater than 4 | `num_orders: "> 4"` | +| in the past (date) (interval) | Date is before x (days / months / years) | `date: "inThePast 14 months"` | +| in the next (date) (interval) | Date is after x (days / months / years) | `date: "inTheNext 14 days"` | +| is greater than or equal to | Number of orders is greater than or equal to 4 | `num_orders: ">= 4"` | +| is less than | Number of orders is less than 4 | `num_orders: "< 4"` | +| is less than or equal to | Number of orders is less than or equal to 4 | `num_orders: "<= 4"` | +| is null | Status is `NULL` | `status: "null"` | +| is not null | Status is not `NULL` | `status: "!null"` | +| is [boolean] | Is complete is true | `is_complete: "true"` | +| is not [boolean] | Is complete is false or null | `is_complete: "!true"` | + +:::info + +To filter a field by a set of given values you can supply them as an array for that field. For example, +if you wanted to filter for orders with order status `completed` or `shipped` you should write the metric like: + +```yaml +columns: + - name: order_id + meta: + metrics: + completed_or_shipped_order_count: + type: count_distinct + filters: + - order_status: + - completed + - shipped +``` + +::: + +### If you have many filters in your list, they will be joined using `AND`. + +For example: + +```yaml +filters: + - is_closed_account: false + - is_7d_active: true +``` + +Would give you logic like `is_closed_account = TRUE AND is_7d_active = FALSE`. + +### You can filter using fields from either the base model, or any joined models. + +To filter using a field from a joined model, just use the syntax `model_name.field`, like this: + +```yaml +version: 2 + +models: + - name: sales_stats + meta: + joins: + - join: web_sessions + sql_on: ${web_sessions.date} = ${sales_stats.date} + columns: + - name: user_id + description: 'Unique ID for users.' + meta: + dimension: + type: string + metrics: + count_users: + type: count_distinct + filters: + - is_closed_account: false + - web_sessions.is_bot_user: false +``` + +### Metric filters cannot be used with non-aggregate metrics + +You can't use filters with non-aggregate metric types. Instead, if your non-aggregate metrics are referencing aggregate metric types, you need to apply metric filters to the aggregate metrics. + +Here's an example: imagine you wanted to calculate the average cost per item that had the status `shipped`. You would need to do something like this in your .yml: + +```yaml +version: 2 + +models: + - name: orders + meta: + metrics: + average_cost_per_item_shipped: + type: number + sql: ${total_cost_of_shipped} / ${count_unique_items_shipped} + columns: + - name: item_id + description: 'Unique ID for items ordered.' + meta: + dimension: + type: string + metrics: + count_unique_items: + type: count_distinct + count_unique_items_shipped: + type: count_distinct + filters: + - status: 'shipped' + - name: item_cost + description: 'Cost for each item ordered.' + meta: + dimension: + type: number + metrics: + total_cost: + type: sum + total_cost_of_shipped: + type: sum + filters: + - status: 'shipped' +``` + +## Format + +You can use the `format` parameter to have your metrics show in a particular format in Lightdash. + +```yaml +version: 2 + +models: + - name: sales_stats + columns: + - name: revenue + description: 'Total estimated revenue in GBP based on forecasting done by the finance team.' + meta: + metrics: + total_revenue: + label: 'Total revenue GBP' + type: SUM + format: 'gbp' +``` + +These are the options: + +| Option | Description | Raw value | Displayed value | +| ------- | ----------------------------------------------------------------------------------- | ---------- | --------------- | +| km | Adds the suffix `km` to your value | 10 | 10 km | +| mi | Adds the suffix `mile` to your value | 10 | 10 mi | +| usd | Adds the `$` symbol to your number value | 10 | $10.00 | +| gbp | Adds the `Β£` symbol to your number value | 10 | Β£10.00 | +| eur | Adds the `€` symbol to your number value | 10 | €10.00 | +| percent | Adds the `%` symbol and multiplies your value by 100 | 0.1 | %10 | +| id | Removes commas and spaces from number or string types so that they appear like IDs. | 12,389,572 | 12389572 | diff --git a/docs/references/personal_tokens.mdx b/docs/references/personal_tokens.mdx new file mode 100644 index 0000000..f8cd28f --- /dev/null +++ b/docs/references/personal_tokens.mdx @@ -0,0 +1,66 @@ +import CreatePAT from './assets/create-pat.jpg'; + +# Personal access tokens + +You can create a personal access token (PAT) to authenticate in the [CLI](../get-started/setup-lightdash/get-project-lightdash-ready.mdx) or +with the API. + +## Creating a personal access token + +To create a personal access token, head to the project settings, then to `personal access tokens`, then click `generate token`. + + + +Everybody in your organization can create a personal access token (PAT). To provide additional security, we highly recommend adding an expiration to your personal access tokens. + +### How to authenticate + +Note that not all endpoints in the API will be accessible with PAT authentication. + +The PAT authentication is done via the HTTP Authorization request header. + +``` +Authorization: ApiKey +``` + +Examples: + +``` +curl --location --request GET 'https://my.lightdash.com/api/v1/org/projects' \ +--header 'Authorization: ApiKey eeaa81d8bcd89a770bd8a581cabd052b' +``` + +``` +GET /api/v1/org/projects HTTP/1.1 +Host: my.lightdash.com +Authorization: ApiKey eeaa81d8bcd89a770bd8a581cabd052b +``` + +## Rotating a personal access token + +To maintain security, you may want to rotate your personal access tokens periodically. Follow these steps to rotate an existing token. + +Requirements for Rotation + +- **Token UUID**: To rotate a token, you’ll need its unique identifier (UUID), which you can find on the tokens page in your account settings. +- **Expiration Date**: You must specify a new expiration date when rotating a token. Tokens without an expiration cannot be rotated. +- **Time Interval**: Tokens can only be rotated once per hour. + +Use the following curl command to rotate a personal access token. Replace `` with the UUID of the token you wish to rotate, +and `` with your current token. + +``` +curl --location --request PATCH 'https://my.lightdash.com/api/v1/user/me/personal-access-tokens//rotate' \ +--header 'Content-Type: application/json' \ +--header 'Authorization: ApiKey ' \ +--data '{ + "expiresAt": "2025-12-13T16:10:04.976Z" +}' +``` + +This process will invalidate the previous token and return a new token with the specified expiration date. diff --git a/docs/references/preview-projects.mdx b/docs/references/preview-projects.mdx new file mode 100644 index 0000000..60a3ac4 --- /dev/null +++ b/docs/references/preview-projects.mdx @@ -0,0 +1,178 @@ +import CreatePreview from './assets/create-preview.jpg'; +import DeletePreview from './assets/delete-preview.jpg'; + +# Preview Projects + +**Preview projects** are temporary Lightdash projects where you can safely experiment with your metrics, dimensions and charts without affecting your production project. Charts and dashboards are copied from your production project into your preview project so you can test your changes and make updates to existing content. + +Preview projects are commonly used to: + +- test changes in models, metrics and dimensions. +- make changes to important content in production without any downtime by [promoting the content](/guides/how-to-promote-content) you've changed in your preview project when it's ready. + +## Creating a preview project + +:::info + +Only users who have developer permissions or above in a project can create preview projects. + +::: + +### Lighdash CLI Tool (Local) + +You can use the [Lightdash CLI tool](/guides/cli/how-to-install-the-lightdash-cli) to generate preview projects in Lightdash from your command line. + +```shell +# This will create a preview and will wait until you press a key to delete the preview project +lightdash preview +``` + +or + +```shell +# This will create a preview and exit, you will have to run lightdash stop-preview to delete it +lightdash start-preview +``` + +You can see more information about the [`lightdash preview` CLI command here](/references/lightdash-cli#lightdash-preview). + +### Lightdash App + +You can create a preview project in the Lightdash web app by clicking on the projects list, then clicking `+ Create Preview`. + + + +Preview projects created in the app are useful when you aren't developing your dbt project, but want to make changes to important content in production without any downtime. You can create/update charts and dashboards in your preview project, then [promote the content](/guides/how-to-promote-content) when it's ready. + +### Pull Requests (GitHub Actions) + +You can automatically create preview projects in GitHub each time you open a pull request. This allows you to easily test out changes you've made to your dbt project, in Lightdash. + +Learn more about setting up a Lightdash preview project for pull requests using GitHub Actions [here](/guides/cli/how-to-use-lightdash-preview#set-up-developer-previews-on-your-pull-requests). + +## Permissions + +### Permissions are copied from the parent project + +All permissions from the parent project are carried over to the preview project. + +For example: + +- Priyanka is a **project interactive viewer** and Irakli is a **developer** in a project called `Marketing Insights`. +- Irakli creates a preview project of `Marketing Insights` called `Marketing Insights Preview`. +- He creates a chart in `Marketing Insights Preview` and shares it with Priyanka. +- Priyanka can open the chart because she was an interactive viewer in `Marketing Insights`, so her permissions were copied over to `Marketing Insights Preview`. + +:::info + +Only users who are developers or admins can see preview projects in the project list. However, users with access to a preview project can open links shared with them from the preview project. + +::: + +### Only content a user has access to will be copied to the preview project + +For the user creating a project, only content they have access to will be copied over to the preview project. + +For example: + +- Irakli is a developer in the `Marketing Insights` project +- Inside the project, there is a space called `Finance private space`. +- Irakli doesn't have access to `Finance private space` +- Irakli creates a preview project of `Marketing Insights` called `Preview Marketing Insights` +- The `Finance private space` will not be copied over to his preview project (because he doesn't have access to it). + +## Project connection settings + +The project connection settings cannot be changed in a preview project. + +### Lightdash CLI Tool (Local) + +For preview projects created from the CLI, all project connection settings come from your **local** `profiles.yml` file. + +That means that we will use the same default connection settings that you're using locally for development, unless you specify different options in your CLI commands. + +For example: + +- By default, `lightdash preview` will use the `profiles.yml` file located at `~/.dbt/profiles.yml`. If you want to use a different `profiles.yml` file, you can specify this using the option `lightdash preview --profiles-dir path/to/directory`. +- `lightdash preview` will use whatever default target that is set in your `profiles.yml` file. The database connection settings (schema, project, dataset, etc.) from this target will be used as the database connection settings for your preview project. You can override the target used to create your preview project using the flag `lightdash preview --target my-target-name` + +### Lightdash App + +For preview projects created in the Lightdash app, all project connection settings are copied directly from the project the preview is built from. + +For example: + +- I have a project called `Lightdash Analytics` and I create a preview of that project called `Preview Lightdash Analytics` +- `Preview Lightdash Analytics` will have the same project connection settings (warehouse connection, dbt project connection, etc.) as `Lightdash Analytics`. + +The project connection settings cannot be changed in a preview project. + +### Pull Requests (GitHub Actions) + +For preview projects created from GitHub actions, the project connection settings come from the `profiles.yml` file that you've specified to use in your GitHub action. + +If you haven't changed anything from our default [GitHub action script](https://github.com/lightdash/cli-actions/blob/main/start-preview.yml), then the connection settings used for your preview project should be whatever you've specified in your [`DBT_PROFILES` secret](/guides/cli/how-to-use-lightdash-preview#dbt_profiles). + +You have three options for setting up project connections in your GitHub Actions: + +1. Set up a single project connection that's used in every pull request. E.g. always use the `prod` target. You can [follow the instructions here](/guides/cli/how-to-use-lightdash-preview#dbt_profiles) for your data warehouse +2. If you're using dbt Cloud, you can [use the dbt Cloud schema](/guides/cli/how-to-use-lightdash-preview#how-to-use-the-dbt-cloud-schema-in-your-preview-project) to manage the connection used in the pull request. +3. [Create a project connection per developer in GitHub](/guides/cli/how-to-use-lightdash-preview#how-to-use-the-developer-credentials-in-your-preview-project) (similar to `dev` profiles in your dbt project) so the connection changes depending on who opened the pull request. This is useful if you use different development schemas for team members developing in dbt. + +## Content in preview projects + +When you create a preview project, the content is copied from the production project. The content in a preview project does not get re-synced from the project it's been created from. + +For example: + +- I have a project called `Lightdash Analytics` with a chart called `Revenue by source` +- I create a preview of that project called `Preview Lightdash Analytics` +- The `Preview Lightdash Analytics` project has the same chart called `Revenue by source` +- I change the `Revenue by source` chart in `Lightdash Analytics` (i.e. in the production project) +- The `Revenue by source` chart in `Preview Lightdash Analytics` is not updated. It is the same chart as when the preview project was first created. + +### Promoting content from preview projects + +Promoting content allows you to sync charts and dashboards that you've created or updated in your preview project to your production project. This means you can use preview projects to make changes to important content in production without any downtime. + +Learn more about promoting content from preview projects [here](/guides/how-to-promote-content). + +## Deleting a Preview Project + +Preview projects created using any method can be deleted in the [Lightdash App](/references/preview-projects#lightdash-app-2). + +There are also other more automated ways of deleting preview projects created in the Lightdash CLI and in GitHub Actions explained below. + +### Lightdash CLI Tool (Local) + +If you use the command `lightdash preview` to generate a preview project from your CLI, then hitting `Enter` from your CLI should delete the preview project. + +If you use the command `lightdash start-preview` to generate a preview project from your CLI, then running the command `lightdash stop-preview` should delete your preview project. + +For more details on the `lightdash preview` CLI command, check out the docs [here](/references/lightdash-cli#lightdash-preview). + +### Lightdash App + +You can delete preview projects you've created in the app by navigating to the `project settings`, then clicking on `all projects` in the sidebar under the `organization settings` header. + +You'll see a list of all of the projects in your organization. You can switch to the `preview projects` tab to filter to a list of preview projects in your organization. + + + +If you have **developer** access, you can only delete preview projects that you created. + +If you are an **organization admin**, you can delete any preview project in the organization. + +### Pull Requests (GitHub Actions) + +If you've added both the [`start-preview` and `stop-preview` workflows](/guides/cli/how-to-use-lightdash-preview#step-2-create-start-previewyml-and-close-previewyml-workflows-in-github) in GitHub, then the preview environments you've created in your pull requests should automatically be deleted when the pull request gets merged. diff --git a/docs/references/roles.mdx b/docs/references/roles.mdx new file mode 100644 index 0000000..83713f0 --- /dev/null +++ b/docs/references/roles.mdx @@ -0,0 +1,98 @@ +import AllowedEmailDomains from './../snippets/allowed-email-domains.mdx'; +import AddUsersSpace from './assets/add-users-space.png'; + +# Roles and permissions + +## Roles in your Lightdash instance + +- Everybody in your organization will join as an `Organization Member` unless specified. For example, if I invite someone to a project as an editor, they will become an organization member with `editor` access to that project. If I invite someone to the **_organization_** as a `viewer`, then they will be an `organization viewer` (instead of an `organization member`). +- All organization members can create their own projects and will be the Project Admin for that project. +- Admins have access to all content (even content they haven't been explicitly invited to). + +### Project Roles + +Project Admins can invite users to their project and assign users or [groups](/references/groups.mdx) to roles in that project. Note that projects may also be +accessible by users with organization roles. + +| Action | Project Admin | Project Developer | Project Editor | Project Interactive Viewer | Project Viewer | +| :----------------------------------------------------- | :-----------: | :---------------: | :------------: | :------------------------: | :------------: | +| View charts and dashboards | βœ… | βœ… | βœ… | βœ… | βœ… | +| Export results visible in a chart to CSV | βœ… | βœ… | βœ… | βœ… | βœ… | +| Export results visible in a chart to Google Sheets | βœ… | βœ… | βœ… | βœ… | βœ… | +| Export results to CSV and override the limit | βœ… | βœ… | βœ… | βœ… | ❌ | +| Export results to Google Sheets and override the limit | βœ… | βœ… | βœ… | βœ… | ❌ | +| View comments | βœ… | βœ… | βœ… | βœ… | βœ… | +| Create comments | βœ… | βœ… | βœ… | βœ… | ❌ | +| Use the explorer | βœ… | βœ… | βœ… | βœ… | ❌ | +| View underlying data | βœ… | βœ… | βœ… | βœ… | ❌ | +| Create/edit scheduled deliveries | βœ… | βœ… | βœ… | βœ… | ❌ | +| Create/edit Syncs | βœ… | βœ… | βœ… | ❌ | ❌ | +| Create/edit charts and dashboards | βœ… | βœ… | βœ… | ❌ | ❌ | +| Use the SQL runner | βœ… | βœ… | ❌ | ❌ | ❌ | +| Create and explore custom SQL dimensions | βœ… | βœ… | ❌ | ❌ | ❌ | +| Create virtual views | βœ… | βœ… | ❌ | ❌ | ❌ | +| Manage project access and permissions | βœ… | ❌ | ❌ | ❌ | ❌ | +| Delete project | βœ… | ❌ | ❌ | ❌ | ❌ | +| Create a preview from a project | βœ… | βœ… | ❌ | ❌ | ❌ | + +### Organization Roles + +Organization Admins can assign roles to organization members, which gives access to all projects in the organization. + +| Action | Organization Admin | Organization Developer | Organization Editor | Organization Interactive Viewer | Organization Viewer | Organization Member | +| :----------------------------------------- | :----------------: | :--------------------: | :-----------------: | :-----------------------------: | :-----------------: | :-----------------: | +| Create Personal access tokens | βœ… | βœ… | βœ… | βœ… | βœ… | βœ… | +| View **all** projects | βœ… | βœ… | βœ… | βœ… | βœ… | ❌ | +| Create new projects | βœ… | ❌ | ❌ | ❌ | ❌ | ❌ | +| Create a preview from a project | βœ… | βœ… | ❌ | ❌ | ❌ | ❌ | +| Edit **all** projects | βœ… | βœ… | βœ… | ❌ | ❌ | ❌ | +| Admin for **all** projects | βœ… | ❌ | ❌ | ❌ | ❌ | ❌ | +| Invite users to organization | βœ… | ❌ | ❌ | ❌ | ❌ | ❌ | +| Manage organization access and permissions | βœ… | ❌ | ❌ | ❌ | ❌ | ❌ | + +### Space Roles + +There are three space roles: `Full Access`, `Can Edit`, `Can View` + +| Action | Full Access | Can Edit | Can View | +| :------------------- | :---------: | :------: | :------: | +| View space content | βœ… | βœ… | βœ… | +| Manage space content | βœ… | βœ… | ❌ | +| Manage space access | βœ… | ❌ | ❌ | +| Manage space details | βœ… | ❌ | ❌ | + +Users with `Full Access` to a space can restrict and increase a user’s inherited project permissions in a space (e.g. you can make project editors into `can view` in a space). Space permissions determine which users can edit space contents (charts and dashboards), view the contents in a space, and change a space's settings: + +- A user needs to have at least the `Can view` access level to a space to see that the space exists and to see the charts and dashboards inside it. +- A user needs to have the `Can edit` access level to a space to edit the content in the space (add/delete/rename charts and dashboards). +- A user needs to have the `Full access` access level to a space to manage access to the space and to edit the space details (name, description, etc.). + +Space permissions don't otherwise control what users can do, or which data they can use to build their own content. + +This means: + +- a project viewer who has `Can edit` space permissions cannot get access to build or edit charts because Viewers don't have access to the Explore view +- an interactive viewer who is given `Can edit` space permissions can save content in that space but not in any other space (unless given `edit` access to another space) +- an editor who is given `Can view` space permissions cannot edit the content in that space, but they can create/edit content in other parts of the project (unless they're given `Can view` access). + +#### Adjusting space permissions + +You can adjust an individual user's permissions, or the permissions of a group in a Space. + + + +If a user is part of multiple groups that have been given access to the space, the user will inherit the highest level of access from their groups. + +E.g. Priyanka is a `Project Interactive Viewer`. She is a member of the `Finance` group and the `Design` group. The `Finance` group is given `Can View` access to the space. The `Design` group is given `Can Edit` access to the space. Priyanka has `Can Edit` access to the space (inherited from the `Design` group). + +You can override a user's group access by adjusting their specific user access. + +E.g. Priyanka is a `Project Interactive Viewer`. She is a member of the `Design` group. The `Design` group is given `Can Edit` access to the space. I set Priyanka's user access in the space to be `Can View`. Priyanka has `Can View` access to the space (her assigned user access to the space overrides her group access). + +## Allowed email domains to join organization automatically + + diff --git a/docs/references/scim-integration.mdx b/docs/references/scim-integration.mdx new file mode 100644 index 0000000..ffbb9d6 --- /dev/null +++ b/docs/references/scim-integration.mdx @@ -0,0 +1,308 @@ +import ScimAzureConfigureProvisioning from './assets/scim/scim-azure-configure-provisioning.png'; +import ScimAzureCreateApp from './assets/scim/scim-azure-create-app.png'; +import ScimAzureEditApp from './assets/scim/scim-azure-edit-app.png'; +import ScimLightdashGenerateToken from './assets/scim/scim-lightdash-generate-token.png'; +import ScimLightdashGeneratedToken from './assets/scim/scim-lightdash-generated-token.png'; +import ScimLightdashTokensList from './assets/scim/scim-lightdash-tokens-list.png'; +import ScimLightdashUserSettings from './assets/scim/scim-lightdash-user-settings.png'; +import ScimLightdashViewURL from './assets/scim/scim-lightdash-view-url.png'; +import ScimOktaAssignUsers from './assets/scim/scim-okta-assign-users.png'; +import ScimOktaConfigureApiIntegration from './assets/scim/scim-okta-configure-api-integration.png'; +import ScimOktaCreateIntegration from './assets/scim/scim-okta-create-integration.png'; +import ScimOktaNameApp from './assets/scim/scim-okta-name-app.png'; +import ScimOktaProvisioning from './assets/scim/scim-okta-provisioning.png'; +import { CloudEnterprisePill } from '../../src/components/PlanPills.jsx'; + +# SCIM Integration + + + +:::info + +SCIM Integration is only available on Lightdash Enterprise plans. For more information on our plans, visit our [pricing page](https://www.lightdash.com/pricing). + +::: + +## Summary + +This document describes the steps required to integrate Azure or Okta SCIM protocol into your Enterprise instance. This provides a connection for Azure or Okta to manage users and groups within your organization. + +## SCIM Setup within Lightdash + +1. Sign into your Lightdash instance, click your initials at the top-right, and select **User Settings**. + + + +2. In the sidebar, select **SCIM Access Tokens**. + + + +3. Click **Generate new token**. + + - Give it a name and an optional expiration date. + + + +4. Once generated, copy and save it in a safe place, as it cannot be viewed again once the modal is closed. + + + +5. Note: Now you will also be able to see your SCIM URL at the top of the page. You will need this when connecting an external SCIM service, such as Okta or Azure. + + + +## Okta Integration + +:::note +You'll need administrative permissions to configure SCIM for your organization +::: + +### Step 1 - Add or Create Application in Okta + +:::note +You can skip this step if you have Azure SSO already configured. An application will already be present. +::: + +1. Visit your Okta account and sign in. +2. In the sidebar, click **Applications > Browse App Catalog**. +3. Search for "SCIM" and select **SCIM 2.0 Test App (Header Auth)**. +4. Click **+ Add Integration**. + + + +5. Give it a friendly name and click **Next**. + + + +6. Change **Application username format** to email. +7. Save your configuration by clicking **Done**. + +### Step 2 - Connect SCIM to Lightdash from Okta + +1. In the sidebar, click **Applications > Applications**. +2. Select your application and go to the **Provisioning** tab. + + + +3. Select **Configure API Integration**. + + + +4. Check the **Enable API integration** checkbox. +5. Fill in the following fields: + - **Base URL**: `https://YOUR_APP_URL/api/v1/scim/v2/` + - **API Token**: `Bearer YOUR_SCIM_TOKEN` (See SCIM Setup within Lightdash above for generating a token) +6. Save your configuration. +7. More options should be available. In **Provisioning > To App**, select **Edit**. + - Enable **Create Users**. + - Enable **Update User Attributes**. + - Enable **Deactivate Users**. + - Click **Save**. +8. Test the integration by clicking **Assignments**. Select **Assign > Assign to people**. Choose a user and click **Assign > Save and Go Back**. This user should be created in your Lightdash instance. + + + +:::info + +Lightdash will sync the active status from Okta to Lightdash. For example, if a user is provisioned as inactive or is deactivated in Okta, that user will still exist in Lightdash marked as inactive, meaning they will be unable to use the platform. + +::: + +## Azure Integration + +:::note +You'll need `Hybrid identity administrator` permissions to configure SCIM for your organization +::: + +### Step 1 - Connect SCIM to Lightdash from Azure + +1. Visit [Entra ID](https://entra.microsoft.com/) and sign in. +2. In the sidebar, click **Applications > Enterprise applications**. +3. Select **+ New Registration**. + + + +4. At the top of the page, select **+ Create Your own application**. + + - Add a friendly title. + - Leave the default "Non-gallery" option selected. + - Click **Test Connection** to verify the credentials are correct. + + + +5. Save your configuration by clicking **Create**. + +### Step 2 - Connect SCIM to Lightdash from Azure + +1. Navigate to **Applications > Enterprise applications** and select your application. +2. Select **Users and groups > + Add user/group**. +3. Click **None selected**, which will open a modal. + - Select any users and groups you want to provision and then close the modal with **Select**. +4. Click **Assign** to save. + + + +5. Select **Provision > Start provisioning**. +6. After a few minutes, your users and groups will be synced. + +:::info + +Lightdash will sync the active status from Azure to Lightdash. For example, if a user is provisioned as inactive or is deactivated in Azure, that user will still exist in Lightdash marked as inactive, meaning they will be unable to use the platform. + +::: + +## Rotating a SCIM access token + +To maintain security, you may want to rotate your SCIM access tokens periodically. Follow these steps to rotate an existing token. + +Requirements for Rotation + +- **Token UUID**: To rotate a token, you’ll need its unique identifier (UUID), which you can find on the tokens page in your organization settings. +- **Expiration Date**: You must specify a new expiration date when rotating a token. Tokens without an expiration cannot be rotated. +- **Time Interval**: Tokens can only be rotated once per hour. + +Use the following curl command to rotate a SCIM access token. Replace `` with the UUID of the token you wish to rotate, +and `` with your [personal access token](../references/personal_tokens.mdx). +This process will invalidate the previous token and return a new token with the specified expiration date. + +``` +curl --location --request PATCH 'https://my.lightdash.com/api/v1/scim/organization-access-tokens//rotate' \ +--header 'Content-Type: application/json' \ +--header 'Authorization: ApiKey ' \ +--data '{ + "expiresAt": "2025-12-13T16:10:04.976Z" +}' +``` + +Example response: + +``` +{ + "status": "ok", + "results": { + "uuid": "bf677698-502e-4ed6-aa90-02a17999c379", + "organizationUuid": "172a2270-000f-42be-9c68-c4752c23ae51", + "description": "rotate token", + "createdAt": "2024-11-18T13:50:21.241Z", + "expiresAt": "2025-12-13T16:10:04.976Z", + "lastUsedAt": "2024-11-18T14:24:41.367Z", + "rotatedAt": "2024-11-18T15:15:24.361Z", + "token": "scim_204b5ccaf4d11e656efbf1f68986028a" + } +} +``` + +To get a token metadata, use the following curl command: + +``` +curl --location 'http://localhost:3000/api/v1/scim/organization-access-tokens/' \ +--header 'Authorization: ApiKey ' +``` + +Example response: + +``` +{ + "status": "ok", + "results": { + "uuid": "bf677698-502e-4ed6-aa90-02a17999c379", + "organizationUuid": "172a2270-000f-42be-9c68-c4752c23ae51", + "description": "Okta SCIM token", + "createdAt": "2024-11-18T13:50:21.241Z", + "expiresAt": "2025-12-13T16:10:04.976Z", + "lastUsedAt": "2024-11-18T14:24:41.367Z", + "rotatedAt": "2024-11-18T14:10:51.460Z" + } +} +``` + +To list all tokens, use the following curl command: + +``` +curl --location 'http://localhost:3000/api/v1/scim/organization-access-tokens' \ +--header 'Authorization: ApiKey ' +``` + +Example response: + +``` +{ + "status": "ok", + "results": [ + { + "uuid": "bf677698-502e-4ed6-aa90-02a17999c379", + "organizationUuid": "172a2270-000f-42be-9c68-c4752c23ae51", + "description": "Okta SCIM token", + "createdAt": "2024-11-18T13:50:21.241Z", + "expiresAt": "2025-12-13T16:10:04.976Z", + "lastUsedAt": "2024-11-18T14:24:41.367Z", + "rotatedAt": "2024-11-18T14:10:51.460Z" + } + ] +} +``` diff --git a/docs/references/slack-integration.mdx b/docs/references/slack-integration.mdx new file mode 100644 index 0000000..7b98b0f --- /dev/null +++ b/docs/references/slack-integration.mdx @@ -0,0 +1,113 @@ +import SlackAI from './assets/slack-ai-analyst.png'; +import SlackAlert from './assets/slack-alert.png'; +import SlackSettings from './assets/slack-settings.png'; +import SlackChartUnfurl from './assets/slack-chart-unfurl.png'; +import SlackDashboardUnfurl from './assets/slack-dashboard-unfurl.png'; +import SlackScheduledChart from './assets/slack-scheduled-chart.png'; +import SlackScheduledDashboard from './assets/slack-scheduled-dashboard.png'; + +# Slack integration reference + +Below is everything you need to know about the Lightdash Slack integration. For walk through videos, check out our guides on [adding the Slack integration](guides/adding-slack-integration.mdx) and [using the Slack integration](guides/using-slack-integration.mdx). + +## Required permissions + +The Lightdash Slack app will request permission for these scopes: + +- **`[links:read]` for lightdash.cloud** : Links to lightdash.cloud will be sent to our App so we can make an internal request and fetch information from charts and dashboards so we can later share it in slack. +- **`[links:write]`** : This allows us to unfurl the URL previously mentioned. + +No other content will be shared from your workspace. + +## Settings + +After installing the app you'll see these settings: + + + +### Select a notification channel + +Here you may choose a Slack channel where Lightdash will send alerts when any scheduled deliviries fail in your organization. + +You must add the Lightdash app into that organization for notifications to work properly. + +### Slack bot avatar + +You can customize the avatar for your Lightdash slack app by adding an image URL in the Profile photo URL field. Slack recommends these images be square with a minimum of 512x512 pixels, but no larger than 1024x1024 pixels. + +### AI Bot channel mappings + +Here you can choose which project is used by the Lightdash AI analyst co-pilot for each of your Slack channels. Only one project can be used for each channel. + +## Unfurl Lightdash links + +After installing the Slack app it will automatically unfurl links you share in Slack from your Lightdash project. The Lightdash app must be invited to a channel before it will unfurl links in that channel. + +Chart and dashbaord links unfurl for links copied from the URL field and also "share" links copied by clicking the link icon. + +Here's what an individual chart looks like unfurled: + + + +And an unfurled dashboard: + + + +## Scheduled deliveries + +Once Slack is added to your Lightdash organization you can use it as a destination for scheduled deliveries. You can schedule refreshes for either Charts or Dashboards and push the results into a Slack channel or DM. + +The result will look like this for charts if you choose to attach an image of the chart: + + + +And like this for dashbaords if you chose _not_ to include an image: + + + +## Saved Chart Alerts in Slack + +In addition to scheduled deliveries, you can also set up [alerts on saved charts](guides/how-to-create-alerts.mdx) that only send to slack if certain criteria are met. + + + +## AI analyst co-pilot + +The Slack integration is also used by the AI analyst co-pilot. Once you have access to the AI analyst you'll chat with it by mentioning the Lightdash Slack app. + + diff --git a/docs/references/spaces.mdx b/docs/references/spaces.mdx new file mode 100644 index 0000000..1345176 --- /dev/null +++ b/docs/references/spaces.mdx @@ -0,0 +1,132 @@ +import Spaces from './assets/spaces.png'; +import AddWithinSpace from './assets/add-within-space.png'; +import MoveBetweenSpace from './assets/move-between-space.png'; +import AddModal from './assets/add-modal.png'; +import AccessSpaces from './assets/access-spaces.png'; +import RenameDeleteSpace from './assets/rename-delete-space.png'; +import RestrictedAccessSpace from './assets/restricted-access-space.jpg'; +import PublicAccessSpace from './assets/public-access-space.png'; +import EditSpaceAccess from './assets/edit-space-access.jpg'; + +# Spaces + +Once you've used Lightdash for a while, your team will probably end up with a lot of saved charts and dashboards. Spaces let you organize your saved charts and dashboards. + +They're kind of like folders except you can't put a Space inside of a Space (no nesting πŸ₯). All saved chart and dashboards exist in a Space and can only be in one Space at a time. + + + +To access Spaces, you can either select a Space from the drop-down list in `Browse` or you can click on the Lightdash icon and select your Space from the homepage. + + + +## Moving items between Spaces + +To move a saved chart or dashboard between Spaces, you can click on the three dot menu (`...`) to the right of the item and pick the `Move to Space` action. + + + +You can also add items to a Space from within the Space. Just click on the `Add` button by the saved charts or the dashboards section of the page. If you select an item that's in another Space, it will get moved to the Space you're adding it to. + + + +You select multiple items to add at the same time to your Space. + + + +## Updating and deleting Spaces + +You can rename or delete your Space on the homescreen by clicking on the three-dot menu (`...`) for the Space. + + + +:::warning + +Deleting a Space will delete all of the content in that Space. + +::: + +## Managing access to a Space + +By default, when you create a Space, it is restricted so only you can access it. You can edit a Space to make it Restricted Access or Public Access. + +To edit access to a Space, navigate into the Space, then click the `share` button. From there, you can choose to make a space `Restricted Access` or `Public Access`. + + + +By default, in public spaces, a user's space permissions are inherited from their project permissions. For example, if I'm a project viewer, I will get `Can View` access to a Space. + +There are three space roles: `Full Access`, `Can Edit`, `Can View` + +For more details about actions you can take in a Space based on your role, [check out this table](/references/roles.mdx#space-roles). + +### Restricted Access Spaces + +**Only admins and members that are invited to a Space with Restricted Access have access to it.** + +For example, here I have a Space with Restricted Access. Only admins and the invited members have access to this Space. Katie, Filipe and Marshall have inherited `Full Access` because they are organization admins. Priyanka was invited to the space, so she has `Can View` access to the space. No one else in Lightdash can see or interact with the content in this Space unless they're invited or become an admin. + +Only users with `Full Access` permissions to a Restricted Space can invite other users to that Space. + + + +### Public Spaces + +**Everyone who has access to your project has access to a Public space.** + +For example, here I have a Space with Public access. Everyone who has access to my Project, "Lightdash analytics", will get access to the content in my public space. + + + +**By default, you inherit your space permissions in a public space from your project permissions.** + +So, if someone is an `editor` in my project, they will have `Can Edit` permissions in my Space. If someone is a `viewer` in my project, they will have `Can View` permissions in my Space. For more details about actions you can take in a Space based on your role, [check out this table](/references/roles.mdx#space-roles). + +**Users with Full Access to the space can change a user's space permissions.** + +In Public spaces (just like in restricted spaces), users who have `Full Access` to the space can change other users' space permissions (except admins). Users cannot be removed from Public Spaces. To make a user have `no access` to a space, you must change the space from Public to Restricted. diff --git a/docs/references/sql-runner.mdx b/docs/references/sql-runner.mdx new file mode 100644 index 0000000..ca793a0 --- /dev/null +++ b/docs/references/sql-runner.mdx @@ -0,0 +1,81 @@ +import AccessSQLRunner from './assets/access-sql-runner.jpg'; +import SQLRunnerComponents from './assets/sql-runner-components.jpg'; +import QueryHistory from './assets/query-history.jpg'; +import BuildChartSQLRunner from './assets/build-chart-sql-runner.jpg'; + +# SQL Runner + +The SQL runner is used to build ad-hoc queries or charts using totally custom SQL. + +A query built in the SQL runner can be: + +- used to power a single saved chart +- turned into a virtual view so it becomes a reusable table +- written back to dbt as a model + +Only users with [`developer` or `admin` access](/references/roles) can use the SQL runner. + +## Getting started with the SQL Runner + +The SQL Runner can be accessed from the `New` --> `Query using SQL Runner` option in your navigation bar. + + + +Once you're in the SQL Runner, you'll see four key components: + +1. A list of tables in your data warehouse that Lightdash has access to (based on your data warehouse connection in Lightdash). +2. The schema of a selected table. +3. The SQL query builder. +4. The results from your latest SQL query. + + + +To build a query in the SQL Runner, just write your query in the SQL query builder, then hit `Run query` to see the results. + +You can access your **Query history** from your session by clicking on the `SQL Query history` button beside `Run query`. + + + +Once you've run your query, you can either: + +1. [Build and save a **Chart**](#building-charts-in-the-sql-runner) +2. [Create a **Virtual View** so your query becomes a reusable table in Lightdash](/references/virtual-views) +3. [**Write-back to dbt** so your query is saved as a governed model.](/references/dbt-write-back) +4. Click the link icon in the top-right to share your query draft with a coworker (or save it yourself to return to later). + +## Saved charts in the SQL Runner + +Once you've run your query, you can build a chart by clicking on the `chart` tab in the SQL Runner. + +The charts in the SQL Runner are built from the data that you generated in your query. The chart builder automatically aggregates the data from your query results using the aggregation type that you choose. Depending on the column type, the aggregation options are: + +- count (which is a distinct count and will ignore duplicates) +- any (which will count and include duplicates) +- sum +- average +- max +- min + + + +Once you've configured your chart, you can save it, add it to a space, and add it to a dashboard by hitting `save chart`. diff --git a/docs/references/sql-variables.mdx b/docs/references/sql-variables.mdx new file mode 100644 index 0000000..65b1ee2 --- /dev/null +++ b/docs/references/sql-variables.mdx @@ -0,0 +1,37 @@ +import MissingAttributeEmailError from './assets/missing-user-attribute-email-error.png'; + +# SQL Variables + +When writing SQL in your Lightdash models, you can use the following references to template you SQL and make it more +reusable + +- `${field}` - reference a field in the current model +- `${model.field}` - reference a field in another model +- `${TABLE}` - reference the current table's sql reference +- `${lightdash.attributes.my_attr_1}` - a user attribute called `my_attr_1` + - (optional) `ld` as an alias for `lightdash` + - (optional) `attribute` or `attr` as an alias for `attributes` +- `${lightdash.user.}` - reference an `intrinsic_attribute` of the current Lightdash user + - (optional) `ld` as an alias for `lightdash` + - available intrinsic user attributes: + - `email` + +:::info + +The user email attribute is only available when the email is verified. +This is a security measure to prevent users from creating/updating an account with any email they don't own and gain access to data they shouldn't see. + +If the user email is not verified you will get the following error: + + + +```yaml +models: + - name: example + meta: + sql_filter: ${lightdash.user.email} = 'example@lightdash.com' +``` + +If you are self hosting you can enable [SMTP](/self-host/customize-deployment/configure-smtp-for-lightdash-email-notifications) or [SSO](/self-host/customize-deployment/use-sso-login-for-self-hosted-lightdash) authentication to allow users to verify their email address. + +::: diff --git a/docs/references/table-calculations.mdx b/docs/references/table-calculations.mdx new file mode 100644 index 0000000..be8d926 --- /dev/null +++ b/docs/references/table-calculations.mdx @@ -0,0 +1,111 @@ +import TableCalculationsAddImage from './assets/table-calculations-add.jpg'; +import CreateNewCalc from './assets/create-new-table-calc.jpg'; +import WriteNewCalc from './assets/add-table-calc-sql.jpg'; +import EditDeleteCalc from './assets/edit-delete-table-calc.jpg'; +import FormatCalc from './assets/format-table-calc.jpg'; +import CurrencyFormat from './assets/currency-format.png'; +import QuickTableCalculation from './assets/quick-table-calculation.png'; + +# Table Calculations + +Table calculations make it easy to create metrics on the fly (for example, aggregating the data in your table over some window, or getting a running total of a column). You add table calculations in the Explore view and they appear as green columns in your results table (remember, [dimensions](https://docs.lightdash.com/references/dimensions) are blue, and [metrics](https://docs.lightdash.com/references/metrics) are orange). + + + +Table calculations are built using raw SQL. That means you can use table calculations to build mathematical, True/False, text, and date-based calculations (basically, anything you can do in SQL, you can do in table calculations). + +## When to use table calculations + +Typically, in your Lightdash project, you'll have one or more Tables that you've pre-defined in your dbt project (this is probably done by the data analysts/engineers/analytics engineers). But sometimes, you'll need particular logic which hasn't been defined as a dimension or metric in your dbt project - maybe because you have a new kind of question or use case. + +This is when you might need a table calculation. + +Watch out: table calculations can be easier to create than regular metrics/dimensions, but they are not as easy to manage. If you find yourself creating the same table calculation over and over again when you're using a Table, then it might be worth adding it in as a more permanent metric in your dbt project! You can read more about [adding metrics to your dbt project here](https://docs.lightdash.com/references/metrics). + +## Creating table calculations + +Before you create a table calculation, you need to add some dimensions and/or metrics to your results table. + +Table calculations can only be built using the dimensions + metrics that you've included in your results table. So, to create a table calculation, first, you need to add the dimensions and/or metrics for your table calculation to your results table. + +### Using Quick Calculations + +Quick calculations are shortcuts to the most common table calculations, these are only available to metrics in the contextual menu in the results table. + + + +To learn more about what these calculations are doing, check out the docs [here](/guides/table-calculations/sql-templates). +Once the table calculation is generated you can edit it to modify the SQL query or update the format. + +### Using Custom Table Calculations + +To add a custom table calculation just click on `+ Table calculation` in the `Results` tab + +Once you've got some data in your results table, you can create a table calculation by clicking on the `+ Table calculation` in the `Results` tab of the Explore view: + + + +#### 3. Write the SQL for your table calculation in the pop-up box + +Your table calculation is defined using raw SQL that you write up in this pop up box. If you're not sure what to write here, you can [check out some of our table calculation SQL templates](#table-calculation-sql-templates). + +To reference the metrics and dimensions in your results table, you can either use the autocomplete, or you can manually write the full field name using the format `${table_name.field_name}`. + + + +#### 4. Update the format of your table calculation (if needed) + +If needed, you can update the format of your table calculation to things like percent formatting using the `format` tab. + + + +| Format types | Description | Raw value | How it might look like in Lightdash | +| ------------ | ----------------------------------------------- | --------- | ----------------------------------- | +| Default | Default format for the table calculation result | 0.75 | 0.75 | +| Percent | Converts numbers into a percentage | 0.75 | 75% | +| Currency | Adds currency symbol and default locale format | 1234.1234 | $ 1234.12 | +| Number | Formats number with prefix and suffix | 123.1234 | Speed: 123.12 km/h | + +#### 5. To delete or edit your table calculation, just click on the gear icon by the field name + +If you need to edit or delete a table calculation, you can just click on the toggle beside the field and do what you need to do! + + + +--- + +## Table calculation SQL templates + +I'm not sure about you, but I definitely rely on copy-pasting old SQL code to write 90% of my new SQL queries. So, we thought it might be useful to give you some snippets of SQL code to help you get started with your most common table calculations. + +You can check out our table calculation SQL templates [here](/guides/table-calculations/sql-templates). diff --git a/docs/references/tables.mdx b/docs/references/tables.mdx new file mode 100644 index 0000000..df12321 --- /dev/null +++ b/docs/references/tables.mdx @@ -0,0 +1,277 @@ +import TableGroupLabelImg from '../references/assets/table-group-label.png'; + +# Tables reference + +You can run queries against the tables in your Lightdash project. + +Tables are built from dbt models (either one, or many joined together). + +--- + +## Adding Tables to your project + +Tables come from dbt models that have been defined in your dbt project's schema.yml files. + +If your dbt model has been defined in a .yml file, it will appear in Lightdash as a table. + +For example, if we had this in our schema.yml files in dbt, we'd see a Table called `users` in Lightdash. + +```yaml +version: 2 + +models: + - name: users +``` + +You can read more about [adding Tables to Lightdash here](/guides/adding-tables-to-lightdash). + +## Table configuration + +You can customize your Tables in your dbt model's YAML file. Here's an example of the properties used in defining a Table: + +```yaml +version: 2 + +models: + - name: my_table + meta: + label: 'My Custom Table Name' + order_fields_by: 'label' + group_label: 'Revenue' + sql_filter: ${date_dimension} > '2020-01-01' + joins: + - join: my_other_table + sql_on: ${my_table.column_a} = ${my_other_table.column_a} + required_attributes: + is_admin: 'true' +``` + +Here are all of the properties you can customize: + +| Property | Value | Note | +| ------------------------------------------------- | ------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------- | --- | +| label | string | Custom label. This is what you'll see in Lightdash instead of the Table name. | +| [order_fields_by](#order-fields-by) | 'index' or 'label' | How the fields will be sorted in the sidebar. [Read more about the order rules in here](#order-fields-by) | +| [joins](joins.mdx) | array | Join logic to join other data models to the Table. [Read more about joins in here.](joins.mdx) | +| [metrics](metrics.mdx#2-using-the-model-meta-tag) | object | Model metrics. [Read more about model metrics in here](metrics.mdx#2-using-the-model-meta-tag) | +| [group_label](#group-label) | string | Group tables in the sidebar. [Read more about the group label in here](#group-label) | +| [sql_filter](#sql-filter) | string | A permanent filter that will always be applied when querying this table directly. Read more about `sql_filter` [below](#sql-filter) | +| [sql_where](#sql-filter) | string | Alias for `sql_filter` | | +| [required_attributes](#required-attributes) | Object with { user_attribute, value } | Limits access to users with those attributes. [Read more about user attributes in here](./user-attributes.mdx) | +| group_details | Object with { label, description } | Describes the groups for dimensions and metrics | +| [required_filters](#required-filters) | Array of {filter field: value} | Dimension filters that will be applied when no other filter on those dimension exists. Read more about `required_filters` [below](#required-filters) | + +### If you've added a new dbt model to your project, you need to do `dbt run` + `dbt refresh` before it will appear in Lightdash + +Lightdash gets information about your data models from dbt. +But it gets information about the data **_generated_** by those data models from your data warehouse. + +This means that if you add a new dbt model to your project or update a model so that you're making changes +to the table it generates, then you need to do two things before your changes will appear in Lightdash: + +1. **Materialize the new table/changes to the table (using `dbt run`).** + You basically want the data in your data warehouse to be the new + table you're expecting. So you need to do `dbt run` to update the table from the data model you just changed. + +2. **Click `dbt refresh` in Lightdash.** + This will re-sync your dbt project in Lightdash so that any changes you made + to your dbt models is shown in Lightdash (e.g. adding a new table). + +### Order fields by + +By default, the fields in your sidebar for any table will appear alphabetically (`order_fields_by: "label"`). Sometimes, you might not want your fields to appear alphabetically, but instead, in the same order as they are in your model's dbt .yml file. You can achieve this by setting the `order_fields_by` parameter in your table's meta tag to `index`, like this: + +```yaml +version: 2 + +models: + - name: my_table + meta: + order_fields_by: 'index' + columns: + - name: user_id + - name: product_id + - name: account_id +``` + +So, in the example above, the fields in the sidebar for "My Table" would appear in the order: + +- user_id +- product_id +- account_id + +Instead of being listed alphabetically. + +Here are some other things worth mentioning about the `order_fields_by` parameter: + +- By default, `order_fields_by` is set to `label`, which means that your fields will appear in the table listed alphabetically. +- Since metrics can be declared in multiple places within your .yml (as a dbt metric, in the model `meta` tag, under a dimension's `meta`), we force the following order on metrics if you set `order_fields_by` to `index`: + + - dbt metrics appear first + - then, metrics defined in the model's `meta` + - then, metrics defined in the dimensions' `meta` + +- Group labels inherit the index of the first dimension that use them. + +### Group label + +If you set this property, the table will be grouped in the sidebar with other tables with the same group label. + +The tables in your sidebar will appear in the following order: + +- Group labels appear first, alphabetically +- Ungrouped tables appear after the grouped tables in the sidebar, alphabetically +- Tables within the groups are also ordered alphabetically + + + +### SQL filter (row-level security) + +`sql_filter` adds a filter to the table that cannot be removed in Lightdash. It is automatically added to the compiled SQL when running queries. + +For example: + +```yaml +models: + - name: sales + meta: + sql_filter: ${TABLE}.sales_region = 'EMEA' +``` + +Any queries that I run using the `Sales` table in Lightdash will always have a filter for `sales_region = 'EMEA'` in their compiled SQL + +```sql +SELECT + [...] +FROM `lightdash`.`prod`.`sales` + +WHERE sales_region = 'EMEA' +``` + +#### Row-level security using user attributes + +Using `sql_filter` with [user attributes](/references/user-attributes) allows you to set up [row-level security in your tables](/references/user-attributes#row-filtering-with-sql_filter). You can reference user attributes in your `sql_filter` using `${lightdash.attributes.my_attribute_name}` + +For example: + +```yaml +models: + - name: sales + meta: + sql_filter: ${TABLE}.sales_region IN (${lightdash.attributes.sales_region}) +``` + +#### `sql_filter` will only be applied when querying tables directly. + +For example: + +- Table A is joined to Table B +- Table B has a `sql_filter` applied to it +- A user queries Table A and adds a field from the joined table (Table B) to their query +- the `sql_filter` from Table B will **not** be applied to the query (you would need to add this as a `sql_filter` to Table A directly for it to apply) + +#### If you reference a dimension from a joined table in your `sql_filter`, the referenced table will always be joined in your queries. + +For example: + +- You have Table A which is joined to Table B +- In Table A, you've added a `sql_filter: ${TABLE}.sales_region = 'EMEA' OR ${table_b}.sales_region IS NULL` +- Table B will always be joined to Table A in your queries (even if there are no fields from Table B selected in your results table) + +### Required attributes + +Lightdash can use [user attributes](./user-attributes.mdx) to limit some tables to some users. + +In the example below, only users with `is_admin` attribute `true` can use the `payments` table. Users without access to this table will not see it on the `tables page` or the `explore page` when joined to other tables. + +``` +version: 2 +models: + - name: payments + meta: + required_attributes: + is_admin: "true" +``` + +If a user without access to this table runs a query that contains this table, they will get a `Forbidden` error. + +## Required Filters + +Use `required_filters` to define filters on Dimensions that will be applied when no other user-defined filter on those Dimensions exists. +This allows to enforce a default filter on a Dimension when querying a table. +This defined `required_filters` will be replaced by any user-defined filter on the same Dimension making sure at least one filter is applied to the Dimension. + +This is particularly useful when you want to enforce a default filter to save on query time and potential warehouse costs. + +:::info +A required filter's field reference can't be changed, but its operator (is, is not, etc.) and value can be changed when querying the table. +::: + +For example, the defined `required_filters` on the date Dimension will be in place unless there is another user-defined filter on the date Dimension when querying the orders table, like this: + +```yaml +version: 2 + +models: + - name: orders + meta: + required_filters: + - date: 'inThePast 14 days' + columns: + - name: date + description: 'Order date' + meta: + dimension: + type: date +``` + +### If you have many filters in your list, they will be joined using `AND` + +For example: + +```yaml +version: 2 + - name: orders + meta: + required_filters: + - date: 'inThePast 14 days' + - status: "completed" + columns: + - name: date + description: 'Order date' + meta: + dimension: + type: date + - name: status + description: 'Order status - completed, pending, cancelled' + meta: + dimension: + type: string +``` + +In the example above, the `orders` table will have a default filter of `date` in the past 14 days **and** `status` completed. + +### Available filter types + +| Type | Example (in English) | Example (as code) | +| ----------------------------- | ---------------------------------------------- | ----------------------------- | +| is | User name is equal to katie | `user_name: "katie"` | +| is not | User name is not equal to katie | `user_name: "!katie"` | +| contains | User name contains katie | `user_name: "%katie%"` | +| does not contain | User name does not contain katie | `user_name: "!%katie%"` | +| starts with | User name starts with katie | `user_name: "katie%"` | +| ends with | User name ends with katie | `user_name: "%katie"` | +| is greater than (number) | Number of orders is greater than 4 | `num_orders: "> 4"` | +| in the past (date) (interval) | Date is before x (days / months / years) | `date: "inThePast 14 months"` | +| in the next (date) (interval) | Date is after x (days / months / years) | `date: "inTheNext 14 days"` | +| is greater than or equal to | Number of orders is greater than or equal to 4 | `num_orders: ">= 4"` | +| is less than | Number of orders is less than 4 | `num_orders: "< 4"` | +| is less than or equal to | Number of orders is less than or equal to 4 | `num_orders: "<= 4"` | +| is null | Status is `NULL` | `status: "null"` | +| is not null | Status is not `NULL` | `status: "!null"` | +| is [boolean] | Is complete is true | `is_complete: "true"` | +| is not [boolean] | Is complete is false or null | `is_complete: "!true"` | diff --git a/docs/references/usage-analytics.mdx b/docs/references/usage-analytics.mdx new file mode 100644 index 0000000..d41240c --- /dev/null +++ b/docs/references/usage-analytics.mdx @@ -0,0 +1,64 @@ +import AccessUsageAnalytics from './assets/access-usage-analytics.jpg'; +import UserActivityDashboard from './assets/user-activity-dashboard.jpg'; + +# Usage analytics + +To understand who is accessing content or running queries in your Lightdash projects, we've built usage analytics to help you track this. There are two ways of understanding user activity: + +1. **[Usage Analytics dashboards](#usage-analytics-dashboards)** - these are dashboards created by Lightdash which give you an overview of your project's content and user activity. +2. **[Query tags](#query-tags)** - this is metadata which is added to your data warehouse queries and gives you information about who is querying data and what they are querying. + +## Usage analytics dashboards + +Each project has usage analytics dashboards created by Lightdash giving you an overview of your project's content and user activity. + +To see your usage analytics dashboards for a project, just click on the `settings` icon, `project settings`, then `usage analytics`. + + + +Or you can also use our [search bar](https://docs.lightdash.com/get-sarted/exploring-data/exploring-your-content#using-the-search-bar) to get direct access to +the different analytics dashboards by typing the name of the dashboard (eg: User activity) + +### User Activity dashboard + +This dashboard gives you an overview of the users in your project and the activity of your users. + + + +Here's an overview of the fields used in the dashboard: + +- **Number of users**: the total number of users that have access to the project. +- **Number of viewers**: the number of users with the `viewer` role that have access to the project. +- **Number of editors**: the number of users with the `editor` role that have access to the project. +- **Number of admins**: the number of users with the `admin` role that have access to the project. +- **% of weekly querying users**: the % of users which have run at least one query in the project in the last 7 days (out of all users in your project). Queries include viewing existing charts and dashboards. +- **Number of weekly querying users**: the number of users which have run at least one query in the project in the last 7 days. +- **Weekly average number of queries per user**: the rolling 7 day average number of queries that each user is running in your project. +- **Users that have run the most queries in the last 7 days**: a list of the users that have run the most queries in your project in the last 7 days. +- **Users that have updated the most charts in the last 7 days**: a list of users that have updated (including created) the most charts in the project in the last 7 days. +- **Users that have not run a query in the last 90 days**: a list of users that have not run a query in the project in the last 7 days. This includes viewing charts and dashboards. + +## Query tags + +Query tags are metadata which is added to your data warehouse queries and gives you information about the `user_id`, `project_id` and `organization_id` for each query executed. + +Query tags are stored differently in each data warehouse: + +| Data Warehouse | Query Tag | +| :------------- | :-------------------------------------------------------------------------------------------------------------------------------------------------: | +| BigQuery | Persists in the `labels` parameter in your [job history](https://cloud.google.com/bigquery/docs/managing-jobs#view_job_details_2). | +| Snowflake | Persists in the `comment` parameter in your [query history](https://docs.snowflake.com/en/user-guide/ui-history#viewing-query-details-and-results). | +| Trino | Appends to the SQL in your query history. | +| Redshift | Appends to the SQL in your query history. | +| Databricks | Appends to the SQL in your query history. | +| Postgres | Appends to the SQL in your query history. | diff --git a/docs/references/user-attributes.mdx b/docs/references/user-attributes.mdx new file mode 100644 index 0000000..ee2e6ad --- /dev/null +++ b/docs/references/user-attributes.mdx @@ -0,0 +1,283 @@ +--- +tags: + - role:admin +--- + +import DefaultValue from './assets/user-attribute-default-value.png'; +import MissingAttributeEmailError from './assets/missing-user-attribute-email-error.png'; + +# User Attributes + +User attributes provide a way to customise Lightdash charts, dashboards, and other behaviour depending on the user +that is logged in. For example, you could only show your sales team members data that are relevant to their region. + +User attributes are defined for your whole Organization and can only be a text value (not a date or number). Some +examples of user attributes are: + +- Sales region +- Department +- Can view PII +- Can view financial data + +To start user attributes you need to follow 2 steps: + +1. Define the user attribute, users can only have user attributes that are explicitly created by admins +2. Set the user attribute value per user. + +User attributes can only be managed by admins. + + + +## Managing user attributes + +### Creating user attributes + +User attributes can be created by navigating to **Organization Settings** > **User Attributes** and clicking on the +**Add attribute** button. This will create a new user attribute but it will not be assigned to any user. + +### Assigning user attributes to users and groups + +User attributes can be assigned to users or [groups](/references/groups.mdx) by navigating to **Organization Settings** > **User Attributes** and +clicking on the user attribute you'd like to assign. Select a user by email address, or a group by group name and set their value. + +### Setting a default value for your user attribute + +You can add a default attribute that will be applied to all users who don't have their own value defined in this user attribute. + + + +If a user has an attribute defined, we will ignore the default for that user. + +## Using user attributes in Lightdash + +There are several places in Lightdash where you can customise behaviour based on user attributes. + +When referencing user attributes in SQL you can use the following [SQL variables](./sql-variables.mdx): + +- `${lightdash.attributes.my_attr_1}` - a user attribute called `my_attr_1` + - (optional) `ld` as an alias for `lightdash` + - (optional) `attribute` or `attr` as an alias for `attributes` +- `${lightdash.user.}` - reference an `intrinsic_attribute` of the current Lightdash user + - (optional) `ld` as an alias for `lightdash` + - available intrinsic user attributes: + - `email` + +:::info + +The user email attribute is only available when the email is verified. +This is a security measure to prevent users from creating/updating an account with any email they don't own and gain access to data they shouldn't see. + +If the user email is not verified you will get the following error: + + + +```yaml +models: + - name: example + meta: + sql_filter: ${lightdash.user.email} = 'example@lightdash.com' +``` + +If you are self hosting you can enable [SMTP](/self-host/customize-deployment/configure-smtp-for-lightdash-email-notifications) or [SSO](/self-host/customize-deployment/use-sso-login-for-self-hosted-lightdash) authentication to allow users to verify their email address. + +::: + +### Row filtering with `sql_filter` + +You can use user attributes to filter the rows returned by a query. This is useful if you want to restrict the data +based on the user's attributes. To reference a user attribute in your sql, use the special lightdash reference +`${lightdash.attributes. }`. +You should use the `IN` operator since the attribute might have multiple values. + +For example, if you have a user attribute called `sales_region` you can +use it in your sql like this: + +```yaml +models: + - name: my_model + meta: + sql_filter: ${TABLE}.sales_region IN (${lightdash.attributes.sales_region}) +``` + +### Column filtering with `required_attributes` + +You can use `user attributes` to limit some dimensions to some users. + +:::info +Users without access to this dimension will not see it, as well as the **metrics derived from it**. +Also note that the **custom metrics created from this dimension** on the `explore page`. +::: + +In the example below, only users with `is_admin` attribute `true` can use the `salary` dimension on `user` table. + +``` +columns: + - name: + description: User name + - salary: + description: User salary + meta: + dimension: + required_attributes: + is_admin: "true" +``` + +If a user without access to this dimension runs a query that contains this dimension, they will get a `Forbidden` error. Also, if the user runs a query that contains a metric derived from this dimension, they won't see the metric on the explore page and won't be able to query from it. + +You can add multiple attributes for a single dimension. There are two ways to do this: + +1. **Multiple attributes joined with `AND`.** In the example below, only users with `is_admin: "true" AND team_name: "HR"` have access to the `salary` dimension in Lightdash. + +```yaml +columns: + - name: user + description: User name + - name: salary + description: User salary + meta: + dimension: + required_attributes: + is_admin: 'true' + team_name: 'HR' +``` + +2. **Multiple attribute values joined with `OR`.** In the example below, users with `team_name = 'HR' OR team_name = 'C-Suite'` have access to the `salary` dimension in Lightdash. + +```yaml +columns: + - name: user + description: User name + - name: salary + description: User salary + meta: + dimension: + required_attributes: + team_name: ['HR', 'C-Suite'] +``` + +:::info + +Column filtering using `required_attributes` does not take into account intrinsic attributes of a user - `email`. + +::: + +### Table filtering with `required_attributes` + +You can use `user attributes` to limit some tables to some users. + +In the example below, only users with `is_admin` attribute `true` can use the `payments` table. Users without access to this table will not see it on the `tables page` or the `explore page` when joined to other tables. + +``` +version: 2 +models: + - name: payments + meta: + required_attributes: + is_admin: "true" +``` + +Similar to [columns filtering](#column-filtering-with-required_attributes), you can add multiple attributes for a single table. + +:::info + +Table filtering using `required_attributes` does not take into account intrinsic attributes of a user - `email`. + +::: + +### Filtering joins with `sql_on` + +If you're joining a table, you can also customise the rows that are returned + +You can use user attributes to filter the rows returned by a join. This is useful if you want to restrict the data +returned from the joined table. To reference a user attribute in your sql, use the special lightdash reference +`${ lightdash.attributes. }`. For example, if you have a user attribute called `sales_region` you can +use it in your sql like this: + +```yaml +models: + - name: base + meta: + joins: + - join: joined + sql_on: > + ${base}.id = ${joined}.id + AND ${joined}.sales_region = ${lightdash.attributes.sales_region} +``` + +## Current limitations + +Lightdash dimensions and custom metrics are protected by this feature, however, +it is possible to write custom SQL to bypass this filter, for example: + +- Developers and admins running SQL queries on SQL runner. +- Custom SQL or subqueries on `table calculations` + +:::info + +Scheduler deliveries will run against the user who created the scheduled delivery, be careful when sharing required attributes with other users. + +::: + +## Demo: filtering a chart based on user attributes + +The following video gives you a full demo for how to use user attributes to filter chart results. + + + +## How user and group attribute values interact + +Users can be assigned attributes, but you can also assign groups attributes. So, if a user is assigned an attribute value, but they're also part of a group that's been assigned a value for the same attribute, what happens? + +### Column filtering + +If the required attributes match **_any_** of the user's group or user attribute values, then the user has access to the column. + +For example, if a user is part of a group with the attribute value `kiwi`, another group with the attribute value `orange`, and they've also been assigned as a user to the attribute value `coconut`. + +```yaml +columns: + - name: tropical_fruits_column + meta: + dimension: + required_attributes: + fruits: 'coconut' +``` + +In this example, the `tropical_fruits_column` will be visible to them because `coconut` is listed in their attribute values `['kiwi','orange', 'coconut']`. + +### Row filtering + +The template reference will be replaced by an array of the user's group or user attribute values. + +Let's walk through an example: + +```yaml +models: + - name: my_model + meta: + sql_filter: ${TABLE}.fruit IN (${lightdash.attributes.fruit}) +``` + +In this example, the `${lightdash.attributes.fruit}` will be replaced with `'kiwi','orange','coconut'`. +The final SQL will be `my_model.fruit IN ('kiwi','orange','coconut)` diff --git a/docs/references/validating-your-content.mdx b/docs/references/validating-your-content.mdx new file mode 100644 index 0000000..3f54ac8 --- /dev/null +++ b/docs/references/validating-your-content.mdx @@ -0,0 +1,56 @@ +import ValidateDashboard from './assets/validate-dashboard.jpg'; +import DismissErrors from './assets/dismiss-errors.png'; + +# Validating your content + +Broken content is not useful content. We've built tools in Lightdash to help validate your content so you can keep it useful and we'll notify you when it isn't. + +In Lightdash, users with [admin or developer roles](../references/roles) can access a content validation dashboard from within a project's settings. This dashboard gives you an overview of all of the broken content in your project and detailed information about what is causing the errors. + +You can access the content validation dashboard by heading to `project settings`, then selecting the `Validator` tab. + + + +## How can I validate my content? + +Your project is validated any time the content validator is run. The content validator will run when: + +- a user hits `Refresh dbt` in the app +- the command `lightdash deploy` is run on the [Lightdash CLI](/guides/cli/intro) (you can read more about automatically deploying your changes using GitHub actions [here](https://docs.lightdash.com/guides/cli/how-to-use-lightdash-deploy#automatically-deploy-your-changes-to-lightdash-using-a-github-action)) +- you update your project settings and hit `Test and compile`. +- you hit `Run validation` directly inside the content validator dashboard +- you run [`lightdash validate` from the CLI](/guides/cli/how-to-use-lightdash-validate) + +## What content is included in the validation? + +The validator will show you any errors caused by metrics or dimensions which no longer exist, have been renamed, or have invalid definitions. The validator does not show errors caused by invalid SQL at run time (e.g. invalid SQL syntax, division by 0, trying to perform numeric calculations on a string value type). + +Here are some examples of errors that would appear in your content validator: + +- Renaming a metric from `total_revenue` to `sum_revenue`. The old metric name is used in a chart, so it breaks the chart. +- Deleting a dimension `is_premium_user` which is referenced in a metric's custom SQL definition. +- Deleting a dimension `is_premium_user` which is used as a filter on a dashboard. + +The content types included in the validator dashboard are: + +- **Tables** - errors in tables are caused when dimensions or metrics that have been deleted or renamed but are still referenced in other places in the table. +- **Charts** - errors in charts are caused when the results table or filters reference a metric or dimension which no longer exists. +- **Dashboards** - errors in dashboards are caused when a chart is broken in the dashboard or a filter references a metric or dimension which no longer exists. + +## How to dismiss errors + +You can dismiss errors from validation by clicking on the "x" button that appears when you hover over a row on the validation table. + + + +Dismissed validation errors are applied to everyone. So, if you dismiss an error, it will be removed from everyone else's validation results as well as yours. The errors you dismissed will reappear again if you run another validation and the issue hasn't been fixed yet. diff --git a/docs/references/virtual-views.mdx b/docs/references/virtual-views.mdx new file mode 100644 index 0000000..15c9221 --- /dev/null +++ b/docs/references/virtual-views.mdx @@ -0,0 +1,46 @@ +import CreateVirtualView from './assets/create-virtual-view.jpg'; +import UsingVirtualViews from './assets/using-virtual-views.jpg'; +import EditDeleteVirtualView from './assets/edit-delete-virtual-view.jpg'; + +# Virtual Views + +Virtual Views are created in the [SQL Runner](/references/sql-runner) and allow other users to reuse your custom SQL queries in Lightdash. They get listed in your `Tables` and can be used like the tables that come from your dbt project. + +:::info + +A Virtual View won't be saved to or managed in your dbt project. If you're expecting to use this query regularly, we recommend [writing it back to dbt](/references/dbt-write-back). + +::: + +## Create a Virtual View + +To create a Virtual View from the SQL Runner, select the `Create Virtual View` option from the `save` drop-down. + + + +Your Virtual View will appear in the list of Tables available to explore in Lightdash. Everyone in your team can use Virtual Views to build queries and charts just like they would any other Table. + + + +## Edit or delete a Virtual View + +To edit a Virtual View, you need to open it in the Explorer, then beside the name, there's a three-dot-menu where you can choose to `edit` or `delete` the Virtual View. + + + +Any changes you make will affect all existing content built using the Virtual View. diff --git a/docs/self-host/assets/lightdash-access.png b/docs/self-host/assets/lightdash-access.png new file mode 100644 index 0000000..d6ddf70 Binary files /dev/null and b/docs/self-host/assets/lightdash-access.png differ diff --git a/docs/self-host/assets/lightdash-deployed.png b/docs/self-host/assets/lightdash-deployed.png new file mode 100644 index 0000000..ba31387 Binary files /dev/null and b/docs/self-host/assets/lightdash-deployed.png differ diff --git a/docs/self-host/assets/restack-add-AWS-creds.png b/docs/self-host/assets/restack-add-AWS-creds.png new file mode 100644 index 0000000..f11936e Binary files /dev/null and b/docs/self-host/assets/restack-add-AWS-creds.png differ diff --git a/docs/self-host/assets/restack-add-credentials.png b/docs/self-host/assets/restack-add-credentials.png new file mode 100644 index 0000000..b4a8293 Binary files /dev/null and b/docs/self-host/assets/restack-add-credentials.png differ diff --git a/docs/self-host/assets/restack-cluster-created.png b/docs/self-host/assets/restack-cluster-created.png new file mode 100644 index 0000000..0ff3830 Binary files /dev/null and b/docs/self-host/assets/restack-cluster-created.png differ diff --git a/docs/self-host/assets/restack-cluster-details.png b/docs/self-host/assets/restack-cluster-details.png new file mode 100644 index 0000000..615a14b Binary files /dev/null and b/docs/self-host/assets/restack-cluster-details.png differ diff --git a/docs/self-host/assets/restack-create-cluster.png b/docs/self-host/assets/restack-create-cluster.png new file mode 100644 index 0000000..1c73676 Binary files /dev/null and b/docs/self-host/assets/restack-create-cluster.png differ diff --git a/docs/self-host/assets/restack-creating-cluster.png b/docs/self-host/assets/restack-creating-cluster.png new file mode 100644 index 0000000..6c9507a Binary files /dev/null and b/docs/self-host/assets/restack-creating-cluster.png differ diff --git a/docs/self-host/assets/restack-sign-up.png b/docs/self-host/assets/restack-sign-up.png new file mode 100644 index 0000000..1e20110 Binary files /dev/null and b/docs/self-host/assets/restack-sign-up.png differ diff --git a/docs/self-host/assets/select-lightdash.png b/docs/self-host/assets/select-lightdash.png new file mode 100644 index 0000000..eb184ef Binary files /dev/null and b/docs/self-host/assets/select-lightdash.png differ diff --git a/docs/self-host/customize-deployment/_category_.json b/docs/self-host/customize-deployment/_category_.json new file mode 100644 index 0000000..0f9799e --- /dev/null +++ b/docs/self-host/customize-deployment/_category_.json @@ -0,0 +1,4 @@ +{ + "label": "Customize deployment", + "position": 6 +} diff --git a/docs/self-host/customize-deployment/assets/headless-browser-schema.png b/docs/self-host/customize-deployment/assets/headless-browser-schema.png new file mode 100644 index 0000000..b9fb21d Binary files /dev/null and b/docs/self-host/customize-deployment/assets/headless-browser-schema.png differ diff --git a/docs/self-host/customize-deployment/assets/slack-basic-information.png b/docs/self-host/customize-deployment/assets/slack-basic-information.png new file mode 100644 index 0000000..b3d9fba Binary files /dev/null and b/docs/self-host/customize-deployment/assets/slack-basic-information.png differ diff --git a/docs/self-host/customize-deployment/assets/slack-create-new-app.png b/docs/self-host/customize-deployment/assets/slack-create-new-app.png new file mode 100644 index 0000000..2ea358f Binary files /dev/null and b/docs/self-host/customize-deployment/assets/slack-create-new-app.png differ diff --git a/docs/self-host/customize-deployment/assets/slack-select-worskpace.png b/docs/self-host/customize-deployment/assets/slack-select-worskpace.png new file mode 100644 index 0000000..0f8d293 Binary files /dev/null and b/docs/self-host/customize-deployment/assets/slack-select-worskpace.png differ diff --git a/docs/self-host/customize-deployment/configure-a-slack-app-for-lightdash.mdx b/docs/self-host/customize-deployment/configure-a-slack-app-for-lightdash.mdx new file mode 100644 index 0000000..6e7b26f --- /dev/null +++ b/docs/self-host/customize-deployment/configure-a-slack-app-for-lightdash.mdx @@ -0,0 +1,106 @@ +--- +sidebar_label: Slack integration +--- + +import SlackCreateNewApp from './assets/slack-create-new-app.png'; +import SlackSelectWorkspace from './assets/slack-select-worskpace.png'; +import SlackBasicInformation from './assets/slack-basic-information.png'; + +# Configure a slack integration for self-hosted Lightdash + +In this guide we will show you how you can enable [the Slack integration](/references/slack-integration.mdx) on your on self-hosted Lightdash server. + +### Create a new Slack APP on your organization + +First we will have to create a Slack APP https://api.slack.com/apps?new_app=1 + +You can select `From an app manifest` to make it easier. + + + +Then select the workspace you want to enable this into. Later you can `enable distribution` if you want to use a different Slack workspace. + + + +Then copy this manifest to allow URL unfurls in your app. **Make sure you update `your Lightdash URL` in the manifest below** (for example, `app.lightdash.cloud` or `eu1.lightdash.cloud`). + +```yaml +display_information: + name: Lightdash + description: Share Lightdash URLs on your Slack + background_color: '#7262ff' +features: + bot_user: + display_name: Lightdash + always_online: false + unfurl_domains: + - your-lightdash-deployment-url.com +oauth_config: + redirect_urls: + - https://your-lightdash-deployment-url.com/api/v1/slack/oauth_redirect + scopes: + bot: + - app_mentions:read + - channels:join + - channels:read + - chat:write + - chat:write.customize + - files:read + - files:write + - groups:read + - links:read + - links:write + - users:read +settings: + event_subscriptions: + request_url: https://your-lightdash-deployment-url.com/slack/events + bot_events: + - app_mention + - link_shared + interactivity: + is_enabled: true + request_url: https://your-lightdash-deployment-url.com/slack/events + org_deploy_enabled: false + socket_mode_enabled: false + token_rotation_enabled: false +``` + +Finally, click on `create` + +### Copying credentials + +Now copy the following credentials from your new app. + +From `Basic Information` + + + +- Client ID +- Client secret (show and copy) +- Signing secret (show and copy) + +### Adding credentials to your local environment + +Now you need to add the following environment variables to your Lightdash server using the credentials we previously copied + +- `SLACK_CLIENT_ID`: Client ID (make sure it is between quotes, so it is a string, not a number) +- `SLACK_CLIENT_SECRET`: Client secret +- `SLACK_SIGNING_SECRET`: Signing secret +- `SLACK_STATE_SECRET`: This can be any string + +Restart your Lightdash service, now you should be able to use [the Slack integration](/references/slack-integration.mdx) on your self-hosted Lightdash. diff --git a/docs/self-host/customize-deployment/configure-lightdash-to-use-an-external-database.mdx b/docs/self-host/customize-deployment/configure-lightdash-to-use-an-external-database.mdx new file mode 100644 index 0000000..bdbbf5f --- /dev/null +++ b/docs/self-host/customize-deployment/configure-lightdash-to-use-an-external-database.mdx @@ -0,0 +1,43 @@ +--- +sidebar_label: Use external database +--- + +# Configure Lightdash to use an external database + +> Note: Lightdash requires a **PostgreSQL** database (version 12 or greater). + +In production, we recommend using a managed database service (depending on your cloud provider). This ensures that your database is highly available and secure. You can also use a self-hosted database, but you will need to manage the database yourself. + +The following configuration shows an example of how to configure Lightdash to use an external database. You can use this as a starting point for your own configuration. + +## Configuration options for external database + +```yaml +# values.yaml + +# Disable the internal database +postgresql: + enabled: false + +# Configure Lightdash to use an external database +externalDatabase: + host: lightdash-db.mycompany.com + port: 5432 + user: lightdash + password: lightdash + database: lightdash +``` + +Optionally you can pass any of the [PostgreSQL Environment Variables](https://www.postgresql.org/docs/current/libpq-envars.html) to the `configMap` + +## Required pg extensions for external database + +Lightdash requires the following extensions to be installed on the database: + +- `uuid-ossp` - used for generating unique IDs + +## Migrations + +Migrations are ran automatically on starting the Lightdash server or workers. When upgrading Lightdash, migrations +will be ran automatically. If migrations fail due to a pg_lock error, check for a table called +`knex_migrations_lock` to manually release the lock. diff --git a/docs/self-host/customize-deployment/configure-lightdash-to-use-external-object-storage.mdx b/docs/self-host/customize-deployment/configure-lightdash-to-use-external-object-storage.mdx new file mode 100644 index 0000000..9a9a564 --- /dev/null +++ b/docs/self-host/customize-deployment/configure-lightdash-to-use-external-object-storage.mdx @@ -0,0 +1,76 @@ +--- +sidebar_label: External storage +--- + +# Configure Lightdash to use external storage + +On Lightdash, we generate some files like: + +- Images for Slack unfurl +- Images on scheduled deliveries +- Results on CSV format. + +These files can be stored locally and can be served through Lightdash, +however, if you run Lightdash on multiple containers, these files might not be available when you requested, +because the file might be generated in another container, as these files are not shared across containers. +Also these files might not persist across different deployments. + +To solve this, we suggest you enable Cloud storage, so Lightdash can store the files in a cloud (GCP buckets, S3 storage...) + +For this, all you need is to configure the cloud storage and export S3 credentials (most cloud storages are compatible with S3 library) + +## Configure cloud storage on Google Cloud Platform + +Go into GCP: Cloud storage + +Create a new bucket with the following details: + +- give it an unique `Bucket name` like - `lightdash-cloud-file-storage-eu` +- Select region (like multi US or multi EU or single region EU-west-1) +- select storage class: default standard +- disable `enforce public access` and select `fine-grained` +- Protection: `none` + +Go to settings > Interoperability and create a `Access key for service account` + +- Copy the `access key` and `secret` + +`S3_ENDPOINT` for google is `https://storage.googleapis.com` +`S3_REGION` for google is `auto` + +## Configure cloud storage on AWS + +- Navigate to the S3 section of the AWS Management Console and click on the Create Bucket button. +- Give your bucket a name and select the region where you want to store your data. +- Next, you need to set the permissions for your bucket. Make it private. + +To export your S3 credentials, you need to follow these steps: + +- Navigate to the IAM section and click on the Users tab. +- Click on the user whose credentials you want to export. +- Click on the Security Credentials tab and locate the Access Keys section. +- Click on the Create Access Key button. +- Download the CSV file that contains your Access Key ID and Secret Access Key. + +Check [this guide](https://docs.aws.amazon.com/general/latest/gr/s3.html) to see what's the right `S3_ENDPOINT` for your bucket + +## Configure Lightdash to use S3 credentials + +Now you have the bucket and the S3 credentials for your cloud storage, +you can provide the following ENV variables to Lightdash so it can use the cloud storage using S3 library + +``` +S3_REGION +S3_ACCESS_KEY +S3_SECRET_KEY +S3_BUCKET +S3_ENDPOINT +S3_EXPIRATION_TIME +``` + +We also support IAM roles. If you don't provide `S3_ACCESS_KEY` and `S3_SECRET_KEY` the S3 library will try to use IAM roles, +see this [AWS documentation](https://docs.aws.amazon.com/sdk-for-javascript/v2/developer-guide/setting-credentials-node.html) for more details. + +The expiration time is optional and defaults to 259200 (seconds). + +If you try to customize this expiration time, you should keep in mind that link to your object url will be available for the maximum of 7 days due to signed url limitations if you use IAM role to generate it. diff --git a/docs/self-host/customize-deployment/configure-logging-for-lightdash.mdx b/docs/self-host/customize-deployment/configure-logging-for-lightdash.mdx new file mode 100644 index 0000000..884edbb --- /dev/null +++ b/docs/self-host/customize-deployment/configure-logging-for-lightdash.mdx @@ -0,0 +1,20 @@ +--- +sidebar_label: Logging +--- + +# Configure logging for Lightdash + +By default Lightdash logs to the console in a human readable format. You can configure the logging behaviour, such +as logging to a file or using a JSON format, by +using the following environment variables: + +| Variable | Description | Required? | Default | +| ------------------------------ | ----------------------------------------------------------- | --------- | ---------------------- | +| `LIGHTDASH_LOG_LEVEL` | The minimum level of log messages to display | | `INFO` | +| `LIGHTDASH_LOG_FORMAT` | The format of log messages | | `pretty` | +| `LIGHTDASH_LOG_OUTPUTS` | The outputs to send log messages to | | `console` | +| `LIGHTDASH_LOG_CONSOLE_LEVEL` | The minimum level of log messages to display on the console | | `LIGHTDASH_LOG_LEVEL` | +| `LIGHTDASH_LOG_CONSOLE_FORMAT` | The format of log messages on the console | | `LIGHTDASH_LOG_FORMAT` | +| `LIGHTDASH_LOG_FILE_LEVEL` | The minimum level of log messages to write to the log file | | `LIGHTDASH_LOG_LEVEL` | +| `LIGHTDASH_LOG_FILE_FORMAT` | The format of log messages in the log file | | `LIGHTDASH_LOG_FORMAT` | +| `LIGHTDASH_LOG_FILE_PATH` | The path to the log file | | `./logs/all.log` | diff --git a/docs/self-host/customize-deployment/configure-smtp-for-lightdash-email-notifications.mdx b/docs/self-host/customize-deployment/configure-smtp-for-lightdash-email-notifications.mdx new file mode 100644 index 0000000..b72e488 --- /dev/null +++ b/docs/self-host/customize-deployment/configure-smtp-for-lightdash-email-notifications.mdx @@ -0,0 +1,21 @@ +--- +sidebar_label: SMTP for emails +--- + +# Configure SMTP for Lightdash email notifications + +This is a reference to all the SMTP environment variables that can be used to configure a Lightdash email client. + +| Variable | Description | Required? | Default | +| ------------------------------- | -------------------------------------------------------------------------- | --------- | --------- | +| `EMAIL_SMTP_HOST` | Hostname of email server | βœ… | | +| `EMAIL_SMTP_PORT` | Port of email server | | 587 | +| `EMAIL_SMTP_SECURE` | Secure connection | | true | +| `EMAIL_SMTP_USER` | Auth user | βœ… | | +| `EMAIL_SMTP_PASSWORD` | Auth password | [1] | | +| `EMAIL_SMTP_ACCESS_TOKEN` | Auth access token for Oauth2 authentication | [1] | | +| `EMAIL_SMTP_ALLOW_INVALID_CERT` | Allow connection to TLS server with self-signed or invalid TLS certificate | | false | +| `EMAIL_SMTP_SENDER_EMAIL` | The email address that sends emails | βœ… | | +| `EMAIL_SMTP_SENDER_NAME` | The name of the email address that sends emails | | Lightdash | + +[1] `EMAIL_SMTP_PASSWORD` or `EMAIL_SMTP_ACCESS_TOKEN` needs to be provided diff --git a/docs/self-host/customize-deployment/configure-standalone-scheduled-worker.md b/docs/self-host/customize-deployment/configure-standalone-scheduled-worker.md new file mode 100644 index 0000000..b9e2781 --- /dev/null +++ b/docs/self-host/customize-deployment/configure-standalone-scheduled-worker.md @@ -0,0 +1,91 @@ +--- +sidebar_label: Standalone scheduler worker +--- + +# Configure a standalone scheduler worker for self-hosted Lightdash + +By default, the Lightdash server runs a scheduler worker. +For more advanced infrastructure, we can run the scheduler worker separately from the main server. + +### 1. Disable scheduler worker in the main server + +Set the following environment variable value: + +``` +SCHEDULER_ENABLED=false +``` + +### 2. Run standalone schedule worker + +Command to start scheduler worker: + +``` +yarn workspace backend scheduler +``` + +Note that it expects the same environment variables as the main server. + +### Example docker-compose.yml + +``` +version: "3.8" +x-environment: &commonEnvironment + - PGHOST=${PGHOST:-db} + - PGPORT=${PGPORT:-5432} + - PGUSER=${PGUSER:-postgres} + - PGPASSWORD=${PGPASSWORD} + - PGDATABASE=${PGDATABASE:-postgres} + - SECURE_COOKIES=${SECURE_COOKIES:-false} + - TRUST_PROXY=${TRUST_PROXY:-false} + - LIGHTDASH_SECRET=${LIGHTDASH_SECRET} + - PORT=${PORT:-8080} + - SITE_URL=${SITE_URL} + - EMAIL_SMTP_HOST=${EMAIL_SMTP_HOST} + - EMAIL_SMTP_PORT=${EMAIL_SMTP_PORT} + - EMAIL_SMTP_SECURE=${EMAIL_SMTP_SECURE} + - EMAIL_SMTP_USER=${EMAIL_SMTP_USER} + - EMAIL_SMTP_PASSWORD=${EMAIL_SMTP_PASSWORD} + - EMAIL_SMTP_ALLOW_INVALID_CERT=${EMAIL_SMTP_ALLOW_INVALID_CERT} + - EMAIL_SMTP_SENDER_NAME=${EMAIL_SMTP_SENDER_NAME} + - EMAIL_SMTP_SENDER_EMAIL=${EMAIL_SMTP_SENDER_EMAIL} + - HEADLESS_BROWSER_HOST=headless-browser + - HEADLESS_BROWSER_PORT=3000 +services: + headless-browser: + image: browserless/chrome + restart: always + ports: + - "3001:3000" + + db: + image: postgres + restart: always + environment: + POSTGRES_PASSWORD: ${PGPASSWORD} + POSTGRES_USER: ${PGUSER:-postgres} + POSTGRES_DB: ${PGDATABASE:-postgres} + volumes: + - db-data:/var/lib/postgresql/data + + lightdash: + image: lightdash/lightdash:latest + depends_on: + - db + environment: + <<: *commonEnvironment + SCHEDULER_ENABLED: 'false' + volumes: + - "${DBT_PROJECT_DIR}:/usr/app/dbt" + ports: + - ${PORT:-8080}:${PORT:-8080} + + scheduler: + image: lightdash/lightdash:latest + entrypoint: ["yarn", "workspace", "backend", "scheduler"] + depends_on: + - db + environment: *commonEnvironment + +volumes: + db-data: +``` diff --git a/docs/self-host/customize-deployment/enable-headless-browser-for-lightdash.mdx b/docs/self-host/customize-deployment/enable-headless-browser-for-lightdash.mdx new file mode 100644 index 0000000..be0c1f0 --- /dev/null +++ b/docs/self-host/customize-deployment/enable-headless-browser-for-lightdash.mdx @@ -0,0 +1,51 @@ +--- +sidebar_label: Headless browser +--- + +import HeadlessBrowserSchema from './assets/headless-browser-schema.png'; + +# Add headless browser on self-hosting + +We use a chrome headless browser to generate images from your charts and dashboards so we can send them via email or Slack. + +Images can be requested on `Slack unfurl` or using our `Scheduler` + +If you are running Lightdash on self-hosting, you will also have to run this headless browser on your infrastructure. + +## How it works + + + +When Lightdash needs to generate an image, it will open a new socket connection to the headless browser on `ws://HEADLESS_BROWSER_HOST:HEADLESS_BROWSER_PORT` + +Then using `playwright` we will browse the chart/dashboard on lightdash on `SITE_URL` + +We load the chart/dashboard on the browser and then a screenshot when it finishes loading + +Then we store that image in S3 (if enabled) or locally and then return the image URL. + +If the image was requested by Slack unfurl, we will unfurl the image using the Slack API. +If the image was requested by Scheduler, we will send the image to the destination(s) (email or Slack) + +## Configure headless browser on Lightdash + +In order to make this work, there are a few key ENV variables that need to be configured correctly. + +- `HEADLESS_BROWSER_HOST` : If you're running docker, this could be `headless-browser`, or `localhost` if you're running it locally (or with network:host) +- `HEADLESS_BROWSER_PORT` : Optional port for headless browser, defaults to 3001 +- `SITE_URL` : The URL for your Lightdash instance. + +:::info + +This SITE_URL variable (eg: https://eu1.lightdash.cloud) needs to be accessible from this headless browser service, either by a local connection, or via Internet. +Otherwise it will not be able to open a page and generate the image. + +This means that if you are using docker locally, make sure the headless browser pod can reach the lightdash pod. +Or follow the [docker documentation](https://docs.docker.com/compose/compose-file/compose-file-v3/#network_mode) to enable `network:host` + +::: diff --git a/docs/self-host/customize-deployment/enable-scheduler-in-self-hosted-lightdash.mdx b/docs/self-host/customize-deployment/enable-scheduler-in-self-hosted-lightdash.mdx new file mode 100644 index 0000000..af894fc --- /dev/null +++ b/docs/self-host/customize-deployment/enable-scheduler-in-self-hosted-lightdash.mdx @@ -0,0 +1,7 @@ +--- +sidebar_label: Scheduler +--- + +# Enable the scheduler in self-hosted Lightdash + +Coming soon diff --git a/docs/self-host/customize-deployment/environment-variables.mdx b/docs/self-host/customize-deployment/environment-variables.mdx new file mode 100644 index 0000000..afde417 --- /dev/null +++ b/docs/self-host/customize-deployment/environment-variables.mdx @@ -0,0 +1,109 @@ +# Environment variables + +This is a reference to all environment variables that can be used to configure a Lightdash deployment. + +| Variable | Description | Required? | Default | +| -------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------- | --------------------------------------------------------------- | +| `PGHOST` | Hostname of postgres server to store Lightdash data | βœ… | | +| `PGPORT` | Port of postgres server to store Lightdash data | βœ… | | +| `PGUSER` | Username of postgres user to access postgres server to store Lightdash data | βœ… | | +| `PGPASSWORD` | Password for `PGUSER` | βœ… | | +| `PGDATABASE` | Database name inside postgres server to store Lightdash data | βœ… | | +| `PGCONNECTIONURI` | Connection URI for postgres server to store Lightdash data in the format `postgresql://user:password@host:port/db?params` | | This is an alternative to providing the previous `PG` variables | +| `LIGHTDASH_SECRET` | Secret key used to secure various tokens in Lightdash. This **must** be fixed between deployments. If the secret changes, you won't have access to Lightdash data. | βœ… | | +| `SECURE_COOKIES` | Only allows cookies to be stored over a `https` connection. We use cookies to keep you logged in. This is recommended to be set to `true` in production. | | `false` | +| `COOKIES_MAX_AGE_HOURS` | How many hours a user session exists before the user is automatically signed out. For example if 24, then the user will be automatically after 24 hours of inactivity. | | | +| `TRUST_PROXY` | This tells the Lightdash server that it can trust the `X-Forwarded-Proto` header it receives in requests. This is useful if you use `SECURE_COOKIES=true` behind a HTTPS terminated proxy that you can trust. | | `false` | +| `SITE_URL` | Site url where Lightdash is being hosted. It should include the protocol. E.g https://lightdash.mycompany.com | | `http://localhost:8080` | +| `INTERNAL_LIGHTDASH_HOST` | Internal Lightdash host for the Headless browser to send requests when your Lightdash instance is not accessible from the Internet. | | Same as SITE_URL | +| `STATIC_IP` | Server static IP so users can add the IP to their warehouse allow-list. | | `http://localhost:8080` | +| `LIGHTDASH_QUERY_MAX_LIMIT` | Query max rows limit | | `5000` | +| `SCHEDULER_ENABLED` | Enables/Disables the scheduler worker that triggers the scheduled deliveries. | | `true` | +| `SCHEDULER_CONCURRENCY` | How many scheduled delivery jobs can be processed concurrently. | | `1` | +| `SCHEDULER_JOB_TIMEOUT` | After how many milliseconds the job should be timeout so the scheduler worker can pick other jobs. | | `600000` (10 minutes) | +| `LIGHTDASH_CSV_CELLS_LIMIT` | Max cells on CSV file exports | | `100000` | +| `LIGHTDASH_CHART_VERSION_HISTORY_DAYS_LIMIT` | Configure how far back the chart versions history goes in days | | `3` | +| `LIGHTDASH_PIVOT_TABLE_MAX_COLUMN_LIMIT` | Configure maximum number of columns in pivot table | | `60` | +| `GROUPS_ENABLED` | Enables/Disables groups functionality | | `false` | +| `AUTH_ENABLE_OIDC_LINKING` | Enables/Disables linking the new OIDC(aka SSO) identity to an existing user if they already have another OIDC with the same email | | `false` | + +Lightdash also accepts all [standard postgres environment variables](https://www.postgresql.org/docs/9.3/libpq-envars.html) + +## SMTP environment variables + +This is a reference to all the SMTP environment variables that can be used to configure a Lightdash email client. + +| Variable | Description | Required? | Default | +| ------------------------------- | -------------------------------------------------------------------------- | --------- | --------- | +| `EMAIL_SMTP_HOST` | Hostname of email server | βœ… | | +| `EMAIL_SMTP_PORT` | Port of email server | | 587 | +| `EMAIL_SMTP_SECURE` | Secure connection | | true | +| `EMAIL_SMTP_USER` | Auth user | βœ… | | +| `EMAIL_SMTP_PASSWORD` | Auth password | [1] | | +| `EMAIL_SMTP_ACCESS_TOKEN` | Auth access token for Oauth2 authentication | [1] | | +| `EMAIL_SMTP_ALLOW_INVALID_CERT` | Allow connection to TLS server with self-signed or invalid TLS certificate | | false | +| `EMAIL_SMTP_SENDER_EMAIL` | The email address that sends emails | βœ… | | +| `EMAIL_SMTP_SENDER_NAME` | The name of the email address that sends emails | | Lightdash | + +[1] `EMAIL_SMTP_PASSWORD` or `EMAIL_SMTP_ACCESS_TOKEN` needs to be provided + +## SSO environment variables + +These variables enable you to control Single Sign On (SSO) functionality. + +| Variable | Description | Required? | Default | +| -------------------------------------- | -------------------------------------------------------------------------------- | --------- | ------- | +| `AUTH_DISABLE_PASSWORD_AUTHENTICATION` | If `"true"` disables signing in with plain passwords | | false | +| `AUTH_ENABLE_GROUP_SYNC` | If `"true"` enables assigning SSO groups to Lightdash groups | | false | +| `AUTH_GOOGLE_OAUTH2_CLIENT_ID` | Required for Google SSO | | | +| `AUTH_GOOGLE_OAUTH2_CLIENT_SECRET` | Required for Google SSO | | | +| `AUTH_OKTA_OAUTH_CLIENT_ID` | Required for Okta SSO | | | +| `AUTH_OKTA_OAUTH_CLIENT_SECRET` | Required for Okta SSO | | | +| `AUTH_OKTA_OAUTH_ISSUER` | Required for Okta SSO | | | +| `AUTH_OKTA_DOMAIN` | Required for Okta SSO | | | +| `AUTH_OKTA_AUTHORIZATION_SERVER_ID` | Optional for Okta SSO with a custom authorization server | | | +| `AUTH_OKTA_EXTRA_SCOPES` | Optional for Okta SSO scopes (e.g. groups) without a custom authorization server | | | +| `AUTH_ONE_LOGIN_OAUTH_CLIENT_ID` | Required for One Login SSO | | | +| `AUTH_ONE_LOGIN_OAUTH_CLIENT_SECRET` | Required for One Login SSO | | | +| `AUTH_ONE_LOGIN_OAUTH_ISSUER` | Required for One Login SSO | | | +| `AUTH_AZURE_AD_OAUTH_CLIENT_ID` | Required for Azure AD | | | +| `AUTH_AZURE_AD_OAUTH_CLIENT_SECRET` | Required for Azure AD | | | +| `AUTH_AZURE_AD_OAUTH_TENANT_ID` | Required for Azure AD | | | +| `AUTH_AZURE_AD_OIDC_METADATA_ENDPOINT` | Optional for Azure AD | | | +| `AUTH_AZURE_AD_X509_CERT_PATH` | Optional for Azure AD | | | +| `AUTH_AZURE_AD_X509_CERT` | Optional for Azure AD | | | +| `AUTH_AZURE_AD_PRIVATE_KEY_PATH` | Optional for Azure AD | | | +| `AUTH_AZURE_AD_PRIVATE_KEY` | Optional for Azure AD | | | + +## Logging environment variables + +| Variable | Description | Required? | Default | +| ------------------------------ | ----------------------------------------------------------- | --------- | ---------------------- | +| `LIGHTDASH_LOG_LEVEL` | The minimum level of log messages to display | | `INFO` | +| `LIGHTDASH_LOG_FORMAT` | The format of log messages | | `pretty` | +| `LIGHTDASH_LOG_OUTPUTS` | The outputs to send log messages to | | `console` | +| `LIGHTDASH_LOG_CONSOLE_LEVEL` | The minimum level of log messages to display on the console | | `LIGHTDASH_LOG_LEVEL` | +| `LIGHTDASH_LOG_CONSOLE_FORMAT` | The format of log messages on the console | | `LIGHTDASH_LOG_FORMAT` | +| `LIGHTDASH_LOG_FILE_LEVEL` | The minimum level of log messages to write to the log file | | `LIGHTDASH_LOG_LEVEL` | +| `LIGHTDASH_LOG_FILE_FORMAT` | The format of log messages in the log file | | `LIGHTDASH_LOG_FORMAT` | +| `LIGHTDASH_LOG_FILE_PATH` | The path to the log file | | `./logs/all.log` | + +## Prometheus environment variables + +| Variable | Description | Required? | Default | +| ------------------------------------------- | ------------------------------------------------------------------------------- | --------- | --------------------------- | +| `LIGHTDASH_PROMETHEUS_ENABLED` | Enables/Disables Prometheus metrics endpoint | | `false` | +| `LIGHTDASH_PROMETHEUS_PORT` | Port for Prometheus metrics endpoint | | `9090` | +| `LIGHTDASH_PROMETHEUS_PATH` | Path for Prometheus metrics endpoint | | `/metrics` | +| `LIGHTDASH_PROMETHEUS_PREFIX` | Prefix for metric names. | | | +| `LIGHTDASH_GC_DURATION_BUCKETS` | Buckets for duration histogram in seconds. | | `0.001, 0.01, 0.1, 1, 2, 5` | +| `LIGHTDASH_EVENT_LOOP_MONITORING_PRECISION` | Precision for event loop monitoring in milliseconds. Must be greater than zero. | | `10` | +| `LIGHTDASH_PROMETHEUS_LABELS` | Labels to add to all metrics. Must be valid JSON | | | + +## Security + +| Variable | Description | Required? | Default | +| ------------------------------- | ------------------------------------------------------------------------------------------------------------------ | --------- | ------- | +| `LIGHTDASH_CSP_REPORT_ONLY` | Enables Content Security Policy (CSP) reporting only mode. This is recommended to be set to `false` in production. | | `true` | +| `LIGHTDASH_CSP_ALLOWED_DOMAINS` | List of domains that are allowed to load resources from. Values must be separated by commas. | | | +| `LIGHTDASH_CSP_REPORT_URI` | URI to send CSP violation reports to. | | | diff --git a/docs/self-host/customize-deployment/google-sheets-integration.mdx b/docs/self-host/customize-deployment/google-sheets-integration.mdx new file mode 100644 index 0000000..c2bf2f1 --- /dev/null +++ b/docs/self-host/customize-deployment/google-sheets-integration.mdx @@ -0,0 +1,26 @@ +--- +sidebar_label: Google Sheets integration +--- + +# Configure a Google Sheets integration for self-hosted Lightdash + +In this guide we will show you how you can [upload to Google Sheets in scheduled deliveries](/references/google-sheets) and +upload results from Google Sheets on `charts` on your on self-hosted Lightdash server. + +### Enable Google SSO + +To authenticate Google users, first you need to enable [Google SSO](https://docs.lightdash.com/self-host/customize-deployment/use-sso-login-for-self-hosted-lightdash#google) on your server. + +If you still want to keep users to login via email/password or another SSO provider, you can set this `AUTH_GOOGLE_ENABLED` variable to `false` + +### Create an API key for Google file picker + +We use Google Drive picker API to allow you to select your spreadsheet files on `Syncs` + +To create a Google Drive picker API you need to add a new API key in [APIs and services in Google Cloud](https://console.cloud.google.com/apis/credentials). Your Google project must have the following API's enabled: + +- Google Drive API +- Google Picker API +- Google Sheets API + +Save the API key in a new environment variable `GOOGLE_DRIVE_API_KEY` diff --git a/docs/self-host/customize-deployment/recommended-resources.mdx b/docs/self-host/customize-deployment/recommended-resources.mdx new file mode 100644 index 0000000..a0ca84c --- /dev/null +++ b/docs/self-host/customize-deployment/recommended-resources.mdx @@ -0,0 +1,25 @@ +--- +sidebar_label: Resource recommendations +--- + +# Resource recommendations + +The recommended resource requests for each Lightdash component are as follows: + +## lightdash + +- **CPU**: 475m +- **Memory**: 1.5Gi +- **Ephemeral Storage**: 1Gi + +## browserlessChrome + +- **CPU**: 1 +- **Memory**: 1Gi +- **Ephemeral Storage**: 1Gi + +## scheduler + +- **CPU**: 475m +- **Memory**: 1425Mi +- **Ephemeral Storage**: 1Gi diff --git a/docs/self-host/customize-deployment/secure-lightdash-with-https.mdx b/docs/self-host/customize-deployment/secure-lightdash-with-https.mdx new file mode 100644 index 0000000..56d010f --- /dev/null +++ b/docs/self-host/customize-deployment/secure-lightdash-with-https.mdx @@ -0,0 +1,42 @@ +--- +sidebar_label: Secure with HTTPS +--- + +# Secure Lightdash with HTTPS + +To run Lightdash in production it is highly recommended to secure it with HTTPS. This is usually done using your +cloud provider's load balancer or ingress controller. Optionally you could use a proxy service like [nginx] +(https://www.nginx.com/) or [traefik](https://traefik.io/). + +## Configuration options for HTTPS + +```yaml +# values.yaml +configMap: + # Ensures all Lightdash links use https + SITE_URL: https://lightdash.mycompany.com + + # Only allow cookies to be sent over HTTPS + SECURE_COOKIES: 'true' + + # (optional) allow http traffic behind a https enabled proxy + TRUST_PROXY: 'true' + +# Depending on your ingress implemantation you may need to set the following +service: + type: NodePort + +# Example ingress controller configuration +ingress: + enabled: true + annotations: {} + hosts: + - host: lightdash.mycompany.com + paths: + - path: /* + pathType: ImplementationSpecific + tls: + - hosts: + - lightdash.mycompany.com + secretName: lightdash-tls +``` diff --git a/docs/self-host/customize-deployment/use-sso-login-for-self-hosted-lightdash.mdx b/docs/self-host/customize-deployment/use-sso-login-for-self-hosted-lightdash.mdx new file mode 100644 index 0000000..9f474f4 --- /dev/null +++ b/docs/self-host/customize-deployment/use-sso-login-for-self-hosted-lightdash.mdx @@ -0,0 +1,205 @@ +--- +sidebar_label: SSO and auth +--- + +# Configure Lightdash to use passwords or SSO for authentication + +## Passwords + +We recommend [adding the SMTP environment variables](/references/environmentVariables#smtp-environment-variables) so Lightdash can display a `Forgot your password?` button in the login page and send emails to reset passwords. + +You can override a user password in just a few steps: + +1. Open the bash terminal for the docker Lightdash container +2. Override user password with this command: + +```shell +cd ./packages/backend && node ./dist/overrideUserPassword.js +``` + +## SSO setup + +To enforce SSO, it's recommended to disable password authentication. This can be done by setting the following environment variable: + +| Variable | Description | Required? | Default | +| -------------------------------------- | ---------------------------------------------------- | --------- | ------- | +| `AUTH_DISABLE_PASSWORD_AUTHENTICATION` | If `"true"` disables signing in with plain passwords | | false | + +## Okta + +Lightdash supports Okta as an authentication provider. The integration uses OpenID Connect (OIDC) to authenticate +users and JIT provisioning to create users in Lightdash when they first log in. + +### Creating an Okta application + +In the Okta admin panel, navigate to **Applications** and click **Create App Integration**, choose the following +settings: + +- **Sign-in method**: OIDC - OpenID Connect +- **Application type**: Web application + +On the following page you'll need to use the following settings, replace `{{ lightdash_url }}` with the URL of your +Lightdash instance. For example if you normally access Lightdash at `https://lightdash.example.com/login` then you +should use `https://lightdash.example.com` as your `{{ lightdash_url }}`. + +- **Grant type**: Authorization Code +- **Sign-in redirect URIs**: `{{ lightdash_url }}/api/v1/oauth/redirect/okta` +- **Sign-out redirect URIs**: `{{ lightdash_url }}` +- **Controlled access**: Select who can access this application + +Hit **Save** and you'll be taken to the application settings page. For the optimal user experience, we recommend +allowing Okta to initiate the login flow. To do this, click **Edit** next to **General Settings** and set: + +- **Login initiated by**: App and Okta Sign-in Page +- **Application visibility**: Display application icon to users +- **Login flow**: Redirect to app to initiate login (OIDC Compliant) +- **Initiate login URI**: `{{ lightdash_url }}/api/v1/login/okta` + +Hit **Save** to finish. + +### Okta configuration variables + +From the application settings page, you'll need to copy the following values: + +- **Client ID** +- **Client secret** + +You'll also need your **Okta domain**, which is the first part of your okta URL. For example if your Okta URL is +https://dev-123456.okta.com then your Okta domain is `dev-123456.okta.com`. + +Finally, you need the **Issuer URI**. This is the URL of your Okta authorization server. You can use +your [Org authorization server](https://developer.okta.com/docs/concepts/auth-servers/#org-authorization-server) +which uses `https://dev-123456.okta.com` as your issuer or select a custom authorization server. To find the issuer URI +for a custom authorization server navigate to **API** > **Authorization Servers** and click on the authorization +server and note the **Issuer URI** and **Name** of the authorization server. For example the `default` authorization +server has an issuer URI of `https://dev-123456.okta.com/oauth2/default`. + +#### Groups & Okta + +If you want to use groups to control access to Lightdash, you'll need to configure Okta and Lightdash to support this. + +If you're **not** using a custom authorization server ID: + +- on `OpenID Connect ID Token` section in the Okta application settings, add `groups` to the `Groups claim` field, by setting a Groups claims type to `Filter` and a Filter to match expression to `.*` + +If you're using a custom authorization server ID: + +- you don't need to set the `AUTH_OKTA_EXTRA_SCOPES` environment variable +- on the Authorization Server settings, add claim `groups`, value type `Groups`, matches regex `.*` + +### Configuring Lightdash for Okta + +You'll need to set the following environment variables in your Lightdash deployment: + +| Variable | Description | Required? | +| ----------------------------------- | -------------------------------------------------------------------------------------------------- | --------- | +| `AUTH_OKTA_DOMAIN` | The `{{ okta_domain }}`. Should not include `https://` | βœ… | +| `AUTH_OKTA_OAUTH_CLIENT_ID` | The **Client ID** copied from the application settings in okta | βœ… | +| `AUTH_OKTA_OAUTH_CLIENT_SECRET` | The **Client secret** copied from the application settings in okta | βœ… | +| `AUTH_OKTA_OAUTH_ISSUER` | The **Issuer URI** copied from the authorization server. Should include `https://` | βœ… | +| `AUTH_OKTA_AUTHORIZATION_SERVER_ID` | Optional. The **Name** of a custom authorization server if not using the org authorization server. | | +| `AUTH_OKTA_EXTRA_SCOPES` | Optional. The extra **scopes** (e.g. "groups") when not using a custom authorization server | | + +### Enable Automatic Assignment of Okta Users to Groups in Lightdash + +:::warning Deprecated feature + +This feature is deprecated and will be removed in a future release. +For more information on how to provision users and groups in Lightdash, see the [SCIM integration](/references/scim-integration.mdx) documentation. + +::: + +Okta users will automatically be assigned to the same groups in Lightdash as they are in Okta if you have [configured Okta to share groups with Lightdash](../../references/groups.mdx#using-okta-to-manage-groups-in-lightdash). To enable this functionality, ensure the following environment variable is set: + +| Variable | Description | Required? | +| ------------------------ | ----------------------------------------- | --------- | +| `AUTH_ENABLE_GROUP_SYNC` | If `"true"` enables group sync from Okta. | | + +read more about [Using OKTA to manage groups in Lightdash](/references/groups/#using-okta-to-manage-groups-in-lightdash) + +## Google + +To enable Google Single Sign On (SSO) you'll need to follow these instructions to +[Create the OAuth web client ID](https://support.google.com/workspacemigrate/answer/9222992?hl=en). +Once you reach **Step 13** to configure the client you'll need to enter the following details: + +- Authorized JavaScript Origins: `https://{{ lightdash_domain }}` +- Authorized redirect URIs: `https://{{ lightdash_domain }}/api/v1/oauth/redirect/google` + +Where `{{ lightdash_domain }}` is the domain you use to sign in to Lightdash such as `mycompany.lightdash.com` + +These environment variables must be provided to Lightdash to enable you to control Single Sign On (SSO) functionality for Google + +| Variable | Description | Required? | Default | +| ---------------------------------- | ------------------------------------------- | --------- | ------- | +| `AUTH_GOOGLE_ENABLED` | Required to be set to `true` for Google SSO | βœ… | | +| `AUTH_GOOGLE_OAUTH2_CLIENT_ID` | Required see instructions above | βœ… | | +| `AUTH_GOOGLE_OAUTH2_CLIENT_SECRET` | Required see instructions above | βœ… | | + +## One Login + +These variables enable you to control Single Sign On (SSO) functionality for One Login + +| Variable | Description | Required? | Default | +| ------------------------------------ | -------------------------- | --------- | ------- | +| `AUTH_ONE_LOGIN_OAUTH_CLIENT_ID` | Required for One Login SSO | βœ… | | +| `AUTH_ONE_LOGIN_OAUTH_CLIENT_SECRET` | Required for One Login SSO | βœ… | | +| `AUTH_ONE_LOGIN_OAUTH_ISSUER` | Required for One Login SSO | βœ… | | + +## Azure Active Directory + +### Creating an Azure AD application + +In the admin panel, navigate to **App Registrations** and click **New registration**, choose the following +settings for the redirect URI: + +- **Type**: Web +- **URI**: `{{ lightdash_url }}/api/v1/oauth/redirect/azuread` + +On the following page you'll need to use the following settings, replace `{{ lightdash_url }}` with the URL of your +Lightdash instance. For example if you normally access Lightdash at `https://lightdash.example.com/login` then you +should use `https://lightdash.example.com` as your `{{ lightdash_url }}`. + +Hit **Register** and you'll be taken to the application settings page. Copy the "Application (client) ID" and "Directory +(tenant) ID" values as you'll need them later. + +In the left hand menu, navigate to **Certificates & secrets** and click **New client secret**. Give the secret a +description and choose an expiry time. Hit **Add** and you'll be shown the secret value. Copy this value as you'll +need it later. + +### Configuring Lightdash for Azure AD + +These variables enable you to control Single Sign On (SSO) functionality for Azure Active Directory. + +| Variable | Description | Required? | Default | +| -------------------------------------- | --------------------- | --------- | ------- | +| `AUTH_AZURE_AD_OAUTH_CLIENT_ID` | Required for Azure AD | βœ… | | +| `AUTH_AZURE_AD_OAUTH_CLIENT_SECRET` | Required for Azure AD | βœ… | | +| `AUTH_AZURE_AD_OAUTH_TENANT_ID` | Required for Azure AD | βœ… | | +| `AUTH_AZURE_AD_OIDC_METADATA_ENDPOINT` | Optional for Azure AD | | | +| `AUTH_AZURE_AD_X509_CERT_PATH` | Optional for Azure AD | | | +| `AUTH_AZURE_AD_X509_CERT` | Optional for Azure AD | | | +| `AUTH_AZURE_AD_PRIVATE_KEY_PATH` | Optional for Azure AD | | | +| `AUTH_AZURE_AD_PRIVATE_KEY` | Optional for Azure AD | | | + +## OpenID Connect + +Lightdash supports OpenID Connect-compliant SSO providers, via our configurable OIDC connector. + +### Configuring Lightdash for OpenID Connect + +These variables enable you to control Single Sign On (SSO) functionality for a generic OpenID Connect provider. + +| Variable | Description | Required? | Default | +| --------------------------------- | --------------------------------------------------------------------- | --------- | --------------------- | +| `AUTH_OIDC_CLIENT_ID` | | βœ… | | +| `AUTH_OIDC_CLIENT_SECRET` | Required unless AUTH_METHOD is `private_key_jwt` | | | +| `AUTH_OIDC_METADATA_DOCUMENT_URL` | [URL to OIDC metadata discovery endpoint][providerconfrequest] | βœ… | | +| `AUTH_OIDC_AUTH_METHOD` | `client_secret_basic` or `private_key_jwt` | | `client_secret_basic` | +| `AUTH_OIDC_X509_CERT` | PEM-encoded content of a public key certificate for `private_key_jwt` | | | +| `AUTH_OIDC_PRIVATE_KEY` | PEM-encoded content of a private key file for `private_key_jwt` | | | +| `AUTH_OIDC_X509_CERT_PATH` | Path to a PEM-encoded public key certificate for `private_key_jwt` | | | +| `AUTH_OIDC_PRIVATE_KEY_PATH` | Path to a PEM-encoded private key for `private_key_jwt` | | | +| `AUTH_OIDC_SCOPES` | List of space-delimited OIDC scopes | | | + +[providerconfrequest]: https://openid.net/specs/openid-connect-discovery-1_0.html#ProviderConfigurationRequest diff --git a/docs/self-host/lightdash-cloud-vs-self-hosted.mdx b/docs/self-host/lightdash-cloud-vs-self-hosted.mdx new file mode 100644 index 0000000..818364a --- /dev/null +++ b/docs/self-host/lightdash-cloud-vs-self-hosted.mdx @@ -0,0 +1,38 @@ +--- +sidebar_position: 2 +sidebar_label: Cloud vs. Self-Hosted +--- + +# Lightdash Cloud vs. Self-Hosted + +Lightdash is open-source and licensed under the MIT license. This means that you are free to self-host Lightdash on +your own infrastructure but without any warranty or support from the Lightdash team. + +Self-hosting is great for hobbyist projects or if you want to go wild with a completely custom implementation (maybe +you'd prefer the whole app was translated into pirate-speak). +For most companies and teams, we recommend Lightdash Cloud. + +To self-host Lightdash securely in production, you should have an excellent understanding of running services +with Docker and kubernetes, as well as the security considerations. + +If you're unsure whether to self-host or use Lightdash Cloud, here are some things to consider: + +## When to use Lightdash Cloud + +Unless you have a specific need to self-host, we recommend using Lightdash Cloud: + +- Suitable for most teams +- Get started with Lightdash quickly +- Secure and reliable out-of-the-box. +- No need to maintain your own infrastructure. +- Always have the latest version of Lightdash. +- Incredible support from the core Lightdash team and maintainers. + +## When to self-host + +There are a few reasons why you might want to self-host Lightdash: + +- You're a large enterprise and want to run a proof-of-concept on your own infrastructure. This can be a great way + to get your hands on Lightdash, while your infosec team approves the use of Lightdash Cloud. +- You're a hobbyist and want to run Lightdash on your own infrastructure. +- You want to customise Lightdash to your specific needs. diff --git a/docs/self-host/self-host-lightdash-docker-compose.mdx b/docs/self-host/self-host-lightdash-docker-compose.mdx new file mode 100644 index 0000000..8757f62 --- /dev/null +++ b/docs/self-host/self-host-lightdash-docker-compose.mdx @@ -0,0 +1,60 @@ +--- +sidebar_position: 3 +sidebar_label: Host with docker compose +--- + +# Self-host Lightdash using docker compose + +This guide will give you a minimal Lightdash instance running on your local machine. It will not be accessible from +the internet, but it will be accessible from your local machine. This is a great way to get started with Lightdash +for a proof-of-concept without needing access to kubernetes. + +## Prerequisites + +- [Docker](https://docs.docker.com/get-docker/) +- [Docker Compose](https://docs.docker.com/compose/install/) + +## 1. Clone the Lightdash repository + +Clone the Lightdash code to your local machine. This will create a new directory called `./lightdash` (the Lightdash directory). + +```bash +# Clone the Lightdash repo +git clone https://github.com/lightdash/lightdash +cd lightdash +``` + +## 2. Update your ENV config + +Edit all the ENV variables in `.env` to match your setup, eg: + +``` +PGHOST=db +PGPORT=5432 +PGUSER=pg_user *OR* machine username if no prior postgres set up +PGPASSWORD=pg_password *OR* blank if no prior postgres set up +PGDATABASE=postgres +DBT_DEMO_DIR=/*path*/*to*/lightdash/project/examples/full-jaffle-shop-demo +``` + +## 3. Create containers + +You must set the following two environment variables: + +- `PGPASSWORD` is the password used for the internal postgres database +- `LIGHTDASH_SECRET` is the secret used to encrypt data at rest in the database. If you lose this secret, you will not be able to access your data in Lightdash. + +```bash + +export LIGHTDASH_SECRET="not very secret" +export PGPASSWORD="password" + +docker compose -f docker-compose.yml --env-file .env up --detach --remove-orphans +``` + +:::info + +If you have a Windows machine and get the error **Error response from daemon: i/o timeout**. +Go to **Docker > Settings > General** and enable the option **Expose daemon on tcp://localhost:2375 without TLS** + +::: diff --git a/docs/self-host/self-host-lightdash-restack.mdx b/docs/self-host/self-host-lightdash-restack.mdx new file mode 100644 index 0000000..389e7e5 --- /dev/null +++ b/docs/self-host/self-host-lightdash-restack.mdx @@ -0,0 +1,83 @@ +--- +sidebar_position: 4 +sidebar_label: Host with Restack +--- + +# Self-Host Lightdash with Restack + +Restack is a managed service for deploying and managing open-source software. + +## Deploy to AWS with Restack + +To deploy Lightdash to your own AWS with Restack: + +1. [Sign up for a Restack account](#sign-up-for-a-restack-account). +2. [Add AWS credentials with AdministratorAccess](#add-aws-credentials-with-administratoraccess). +3. [One-click cluster creation with Restack](#one-click-cluster-creation-with-restack). +4. [Deploy Lightdash on Restack](#deploy-lightdash-on-restack). +5. [Start using Lightdash](#start-using-lightdash). +6. [Deploy multiple instances of Lightdash](#deploy-multiple-instances-of-lightdash). + +### Sign up for a Restack account + +To Sign up for a Restack account, visit [www.restack.io/signup](https://www.restack.io/signup). You can sign up with your corporate email address or your GitHub profile. You do not need a credit card to sign up. +![restack-signup](./assets/restack-sign-up.png) +If you already have an account, go ahead and login to Restack at [www.restack.io/login](https://www.restack.io/login). + +### Add AWS credentials with AdministratorAccess + +To deploy Lightdash in your own AWS infrastructure with Restack, you will need to add your credentials as the next step. + +Make sure that this account has _AdministratorAccess_. This is how Restack can ensure an end-to-end cluster creation and cluster management process. + +1. Navigate to _Clusters_ in the left-hand navigation menu. +2. Select the _Credentials_ tab. +3. Click _Add credential_. + ![add-credentials](./assets/restack-add-credentials.png) +4. Give a suitable title to your credentials for managing them later. +5. Enter your _AWS Access Key ID_ and _AWS Secret Access key_. +6. Click _Add credential_. + ![add-aws-credentials](./assets/restack-add-AWS-creds.png) + +> [How to get your AWS Access key ID and AWS Secret Access Key](https://docs.aws.amazon.com/accounts/latest/reference/root-user-access-key.html) + +### One-click cluster creation with Restack + +:::tip +Why do I need a cluster?
+Running your application on a Kubernetes cluster lets you deploy, scale and monitor the application reliably. +::: +Once you have added your credentials, + +1. Navigate to the _Clusters_ tab on the same page and click on _Create cluster_. + ![create-cluster](./assets/restack-create-cluster.png) +2. Give a suitable name to your cluster. +3. Select the region you want to deploy the cluster in. +4. Select the AWS credentials you added in the previous step. + ![cluster-details](./assets/restack-cluster-details.png) + +The cluster creation process will start automatically. Once the cluster is ready, you will get an email on the email id connected with your account.
Creating a cluster is a one-time process. From here you can add other open source tools or multiple instances of Lightdash in the same cluster. + +![creating-cluster](./assets/restack-creating-cluster.png) +![cluster-created](./assets/restack-cluster-created.png) + +Any application you deploy in your cluster will be accessible via a free **restack domain**.
Contact the Restack team via chat to set a custom domain for your Lightdash instances. + +### Deploy Lightdash on Restack + +1. Click _Add application_ from the Cluster description or go to the Applications tab in the left hand side navigation. +2. Click _Lightdash_. + ![select-lightdash](./assets/select-lightdash.png) +3. Select the cluster you have already provisioned. +4. Click _Add application_. + +### Start using Lightdash + +Lightdash will be deployed on your cluster and you can access it using the link under the _URL_ tab. +![lightdash-deployed](./assets/lightdash-deployed.png) +You can also check the workloads and volumes that are deployed within Lightdash. +![access-lightdash](./assets/lightdash-access.png) + +### Deploy multiple instances of Lightdash + +Restack makes it easier to deploy multiple instances of Lightdash on the same or multiple clusters.
So you can test the latest version before upgrading or have a dedicated instance for development and for production. diff --git a/docs/self-host/self-host-lightdash.mdx b/docs/self-host/self-host-lightdash.mdx new file mode 100644 index 0000000..9a538a1 --- /dev/null +++ b/docs/self-host/self-host-lightdash.mdx @@ -0,0 +1,112 @@ +--- +sidebar_position: 1 +--- + +# Self-Host Lightdash + +Lightdash is MIT licensed and open source. You can self-host Lightdash on your own infrastructure. + +This guide is designed for DevOps Engineers that are familiar with Docker, Kubernetes, and are comfortable configuring environment variables, SMTP credentials, and database connections. +If you're unsure whether to self-host please read our guide on [Lightdash Cloud vs. Self-Hosted](./lightdash-cloud-vs-self-hosted.mdx). + +## Prerequisites for self-hosting + +- Access to a kubernetes cluster and [`kubectl`](https://kubernetes.io/docs/tasks/tools/) installed +- [Helm](https://helm.sh/docs/intro/quickstart/) +- Docker + +## Self-host Lightdash on Kubernetes + +The following steps will create a Lightdash instance and a postgres database to store your metadata (note: this is +separate to your data warehouse with your analytics data). + +We recommend using kubernetes + helm but you can alternatively follow these guides for a minimum deployment without +kubernetes: + +- [Docker compose](./self-host-lightdash-docker-compose.mdx) +- [Restack](./self-host-lightdash-restack.mdx) + +To deploy Lightdash on your Kubernetes cluster you can use our community maintained Helm chart: https://github.com/lightdash/helm-charts. +This will get you started with the simplest configuration possible. At the end of this guide you can find a list of configuration options to customise your Lightdash instance and make it production ready. + +### 1. Add the Lightdash Helm repository + +```bash +helm repo add lightdash https://lightdash.github.io/helm-charts +``` + +### 2. Create a namespace for Lightdash + +```bash +kubectl create namespace lightdash +``` + +### 3. Create a minimum configuration for Lightdash + +At minimum you should configure: + +- `secrets.LIGHTDASH_SECRET` - this variable is used by Lightdash to encrypt data at rest in the database. You must + keep this secret. If this is lost, you will not be able to access your data in Lightdash. +- `service.type` - by default the Lightdash UI and API is exposed on a `ClusterIP` service. This means that it is + only accessible from within the Kubernetes cluster. If you want to access Lightdash from outside the cluster, + you can change this to `LoadBalancer` or `NodePort`. See the [Kubernetes documentation](https://kubernetes.io/docs/concepts/services-networking/service/#publishing-services-service-types) for more information. +- `SITE_URL` - if you know the URL that Lightdash will be accessible at, you can set this variable. This will + ensure that all links in Lightdash are correct. If you don't know the URL yet, you can leave this blank and + update it later. + +Example `values.yaml` file containing our configuration: + +```yaml +# values.yaml +secrets: + LIGHTDASH_SECRET: notverysecret + +configMap: + SITE_URL: https://lightdash.mycompany.com + +service: + type: NodePort +``` + +### 4. Install Lightdash with helm + +Create a new helm release called `lightdash` using the `lightdash/lightdash` helm chart. In this example we're also +using the namespace `-n lightdash`. Finally we apply our minimum configuration from above using `-f values.yaml`. + +```bash +helm install lightdash lightdash/lightdash -n lightdash -f values.yaml +``` + +### 4 (alternative). Install Lightdash with kubectl + +If you prefer not to manage your deployment with helm, you can generate the kubernetes manifests and apply them +using `kubectl`. + +```bash +helm template lightdash lightdash/lightdash -n lightdash -f values.yaml > lightdash.yaml +kubectl apply -f lightdash.yaml +``` + +Visit your `SITE_URL` to access Lightdash! + +## Configure Lightdash for production + +Now you have a working Lightdash instance, you can customise it to your needs. The following docs cover the most +common configuration options, including those we recommend before going to production: + +**Recommended for production usage** + +- [Secure Lightdash with HTTPS](./customize-deployment/secure-lightdash-with-https.mdx) +- [Configure Lightdash to use an external database](./customize-deployment/configure-lightdash-to-use-an-external-database.mdx) +- [Configure SMTP for email notifications](./customize-deployment/configure-smtp-for-lightdash-email-notifications.mdx) +- [Configure Lightdash to use external object storage](./customize-deployment/configure-lightdash-to-use-external-object-storage.mdx) +- [Resource recommendations](./customize-deployment/recommended-resources.mdx) + +**Optional configuration** + +- [Use SSO login for self-hosted Lightdash](./customize-deployment/use-sso-login-for-self-hosted-lightdash.mdx) +- [Enable scheduler in self-hosted Lightdash](./customize-deployment/enable-scheduler-in-self-hosted-lightdash.mdx) +- [Configure a Slack App for Lightdash](./customize-deployment/configure-a-slack-app-for-lightdash.mdx) +- [Configure environment variables for Lightdash](./customize-deployment/environment-variables.mdx) +- [Enable headless browser for Lightdash](./customize-deployment/enable-headless-browser-for-lightdash.mdx) +- [Configure Logging for Lightdash](./customize-deployment/configure-logging-for-lightdash.mdx) diff --git a/docs/self-host/update-lightdash.md b/docs/self-host/update-lightdash.md new file mode 100644 index 0000000..1f3363e --- /dev/null +++ b/docs/self-host/update-lightdash.md @@ -0,0 +1,27 @@ +--- +sidebar_position: 5 +sidebar_label: Update Lightdash +--- + +# Updating Lightdash to the latest version + +## Local deployments + +If you're running Lightdash on your own laptop using Docker, you just need to instruct Docker to pull +the latest version of Lightdash: + +```shell +docker pull lightdash/lightdash +``` + +Now restart Lightdash and you'll be upgraded to the latest version. + +## Kubernetes/helm deployments + +If you install Lightdash into kubernetes using our [community helm charts](https://github.com/lightdash/helm-charts) +you need to update your helm chart repository and upgrade your deployment. + +```shell +helm repo update lightdash +helm upgrade -f values.yml lightdash lightdash/lightdash +``` diff --git a/docs/snippets/allowed-email-domains.mdx b/docs/snippets/allowed-email-domains.mdx new file mode 100644 index 0000000..566212e --- /dev/null +++ b/docs/snippets/allowed-email-domains.mdx @@ -0,0 +1,59 @@ +import AccessDomains from './assets/access-allowed-email-domains.jpg'; +import AddingDomains from './assets/add-allowed-email-domains.jpg'; +import UpdateDomains from './assets/update-allowed-email-domain-projects.png'; +import JoinWorkspace from './assets/join-workspace-prompt.png'; +import ProjectAccess from './assets/project-access.png'; + +Organization admins can add allowed email domains to their organization settings so that anyone with those email domains can automatically join their organization (without explicitly inviting them). + +To update your organization's allowed email domains setting, just go to the `general` organization settings. + + + +In the `allowed email domains` panel, enter the email domains you want to be able to automatically join your organization (e.g. here, we've added `lightdash.com`). Generic email domains like `gmail.com` or `hotmail.com` are not accepted. + +You can then select the access that you want these users to have, by default. The organization admin can always update a user's permissions after they've joined the organization! + + + +If you want to add default permissions that are different across each project, you can select the organization role of `organization member`, then set the project access for each project. + + + +Once you've selected the default roles for your allowed email domains, make sure to click `update` to save your changes. + + + +Now, when a user tries to join Lightdash, they will be prompted to join your workspace if they have one of your allowed email domains. + + + +### Setting a Default Project + +In the organization settings you can set a default project. This is the project users will see when they log in for the +first time or from a new device. If a user does not have access, they will see their next accessible project. diff --git a/docs/snippets/assets/access-allowed-email-domains.jpg b/docs/snippets/assets/access-allowed-email-domains.jpg new file mode 100644 index 0000000..c8fb647 Binary files /dev/null and b/docs/snippets/assets/access-allowed-email-domains.jpg differ diff --git a/docs/snippets/assets/add-allowed-email-domains.jpg b/docs/snippets/assets/add-allowed-email-domains.jpg new file mode 100644 index 0000000..735b829 Binary files /dev/null and b/docs/snippets/assets/add-allowed-email-domains.jpg differ diff --git a/docs/snippets/assets/add-new-dimension-overview.png b/docs/snippets/assets/add-new-dimension-overview.png new file mode 100644 index 0000000..c928275 Binary files /dev/null and b/docs/snippets/assets/add-new-dimension-overview.png differ diff --git a/docs/snippets/assets/browse-button.png b/docs/snippets/assets/browse-button.png new file mode 100644 index 0000000..c67f159 Binary files /dev/null and b/docs/snippets/assets/browse-button.png differ diff --git a/docs/snippets/assets/data-question.jpg b/docs/snippets/assets/data-question.jpg new file mode 100644 index 0000000..994805e Binary files /dev/null and b/docs/snippets/assets/data-question.jpg differ diff --git a/docs/snippets/assets/delete-custom-metric.png b/docs/snippets/assets/delete-custom-metric.png new file mode 100644 index 0000000..a4fbb46 Binary files /dev/null and b/docs/snippets/assets/delete-custom-metric.png differ diff --git a/docs/snippets/assets/dimensions-in-the-explore-view.jpg b/docs/snippets/assets/dimensions-in-the-explore-view.jpg new file mode 100644 index 0000000..783d42b Binary files /dev/null and b/docs/snippets/assets/dimensions-in-the-explore-view.jpg differ diff --git a/docs/snippets/assets/download-chart.png b/docs/snippets/assets/download-chart.png new file mode 100644 index 0000000..3e191a5 Binary files /dev/null and b/docs/snippets/assets/download-chart.png differ diff --git a/docs/snippets/assets/drill-by-action-menu.png b/docs/snippets/assets/drill-by-action-menu.png new file mode 100644 index 0000000..a4c24df Binary files /dev/null and b/docs/snippets/assets/drill-by-action-menu.png differ diff --git a/docs/snippets/assets/drill-by-modal.png b/docs/snippets/assets/drill-by-modal.png new file mode 100644 index 0000000..03fc6ef Binary files /dev/null and b/docs/snippets/assets/drill-by-modal.png differ diff --git a/docs/snippets/assets/drill-by-source-example.png b/docs/snippets/assets/drill-by-source-example.png new file mode 100644 index 0000000..5a19f1b Binary files /dev/null and b/docs/snippets/assets/drill-by-source-example.png differ diff --git a/docs/snippets/assets/example-table.jpg b/docs/snippets/assets/example-table.jpg new file mode 100644 index 0000000..c750245 Binary files /dev/null and b/docs/snippets/assets/example-table.jpg differ diff --git a/docs/snippets/assets/explore-from-here.jpg b/docs/snippets/assets/explore-from-here.jpg new file mode 100644 index 0000000..c060dc8 Binary files /dev/null and b/docs/snippets/assets/explore-from-here.jpg differ diff --git a/docs/snippets/assets/explore-screenshot.jpg b/docs/snippets/assets/explore-screenshot.jpg new file mode 100644 index 0000000..01f62ca Binary files /dev/null and b/docs/snippets/assets/explore-screenshot.jpg differ diff --git a/docs/snippets/assets/export-csv-or-google-sheets.png b/docs/snippets/assets/export-csv-or-google-sheets.png new file mode 100644 index 0000000..adadc09 Binary files /dev/null and b/docs/snippets/assets/export-csv-or-google-sheets.png differ diff --git a/docs/snippets/assets/github-actions.png b/docs/snippets/assets/github-actions.png new file mode 100644 index 0000000..def9a56 Binary files /dev/null and b/docs/snippets/assets/github-actions.png differ diff --git a/docs/snippets/assets/github-run.png b/docs/snippets/assets/github-run.png new file mode 100644 index 0000000..944d931 Binary files /dev/null and b/docs/snippets/assets/github-run.png differ diff --git a/docs/snippets/assets/github-secrets.jpg b/docs/snippets/assets/github-secrets.jpg new file mode 100644 index 0000000..e7d58c2 Binary files /dev/null and b/docs/snippets/assets/github-secrets.jpg differ diff --git a/docs/snippets/assets/home-button.png b/docs/snippets/assets/home-button.png new file mode 100644 index 0000000..b7e237c Binary files /dev/null and b/docs/snippets/assets/home-button.png differ diff --git a/docs/snippets/assets/home-page.png b/docs/snippets/assets/home-page.png new file mode 100644 index 0000000..207d167 Binary files /dev/null and b/docs/snippets/assets/home-page.png differ diff --git a/docs/snippets/assets/join-workspace-prompt.png b/docs/snippets/assets/join-workspace-prompt.png new file mode 100644 index 0000000..57e3b9b Binary files /dev/null and b/docs/snippets/assets/join-workspace-prompt.png differ diff --git a/docs/snippets/assets/metric-on-bar-chart.png b/docs/snippets/assets/metric-on-bar-chart.png new file mode 100644 index 0000000..7783228 Binary files /dev/null and b/docs/snippets/assets/metric-on-bar-chart.png differ diff --git a/docs/snippets/assets/metrics-explore-view.jpg b/docs/snippets/assets/metrics-explore-view.jpg new file mode 100644 index 0000000..da3468f Binary files /dev/null and b/docs/snippets/assets/metrics-explore-view.jpg differ diff --git a/docs/snippets/assets/new-workflow-existing-actions.jpg b/docs/snippets/assets/new-workflow-existing-actions.jpg new file mode 100644 index 0000000..3d4de07 Binary files /dev/null and b/docs/snippets/assets/new-workflow-existing-actions.jpg differ diff --git a/docs/snippets/assets/personal-access-token.png b/docs/snippets/assets/personal-access-token.png new file mode 100644 index 0000000..e5b646c Binary files /dev/null and b/docs/snippets/assets/personal-access-token.png differ diff --git a/docs/snippets/assets/project-access.png b/docs/snippets/assets/project-access.png new file mode 100644 index 0000000..fc4a045 Binary files /dev/null and b/docs/snippets/assets/project-access.png differ diff --git a/docs/snippets/assets/results-table.png b/docs/snippets/assets/results-table.png new file mode 100644 index 0000000..b014d2d Binary files /dev/null and b/docs/snippets/assets/results-table.png differ diff --git a/docs/snippets/assets/save-chart.jpg b/docs/snippets/assets/save-chart.jpg new file mode 100644 index 0000000..5ee60d7 Binary files /dev/null and b/docs/snippets/assets/save-chart.jpg differ diff --git a/docs/snippets/assets/search-bar.gif b/docs/snippets/assets/search-bar.gif new file mode 100644 index 0000000..07215e9 Binary files /dev/null and b/docs/snippets/assets/search-bar.gif differ diff --git a/docs/snippets/assets/search-filters.gif b/docs/snippets/assets/search-filters.gif new file mode 100644 index 0000000..ddfe5fc Binary files /dev/null and b/docs/snippets/assets/search-filters.gif differ diff --git a/docs/snippets/assets/search-groups.gif b/docs/snippets/assets/search-groups.gif new file mode 100644 index 0000000..3ddc763 Binary files /dev/null and b/docs/snippets/assets/search-groups.gif differ diff --git a/docs/snippets/assets/select-table.jpg b/docs/snippets/assets/select-table.jpg new file mode 100644 index 0000000..dd88013 Binary files /dev/null and b/docs/snippets/assets/select-table.jpg differ diff --git a/docs/snippets/assets/share_chart_link_action.png b/docs/snippets/assets/share_chart_link_action.png new file mode 100644 index 0000000..b3e4377 Binary files /dev/null and b/docs/snippets/assets/share_chart_link_action.png differ diff --git a/docs/snippets/assets/sort-multiple-fields.jpg b/docs/snippets/assets/sort-multiple-fields.jpg new file mode 100644 index 0000000..97bf593 Binary files /dev/null and b/docs/snippets/assets/sort-multiple-fields.jpg differ diff --git a/docs/snippets/assets/sort-one-field.jpg b/docs/snippets/assets/sort-one-field.jpg new file mode 100644 index 0000000..f6ed95a Binary files /dev/null and b/docs/snippets/assets/sort-one-field.jpg differ diff --git a/docs/snippets/assets/sort-options.jpg b/docs/snippets/assets/sort-options.jpg new file mode 100644 index 0000000..d05e0ac Binary files /dev/null and b/docs/snippets/assets/sort-options.jpg differ diff --git a/docs/snippets/assets/three-dot-option.png b/docs/snippets/assets/three-dot-option.png new file mode 100644 index 0000000..8845700 Binary files /dev/null and b/docs/snippets/assets/three-dot-option.png differ diff --git a/docs/snippets/assets/tutorial_creating_saved_chart_explore.png b/docs/snippets/assets/tutorial_creating_saved_chart_explore.png new file mode 100644 index 0000000..3411e06 Binary files /dev/null and b/docs/snippets/assets/tutorial_creating_saved_chart_explore.png differ diff --git a/docs/snippets/assets/tutorial_exploring_the_explore_view.png b/docs/snippets/assets/tutorial_exploring_the_explore_view.png new file mode 100644 index 0000000..0897c0a Binary files /dev/null and b/docs/snippets/assets/tutorial_exploring_the_explore_view.png differ diff --git a/docs/snippets/assets/underlying-data.jpg b/docs/snippets/assets/underlying-data.jpg new file mode 100644 index 0000000..c8b0305 Binary files /dev/null and b/docs/snippets/assets/underlying-data.jpg differ diff --git a/docs/snippets/assets/update-allowed-email-domain-projects.png b/docs/snippets/assets/update-allowed-email-domain-projects.png new file mode 100644 index 0000000..62466dd Binary files /dev/null and b/docs/snippets/assets/update-allowed-email-domain-projects.png differ diff --git a/docs/snippets/automatically-deploy-your-changes-using-github-action.mdx b/docs/snippets/automatically-deploy-your-changes-using-github-action.mdx new file mode 100644 index 0000000..db67f0f --- /dev/null +++ b/docs/snippets/automatically-deploy-your-changes-using-github-action.mdx @@ -0,0 +1,45 @@ +import NewWorkflowExistingActions from './assets/new-workflow-existing-actions.jpg'; +import GithubRun from './assets/github-run.png'; +import GithubSecretsSnippet from './github-secrets.mdx'; + +If you've connected Lightdash to GitHub, you can setup a `github action` and get Lightdash to deploy your project automatically. This is the easiest way to keep Lightdash in sync with your changes in dbt. + +### Step 1: add the credentials to Github secrets + + + +### Step 2: Create deploy.yml workflow in Github + +Go to your repo, click on `Actions` menu. + +If you don't have any GitHub actions, you'll just need to click on `Configure` + +![Github actions page](./assets/github-actions.png) + +If you have some GitHub actions in your repo already, click on `New workflow`, then select `setup a workflow yourself`. + + + +Now copy [this file](https://github.com/lightdash/cli-actions/blob/main/deploy.yml) from our [cli-actions](https://github.com/lightdash/cli-actions) repo. + +Give it a nice name like `deploy-lightdash.yml` + +And commit this to your repo by clicking on `Start commit`. + +### You're done! + +Everytime you make a change to your repo, on the `main` branch, it will automatically deploy your new config into your Lightdash projects + +You can see the log on the `Github actions` page + + diff --git a/docs/snippets/exploring-your-content.mdx b/docs/snippets/exploring-your-content.mdx new file mode 100644 index 0000000..d625f20 --- /dev/null +++ b/docs/snippets/exploring-your-content.mdx @@ -0,0 +1,159 @@ +import HomeButton from './assets/home-button.png'; +import HomePage from './assets/home-page.png'; +import BrowseButton from './assets/browse-button.png'; +import SearchBar from './assets/search-bar.gif'; +import SearchFilters from './assets/search-filters.gif'; +import SearchGroups from './assets/search-groups.gif'; +import ExploreFromHere from './assets/explore-from-here.jpg'; +import SelectTable from './assets/select-table.jpg'; +import UnderlyingData from './assets/underlying-data.jpg'; +import DrillByActionMenu from './assets/drill-by-action-menu.png'; +import DrillByModal from './assets/drill-by-modal.png'; +import DrillBySourceExample from './assets/drill-by-source-example.png'; + +## Browsing the saved charts and dashboards in your project + +The easiest way to get started in Lightdash is to check out the saved charts and dashboards that your team's already made. You can see a list of some of this content on your homepage as soon as you land in Lightdash. + + + +You can always get back to your homepage by clicking on the Lightdash icon in the top-left corner of your screen. + + + +You can also browse the lists of all of the saved charts, dashboards, and Spaces that you and your teammates have made in your project by clicking on `Browse` in your navbar. + + + +## Using the search bar + +If you already know what you're looking for, you can use the search bar to search through all the content in your Lightdash project. Just click on the search bar at the top of your screen, or press `Cmd + K` (Mac) or `Ctrl + K` (Windows, Linux) to open the search bar. + + + +This global search feature matches content from everywhere in the project. You can search for dashboards, charts, spaces, tables, and fields by their names and descriptions. It is now more powerful, with the ability to filter results and group them for easier navigation. + +### Search filters + +Enhance your search experience by applying filters directly in the search bar. Specify what you're looking for by content type, and narrow down results by dates, either by choosing a range (e.g., "from: January 10, 2024, to: January 20, 2024") or a single date ("from: January 10, 2024"). You can also filter results by the creator of the content, making it easier to find items created by specific team members. + + + +### Search groups + +Search results are organized into groups, making navigation through the findings simpler. Items within each group are sorted by their relevance to your query, ensuring that the most pertinent results are always easy to find. This organization aids in quickly identifying the exact type of content you're searching for, whether it be a chart, dashboard, or any other entity within your project. + + + +## Exploring data in a chart + +### View underlying data in a chart or your results table + +You can click on any point on a chart or any cell in a results table and view the records which make up that data point. + +For example, I can click on the page views bar in my chart or the value in the results table cell and I'd see all of the rows in the underlying table that make up the 19,120 page views count. + +I can then export this as a CSV or explore from this underlying data. + + + +#### You can specify which fields are shown when someone clicks on `view underlying data` + +By default, we show all of the dimensions from the Table. If you have fields from a joined table included in your results table, then we'll also show you all of the fields from the joined Table. + +If you don't want all of the fields from your Table shown, then you can specify which fields you want users to see when they click on `show underlying data` for a field. + +Check out the [metric](/references/metrics.mdx#show-underlying-values) reference docs to see how to do this in your Table's `.yml` file. + +By default, when you click `Explore from here` from the `view underlying data` table, you're brought to an Explore view with no fields selected. If you specify fields in `show underlying data`, then these fields will be automatically added to the results table, so users won't `Explore from here` into an empty results table. + +### Drill into a metric in a chart or your results table using `drill by` + +You can drill into a metric in your chart or results table to better understand a point in your chart. Selecting `drill by` lets you group your metric by a dimension, like the total revenue segmented by (or grouped by) product type. Note that `drill by` only works for metrics, not for dimensions or table calculations. + +#### Here's an example of how to use drill by + +I have a chart with the total number of page views (a metric) over time. You can see, there's a spike in October, so I want to drill into that data point and see where this traffic is coming from... + +To do this, I click on the data point in my chart, then click `drill by` in the action menu: + + + +I then select the dimension I want to segment my metric by (or "drill by"). In this example, I'm interested in grouping the total page views by the `source` so I can figure out where this traffic is coming from. + + + +Once I've selected the dimension I want to group by, I click `open in new tab` and see a chart with my metric, grouped by `Source`. Now I can uncover where this spike in web traffic was coming from πŸ‘€ + + + +## Exploring data in a dashboard + +Dashboards allow you to arrange multiple charts that are related to each other into a single view. + +You can interact with dashboards in your project in a few different ways. [Learn more about it here](/guides/interactive-dashboards.mdx). + +## Using "Explore from here" to explore from existing charts + +One of the best ways of exploring data is using saved charts and charts in dashboards as the starting point to your data exploration. You can do this in Lightdash using the `Explore from here` button. + +`Explore from here` gives you a copy of the same chart you can play around with. Any changes you make here **will not affect** the original chart - so you can Explore away without any worry of breaking things! + +If you've never used the Explore View, then checkout this tutorial on [using the Explore View in Lightdash](/get-started/exploring-data/using-explores). + + + +## Exploring from scratch with Tables + +If you can't find any relevant saved charts or dashboards that answer your question, you can always explore your Tables from scratch. + +To start an Explore view from scratch, just click on `Explore` --> `Tables` --> then select the table that you want to explore. + +If you've never used the Explore View, then checkout this tutorial on [using the Explore View in Lightdash](/get-started/exploring-data/using-explores). + + diff --git a/docs/snippets/github-secrets.mdx b/docs/snippets/github-secrets.mdx new file mode 100644 index 0000000..bddbf72 --- /dev/null +++ b/docs/snippets/github-secrets.mdx @@ -0,0 +1,210 @@ +import PersonalAccessToken from './assets/personal-access-token.png'; +import GithubSecrets from './assets/github-secrets.jpg'; + +We are going to add some secrets and config to GitHub actions, but you don't want those to be public, so the best way to do this is to add them as secrets on Github. + +:::info +If you already have a GitHub action for Lightdash, then you can use the same Lightdash secrets you created for your other action. +::: + +Go to your repo, click on `Settings` , on the left sidebar, click on `Secrets` under `Security`. Now click on the `New repository secret` + + + +We need to add the following secrets: + +#### `LIGHTDASH_API_KEY` + +Create a new personal access token, by going to `Settings` > `Personal Access Tokens`. This is the token you'll put in for `LIGHTDASH_API_KEY`. + + + +#### `LIGHTDASH_PROJECT` + +The UUID for your project. For example, if your URL looks like `https://eu1.lightdash.cloud/projects/3538ab33-dc90-aabb-bc00-e50bba3a5f69/tables`, then `3538ab33-dc90-45f0-aabb-e50bba3a5f69` is your `LIGHTDASH_PROJECT` + +#### `LIGHTDASH_URL` + +This is either `https://eu1.lightdash.cloud` or `https://app.lightdash.cloud` for Lightdash Cloud users (check the URL to your Lightdash project). +If you self-host, this should be your own custom domain. + +#### `DBT_PROFILES` + +Some tips for this bit: + +- You might be able to copy a bunch of the information from your local `profiles.yml` file. You can see what's in there by typing `cat ~/.dbt/profiles.yml` in your terminal. +- If you have a separate `prod` and `dev` profile, you probably want to use the information from your `prod` profile for your GitHub action. +- If you want to have different connection settings depending on the user that opened the pull request (dev profiles), then [check out this guide](/guides/cli/how-to-use-lightdash-preview#how-to-use-the-developer-credentials-in-your-preview-project). + +Find your data warehouse from the list below to get a profiles.yml file template. Fill out this template, and this is your `DBT_PROFILES` secret. + +
+ BigQuery + BigQuery OAuth: + +Step 1: create a secret called `GOOGLE_APPLICATION_CREDENTIALS` + +Add the service account credentials (the JSON file) that you want to use for your GitHub action. It should look something like this: + +```json +{ + "type": "service_account", + "project_id": "jaffle_shop", + "private_key_id": "12345", + "private_key": "-----BEGIN PRIVATE KEY----- ... -----END PRIVATE KEY-----\n", + "client_email": "jaffle_shop@jaffle_shop.iam.gserviceaccount.com", + "client_id": "12345", + "auth_uri": "https://accounts.google.com/o/oauth2/auth", + "token_uri": "https://oauth2.googleapis.com/token", + "auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs", + "client_x509_cert_url": "https://www.googleapis.com/robot/v1/metadata/x509/jaffle_shop" +} +``` + +Step 2: create another secret called `DBT_PROFILES` + +Copy-paste this template into the secret and fill out the details. + +This will always use this project connection in your GitHub actions. If you want your preview projects to have different connection settings depending on the user that opened the pull request (dev profiles), then see what you need to add to your secret [in this guide](/guides/cli/how-to-use-lightdash-preview#how-to-use-the-developer-credentials-in-your-preview-project). + +```yaml +[my-bigquery-db]: # this is the name of your project + target: dev + outputs: + dev: + type: bigquery + method: oauth + keyfile: keyfile.json # no need to change this! We'll automatically use the keyfile you created in the last step. + project: [GCP project id] + dataset: [the name of your dbt dataset] +``` + +More info in dbt's profiles docs: https://docs.getdbt.com/reference/warehouse-profiles/bigquery-profile#service-account-file + +
+ +
+ Postgres + Postgres profile configuration: + +```yaml +company-name: + target: dev + outputs: + dev: + type: postgres + host: [hostname] + user: [username] + password: [password] + port: [port] + dbname: [database name] + schema: [dbt schema] + threads: [1 or more] + keepalives_idle: 0 + connect_timeout: 10 + retries: 1 +``` + +More info in dbt's profiles docs: https://docs.getdbt.com/reference/warehouse-profiles/postgres-profile#profile-configuration + +This will always use this project connection in your GitHub actions. If you want your preview projects to have different connection settings depending on the user that opened the pull request (dev profiles), then see what you need to add to your secret [in this guide](/guides/cli/how-to-use-lightdash-preview#how-to-use-the-developer-credentials-in-your-preview-project). + +
+ +
+ Redshift + Redshift password-based authentication: + +```yaml +company-name: + target: dev + outputs: + dev: + type: redshift + host: [hostname.region.redshift.amazonaws.com] + user: [username] + password: [password] + port: 5439 + dbname: analytics + schema: analytics + threads: 4 + keepalives_idle: 240 + connect_timeout: 10 + ra3_node: true # enables cross-database sources +``` + +More info in dbt's profiles docs: https://docs.getdbt.com/reference/warehouse-profiles/redshift-profile#password-based-authentication + +This will always use this project connection in your GitHub actions. If you want your preview projects to have different connection settings depending on the user that opened the pull request (dev profiles), then see what you need to add to your secret [in this guide](/guides/cli/how-to-use-lightdash-preview#how-to-use-the-developer-credentials-in-your-preview-project). + +
+ +
+ Snowflake + User / Password authentication: + +```yaml +my-snowflake-db: + target: dev + outputs: + dev: + type: snowflake + account: [account id] + + # User/password auth + user: [username] + password: [password] + + role: [user role] + database: [database name] + warehouse: [warehouse name] + schema: [dbt schema] + threads: [1 or more] + client_session_keep_alive: False + query_tag: [anything] +``` + +More info in dbt's profiles docs: https://docs.getdbt.com/reference/warehouse-profiles/snowflake-profile#user--password-authentication + +This will always use this project connection in your GitHub actions. If you want your preview projects to have different connection settings depending on the user that opened the pull request (dev profiles), then see what you need to add to your secret [in this guide](/guides/cli/how-to-use-lightdash-preview#how-to-use-the-developer-credentials-in-your-preview-project). + +
+ +
+ DataBricks + Set up a DataBricks target: + +```yaml +your_profile_name: + target: dev + outputs: + dev: + type: databricks + catalog: + [ + optional catalog name, + if you are using Unity Catalog, + only available in dbt-databricks>=1.1.1, + ] + schema: [schema name] + host: [yourorg.databrickshost.com] + http_path: [/sql/your/http/path] + token: [dapiXXXXXXXXXXXXXXXXXXXXXXX] # Personal Access Token (PAT) + threads: [1 or more] +``` + +More info in dbt's profiles docs: https://docs.getdbt.com/reference/warehouse-profiles/bigquery-profile#service-account-json + +This will always use this project connection in your GitHub actions. If you want your preview projects to have different connection settings depending on the user that opened the pull request (dev profiles), then see what you need to add to your secret [in this guide](/guides/cli/how-to-use-lightdash-preview#how-to-use-the-developer-credentials-in-your-preview-project). + +
diff --git a/docs/snippets/how-to-create-dimensions.mdx b/docs/snippets/how-to-create-dimensions.mdx new file mode 100644 index 0000000..b291ca3 --- /dev/null +++ b/docs/snippets/how-to-create-dimensions.mdx @@ -0,0 +1,187 @@ +import DimensionsExploreView from './assets/dimensions-in-the-explore-view.jpg'; +import ExampleTable from './assets/example-table.jpg'; +import Overview from './assets/add-new-dimension-overview.png'; + +# Adding dimensions + + + +**Dimensions** are fields that are used to **segment data** from your Tables. They are **directly linked to a column in a dbt model**. + +For a dimension to exist in Lightdash, it needs to be a column in your dbt model first. + +:::tip + +**New to dbt?** If you haven't used dbt before, [follow dbt's getting started guide](https://docs.getdbt.com/tutorial/setting-up) +before proceeding with setting up Lightdash. + +::: + +## What are dimensions? + +Lightdash dimensions are columns that have been defined in your dbt project's .yml files. Basically, they're just the fields from your data models in dbt. + +For example, the following dbt project file contains properties that create a single dimension, `source`, for the `Pages` Table in Lightdash: + +```yaml +version: 2 +models: + - name: Pages + description: "A table of all page views on Lightdash webpages." + columns: + - name: source + description: "The source of the page view: the demo site, docs site, or lightdash.com" + ... +``` + +The name of the dimension is `source` and the type will be inferred from the column in your database. You can see the [full list of dimension types supported in Lightdash here](/references/dimensions.mdx#dimension-types). + +Once you've added your dimensions, you can use them in Lightdash to build charts and filter results. Dimensions appear in the Explore view, above metrics and, if selected, pop us as blue fields in your results table. + + + +--- + +## You can create dimensions using the CLI or manually. + +### Option 1: Create dimensions in Lightdash using the CLI command `lightdash generate -s my_model` + +:::info + +**This tutorial assumes you've set up the Lightdash CLI** + +If you haven't installed the Lightdash CLI yet, then [follow this guide to installing and setting it up](/guides/cli/how-to-install-the-lightdash-cli). + +::: + +If you've added a new field (or many fields) to your dbt project, you can generate .yml for it so that it is available in Lightdash. + +All you need to do is run this in your terminal: + +```shell +lightdash generate -s my_model # replace my_model with the name of your model +``` + +This command will update the model's .yml file with any new dimensions. + +If you haven't run your dbt model yet, then you can combine running the model and generating the .yml for it in a single command: + +```shell +lightdash dbt run -s my_model # replace my_model with the name of your model +``` + +This command will run your dbt model (i.e. update the table in your data warehouse), then it will update the model's .yml file with any new dimensions. + +Now, you should have your model .yml file with its new dimensions added in! + +--- + +### Option 2: Create dimensions in Lightdash by manually adding columns to your .yml files + +We recommend using the CLI because it's faster and more reliable. But, if you're keen to do some manual documenting, then you can just add columns to your dbt .yml files and they will appear as dimensions in Lightdash. + +For example, if I had a column in my dbt model called `source` and I wanted to add it as a dimension to Lightdash, I would just add the column to my .yml file like so: + +```yaml +version: 2 +models: + - name: Pages + description: "A table of all page views on Lightdash webpages." + columns: + - name: source + description: "The source of the page view: the demo site, docs site, or lightdash.com" + ... +``` + +--- + +## Preview your changes using `lightdash preview` + +Once you've added a dimension to your dbt model, you might want to check to make sure that it's working the way you'd expect. This is where `lightdash preview` comes in handy. + +[Developer previews](/guides/cli/how-to-use-lightdash-preview.mdx) are temporary Lightdash projects where you can safely experiment with your metrics, dimensions and charts without affecting your production project. + +So, let's spin up a developer preview and check out our changes. In your terminal, run the commands: + +```shell +lightdash preview +``` + +Then `cmd` + `click` to open the preview link from your terminal. Once you're in Lightdash go to `Explore` --> `Tables`, then click on the model you just updated to see your `test` column and play around with it. + +--- + +## Configure your dimensions + +You can jazz up your dimensions by configuring them in your .yml files. These dimension configurations live under the `meta` tag of your columns, under `dimension`: + +```yaml +version: 2 +models: + - name: orders + description: "A table of all orders." + columns: + - name: status + description: "Status from org256 settings codes. Referenced at delivery from stat5 zone." + meta: + dimension: + label: "Status latest" + description: "Status of an order: ordered/processed/complete" + ...etc +``` + +Things like the format, the label that people see in Lightdash, rounding, etc. - these are all configurations that you can apply to your dimensions. + +You can [see all of the dimension configurations in our dimensions reference doc here](/references/dimensions.mdx#dimension-configuration). + +--- + +## Deploy your changes to production + +There are two ways to do this: + +### Option 1: Deploy your changes using the CLI + +If you're working with a version controlled project, you'll just want to make sure to merge your changes into the branch you've connected to your Lightdash project (e.g. `main` or `master`). You'll also want to make sure that you've **run your dbt models so that your new columns exist in your data warehouse**. + +Once they've been merged or if you're just working off of `main` (_rebel_ 😏), you can deploy your changes. Just run these commands in your terminal from your dbt project: + +```shell +git checkout main # checkout main or master - or whatever your production branch name is +git pull +lightdash deploy # --target prod. If you use developer profiles in your dbt project, you might need this flag. See below. +``` + +This will deploy the changes in your dbt project to the Lightdash project you set up on your CLI tool earlier. + +:::info + +**Note:** Lightdash's deploy command will deploy using your **default dbt target** unless you specify to use a different target. For example, if you've set up a developer profile where it targets a dev dataset (like `dbt_khindson.my_model_names`), then you'll need to pass the production target in your `lightdash deploy` command. Something like: `lightdash deploy --target prod`. + +::: + +And voilà! Just refresh the page and your new dbt dimension is available to explore in Lightdash. + +### Option 2: Deploy your changes manually + +If you're working with a version controlled project, you'll just want to make sure to merge your changes into the branch you've connected to your Lightdash project (e.g. `main` or `master`). You'll also want to make sure that you've **run your dbt models so that your new columns exist in your data warehouse**. + +Once they've been merged or if you're just working off of `main` (_rebel_ 😏), you can deploy your changes. + +To do this, you just need to hit `refresh dbt` on the Explore View page in your project. Then, the new dimensions should appear for everyone in your project, automatically. + +--- + +## Check out the [dimensions reference doc](/references/dimensions) for more information about setting up your dimensions + +In the [reference doc](/references/dimensions) you'll find all of the dimension types, configurations, and more. diff --git a/docs/snippets/how-to-create-metrics.mdx b/docs/snippets/how-to-create-metrics.mdx new file mode 100644 index 0000000..3600670 --- /dev/null +++ b/docs/snippets/how-to-create-metrics.mdx @@ -0,0 +1,155 @@ +import MetricsExploreView from './assets/metrics-explore-view.jpg'; + +## What are metrics? + +**Metrics** are used to **perform calculations** on your Tables. + +If dimensions segment your data into groups, metrics calculate interesting statistics for those groups. You can define metrics in your dbt project .yml files along with your dimensions and dbt model properties. + +For example, if we have a dimension, `status`, to split orders by their `status`, we may want to know the "Total number of orders" or the "Total sales" of the orders. These calculations are metrics: + +```yaml +# schema.yml +version: 2 +models: + - name: 'orders' + description: 'A table of all orders.' + columns: + - name: 'status' + description: 'Status of an order: ordered/processed/complete' + - name: 'order_id' + meta: + metrics: + total_order_count: + type: count_distinct + - name: 'order_value' + meta: + metrics: + total_sales: + type: sum +``` + +You can [see the full list of metric types](/references/metrics.mdx#metric-types) that you can use in your Lightdash project. + +We support metrics defined using either Lightdash or dbt syntax! You can read more about the two methods [in our reference docs here](/references/metrics.mdx#adding-metrics-to-your-project). + +Once you've added your metrics, you can use them in Lightdash to build charts and filter results. Metrics appear in the Explore view, above dimensions and, if selected, pop us as brownish-yellow fields in your results table. + + + +## Let's try adding a metric to our dbt project + +:::info + +**This tutorial assumes you've set up the Lightdash CLI** + +If you haven't installed the Lightdash CLI yet, then [follow this guide to installing and setting it up](/guides/cli/how-to-install-the-lightdash-cli). + +::: + +We're going to try adding a new metric to our dbt project, then syncing it with Lightdash. We've made this really easy to do using our CLI tool. + +### Add a metric to one of your dbt models + +Head to your dbt project, checkout a new branch (or just work on `main` if that's your style 🀠) and add a metric to one of your dbt models. + +We'd suggest starting out simple, like a `count` for a primary key in your table. + +For example: + +```yaml +# schema.yml +version: 2 +models: + - name: 'orders' + columns: + - name: 'status' + - name: 'order_id' + meta: + metrics: + total_order_count: + type: count +``` + +### Preview your changes using `lightdash preview` + +Once you've added a metric to your dbt model, you might want to check to make sure that it's working the way you'd expect. This is where `lightdash preview` comes in handy. + +**Developer previews** are temporary Lightdash projects where you can safely experiment with your metrics, dimensions and charts +without affecting your production project. + +So, let's spin up a developer preview and check out our changes. In your terminal, run the commands: + +```shell +lightdash preview +``` + +Then `cmd` + `click` to open the preview link from your terminal. Once you're in Lightdash go to `Explore` --> `Tables`, then click on the model you just updated to see your new metric and play around with it. + +### Configure your metric (optional) + +You can jazz up your metrics by configuring them in your .yml files. These metric configurations live under the `meta` tag of your columns, under `metrics`: + +```yaml +version: 2 +models: + - name: "orders" + description: "A table of all orders." + columns: + - name: "status" + description: "Status of an order: ordered/processed/complete" + - name: "order_value" + meta: + metrics: + total_sales: + type: sum + label: "Total sales (USD)" + groups: ["Sales metrics"] + round: 2 + ...etc. +``` + +Things like the format, the label that people see in Lightdash, rounding, etc. - these are all configurations that you can apply to your metrics. + +You can [see all of the metric configurations in our metrics reference doc here](/references/metrics#metric-configuration). + +### If you're happy with your new metric, you can deploy it to production. + +If you're working with a version controlled project, you'll just want to make sure to merge your changes into the branch you've connected to your Lightdash project (e.g. `main` or `master`). + +Once they've been merged or if you're just working off of `main` (_rebel_ 😏), you can deploy your changes. + +Once you've merged your changes, you'll want to deploy them to production. To do this, just run these commands in your terminal from your dbt project: + +```shell +git checkout main # checkout main or master - or whatever your production branch name is +git pull +lightdash deploy # --target prod. If you use developer profiles in your dbt project, you might need this flag. See below. +``` + +This will deploy the changes in your dbt project to the Lightdash project you set up on your CLI tool earlier. + +:::info + +**Note:** Lightdash's deploy command will deploy using your **default dbt target** unless you specify to use a different target. For example, if you've set up a developer profile where it targets a dev dataset (like `dbt_khindson.my_model_names`), then you'll need to pass the production target in your `lightdash deploy` command. Something like: `lightdash deploy --target prod`. + +::: + +And voilà! Your new metric is available to explore in Lightdash. + +--- + +## Adding custom metrics in the Explore view + +The fields that you see in your `dimensions` and `metrics` are created by the people maintaining your Lightdash project. + +But, if there's something missing from this list of metrics, you can use `custom metrics` to add some on-the-fly calculations while you're exploring. + +To read more about custom metrics, take a look at [how to create custom fields](/references/custom-fields). + +## Now, go forth and aggregate (or check out our [metrics reference sheet](/references/metrics) to further details) diff --git a/docs/snippets/how-to-install-the-lightdash-cli.mdx b/docs/snippets/how-to-install-the-lightdash-cli.mdx new file mode 100644 index 0000000..5dfbce3 --- /dev/null +++ b/docs/snippets/how-to-install-the-lightdash-cli.mdx @@ -0,0 +1,54 @@ +The Lightdash CLI is the recommended way to develop your dbt + Lightdash project. It makes development faster and +easier, as well as giving you options for building more powerful automation to manage your Lightdash instance. + +Before installing Lightdash CLI, you need to have NodeJS/NPM installed on your machine. To check that, run the following command in your terminal: + +```shell +node -v; npm -v; +# it should print something like: +# v20.8.0 +# 8.15.0 +``` + +
+ Don't have NodeJS/NPM installed in your system? + +We recommend installing NodeJS/NPM using [NVM (Node Version Manager)](https://github.com/nvm-sh/nvm#install--update-script) which works for POSIX-compliant shells (sh, dash, ksh, zsh, bash on these platforms: unix, macOS, and windows WSL) + +Open your terminal and run the command below to install NVM (Node Version Manager) to your system. + +```shell +curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.2/install.sh | bash +# or +wget -qO- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.2/install.sh | bash +``` + +Restart terminal and install NodeJS by running + +```shell +nvm install --lts +``` + +Check that NodeJS is installed by running + +```shell +node -v +``` + +Running the command above should output something like `20.8.0` which means you've succesfully installed NodeJS/NPM πŸŽ‰ + +--- + +Alternatively, you can [install NodeJS/NPM via your preferred package manager](https://nodejs.org/en/download/package-manager/). + +
+ +Run the following on your terminal to install the Lightdash CLI. + +```shell +npm install -g @lightdash/cli +``` + +:::info +If you get an `npm ERR! code EACCES` error while installing the Lightdash CLI, [follow this guide](https://docs.npmjs.com/resolving-eacces-permissions-errors-when-installing-packages-globally) to resolve it. +::: diff --git a/docs/snippets/intro-metrics-dimensions.mdx b/docs/snippets/intro-metrics-dimensions.mdx new file mode 100644 index 0000000..7289669 --- /dev/null +++ b/docs/snippets/intro-metrics-dimensions.mdx @@ -0,0 +1,25 @@ +import DataQuestion from './assets/data-question.jpg'; + +## What are metrics and dimensions? + +Metrics and dimensions are defined in your dbt project alongside your dbt model properties. + +- **Dimensions** are used to **segment data** in your Tables. +- **Metrics** are used to **perform calculations** on your Tables. + +Say we're running an ecommerce business, we probably have a table containing all order data. We might want to +ask: + + + +This question can be answered using a single metric "the total number of unique orders" and a single dimension for +splitting the metric by "status of order". In Lightdash you'd get the following chart: + +![two metrics on a bar chart](./assets/metric-on-bar-chart.png) + +To learn more about why we use dimensions and metrics in Lightdash, [read the Lightdash approach to BI](/best-practice/lightdash-way). diff --git a/docs/snippets/sharing-insights.mdx b/docs/snippets/sharing-insights.mdx new file mode 100644 index 0000000..8fb5c73 --- /dev/null +++ b/docs/snippets/sharing-insights.mdx @@ -0,0 +1,62 @@ +import SaveChart from './assets/save-chart.jpg'; +import ShareChartLink from './assets/share_chart_link_action.png'; +import DownloadChart from './assets/download-chart.png'; +import ExportCsvOrGoogleSheets from './assets/export-csv-or-google-sheets.png'; + +It's time to share your hard work with the world! + +In Lightdash there are three primary ways to share insights with your team: + +- Share a URL to a 'work-in-progress' data exploration +- Share a link to a saved chart +- Download results as a .csv or a .png of the chart + +### 1. Share a URL to work in progress + +As you explore your data in Lightdash, the URL contains a unique link to your work in progress. + +Copy and paste the url while you're exploring data and anybody with access to your Lightdash project can jump into the Explore view at exactly the same point you're at. + + + +### 2. Share a link to a saved chart + +#### Save your chart + +You can create a new saved chart or update an existing saved chart by clicking the 'Save chart' button on the chart panel. + +#### Share your chart + +Everyone in your project has access to the saved charts. All they need to do is click on `saved charts` and they can see your finished work of chart art πŸ˜šπŸ‘Œ + + + +### 3. Download results as a table or chart + +You can download your chart as .jpeg, .png, .svg, .pdf, or .json file by clicking the 'Download' button on the chart panel. + + + +You can also download your results table as a .CSV or export them to a Google Sheet, with just the click of a button. So, you can import data from Lightdash into other tools, or just save them on your computer for later πŸ˜‰ + + diff --git a/docs/snippets/using-explores.mdx b/docs/snippets/using-explores.mdx new file mode 100644 index 0000000..f787085 --- /dev/null +++ b/docs/snippets/using-explores.mdx @@ -0,0 +1,133 @@ +import ExploreScreenshot from './assets/explore-screenshot.jpg'; +import ResultsTable from './assets/results-table.png'; +import SaveChart from './assets/save-chart.jpg'; +import SelectTable from './assets/select-table.jpg'; +import SortOneField from './assets/sort-one-field.jpg'; +import SortManyFields from './assets/sort-multiple-fields.jpg'; +import SortOptions from './assets/sort-options.jpg'; + +Now that you've connected your dbt project to Lightdash, it's time to start exploring your data. + +A **Table** is the main starting point for exploring data in Lightdash. It contains a group of related +dbt models, dimensions, and metrics. You **explore Tables in the Explore view**. + +## An intro to Tables and the Explore view + +[![tutorial exploring the explore view](./assets/tutorial_exploring_the_explore_view.png)](https://youtu.be/2pQYuIT0674) + +### There are 5 areas to the Explore view + +To access the Explore view, you just need to go to `Explore` --> `Tables` -> then select the Table you want to explore. + + + +The Explore view is really made up of 5 areas: + +1. The list of metrics and dimensions available on the Table +2. The filters panel, which lets you restrict the data pulled into Lightdash +3. The chart panel to visualise the results of queries +4. The results panel to explore the results of queries as a table +5. The SQL panel, which shows the raw SQL that produced the results + + + +## How to create a saved chart from the Explore view in 5 easy steps + +[![tutorial creating saved chart explore](./assets/tutorial_creating_saved_chart_explore.png)](https://youtu.be/1hqRFy-wk98) + +### Step 1: Select the Table you want to explore + +Go to `Explore` --> `Tables` --> then select the Table that you want to explore. + + + +### Step 2: Run your query + +To run a query: + +1. Select a metric to calculate +2. Select one or more dimensions to split the metric into groups +3. Hit "Run Query" in the top right + +For example, if I wanted to know the "total number of orders split by order status", I'd select the `Unique order count` metric to calculate the number of orders and the `Status` dimension to split that by status. + +### Step 3: Order the results in your table + +Click on the three-dot-menu by your column headers and select the sorting option that you want for a column. + + + +You can have multiple sorts by adding more columns using their three-dot-menu. You can see the number of sorts applied just above your results table. + + + +You can update and change the sorting using of your table by clicking on the `sort` menu. Here, you have the option to: + +1. Drag-and-drop columns to rearrange the order of sorting multiple columns. +2. Remove a sort +3. Change the order of a column's sort + + + +### Step 4: Visualize query results as a chart + +Once the query executes, the results will show in the results table. You can then open the charts section and choose +a chart type to visualise the metric. + +You can read more about [configuring your charts here](/references/chart-types). + + + +### Step 5: Save your chart + +Saved Charts allow you to save a specific chart or visualisation so you can share it or revisit it again in future. + +When you open a saved chart, it will always update to display the latest data in your database. + + + +To save a chart: + +1. In chart panel of the Explore view you will find the button to save your chart. +2. Enter a memorable name for the chart, a good idea is to use a question as the name "How many orders are there at each stage?" +3. Click on `Saved charts` to see your finished work of art πŸ˜šπŸ‘Œ diff --git a/docusaurus-rudderstack-plugin/index.js b/docusaurus-rudderstack-plugin/index.js new file mode 100644 index 0000000..a503149 --- /dev/null +++ b/docusaurus-rudderstack-plugin/index.js @@ -0,0 +1,28 @@ +const path = require('path') + +module.exports = function (context, options) { + const { writeKey, dataplaneUrl } = options + const isProd = process.env.NODE_ENV === 'production' + return { + name: 'docusaurus-rudderstack-plugin', + getClientModules() { + return isProd ? [path.resolve(__dirname, './rudderstack')] : [] + }, + injectHtmlTags() { + if (!isProd || !writeKey || !dataplaneUrl) + return {} + return { + headTags: [ + { + tagName: 'script', + innerHTML: ` +!function(){var e=window.rudderanalytics=window.rudderanalytics||[];e.methods=["load","page","track","identify","alias","group","ready","reset","getAnonymousId","setAnonymousId"],e.factory=function(t){return function(){var r=Array.prototype.slice.call(arguments);return r.unshift(t),e.push(r),e}};for(var t=0;t0.5%", + "not dead", + "not op_mini all" + ], + "development": [ + "last 1 chrome version", + "last 1 firefox version", + "last 1 safari version" + ] + } +} diff --git a/sidebars.js b/sidebars.js new file mode 100644 index 0000000..59aeb3e --- /dev/null +++ b/sidebars.js @@ -0,0 +1,330 @@ +module.exports = { + lightdash: [ + 'intro', + { + type: 'category', + label: 'Getting started tutorials', + link: { + type: 'doc', + id: 'get-started/intro', + }, + collapsed: false, + items: [ + { + type: 'category', + label: 'Setting up a new project', + link: { + type: 'doc', + id: 'get-started/setup-lightdash/intro', + }, + items: [ + 'get-started/setup-lightdash/get-project-lightdash-ready', + 'get-started/setup-lightdash/connect-project', + 'get-started/setup-lightdash/intro-metrics-dimensions', + 'get-started/setup-lightdash/using-explores', + 'get-started/setup-lightdash/how-to-create-metrics', + 'get-started/setup-lightdash/invite-new-users', + 'get-started/setup-lightdash/sharing-insights', + ], + }, + { + type: 'category', + label: 'Developing in Lightdash', + link: { + type: 'doc', + id: 'get-started/develop-in-lightdash/intro', + }, + items: [ + 'get-started/develop-in-lightdash/exploring-your-content', + 'get-started/develop-in-lightdash/intro-metrics-dimensions', + 'get-started/develop-in-lightdash/using-explores', + 'get-started/develop-in-lightdash/how-to-create-dimensions', + 'get-started/develop-in-lightdash/how-to-create-metrics', + 'get-started/develop-in-lightdash/sharing-insights', + ], + }, + { + type: 'category', + label: 'Learning to explore data in Lightdash', + link: { + type: 'doc', + id: 'get-started/exploring-data/intro', + }, + items: [ + 'get-started/exploring-data/exploring-your-content', + 'get-started/exploring-data/intro-metrics-dimensions', + 'get-started/exploring-data/using-explores', + 'get-started/exploring-data/sharing-insights', + 'get-started/exploring-data/dashboards', + ], + }, + ], + }, + { + type: 'category', + label: 'Guides', + items: [ + { + type: 'doc', + id: 'guides/ai-analyst', + label: 'AI Analyst', + }, + 'guides/adding-tables-to-lightdash', + 'guides/how-to-create-dimensions', + 'guides/how-to-create-metrics', + 'guides/how-to-join-tables', + { + type: 'category', + label: 'The Lightdash CLI', + link: { + type: 'generated-index', + title: 'The Lightdash CLI', + description: + 'The Lightdash CLI is the recommended way to develop your dbt + Lightdash project. It makes development faster and easier, as well as giving you options for building more powerful automation to manage your Lightdash instance. Here are some guides to get you started!', + slug: '/guides/cli/intro', + keywords: ['cli'], + }, + items: [ + 'guides/cli/how-to-install-the-lightdash-cli', + 'guides/cli/cli-authentication', + 'guides/cli/how-to-upgrade-cli', + 'guides/cli/how-to-auto-generate-schema-files', + 'guides/cli/how-to-use-lightdash-preview', + 'guides/cli/how-to-use-lightdash-deploy', + 'guides/cli/how-to-compile-your-lightdash-project', + 'guides/cli/how-to-use-lightdash-validate', + ], + }, + 'guides/formatting-your-fields', + 'guides/limiting-data-using-filters', + { + type: 'category', + label: 'Table calculation SQL templates', + link: { + type: 'generated-index', + title: 'SQL templates', + description: + 'Use our SQL templates to get started with your table calculations!', + slug: '/guides/table-calculations/sql-templates', + keywords: ['sql', 'templates'], + }, + items: [ + 'guides/table-calculations/table-calculation-sql-templates/percent-change-from-previous', + 'guides/table-calculations/table-calculation-sql-templates/percent-of-previous-value', + 'guides/table-calculations/table-calculation-sql-templates/percent-of-total-column', + 'guides/table-calculations/table-calculation-sql-templates/percent-of-group-pivot-total', + 'guides/table-calculations/table-calculation-sql-templates/rank-in-column', + 'guides/table-calculations/table-calculation-sql-templates/running-total', + 'guides/table-calculations/table-calculation-sql-templates/rolling-window', + ], + }, + 'guides/interactive-dashboards', + 'guides/filtering-dashboard-in-url', + 'guides/how-to-embed-content', + 'guides/pinning', + 'guides/adding-slack-integration', + 'guides/using-slack-integration', + 'guides/how-to-create-scheduled-deliveries', + 'guides/how-to-create-alerts', + 'guides/vs-code-yaml-validation', + 'guides/version-history', + 'guides/how-to-create-multiple-projects', + 'guides/customizing-the-appearance-of-your-project', + 'guides/how-to-promote-content', + 'guides/metrics-catalog', + ], + }, + { + type: 'category', + label: 'References', + link: { + type: 'generated-index', + title: 'Lightdash Reference Docs', + description: + 'Reference docs are broken down into the categories below.', + slug: '/references', + }, + items: [ + { + type: 'category', + label: 'Lightdash Development', + link: { + type: 'generated-index', + title: 'Lightdash Development Reference Docs', + description: + 'Below are detailed reference docs about data development in Lightdash. That includes the YAML in Lightdash Semantic Layer and anywhere you need to use SQL.', + slug: '/references/develop', + }, + items: [ + { + type: 'doc', + id: 'references/dimensions', + label: 'Dimensions', + }, + { + type: 'doc', + id: 'references/metrics', + label: 'Metrics', + }, + { + type: 'doc', + id: 'references/tables', + label: 'Tables', + }, + { + type: 'doc', + id: 'references/joins', + label: 'Joins', + }, + { + type: 'doc', + id: 'references/preview-projects', + label: 'Preview Projects', + }, + { + type: 'doc', + id: 'references/validating-your-content', + label: 'Validator', + }, + { + type: 'category', + label: 'SQL Runner', + items: [ + { + type: 'doc', + id: 'references/sql-runner', + label: 'SQL Runner', + }, + { + type: 'doc', + id: 'references/virtual-views', + label: 'Virtual Views', + }, + { + type: 'doc', + id: 'references/dbt-write-back', + label: 'dbt Write Back', + }, + ] + }, + 'references/sql-variables', + ], + }, + { + type: 'category', + label: 'Data Exploration', + link: { + type: 'generated-index', + title: 'Data Exploration Reference Docs', + description: + 'Below are detailed reference docs for all the ways you can explore and visualize data in Lightdash.', + slug: '/references/explore', + }, + items: [ + 'references/chart-types', + { + type: 'doc', + id: 'get-started/exploring-data/dashboards', + label: 'Dashboards', + }, + { + type: 'doc', + id: 'references/filters', + label: 'Filters', + }, + 'references/custom-fields', + 'references/table-calculations', + 'references/spaces', + ], + }, + { + type: 'doc', + id: 'references/lightdash-cli', + label: 'CLI', + }, + { + type: 'category', + label: 'Integrations', + link: { + type: 'generated-index', + title: 'Lightdash Integration Reference Docs', + description: + 'Reference docs for all integrations available on Lightdash.', + slug: '/references/integrations', + }, + items: [ + 'references/dbt-projects', + { + type: 'doc', + id: 'references/dbt-semantic-layer', + label: 'dbt Semantic Layer', + }, + { + type: 'doc', + id: 'references/slack-integration', + label: 'Slack', + }, + 'references/google-sheets', + ], + }, + { + type: 'category', + label: 'Admin', + link: { + type: 'generated-index', + title: 'Lightdash Admin References', + description: + 'Below are reference docs for all admin functions and features in Lightdash.', + slug: 'references/admin', + }, + items: [ + 'references/usage-analytics', + 'references/roles', + 'references/groups', + 'references/user-attributes', + ], + }, + { + type: 'category', + label: 'User', + link: { + type: 'generated-index', + title: 'Lightdash User References', + description: + 'Below are reference docs for all user functions and features in Lightdash.', + slug: 'references/user', + }, + items: [ + { + type: 'doc', + id: 'references/personal_tokens', + label: 'Personal access tokens', + }, + ], + }, + 'references/embedding', + 'references/scim-integration', + ], + }, + { + type: 'category', + label: 'Self-hosting', + items: [ + { + type: 'autogenerated', + dirName: 'self-host', + }, + ], + }, + { + type: 'link', + label: 'FAQs', + href: 'https://lightdash-knowledge-base.help.usepylon.com/collections/9907632828-faqs', + }, + { + type: 'doc', + label: 'Contact', + id: 'contact/contact_info', + }, + ], +}; diff --git a/src/components/HomepageFeatures.js b/src/components/HomepageFeatures.js new file mode 100644 index 0000000..16f820b --- /dev/null +++ b/src/components/HomepageFeatures.js @@ -0,0 +1,64 @@ +import React from 'react'; +import clsx from 'clsx'; +import styles from './HomepageFeatures.module.css'; + +const FeatureList = [ + { + title: 'Easy to Use', + Svg: require('../../static/img/undraw_docusaurus_mountain.svg').default, + description: ( + <> + Docusaurus was designed from the ground up to be easily installed and + used to get your website up and running quickly. + + ), + }, + { + title: 'Focus on What Matters', + Svg: require('../../static/img/undraw_docusaurus_tree.svg').default, + description: ( + <> + Docusaurus lets you focus on your docs, and we'll do the chores. Go + ahead and move your docs into the docs directory. + + ), + }, + { + title: 'Powered by React', + Svg: require('../../static/img/undraw_docusaurus_react.svg').default, + description: ( + <> + Extend or customize your website layout by reusing React. Docusaurus can + be extended while reusing the same header and footer. + + ), + }, +]; + +function Feature({Svg, title, description}) { + return ( +
+
+ +
+
+

{title}

+

{description}

+
+
+ ); +} + +export default function HomepageFeatures() { + return ( +
+
+
+ {FeatureList.map((props, idx) => ( + + ))} +
+
+
+ ); +} diff --git a/src/components/HomepageFeatures.module.css b/src/components/HomepageFeatures.module.css new file mode 100644 index 0000000..9dcb82c --- /dev/null +++ b/src/components/HomepageFeatures.module.css @@ -0,0 +1,13 @@ +/* stylelint-disable docusaurus/copyright-header */ + +.features { + display: flex; + align-items: center; + padding: 2rem 0; + width: 100%; +} + +.featureSvg { + height: 200px; + width: 200px; +} diff --git a/src/components/PlanPills.jsx b/src/components/PlanPills.jsx new file mode 100644 index 0000000..eace17a --- /dev/null +++ b/src/components/PlanPills.jsx @@ -0,0 +1,34 @@ +import React from 'react'; + +const pillStyle = { + backgroundColor: '#E8F4FD', + color: '#0077CC', + padding: '4px 12px', + borderRadius: '16px', + fontSize: '14px', + fontWeight: '500', + display: 'inline-flex', + alignItems: 'center', + marginBottom: '1rem', + marginRight: '0.5rem' +}; + +export const CloudStarterPill = () => ( + ☁️ Cloud Starter +); + +export const CloudProPill = () => ( + ⚑ Cloud Pro +); + +export const CloudEnterprisePill = () => ( + πŸš€ Cloud Enterprise +); + +export const AllCloudPills = () => ( +
+ + + +
+); \ No newline at end of file diff --git a/src/css/custom.css b/src/css/custom.css new file mode 100644 index 0000000..bf18fdb --- /dev/null +++ b/src/css/custom.css @@ -0,0 +1,54 @@ +/* stylelint-disable docusaurus/copyright-header */ +/** + * Any CSS included here will be global. The classic template + * bundles Infima by default. Infima is a CSS framework designed to + * work well for content-centric websites. + */ + +/* You can override the default Infima variables here. */ +:root { + --ifm-color-primary: #137cbd; + --ifm-color-primary-dark: #1170aa; + --ifm-color-primary-darker: #1069a1; + --ifm-color-primary-darkest: #0d5784; + --ifm-color-primary-light: #1588d0; + --ifm-color-primary-lighter: #168fd9; + --ifm-color-primary-lightest: #259ee9; + --ifm-code-font-size: 95%; +} + +.docusaurus-highlight-code-line { + background-color: rgb(72, 77, 91); + display: block; + margin: 0 calc(-1 * var(--ifm-pre-padding)); + padding: 0 var(--ifm-pre-padding); +} + +.header-github-link:hover { + opacity: .6 +} + +.header-github-link:before { + background: url("data:image/svg+xml;charset=utf-8,%3Csvg viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12'/%3E%3C/svg%3E") no-repeat; + content: ""; + display: flex; + height: 24px; + width: 24px +} + +[data-theme=dark] .header-github-link:before { + background: url("data:image/svg+xml;charset=utf-8,%3Csvg viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill='%23fff' d='M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12'/%3E%3C/svg%3E") no-repeat +} + +.footer__bottom a { + opacity: 0.8; +} + +.footer__logo { + margin-top: 0; + max-width: 15rem; +} + +a.hidden-anchor { + scroll-margin-top: 250px +} diff --git a/src/pages/index.module.css b/src/pages/index.module.css new file mode 100644 index 0000000..5c0d4f6 --- /dev/null +++ b/src/pages/index.module.css @@ -0,0 +1,25 @@ +/* stylelint-disable docusaurus/copyright-header */ + +/** + * CSS files with the .module.css suffix will be treated as CSS modules + * and scoped locally. + */ + +.heroBanner { + padding: 4rem 0; + text-align: center; + position: relative; + overflow: hidden; +} + +@media screen and (max-width: 966px) { + .heroBanner { + padding: 2rem; + } +} + +.buttons { + display: flex; + align-items: center; + justify-content: center; +} diff --git a/static/.nojekyll b/static/.nojekyll new file mode 100644 index 0000000..e69de29 diff --git a/static/img/favicon-32x32.png b/static/img/favicon-32x32.png new file mode 100644 index 0000000..6585ccc Binary files /dev/null and b/static/img/favicon-32x32.png differ diff --git a/static/img/lightdash-full-darkbg.png b/static/img/lightdash-full-darkbg.png new file mode 100644 index 0000000..d7bcb28 Binary files /dev/null and b/static/img/lightdash-full-darkbg.png differ diff --git a/static/img/lightdash-full-lightbg.png b/static/img/lightdash-full-lightbg.png new file mode 100644 index 0000000..dbab0d1 Binary files /dev/null and b/static/img/lightdash-full-lightbg.png differ diff --git a/static/img/lightdash-full.png b/static/img/lightdash-full.png new file mode 100644 index 0000000..d7bcb28 Binary files /dev/null and b/static/img/lightdash-full.png differ diff --git a/static/img/logo.png b/static/img/logo.png new file mode 100644 index 0000000..c4d9464 Binary files /dev/null and b/static/img/logo.png differ diff --git a/static/img/undraw_docusaurus_mountain.svg b/static/img/undraw_docusaurus_mountain.svg new file mode 100644 index 0000000..431cef2 --- /dev/null +++ b/static/img/undraw_docusaurus_mountain.svg @@ -0,0 +1,170 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/img/undraw_docusaurus_react.svg b/static/img/undraw_docusaurus_react.svg new file mode 100644 index 0000000..e417050 --- /dev/null +++ b/static/img/undraw_docusaurus_react.svg @@ -0,0 +1,169 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/img/undraw_docusaurus_tree.svg b/static/img/undraw_docusaurus_tree.svg new file mode 100644 index 0000000..a05cc03 --- /dev/null +++ b/static/img/undraw_docusaurus_tree.svg @@ -0,0 +1 @@ +docu_tree \ No newline at end of file diff --git a/swagger.json b/swagger.json new file mode 100644 index 0000000..a09dc93 --- /dev/null +++ b/swagger.json @@ -0,0 +1,18835 @@ +{ + "components": { + "examples": {}, + "headers": {}, + "parameters": {}, + "requestBodies": {}, + "responses": {}, + "schemas": { + "ApiErrorPayload": { + "properties": { + "error": { + "properties": { + "data": { + "description": "old data containing details of the error" + }, + "message": { + "type": "string", + "description": "A friendly message summarising the error" + }, + "name": { + "type": "string", + "description": "Unique name for the type of error" + }, + "statusCode": { + "type": "number", + "format": "integer", + "description": "HTTP status code" + } + }, + "required": ["name", "statusCode"], + "type": "object" + }, + "status": { + "type": "string", + "enum": ["error"], + "nullable": false + } + }, + "required": ["error", "status"], + "type": "object", + "description": "The Error object is returned from the api any time there is an error.\nThe message contains" + }, + "FieldType": { + "enum": ["metric", "dimension"], + "type": "string" + }, + "Pick_Field.name-or-label-or-fieldType-or-tableLabel-or-description_": { + "properties": { + "name": { + "type": "string" + }, + "label": { + "type": "string" + }, + "fieldType": { + "$ref": "#/components/schemas/FieldType" + }, + "tableLabel": { + "type": "string" + }, + "description": { + "type": "string" + } + }, + "required": ["name", "label", "fieldType", "tableLabel"], + "type": "object", + "description": "From T, pick a set of properties whose keys are in the union K" + }, + "Record_string.string-or-string-Array_": { + "properties": {}, + "type": "object", + "description": "Construct a type with a set of properties K of type T" + }, + "Pick_Dimension.requiredAttributes_": { + "properties": { + "requiredAttributes": { + "$ref": "#/components/schemas/Record_string.string-or-string-Array_" + } + }, + "type": "object", + "description": "From T, pick a set of properties whose keys are in the union K" + }, + "CatalogType.Field": { + "enum": ["field"], + "type": "string" + }, + "Pick_Tag.name-or-color-or-tagUuid_": { + "properties": { + "name": { + "type": "string" + }, + "color": { + "type": "string" + }, + "tagUuid": { + "type": "string" + } + }, + "required": ["name", "color", "tagUuid"], + "type": "object", + "description": "From T, pick a set of properties whose keys are in the union K" + }, + "EmojiIcon": { + "properties": { + "unicode": { + "type": "string" + } + }, + "required": ["unicode"], + "type": "object" + }, + "CustomIcon": { + "properties": { + "url": { + "type": "string" + } + }, + "required": ["url"], + "type": "object" + }, + "CatalogItemIcon": { + "anyOf": [ + { + "$ref": "#/components/schemas/EmojiIcon" + }, + { + "$ref": "#/components/schemas/CustomIcon" + } + ] + }, + "CatalogField": { + "allOf": [ + { + "$ref": "#/components/schemas/Pick_Field.name-or-label-or-fieldType-or-tableLabel-or-description_" + }, + { + "$ref": "#/components/schemas/Pick_Dimension.requiredAttributes_" + }, + { + "properties": { + "icon": { + "allOf": [ + { + "$ref": "#/components/schemas/CatalogItemIcon" + } + ], + "nullable": true + }, + "chartUsage": { + "type": "number", + "format": "double" + }, + "categories": { + "items": { + "$ref": "#/components/schemas/Pick_Tag.name-or-color-or-tagUuid_" + }, + "type": "array" + }, + "tags": { + "items": { + "type": "string" + }, + "type": "array" + }, + "tableGroupLabel": { + "type": "string" + }, + "tableName": { + "type": "string" + }, + "basicType": { + "type": "string" + }, + "type": { + "$ref": "#/components/schemas/CatalogType.Field" + }, + "catalogSearchUuid": { + "type": "string" + } + }, + "required": [ + "icon", + "categories", + "tableName", + "type", + "catalogSearchUuid" + ], + "type": "object" + } + ] + }, + "Pick_TableBase.name-or-label-or-groupLabel-or-description-or-requiredAttributes_": { + "properties": { + "name": { + "type": "string" + }, + "label": { + "type": "string" + }, + "description": { + "type": "string" + }, + "requiredAttributes": { + "$ref": "#/components/schemas/Record_string.string-or-string-Array_" + }, + "groupLabel": { + "type": "string" + } + }, + "required": ["name", "label"], + "type": "object", + "description": "From T, pick a set of properties whose keys are in the union K" + }, + "InlineErrorType": { + "enum": ["METADATA_PARSE_ERROR", "NO_DIMENSIONS_FOUND"], + "type": "string" + }, + "InlineError": { + "properties": { + "message": { + "type": "string" + }, + "type": { + "$ref": "#/components/schemas/InlineErrorType" + } + }, + "required": ["message", "type"], + "type": "object" + }, + "CatalogType.Table": { + "enum": ["table"], + "type": "string" + }, + "DbtModelJoinType": { + "type": "string", + "enum": ["inner", "full", "left", "right"] + }, + "Pick_ExploreJoin.table-or-sqlOn-or-type-or-hidden-or-always_": { + "properties": { + "table": { + "type": "string" + }, + "sqlOn": { + "type": "string" + }, + "type": { + "$ref": "#/components/schemas/DbtModelJoinType" + }, + "hidden": { + "type": "boolean" + }, + "always": { + "type": "boolean" + } + }, + "required": ["table", "sqlOn"], + "type": "object", + "description": "From T, pick a set of properties whose keys are in the union K" + }, + "CompiledExploreJoin": { + "allOf": [ + { + "$ref": "#/components/schemas/Pick_ExploreJoin.table-or-sqlOn-or-type-or-hidden-or-always_" + }, + { + "properties": { + "compiledSqlOn": { + "type": "string" + } + }, + "required": ["compiledSqlOn"], + "type": "object" + } + ] + }, + "CatalogTable": { + "allOf": [ + { + "$ref": "#/components/schemas/Pick_TableBase.name-or-label-or-groupLabel-or-description-or-requiredAttributes_" + }, + { + "properties": { + "icon": { + "allOf": [ + { + "$ref": "#/components/schemas/CatalogItemIcon" + } + ], + "nullable": true + }, + "chartUsage": { + "type": "number", + "format": "double" + }, + "joinedTables": { + "items": { + "$ref": "#/components/schemas/CompiledExploreJoin" + }, + "type": "array" + }, + "categories": { + "items": { + "$ref": "#/components/schemas/Pick_Tag.name-or-color-or-tagUuid_" + }, + "type": "array" + }, + "tags": { + "items": { + "type": "string" + }, + "type": "array" + }, + "groupLabel": { + "type": "string" + }, + "type": { + "$ref": "#/components/schemas/CatalogType.Table" + }, + "errors": { + "items": { + "$ref": "#/components/schemas/InlineError" + }, + "type": "array" + }, + "catalogSearchUuid": { + "type": "string" + } + }, + "required": [ + "icon", + "categories", + "type", + "catalogSearchUuid" + ], + "type": "object" + } + ] + }, + "CatalogItem": { + "anyOf": [ + { + "$ref": "#/components/schemas/CatalogField" + }, + { + "$ref": "#/components/schemas/CatalogTable" + } + ] + }, + "ApiCatalogResults": { + "items": { + "$ref": "#/components/schemas/CatalogItem" + }, + "type": "array" + }, + "CatalogType": { + "enum": ["table", "field"], + "type": "string" + }, + "CatalogFilter": { + "enum": ["tables", "dimensions", "metrics"], + "type": "string" + }, + "CatalogMetadata": { + "properties": { + "fieldType": { + "$ref": "#/components/schemas/FieldType" + }, + "tableLabel": { + "type": "string" + }, + "joinedTables": { + "items": { + "type": "string" + }, + "type": "array" + }, + "fields": { + "items": { + "$ref": "#/components/schemas/CatalogField" + }, + "type": "array" + }, + "source": { + "type": "string" + }, + "modelName": { + "type": "string" + }, + "label": { + "type": "string" + }, + "description": { + "type": "string" + }, + "name": { + "type": "string" + } + }, + "required": [ + "joinedTables", + "fields", + "modelName", + "label", + "name" + ], + "type": "object" + }, + "ApiCatalogMetadataResults": { + "$ref": "#/components/schemas/CatalogMetadata" + }, + "ChartKind": { + "enum": [ + "line", + "horizontal_bar", + "vertical_bar", + "scatter", + "area", + "mixed", + "pie", + "table", + "big_number", + "funnel", + "custom" + ], + "type": "string" + }, + "Pick_ChartSummary.uuid-or-name-or-spaceUuid-or-spaceName-or-dashboardName-or-dashboardUuid-or-chartKind_": { + "properties": { + "name": { + "type": "string" + }, + "uuid": { + "type": "string" + }, + "spaceName": { + "type": "string" + }, + "spaceUuid": { + "type": "string" + }, + "dashboardUuid": { + "type": "string", + "nullable": true + }, + "dashboardName": { + "type": "string", + "nullable": true + }, + "chartKind": { + "$ref": "#/components/schemas/ChartKind" + } + }, + "required": [ + "name", + "uuid", + "spaceName", + "spaceUuid", + "dashboardUuid", + "dashboardName" + ], + "type": "object", + "description": "From T, pick a set of properties whose keys are in the union K" + }, + "CatalogAnalytics": { + "properties": { + "charts": { + "items": { + "$ref": "#/components/schemas/Pick_ChartSummary.uuid-or-name-or-spaceUuid-or-spaceName-or-dashboardName-or-dashboardUuid-or-chartKind_" + }, + "type": "array" + } + }, + "required": ["charts"], + "type": "object" + }, + "ApiCatalogAnalyticsResults": { + "$ref": "#/components/schemas/CatalogAnalytics" + }, + "ApiMetricsCatalogResults": { + "items": { + "$ref": "#/components/schemas/CatalogField" + }, + "type": "array" + }, + "KnexPaginateArgs": { + "properties": { + "page": { + "type": "number", + "format": "double" + }, + "pageSize": { + "type": "number", + "format": "double" + } + }, + "required": ["page", "pageSize"], + "type": "object" + }, + "KnexPaginatedData_ApiMetricsCatalogResults_": { + "properties": { + "pagination": { + "allOf": [ + { + "$ref": "#/components/schemas/KnexPaginateArgs" + }, + { + "properties": { + "totalResults": { + "type": "number", + "format": "double" + }, + "totalPageCount": { + "type": "number", + "format": "double" + } + }, + "required": ["totalResults", "totalPageCount"], + "type": "object" + } + ] + }, + "data": { + "$ref": "#/components/schemas/ApiMetricsCatalogResults" + } + }, + "required": ["data"], + "type": "object" + }, + "ApiMetricsCatalog": { + "properties": { + "results": { + "$ref": "#/components/schemas/KnexPaginatedData_ApiMetricsCatalogResults_" + }, + "status": { + "type": "string", + "enum": ["ok"], + "nullable": false + } + }, + "required": ["results", "status"], + "type": "object" + }, + "ApiSortDirection": { + "type": "string", + "enum": ["asc", "desc"] + }, + "Record_string.Record_string.string-or-string-Array__": { + "properties": {}, + "type": "object", + "description": "Construct a type with a set of properties K of type T" + }, + "FieldType.METRIC": { + "enum": ["metric"], + "type": "string" + }, + "MetricType": { + "enum": [ + "percentile", + "average", + "count", + "count_distinct", + "sum", + "min", + "max", + "number", + "median", + "string", + "date", + "timestamp", + "boolean" + ], + "type": "string" + }, + "ConditionalOperator": { + "enum": [ + "isNull", + "notNull", + "equals", + "notEquals", + "startsWith", + "endsWith", + "include", + "doesNotInclude", + "lessThan", + "lessThanOrEqual", + "greaterThan", + "greaterThanOrEqual", + "inThePast", + "notInThePast", + "inTheNext", + "inTheCurrent", + "notInTheCurrent", + "inBetween" + ], + "type": "string" + }, + "MetricFilterRule": { + "properties": { + "values": { + "items": {}, + "type": "array" + }, + "operator": { + "$ref": "#/components/schemas/ConditionalOperator" + }, + "id": { + "type": "string" + }, + "target": { + "properties": { + "fieldRef": { + "type": "string" + } + }, + "required": ["fieldRef"], + "type": "object" + }, + "settings": {}, + "disabled": { + "type": "boolean" + }, + "required": { + "type": "boolean" + } + }, + "required": ["operator", "id", "target"], + "type": "object", + "additionalProperties": true + }, + "CustomFormatType": { + "enum": [ + "default", + "percent", + "currency", + "number", + "id", + "date", + "timestamp" + ], + "type": "string" + }, + "NumberSeparator": { + "enum": [ + "default", + "commaPeriod", + "spacePeriod", + "periodComma", + "noSeparatorPeriod" + ], + "type": "string" + }, + "Compact": { + "enum": ["thousands", "millions", "billions", "trillions"], + "type": "string" + }, + "CompactOrAlias": { + "anyOf": [ + { + "$ref": "#/components/schemas/Compact" + }, + { + "type": "string", + "enum": [ + "K", + "thousand", + "M", + "million", + "B", + "billion", + "T", + "trillion" + ] + } + ] + }, + "TimeFrames": { + "enum": [ + "RAW", + "YEAR", + "QUARTER", + "MONTH", + "WEEK", + "DAY", + "HOUR", + "MINUTE", + "SECOND", + "MILLISECOND", + "DAY_OF_WEEK_INDEX", + "DAY_OF_MONTH_NUM", + "DAY_OF_YEAR_NUM", + "WEEK_NUM", + "MONTH_NUM", + "QUARTER_NUM", + "YEAR_NUM", + "DAY_OF_WEEK_NAME", + "MONTH_NAME", + "QUARTER_NAME", + "HOUR_OF_DAY_NUM", + "MINUTE_OF_HOUR_NUM" + ], + "type": "string" + }, + "CustomFormat": { + "properties": { + "type": { + "$ref": "#/components/schemas/CustomFormatType" + }, + "round": { + "type": "number", + "format": "double" + }, + "separator": { + "$ref": "#/components/schemas/NumberSeparator" + }, + "currency": { + "type": "string" + }, + "compact": { + "$ref": "#/components/schemas/CompactOrAlias" + }, + "prefix": { + "type": "string" + }, + "suffix": { + "type": "string" + }, + "timeInterval": { + "$ref": "#/components/schemas/TimeFrames" + } + }, + "required": ["type"], + "type": "object", + "additionalProperties": true + }, + "DefaultTimeDimension": { + "properties": { + "interval": { + "$ref": "#/components/schemas/TimeFrames" + }, + "field": { + "type": "string" + } + }, + "required": ["interval", "field"], + "type": "object" + }, + "SourcePosition": { + "properties": { + "character": { + "type": "number", + "format": "double" + }, + "line": { + "type": "number", + "format": "double" + } + }, + "required": ["character", "line"], + "type": "object" + }, + "Source": { + "properties": { + "content": { + "type": "string" + }, + "highlight": { + "properties": { + "end": { + "$ref": "#/components/schemas/SourcePosition" + }, + "start": { + "$ref": "#/components/schemas/SourcePosition" + } + }, + "required": ["end", "start"], + "type": "object" + }, + "range": { + "properties": { + "end": { + "$ref": "#/components/schemas/SourcePosition" + }, + "start": { + "$ref": "#/components/schemas/SourcePosition" + } + }, + "required": ["end", "start"], + "type": "object" + }, + "path": { + "type": "string" + } + }, + "required": ["content", "range", "path"], + "type": "object" + }, + "Format": { + "enum": ["km", "mi", "usd", "gbp", "eur", "id", "percent"], + "type": "string" + }, + "FieldUrl": { + "properties": { + "label": { + "type": "string" + }, + "url": { + "type": "string" + } + }, + "required": ["label", "url"], + "type": "object" + }, + "CompiledMetric": { + "properties": { + "fieldType": { + "$ref": "#/components/schemas/FieldType.METRIC" + }, + "type": { + "$ref": "#/components/schemas/MetricType" + }, + "name": { + "type": "string" + }, + "label": { + "type": "string" + }, + "table": { + "type": "string" + }, + "tableLabel": { + "type": "string" + }, + "sql": { + "type": "string" + }, + "description": { + "type": "string" + }, + "source": { + "$ref": "#/components/schemas/Source" + }, + "hidden": { + "type": "boolean" + }, + "compact": { + "$ref": "#/components/schemas/CompactOrAlias" + }, + "round": { + "type": "number", + "format": "double" + }, + "format": { + "$ref": "#/components/schemas/Format" + }, + "groupLabel": { + "type": "string", + "deprecated": true + }, + "groups": { + "items": { + "type": "string" + }, + "type": "array" + }, + "urls": { + "items": { + "$ref": "#/components/schemas/FieldUrl" + }, + "type": "array" + }, + "index": { + "type": "number", + "format": "double" + }, + "tags": { + "items": { + "type": "string" + }, + "type": "array" + }, + "isAutoGenerated": { + "type": "boolean" + }, + "showUnderlyingValues": { + "items": { + "type": "string" + }, + "type": "array" + }, + "filters": { + "items": { + "$ref": "#/components/schemas/MetricFilterRule" + }, + "type": "array" + }, + "percentile": { + "type": "number", + "format": "double" + }, + "formatOptions": { + "$ref": "#/components/schemas/CustomFormat" + }, + "dimensionReference": { + "type": "string" + }, + "requiredAttributes": { + "$ref": "#/components/schemas/Record_string.string-or-string-Array_" + }, + "defaultTimeDimension": { + "$ref": "#/components/schemas/DefaultTimeDimension" + }, + "compiledSql": { + "type": "string" + }, + "tablesReferences": { + "items": { + "type": "string" + }, + "type": "array" + }, + "tablesRequiredAttributes": { + "$ref": "#/components/schemas/Record_string.Record_string.string-or-string-Array__" + } + }, + "required": [ + "fieldType", + "type", + "name", + "label", + "table", + "tableLabel", + "sql", + "hidden", + "isAutoGenerated", + "compiledSql" + ], + "type": "object", + "additionalProperties": true + }, + "Pick_CompiledTable.defaultTimeDimension_": { + "properties": { + "defaultTimeDimension": { + "$ref": "#/components/schemas/DefaultTimeDimension" + } + }, + "type": "object", + "description": "From T, pick a set of properties whose keys are in the union K" + }, + "MetricWithAssociatedTimeDimension": { + "allOf": [ + { + "$ref": "#/components/schemas/CompiledMetric" + }, + { + "$ref": "#/components/schemas/Pick_CompiledTable.defaultTimeDimension_" + } + ] + }, + "ApiGetMetricPeek": { + "properties": { + "results": { + "$ref": "#/components/schemas/MetricWithAssociatedTimeDimension" + }, + "status": { + "type": "string", + "enum": ["ok"], + "nullable": false + } + }, + "required": ["results", "status"], + "type": "object" + }, + "ApiSuccessEmpty": { + "properties": { + "results": {}, + "status": { + "type": "string", + "enum": ["ok"], + "nullable": false + } + }, + "required": ["status"], + "type": "object" + }, + "ApiCreateComment": { + "properties": { + "results": { + "type": "string" + }, + "status": { + "type": "string", + "enum": ["ok"], + "nullable": false + } + }, + "required": ["results", "status"], + "type": "object" + }, + "Pick_Comment.text-or-replyTo-or-mentions-or-textHtml_": { + "properties": { + "text": { + "type": "string" + }, + "replyTo": { + "type": "string" + }, + "mentions": { + "items": { + "type": "string" + }, + "type": "array" + }, + "textHtml": { + "type": "string" + } + }, + "required": ["text", "mentions", "textHtml"], + "type": "object", + "description": "From T, pick a set of properties whose keys are in the union K" + }, + "Comment": { + "properties": { + "mentions": { + "items": { + "type": "string" + }, + "type": "array" + }, + "canRemove": { + "type": "boolean" + }, + "resolved": { + "type": "boolean" + }, + "replies": { + "items": { + "$ref": "#/components/schemas/Comment" + }, + "type": "array" + }, + "replyTo": { + "type": "string" + }, + "user": { + "properties": { + "name": { + "type": "string" + } + }, + "required": ["name"], + "type": "object" + }, + "createdAt": { + "type": "string", + "format": "date-time" + }, + "textHtml": { + "type": "string" + }, + "text": { + "type": "string" + }, + "commentId": { + "type": "string" + } + }, + "required": [ + "mentions", + "canRemove", + "resolved", + "user", + "createdAt", + "textHtml", + "text", + "commentId" + ], + "type": "object" + }, + "ApiGetComments": { + "properties": { + "results": { + "properties": {}, + "additionalProperties": { + "items": { + "$ref": "#/components/schemas/Comment" + }, + "type": "array" + }, + "type": "object" + }, + "status": { + "type": "string", + "enum": ["ok"], + "nullable": false + } + }, + "required": ["results", "status"], + "type": "object" + }, + "ApiResolveComment": { + "properties": { + "status": { + "type": "string", + "enum": ["ok"], + "nullable": false + } + }, + "required": ["status"], + "type": "object" + }, + "ApiCsvUrlResponse": { + "properties": { + "results": { + "properties": { + "truncated": { + "type": "boolean" + }, + "status": { + "type": "string" + }, + "url": { + "type": "string" + } + }, + "required": ["truncated", "status", "url"], + "type": "object" + }, + "status": { + "type": "string", + "enum": ["ok"], + "nullable": false + } + }, + "required": ["results", "status"], + "type": "object" + }, + "DashboardTileTypes": { + "enum": [ + "saved_chart", + "sql_chart", + "semantic_viewer_chart", + "markdown", + "loom" + ], + "type": "string" + }, + "Required_CreateDashboardTileBase_": { + "properties": { + "uuid": { + "type": "string" + }, + "type": { + "$ref": "#/components/schemas/DashboardTileTypes" + }, + "x": { + "type": "number", + "format": "double" + }, + "y": { + "type": "number", + "format": "double" + }, + "h": { + "type": "number", + "format": "double" + }, + "w": { + "type": "number", + "format": "double" + }, + "tabUuid": { + "type": "string" + } + }, + "required": ["uuid", "type", "x", "y", "h", "w"], + "type": "object", + "description": "Make all properties in T required" + }, + "DashboardTileBase": { + "$ref": "#/components/schemas/Required_CreateDashboardTileBase_" + }, + "DashboardTileTypes.SAVED_CHART": { + "enum": ["saved_chart"], + "type": "string" + }, + "DashboardChartTileProperties": { + "properties": { + "properties": { + "properties": { + "chartSlug": { + "type": "string" + }, + "lastVersionChartKind": { + "allOf": [ + { + "$ref": "#/components/schemas/ChartKind" + } + ], + "nullable": true + }, + "chartName": { + "type": "string", + "nullable": true + }, + "belongsToDashboard": { + "type": "boolean" + }, + "savedChartUuid": { + "type": "string", + "nullable": true + }, + "hideTitle": { + "type": "boolean" + }, + "title": { + "type": "string" + } + }, + "required": ["savedChartUuid"], + "type": "object" + }, + "type": { + "$ref": "#/components/schemas/DashboardTileTypes.SAVED_CHART" + } + }, + "required": ["properties", "type"], + "type": "object" + }, + "DashboardChartTile": { + "allOf": [ + { + "$ref": "#/components/schemas/DashboardTileBase" + }, + { + "$ref": "#/components/schemas/DashboardChartTileProperties" + } + ] + }, + "DashboardTileTypes.MARKDOWN": { + "enum": ["markdown"], + "type": "string" + }, + "DashboardMarkdownTileProperties": { + "properties": { + "properties": { + "properties": { + "content": { + "type": "string" + }, + "title": { + "type": "string" + } + }, + "required": ["content", "title"], + "type": "object" + }, + "type": { + "$ref": "#/components/schemas/DashboardTileTypes.MARKDOWN" + } + }, + "required": ["properties", "type"], + "type": "object" + }, + "DashboardMarkdownTile": { + "allOf": [ + { + "$ref": "#/components/schemas/DashboardTileBase" + }, + { + "$ref": "#/components/schemas/DashboardMarkdownTileProperties" + } + ] + }, + "DashboardTileTypes.LOOM": { + "enum": ["loom"], + "type": "string" + }, + "DashboardLoomTileProperties": { + "properties": { + "properties": { + "properties": { + "url": { + "type": "string" + }, + "hideTitle": { + "type": "boolean" + }, + "title": { + "type": "string" + } + }, + "required": ["url", "title"], + "type": "object" + }, + "type": { + "$ref": "#/components/schemas/DashboardTileTypes.LOOM" + } + }, + "required": ["properties", "type"], + "type": "object" + }, + "DashboardLoomTile": { + "allOf": [ + { + "$ref": "#/components/schemas/DashboardTileBase" + }, + { + "$ref": "#/components/schemas/DashboardLoomTileProperties" + } + ] + }, + "DashboardTileTypes.SQL_CHART": { + "enum": ["sql_chart"], + "type": "string" + }, + "DashboardSqlChartTileProperties": { + "properties": { + "properties": { + "properties": { + "chartSlug": { + "type": "string" + }, + "hideTitle": { + "type": "boolean" + }, + "chartName": { + "type": "string" + }, + "savedSqlUuid": { + "type": "string", + "nullable": true + }, + "title": { + "type": "string" + } + }, + "required": ["chartName", "savedSqlUuid"], + "type": "object" + }, + "type": { + "$ref": "#/components/schemas/DashboardTileTypes.SQL_CHART" + } + }, + "required": ["properties", "type"], + "type": "object" + }, + "DashboardSqlChartTile": { + "allOf": [ + { + "$ref": "#/components/schemas/DashboardTileBase" + }, + { + "$ref": "#/components/schemas/DashboardSqlChartTileProperties" + } + ] + }, + "DashboardTileTypes.SEMANTIC_VIEWER_CHART": { + "enum": ["semantic_viewer_chart"], + "type": "string" + }, + "DashboardSemanticViewerChartTileProperties": { + "properties": { + "properties": { + "properties": { + "chartSlug": { + "type": "string" + }, + "hideTitle": { + "type": "boolean" + }, + "chartName": { + "type": "string" + }, + "savedSemanticViewerChartUuid": { + "type": "string", + "nullable": true + }, + "title": { + "type": "string" + } + }, + "required": [ + "chartName", + "savedSemanticViewerChartUuid" + ], + "type": "object" + }, + "type": { + "$ref": "#/components/schemas/DashboardTileTypes.SEMANTIC_VIEWER_CHART" + } + }, + "required": ["properties", "type"], + "type": "object" + }, + "DashboardSemanticViewerChartTile": { + "allOf": [ + { + "$ref": "#/components/schemas/DashboardTileBase" + }, + { + "$ref": "#/components/schemas/DashboardSemanticViewerChartTileProperties" + } + ] + }, + "DashboardTile": { + "anyOf": [ + { + "$ref": "#/components/schemas/DashboardChartTile" + }, + { + "$ref": "#/components/schemas/DashboardMarkdownTile" + }, + { + "$ref": "#/components/schemas/DashboardLoomTile" + }, + { + "$ref": "#/components/schemas/DashboardSqlChartTile" + }, + { + "$ref": "#/components/schemas/DashboardSemanticViewerChartTile" + } + ] + }, + "DashboardFieldTarget": { + "properties": { + "tableName": { + "type": "string" + }, + "fieldId": { + "type": "string" + } + }, + "required": ["tableName", "fieldId"], + "type": "object" + }, + "FilterRule_ConditionalOperator.T.V.any_": { + "properties": { + "values": { + "items": {}, + "type": "array" + }, + "operator": { + "$ref": "#/components/schemas/ConditionalOperator" + }, + "id": { + "type": "string" + }, + "target": { + "$ref": "#/components/schemas/DashboardFieldTarget" + }, + "settings": {}, + "disabled": { + "type": "boolean" + }, + "required": { + "type": "boolean" + } + }, + "required": ["operator", "id", "target"], + "type": "object", + "additionalProperties": true + }, + "Record_string.DashboardTileTarget_": { + "properties": {}, + "type": "object", + "description": "Construct a type with a set of properties K of type T" + }, + "DashboardFilterRule": { + "allOf": [ + { + "$ref": "#/components/schemas/FilterRule_ConditionalOperator.T.V.any_" + }, + { + "properties": { + "label": { + "type": "string" + }, + "tileTargets": { + "$ref": "#/components/schemas/Record_string.DashboardTileTarget_" + } + }, + "type": "object" + } + ] + }, + "DashboardFilters": { + "properties": { + "tableCalculations": { + "items": { + "$ref": "#/components/schemas/DashboardFilterRule" + }, + "type": "array" + }, + "metrics": { + "items": { + "$ref": "#/components/schemas/DashboardFilterRule" + }, + "type": "array" + }, + "dimensions": { + "items": { + "$ref": "#/components/schemas/DashboardFilterRule" + }, + "type": "array" + } + }, + "required": ["tableCalculations", "metrics", "dimensions"], + "type": "object" + }, + "UpdatedByUser": { + "properties": { + "userUuid": { + "type": "string" + }, + "firstName": { + "type": "string" + }, + "lastName": { + "type": "string" + } + }, + "required": ["userUuid", "firstName", "lastName"], + "type": "object", + "additionalProperties": true + }, + "DashboardTab": { + "properties": { + "order": { + "type": "number", + "format": "double" + }, + "name": { + "type": "string" + }, + "uuid": { + "type": "string" + } + }, + "required": ["order", "name", "uuid"], + "type": "object" + }, + "Pick_Dashboard.Exclude_keyofDashboard.isPrivate-or-access__": { + "properties": { + "name": { + "type": "string" + }, + "description": { + "type": "string" + }, + "uuid": { + "type": "string" + }, + "spaceName": { + "type": "string" + }, + "spaceUuid": { + "type": "string" + }, + "projectUuid": { + "type": "string" + }, + "organizationUuid": { + "type": "string" + }, + "pinnedListUuid": { + "type": "string", + "nullable": true + }, + "slug": { + "type": "string" + }, + "dashboardVersionId": { + "type": "number", + "format": "double" + }, + "updatedAt": { + "type": "string", + "format": "date-time" + }, + "tiles": { + "items": { + "$ref": "#/components/schemas/DashboardTile" + }, + "type": "array" + }, + "filters": { + "$ref": "#/components/schemas/DashboardFilters" + }, + "updatedByUser": { + "$ref": "#/components/schemas/UpdatedByUser" + }, + "views": { + "type": "number", + "format": "double" + }, + "firstViewedAt": { + "anyOf": [ + { + "type": "string", + "format": "date-time" + }, + { + "type": "string" + } + ], + "nullable": true + }, + "pinnedListOrder": { + "type": "number", + "format": "double", + "nullable": true + }, + "tabs": { + "items": { + "$ref": "#/components/schemas/DashboardTab" + }, + "type": "array" + } + }, + "required": [ + "name", + "uuid", + "spaceName", + "spaceUuid", + "projectUuid", + "organizationUuid", + "pinnedListUuid", + "slug", + "dashboardVersionId", + "updatedAt", + "tiles", + "filters", + "views", + "firstViewedAt", + "pinnedListOrder", + "tabs" + ], + "type": "object", + "description": "From T, pick a set of properties whose keys are in the union K" + }, + "Omit_Dashboard.isPrivate-or-access_": { + "$ref": "#/components/schemas/Pick_Dashboard.Exclude_keyofDashboard.isPrivate-or-access__", + "description": "Construct a type with the properties of T except for those in type K." + }, + "DashboardDAO": { + "$ref": "#/components/schemas/Omit_Dashboard.isPrivate-or-access_" + }, + "ApiPromoteDashboardResponse": { + "properties": { + "results": { + "$ref": "#/components/schemas/DashboardDAO" + }, + "status": { + "type": "string", + "enum": ["ok"], + "nullable": false + } + }, + "required": ["results", "status"], + "type": "object" + }, + "PromotionAction": { + "enum": ["no changes", "create", "update", "delete"], + "type": "string" + }, + "Pick_SpaceSummary.Exclude_keyofSpaceSummary.userAccess__": { + "properties": { + "name": { + "type": "string" + }, + "uuid": { + "type": "string" + }, + "projectUuid": { + "type": "string" + }, + "organizationUuid": { + "type": "string" + }, + "pinnedListUuid": { + "type": "string", + "nullable": true + }, + "slug": { + "type": "string" + }, + "isPrivate": { + "type": "boolean" + }, + "access": { + "items": { + "type": "string" + }, + "type": "array" + }, + "pinnedListOrder": { + "type": "number", + "format": "double", + "nullable": true + }, + "chartCount": { + "type": "number", + "format": "double" + }, + "dashboardCount": { + "type": "number", + "format": "double" + } + }, + "required": [ + "name", + "uuid", + "projectUuid", + "organizationUuid", + "pinnedListUuid", + "slug", + "isPrivate", + "access", + "pinnedListOrder", + "chartCount", + "dashboardCount" + ], + "type": "object", + "description": "From T, pick a set of properties whose keys are in the union K" + }, + "Omit_SpaceSummary.userAccess_": { + "$ref": "#/components/schemas/Pick_SpaceSummary.Exclude_keyofSpaceSummary.userAccess__", + "description": "Construct a type with the properties of T except for those in type K." + }, + "PromotedSpace": { + "$ref": "#/components/schemas/Omit_SpaceSummary.userAccess_" + }, + "PromotedDashboard": { + "allOf": [ + { + "$ref": "#/components/schemas/DashboardDAO" + }, + { + "properties": { + "spaceSlug": { + "type": "string" + } + }, + "required": ["spaceSlug"], + "type": "object" + } + ] + }, + "FieldId": { + "type": "string" + }, + "FilterGroup": { + "anyOf": [ + { + "$ref": "#/components/schemas/OrFilterGroup" + }, + { + "$ref": "#/components/schemas/AndFilterGroup" + } + ] + }, + "FieldTarget": { + "properties": { + "fieldId": { + "type": "string" + } + }, + "required": ["fieldId"], + "type": "object" + }, + "FilterRule": { + "properties": { + "values": { + "items": {}, + "type": "array" + }, + "operator": { + "$ref": "#/components/schemas/ConditionalOperator" + }, + "id": { + "type": "string" + }, + "target": { + "$ref": "#/components/schemas/FieldTarget" + }, + "settings": {}, + "disabled": { + "type": "boolean" + }, + "required": { + "type": "boolean" + } + }, + "required": ["operator", "id", "target"], + "type": "object", + "additionalProperties": true + }, + "FilterGroupItem": { + "anyOf": [ + { + "$ref": "#/components/schemas/FilterGroup" + }, + { + "$ref": "#/components/schemas/FilterRule" + } + ] + }, + "OrFilterGroup": { + "properties": { + "or": { + "items": { + "$ref": "#/components/schemas/FilterGroupItem" + }, + "type": "array" + }, + "id": { + "type": "string" + } + }, + "required": ["or", "id"], + "type": "object" + }, + "AndFilterGroup": { + "properties": { + "and": { + "items": { + "$ref": "#/components/schemas/FilterGroupItem" + }, + "type": "array" + }, + "id": { + "type": "string" + } + }, + "required": ["and", "id"], + "type": "object" + }, + "Filters": { + "properties": { + "tableCalculations": { + "$ref": "#/components/schemas/FilterGroup" + }, + "metrics": { + "$ref": "#/components/schemas/FilterGroup" + }, + "dimensions": { + "$ref": "#/components/schemas/FilterGroup" + } + }, + "type": "object" + }, + "SortField": { + "properties": { + "descending": { + "type": "boolean" + }, + "fieldId": { + "type": "string" + } + }, + "required": ["descending", "fieldId"], + "type": "object" + }, + "TableCalculationType": { + "enum": ["number", "string", "date", "timestamp", "boolean"], + "type": "string" + }, + "TableCalculation": { + "properties": { + "type": { + "$ref": "#/components/schemas/TableCalculationType" + }, + "format": { + "$ref": "#/components/schemas/CustomFormat" + }, + "sql": { + "type": "string" + }, + "displayName": { + "type": "string" + }, + "name": { + "type": "string" + }, + "index": { + "type": "number", + "format": "double" + } + }, + "required": ["sql", "displayName", "name"], + "type": "object" + }, + "AdditionalMetric": { + "properties": { + "label": { + "type": "string" + }, + "type": { + "$ref": "#/components/schemas/MetricType" + }, + "description": { + "type": "string" + }, + "sql": { + "type": "string" + }, + "hidden": { + "type": "boolean" + }, + "round": { + "type": "number", + "format": "double" + }, + "compact": { + "$ref": "#/components/schemas/CompactOrAlias" + }, + "format": { + "$ref": "#/components/schemas/Format" + }, + "table": { + "type": "string" + }, + "name": { + "type": "string" + }, + "index": { + "type": "number", + "format": "double" + }, + "filters": { + "items": { + "$ref": "#/components/schemas/MetricFilterRule" + }, + "type": "array" + }, + "baseDimensionName": { + "type": "string" + }, + "uuid": { + "type": "string", + "nullable": true + }, + "percentile": { + "type": "number", + "format": "double" + }, + "formatOptions": { + "$ref": "#/components/schemas/CustomFormat" + } + }, + "required": ["type", "sql", "table", "name"], + "type": "object", + "additionalProperties": true + }, + "CustomDimensionType.BIN": { + "enum": ["bin"], + "type": "string" + }, + "BinType": { + "enum": ["fixed_number", "fixed_width", "custom_range"], + "type": "string" + }, + "BinRange": { + "properties": { + "to": { + "type": "number", + "format": "double" + }, + "from": { + "type": "number", + "format": "double" + } + }, + "type": "object" + }, + "CustomDimensionType": { + "enum": ["bin", "sql"], + "type": "string" + }, + "CustomBinDimension": { + "properties": { + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "table": { + "type": "string" + }, + "type": { + "$ref": "#/components/schemas/CustomDimensionType.BIN" + }, + "dimensionId": { + "$ref": "#/components/schemas/FieldId" + }, + "binType": { + "$ref": "#/components/schemas/BinType" + }, + "binNumber": { + "type": "number", + "format": "double" + }, + "binWidth": { + "type": "number", + "format": "double" + }, + "customRange": { + "items": { + "$ref": "#/components/schemas/BinRange" + }, + "type": "array" + } + }, + "required": [ + "id", + "name", + "table", + "type", + "dimensionId", + "binType" + ], + "type": "object", + "additionalProperties": true + }, + "CustomDimensionType.SQL": { + "enum": ["sql"], + "type": "string" + }, + "DimensionType": { + "enum": ["string", "number", "timestamp", "date", "boolean"], + "type": "string" + }, + "CustomSqlDimension": { + "properties": { + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "table": { + "type": "string" + }, + "type": { + "$ref": "#/components/schemas/CustomDimensionType.SQL" + }, + "sql": { + "type": "string" + }, + "dimensionType": { + "$ref": "#/components/schemas/DimensionType" + } + }, + "required": [ + "id", + "name", + "table", + "type", + "sql", + "dimensionType" + ], + "type": "object", + "additionalProperties": true + }, + "CustomDimension": { + "anyOf": [ + { + "$ref": "#/components/schemas/CustomBinDimension" + }, + { + "$ref": "#/components/schemas/CustomSqlDimension" + } + ] + }, + "Pick_CompiledDimension.label-or-name_": { + "properties": { + "name": { + "type": "string" + }, + "label": { + "type": "string" + } + }, + "required": ["name", "label"], + "type": "object", + "description": "From T, pick a set of properties whose keys are in the union K" + }, + "MetricQuery": { + "properties": { + "metadata": { + "properties": { + "hasADateDimension": { + "$ref": "#/components/schemas/Pick_CompiledDimension.label-or-name_" + } + }, + "required": ["hasADateDimension"], + "type": "object" + }, + "timezone": { + "type": "string" + }, + "customDimensions": { + "items": { + "$ref": "#/components/schemas/CustomDimension" + }, + "type": "array" + }, + "additionalMetrics": { + "items": { + "$ref": "#/components/schemas/AdditionalMetric" + }, + "type": "array" + }, + "tableCalculations": { + "items": { + "$ref": "#/components/schemas/TableCalculation" + }, + "type": "array" + }, + "limit": { + "type": "number", + "format": "double" + }, + "sorts": { + "items": { + "$ref": "#/components/schemas/SortField" + }, + "type": "array" + }, + "filters": { + "$ref": "#/components/schemas/Filters" + }, + "metrics": { + "items": { + "$ref": "#/components/schemas/FieldId" + }, + "type": "array" + }, + "dimensions": { + "items": { + "$ref": "#/components/schemas/FieldId" + }, + "type": "array" + }, + "exploreName": { + "type": "string" + } + }, + "required": [ + "tableCalculations", + "limit", + "sorts", + "filters", + "metrics", + "dimensions", + "exploreName" + ], + "type": "object" + }, + "ChartType.BIG_NUMBER": { + "enum": ["big_number"], + "type": "string" + }, + "ComparisonFormatTypes": { + "enum": ["raw", "percentage"], + "type": "string" + }, + "BigNumber": { + "properties": { + "comparisonLabel": { + "type": "string" + }, + "flipColors": { + "type": "boolean" + }, + "comparisonFormat": { + "$ref": "#/components/schemas/ComparisonFormatTypes" + }, + "showComparison": { + "type": "boolean" + }, + "showBigNumberLabel": { + "type": "boolean" + }, + "selectedField": { + "type": "string" + }, + "style": { + "$ref": "#/components/schemas/CompactOrAlias" + }, + "label": { + "type": "string" + } + }, + "type": "object" + }, + "BigNumberConfig": { + "properties": { + "config": { + "$ref": "#/components/schemas/BigNumber" + }, + "type": { + "$ref": "#/components/schemas/ChartType.BIG_NUMBER" + } + }, + "required": ["type"], + "type": "object" + }, + "ChartType.CARTESIAN": { + "enum": ["cartesian"], + "type": "string" + }, + "Partial_CompleteCartesianChartLayout_": { + "properties": { + "xField": { + "type": "string" + }, + "yField": { + "items": { + "type": "string" + }, + "type": "array" + }, + "flipAxes": { + "type": "boolean" + }, + "showGridX": { + "type": "boolean" + }, + "showGridY": { + "type": "boolean" + } + }, + "type": "object", + "description": "Make all properties in T optional" + }, + "CartesianChartLayout": { + "$ref": "#/components/schemas/Partial_CompleteCartesianChartLayout_" + }, + "EchartsLegend": { + "properties": { + "icon": { + "type": "string", + "enum": [ + "circle", + "rect", + "roundRect", + "triangle", + "diamond", + "pin", + "arrow", + "none" + ] + }, + "align": { + "type": "string", + "enum": ["auto", "left", "right"] + }, + "height": { + "type": "string" + }, + "width": { + "type": "string" + }, + "left": { + "type": "string" + }, + "bottom": { + "type": "string" + }, + "right": { + "type": "string" + }, + "top": { + "type": "string" + }, + "orient": { + "type": "string", + "enum": ["horizontal", "vertical"] + }, + "type": { + "type": "string", + "enum": ["plain", "scroll"] + }, + "show": { + "type": "boolean" + } + }, + "type": "object" + }, + "EchartsGrid": { + "properties": { + "height": { + "type": "string" + }, + "width": { + "type": "string" + }, + "left": { + "type": "string" + }, + "bottom": { + "type": "string" + }, + "right": { + "type": "string" + }, + "top": { + "type": "string" + }, + "containLabel": { + "type": "boolean" + } + }, + "type": "object" + }, + "PivotValue": { + "properties": { + "value": {}, + "field": { + "type": "string" + } + }, + "required": ["value", "field"], + "type": "object" + }, + "PivotReference": { + "properties": { + "pivotValues": { + "items": { + "$ref": "#/components/schemas/PivotValue" + }, + "type": "array" + }, + "field": { + "type": "string" + } + }, + "required": ["field"], + "type": "object" + }, + "CartesianSeriesType": { + "enum": ["line", "bar", "scatter", "area"], + "type": "string" + }, + "MarkLineData": { + "properties": { + "dynamicValue": { + "type": "string", + "enum": ["average"], + "nullable": false + }, + "label": { + "properties": { + "position": { + "type": "string", + "enum": ["start", "middle", "end"] + }, + "formatter": { + "type": "string" + } + }, + "type": "object" + }, + "lineStyle": { + "properties": { + "color": { + "type": "string" + } + }, + "required": ["color"], + "type": "object" + }, + "uuid": { + "type": "string" + }, + "type": { + "type": "string" + }, + "value": { + "type": "string" + }, + "name": { + "type": "string" + }, + "xAxis": { + "type": "string" + }, + "yAxis": { + "type": "string" + } + }, + "required": ["uuid"], + "type": "object" + }, + "MarkLine": { + "properties": { + "label": { + "properties": { + "formatter": { + "type": "string" + } + }, + "type": "object" + }, + "lineStyle": { + "properties": { + "type": { + "type": "string" + }, + "width": { + "type": "number", + "format": "double" + }, + "color": { + "type": "string" + } + }, + "required": ["type", "width", "color"], + "type": "object" + }, + "symbol": { + "type": "string" + }, + "data": { + "items": { + "$ref": "#/components/schemas/MarkLineData" + }, + "type": "array" + } + }, + "required": ["data"], + "type": "object" + }, + "Series": { + "properties": { + "markLine": { + "$ref": "#/components/schemas/MarkLine" + }, + "smooth": { + "type": "boolean" + }, + "showSymbol": { + "type": "boolean" + }, + "areaStyle": { + "properties": {}, + "type": "object" + }, + "hidden": { + "type": "boolean" + }, + "label": { + "properties": { + "position": { + "type": "string", + "enum": [ + "left", + "top", + "right", + "bottom", + "inside" + ] + }, + "show": { + "type": "boolean" + } + }, + "type": "object" + }, + "yAxisIndex": { + "type": "number", + "format": "double" + }, + "color": { + "type": "string" + }, + "name": { + "type": "string" + }, + "stackLabel": { + "properties": { + "show": { + "type": "boolean" + } + }, + "type": "object" + }, + "stack": { + "type": "string" + }, + "type": { + "$ref": "#/components/schemas/CartesianSeriesType" + }, + "encode": { + "properties": { + "y": { + "type": "string" + }, + "x": { + "type": "string" + }, + "yRef": { + "$ref": "#/components/schemas/PivotReference" + }, + "xRef": { + "$ref": "#/components/schemas/PivotReference" + } + }, + "required": ["yRef", "xRef"], + "type": "object" + } + }, + "required": ["type", "encode"], + "type": "object" + }, + "Axis": { + "properties": { + "rotate": { + "type": "number", + "format": "double" + }, + "inverse": { + "type": "boolean" + }, + "maxOffset": { + "type": "string" + }, + "minOffset": { + "type": "string" + }, + "max": { + "type": "string" + }, + "min": { + "type": "string" + }, + "name": { + "type": "string" + } + }, + "type": "object" + }, + "Partial_CompleteEChartsConfig_": { + "properties": { + "legend": { + "$ref": "#/components/schemas/EchartsLegend" + }, + "grid": { + "$ref": "#/components/schemas/EchartsGrid" + }, + "series": { + "items": { + "$ref": "#/components/schemas/Series" + }, + "type": "array" + }, + "xAxis": { + "items": { + "$ref": "#/components/schemas/Axis" + }, + "type": "array" + }, + "yAxis": { + "items": { + "$ref": "#/components/schemas/Axis" + }, + "type": "array" + } + }, + "type": "object", + "description": "Make all properties in T optional" + }, + "EChartsConfig": { + "$ref": "#/components/schemas/Partial_CompleteEChartsConfig_" + }, + "Record_string.SeriesMetadata_": { + "properties": {}, + "type": "object", + "description": "Construct a type with a set of properties K of type T" + }, + "CartesianChart": { + "properties": { + "metadata": { + "$ref": "#/components/schemas/Record_string.SeriesMetadata_" + }, + "eChartsConfig": { + "$ref": "#/components/schemas/EChartsConfig" + }, + "layout": { + "$ref": "#/components/schemas/CartesianChartLayout" + } + }, + "required": ["eChartsConfig", "layout"], + "type": "object" + }, + "CartesianChartConfig": { + "properties": { + "config": { + "$ref": "#/components/schemas/CartesianChart" + }, + "type": { + "$ref": "#/components/schemas/ChartType.CARTESIAN" + } + }, + "required": ["type"], + "type": "object" + }, + "ChartType.CUSTOM": { + "enum": ["custom"], + "type": "string" + }, + "CustomVis": { + "properties": { + "spec": { + "additionalProperties": true, + "type": "object" + } + }, + "type": "object" + }, + "CustomVisConfig": { + "properties": { + "config": { + "$ref": "#/components/schemas/CustomVis" + }, + "type": { + "$ref": "#/components/schemas/ChartType.CUSTOM" + } + }, + "required": ["type"], + "type": "object" + }, + "ChartType.PIE": { + "enum": ["pie"], + "type": "string" + }, + "PieChartValueLabel": { + "type": "string", + "enum": ["hidden", "inside", "outside"], + "nullable": false + }, + "Record_string.string_": { + "properties": {}, + "type": "object", + "description": "Construct a type with a set of properties K of type T" + }, + "Record_string.Partial_PieChartValueOptions__": { + "properties": {}, + "type": "object", + "description": "Construct a type with a set of properties K of type T" + }, + "PieChartLegendPosition": { + "type": "string", + "enum": ["horizontal", "vertical"], + "nullable": false + }, + "PieChart": { + "properties": { + "metadata": { + "$ref": "#/components/schemas/Record_string.SeriesMetadata_" + }, + "legendPosition": { + "$ref": "#/components/schemas/PieChartLegendPosition" + }, + "showLegend": { + "type": "boolean" + }, + "groupSortOverrides": { + "items": { + "type": "string" + }, + "type": "array" + }, + "groupValueOptionOverrides": { + "$ref": "#/components/schemas/Record_string.Partial_PieChartValueOptions__" + }, + "groupColorOverrides": { + "$ref": "#/components/schemas/Record_string.string_" + }, + "groupLabelOverrides": { + "$ref": "#/components/schemas/Record_string.string_" + }, + "showPercentage": { + "type": "boolean" + }, + "showValue": { + "type": "boolean" + }, + "valueLabel": { + "$ref": "#/components/schemas/PieChartValueLabel" + }, + "isDonut": { + "type": "boolean" + }, + "metricId": { + "type": "string" + }, + "groupFieldIds": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "type": "object" + }, + "PieChartConfig": { + "properties": { + "config": { + "$ref": "#/components/schemas/PieChart" + }, + "type": { + "$ref": "#/components/schemas/ChartType.PIE" + } + }, + "required": ["type"], + "type": "object" + }, + "ChartType.FUNNEL": { + "enum": ["funnel"], + "type": "string" + }, + "FunnelChartDataInput": { + "enum": ["row", "column"], + "type": "string" + }, + "FunnelChartLabelPosition": { + "enum": ["inside", "left", "right", "hidden"], + "type": "string" + }, + "FunnelChartLegendPosition": { + "enum": ["horizontal", "vertical"], + "type": "string" + }, + "FunnelChart": { + "properties": { + "legendPosition": { + "$ref": "#/components/schemas/FunnelChartLegendPosition" + }, + "showLegend": { + "type": "boolean" + }, + "labels": { + "properties": { + "showPercentage": { + "type": "boolean" + }, + "showValue": { + "type": "boolean" + }, + "position": { + "$ref": "#/components/schemas/FunnelChartLabelPosition" + } + }, + "type": "object" + }, + "colorOverrides": { + "$ref": "#/components/schemas/Record_string.string_" + }, + "labelOverrides": { + "$ref": "#/components/schemas/Record_string.string_" + }, + "metadata": { + "$ref": "#/components/schemas/Record_string.SeriesMetadata_" + }, + "fieldId": { + "type": "string" + }, + "dataInput": { + "$ref": "#/components/schemas/FunnelChartDataInput" + } + }, + "type": "object" + }, + "FunnelChartConfig": { + "properties": { + "config": { + "$ref": "#/components/schemas/FunnelChart" + }, + "type": { + "$ref": "#/components/schemas/ChartType.FUNNEL" + } + }, + "required": ["type"], + "type": "object" + }, + "ChartType.TABLE": { + "enum": ["table"], + "type": "string" + }, + "Record_string.ColumnProperties_": { + "properties": {}, + "type": "object", + "description": "Construct a type with a set of properties K of type T" + }, + "ConditionalRule_ConditionalOperator.number_": { + "properties": { + "values": { + "items": { + "type": "number", + "format": "double" + }, + "type": "array" + }, + "operator": { + "$ref": "#/components/schemas/ConditionalOperator" + }, + "id": { + "type": "string" + } + }, + "required": ["operator", "id"], + "type": "object" + }, + "ConditionalFormattingWithConditionalOperator": { + "allOf": [ + { + "$ref": "#/components/schemas/ConditionalRule_ConditionalOperator.number_" + }, + { + "properties": { + "values": { + "items": { + "type": "number", + "format": "double" + }, + "type": "array" + } + }, + "required": ["values"], + "type": "object" + } + ] + }, + "ConditionalFormattingConfigWithSingleColor": { + "properties": { + "rules": { + "items": { + "$ref": "#/components/schemas/ConditionalFormattingWithConditionalOperator" + }, + "type": "array" + }, + "color": { + "type": "string" + }, + "target": { + "allOf": [ + { + "$ref": "#/components/schemas/FieldTarget" + } + ], + "nullable": true + } + }, + "required": ["rules", "color", "target"], + "type": "object" + }, + "ConditionalFormattingWithRange": { + "properties": { + "max": { + "type": "number", + "format": "double" + }, + "min": { + "type": "number", + "format": "double" + } + }, + "required": ["max", "min"], + "type": "object" + }, + "ConditionalFormattingConfigWithColorRange": { + "properties": { + "rule": { + "$ref": "#/components/schemas/ConditionalFormattingWithRange" + }, + "color": { + "properties": { + "steps": { + "type": "number", + "enum": [5], + "nullable": false + }, + "end": { + "type": "string" + }, + "start": { + "type": "string" + } + }, + "required": ["steps", "end", "start"], + "type": "object" + }, + "target": { + "allOf": [ + { + "$ref": "#/components/schemas/FieldTarget" + } + ], + "nullable": true + } + }, + "required": ["rule", "color", "target"], + "type": "object" + }, + "ConditionalFormattingConfig": { + "anyOf": [ + { + "$ref": "#/components/schemas/ConditionalFormattingConfigWithSingleColor" + }, + { + "$ref": "#/components/schemas/ConditionalFormattingConfigWithColorRange" + } + ] + }, + "TableChart": { + "properties": { + "metricsAsRows": { + "type": "boolean" + }, + "conditionalFormattings": { + "items": { + "$ref": "#/components/schemas/ConditionalFormattingConfig" + }, + "type": "array" + }, + "columns": { + "$ref": "#/components/schemas/Record_string.ColumnProperties_" + }, + "showSubtotals": { + "type": "boolean" + }, + "showResultsTotal": { + "type": "boolean" + }, + "hideRowNumbers": { + "type": "boolean" + }, + "showTableNames": { + "type": "boolean" + }, + "showRowCalculation": { + "type": "boolean" + }, + "showColumnCalculation": { + "type": "boolean" + } + }, + "type": "object" + }, + "TableChartConfig": { + "properties": { + "config": { + "$ref": "#/components/schemas/TableChart" + }, + "type": { + "$ref": "#/components/schemas/ChartType.TABLE" + } + }, + "required": ["type"], + "type": "object" + }, + "ChartConfig": { + "anyOf": [ + { + "$ref": "#/components/schemas/BigNumberConfig" + }, + { + "$ref": "#/components/schemas/CartesianChartConfig" + }, + { + "$ref": "#/components/schemas/CustomVisConfig" + }, + { + "$ref": "#/components/schemas/PieChartConfig" + }, + { + "$ref": "#/components/schemas/FunnelChartConfig" + }, + { + "$ref": "#/components/schemas/TableChartConfig" + } + ] + }, + "Pick_SavedChart.Exclude_keyofSavedChart.isPrivate-or-access__": { + "properties": { + "name": { + "type": "string" + }, + "description": { + "type": "string" + }, + "uuid": { + "type": "string" + }, + "spaceName": { + "type": "string" + }, + "spaceUuid": { + "type": "string" + }, + "projectUuid": { + "type": "string" + }, + "organizationUuid": { + "type": "string" + }, + "pinnedListUuid": { + "type": "string", + "nullable": true + }, + "dashboardUuid": { + "type": "string", + "nullable": true + }, + "dashboardName": { + "type": "string", + "nullable": true + }, + "slug": { + "type": "string" + }, + "updatedAt": { + "type": "string", + "format": "date-time" + }, + "updatedByUser": { + "$ref": "#/components/schemas/UpdatedByUser" + }, + "pinnedListOrder": { + "type": "number", + "format": "double", + "nullable": true + }, + "tableName": { + "type": "string" + }, + "metricQuery": { + "$ref": "#/components/schemas/MetricQuery" + }, + "pivotConfig": { + "properties": { + "columns": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "required": ["columns"], + "type": "object" + }, + "chartConfig": { + "$ref": "#/components/schemas/ChartConfig" + }, + "tableConfig": { + "properties": { + "columnOrder": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "required": ["columnOrder"], + "type": "object" + }, + "colorPalette": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "required": [ + "name", + "uuid", + "spaceName", + "spaceUuid", + "projectUuid", + "organizationUuid", + "pinnedListUuid", + "dashboardUuid", + "dashboardName", + "slug", + "updatedAt", + "pinnedListOrder", + "tableName", + "metricQuery", + "chartConfig", + "tableConfig", + "colorPalette" + ], + "type": "object", + "description": "From T, pick a set of properties whose keys are in the union K" + }, + "Omit_SavedChart.isPrivate-or-access_": { + "$ref": "#/components/schemas/Pick_SavedChart.Exclude_keyofSavedChart.isPrivate-or-access__", + "description": "Construct a type with the properties of T except for those in type K." + }, + "SavedChartDAO": { + "$ref": "#/components/schemas/Omit_SavedChart.isPrivate-or-access_" + }, + "PromotedChart": { + "allOf": [ + { + "$ref": "#/components/schemas/SavedChartDAO" + }, + { + "properties": { + "oldUuid": { + "type": "string" + }, + "spaceSlug": { + "type": "string" + } + }, + "required": ["oldUuid", "spaceSlug"], + "type": "object" + } + ] + }, + "PromotionChanges": { + "properties": { + "charts": { + "items": { + "properties": { + "data": { + "$ref": "#/components/schemas/PromotedChart" + }, + "action": { + "$ref": "#/components/schemas/PromotionAction" + } + }, + "required": ["data", "action"], + "type": "object" + }, + "type": "array" + }, + "dashboards": { + "items": { + "properties": { + "data": { + "$ref": "#/components/schemas/PromotedDashboard" + }, + "action": { + "$ref": "#/components/schemas/PromotionAction" + } + }, + "required": ["data", "action"], + "type": "object" + }, + "type": "array" + }, + "spaces": { + "items": { + "properties": { + "data": { + "$ref": "#/components/schemas/PromotedSpace" + }, + "action": { + "$ref": "#/components/schemas/PromotionAction" + } + }, + "required": ["data", "action"], + "type": "object" + }, + "type": "array" + } + }, + "required": ["charts", "dashboards", "spaces"], + "type": "object" + }, + "ApiPromotionChangesResponse": { + "properties": { + "results": { + "$ref": "#/components/schemas/PromotionChanges" + }, + "status": { + "type": "string", + "enum": ["ok"], + "nullable": false + } + }, + "required": ["results", "status"], + "type": "object" + }, + "ExploreType": { + "enum": ["virtual", "default"], + "type": "string" + }, + "Pick_Explore.SummaryExploreFields_": { + "properties": { + "name": { + "type": "string" + }, + "label": { + "type": "string" + }, + "groupLabel": { + "type": "string" + }, + "type": { + "$ref": "#/components/schemas/ExploreType" + }, + "tags": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "required": ["name", "label", "tags"], + "type": "object", + "description": "From T, pick a set of properties whose keys are in the union K" + }, + "SummaryExtraFields": { + "properties": { + "databaseName": { + "type": "string" + }, + "schemaName": { + "type": "string" + }, + "description": { + "type": "string" + } + }, + "required": ["databaseName", "schemaName"], + "type": "object" + }, + "Pick_ExploreError.SummaryExploreErrorFields_": { + "properties": { + "name": { + "type": "string" + }, + "label": { + "type": "string" + }, + "groupLabel": { + "type": "string" + }, + "type": { + "$ref": "#/components/schemas/ExploreType" + }, + "tags": { + "items": { + "type": "string" + }, + "type": "array" + }, + "errors": { + "items": { + "$ref": "#/components/schemas/InlineError" + }, + "type": "array" + } + }, + "required": ["name", "label", "tags", "errors"], + "type": "object", + "description": "From T, pick a set of properties whose keys are in the union K" + }, + "Partial_SummaryExtraFields_": { + "properties": { + "description": { + "type": "string" + }, + "schemaName": { + "type": "string" + }, + "databaseName": { + "type": "string" + } + }, + "type": "object", + "description": "Make all properties in T optional" + }, + "SummaryExplore": { + "anyOf": [ + { + "allOf": [ + { + "$ref": "#/components/schemas/Pick_Explore.SummaryExploreFields_" + }, + { + "$ref": "#/components/schemas/SummaryExtraFields" + } + ] + }, + { + "allOf": [ + { + "$ref": "#/components/schemas/Pick_ExploreError.SummaryExploreErrorFields_" + }, + { + "$ref": "#/components/schemas/Partial_SummaryExtraFields_" + } + ] + } + ] + }, + "ApiExploresResults": { + "items": { + "$ref": "#/components/schemas/SummaryExplore" + }, + "type": "array" + }, + "OrderFieldsByStrategy": { + "enum": ["LABEL", "INDEX"], + "type": "string" + }, + "Record_string.GroupType_": { + "properties": {}, + "type": "object", + "description": "Construct a type with a set of properties K of type T" + }, + "TableBase": { + "properties": { + "defaultTimeDimension": { + "$ref": "#/components/schemas/DefaultTimeDimension" + }, + "groupDetails": { + "$ref": "#/components/schemas/Record_string.GroupType_" + }, + "requiredAttributes": { + "$ref": "#/components/schemas/Record_string.string-or-string-Array_" + }, + "hidden": { + "type": "boolean" + }, + "requiredFilters": { + "items": { + "$ref": "#/components/schemas/MetricFilterRule" + }, + "type": "array" + }, + "sqlWhere": { + "type": "string" + }, + "groupLabel": { + "type": "string" + }, + "orderFieldsBy": { + "$ref": "#/components/schemas/OrderFieldsByStrategy" + }, + "sqlTable": { + "type": "string" + }, + "schema": { + "type": "string" + }, + "database": { + "type": "string" + }, + "description": { + "type": "string" + }, + "originalName": { + "type": "string" + }, + "label": { + "type": "string" + }, + "name": { + "type": "string" + } + }, + "required": ["sqlTable", "schema", "database", "label", "name"], + "type": "object" + }, + "Record_string.CompiledDimension_": { + "properties": {}, + "type": "object", + "description": "Construct a type with a set of properties K of type T" + }, + "Record_string.CompiledMetric_": { + "properties": {}, + "type": "object", + "description": "Construct a type with a set of properties K of type T" + }, + "Record_string.LineageNodeDependency-Array_": { + "properties": {}, + "type": "object", + "description": "Construct a type with a set of properties K of type T" + }, + "LineageGraph": { + "$ref": "#/components/schemas/Record_string.LineageNodeDependency-Array_" + }, + "CompiledTable": { + "allOf": [ + { + "$ref": "#/components/schemas/TableBase" + }, + { + "properties": { + "uncompiledSqlWhere": { + "type": "string" + }, + "source": { + "$ref": "#/components/schemas/Source" + }, + "lineageGraph": { + "$ref": "#/components/schemas/LineageGraph" + }, + "metrics": { + "$ref": "#/components/schemas/Record_string.CompiledMetric_" + }, + "dimensions": { + "$ref": "#/components/schemas/Record_string.CompiledDimension_" + } + }, + "required": ["lineageGraph", "metrics", "dimensions"], + "type": "object" + } + ] + }, + "SupportedDbtAdapter": { + "enum": [ + "bigquery", + "databricks", + "snowflake", + "redshift", + "postgres", + "trino" + ], + "type": "string" + }, + "Explore": { + "properties": { + "type": { + "$ref": "#/components/schemas/ExploreType" + }, + "sqlPath": { + "type": "string" + }, + "ymlPath": { + "type": "string" + }, + "warehouse": { + "type": "string" + }, + "targetDatabase": { + "$ref": "#/components/schemas/SupportedDbtAdapter" + }, + "tables": { + "properties": {}, + "additionalProperties": { + "$ref": "#/components/schemas/CompiledTable" + }, + "type": "object" + }, + "joinedTables": { + "items": { + "$ref": "#/components/schemas/CompiledExploreJoin" + }, + "type": "array" + }, + "baseTable": { + "type": "string" + }, + "groupLabel": { + "type": "string" + }, + "tags": { + "items": { + "type": "string" + }, + "type": "array" + }, + "label": { + "type": "string" + }, + "name": { + "type": "string" + } + }, + "required": [ + "targetDatabase", + "tables", + "joinedTables", + "baseTable", + "tags", + "label", + "name" + ], + "type": "object" + }, + "ApiExploreResults": { + "$ref": "#/components/schemas/Explore" + }, + "ApiCompiledQueryResults": { + "type": "string" + }, + "GitRepo": { + "properties": { + "ownerLogin": { + "type": "string" + }, + "fullName": { + "type": "string" + }, + "name": { + "type": "string" + } + }, + "required": ["ownerLogin", "fullName", "name"], + "type": "object" + }, + "GitIntegrationConfiguration": { + "properties": { + "enabled": { + "type": "boolean" + } + }, + "required": ["enabled"], + "type": "object" + }, + "PullRequestCreated": { + "properties": { + "prUrl": { + "type": "string" + }, + "prTitle": { + "type": "string" + } + }, + "required": ["prUrl", "prTitle"], + "type": "object" + }, + "ApiGdriveAccessTokenResponse": { + "properties": { + "results": { + "type": "string" + }, + "status": { + "type": "string", + "enum": ["ok"], + "nullable": false + } + }, + "required": ["results", "status"], + "type": "object" + }, + "ApiJobScheduledResponse": { + "properties": { + "results": { + "properties": { + "jobId": { + "type": "string" + } + }, + "required": ["jobId"], + "type": "object" + }, + "status": { + "type": "string", + "enum": ["ok"], + "nullable": false + } + }, + "required": ["results", "status"], + "type": "object" + }, + "FilterGroupResponse": { + "anyOf": [ + { + "properties": { + "or": { + "items": {}, + "type": "array" + }, + "id": { + "type": "string" + } + }, + "required": ["or", "id"], + "type": "object" + }, + { + "properties": { + "and": { + "items": {}, + "type": "array" + }, + "id": { + "type": "string" + } + }, + "required": ["and", "id"], + "type": "object" + } + ] + }, + "FiltersResponse": { + "properties": { + "tableCalculations": { + "$ref": "#/components/schemas/FilterGroupResponse" + }, + "metrics": { + "$ref": "#/components/schemas/FilterGroupResponse" + }, + "dimensions": { + "$ref": "#/components/schemas/FilterGroupResponse" + } + }, + "type": "object" + }, + "MetricQueryResponse": { + "properties": { + "metadata": { + "properties": { + "hasADateDimension": { + "$ref": "#/components/schemas/Pick_CompiledDimension.label-or-name_" + } + }, + "required": ["hasADateDimension"], + "type": "object" + }, + "customDimensions": { + "items": { + "$ref": "#/components/schemas/CustomDimension" + }, + "type": "array" + }, + "additionalMetrics": { + "items": { + "$ref": "#/components/schemas/AdditionalMetric" + }, + "type": "array" + }, + "tableCalculations": { + "items": { + "$ref": "#/components/schemas/TableCalculation" + }, + "type": "array" + }, + "limit": { + "type": "number", + "format": "double" + }, + "sorts": { + "items": { + "$ref": "#/components/schemas/SortField" + }, + "type": "array" + }, + "filters": { + "$ref": "#/components/schemas/FiltersResponse" + }, + "metrics": { + "items": { + "$ref": "#/components/schemas/FieldId" + }, + "type": "array" + }, + "dimensions": { + "items": { + "$ref": "#/components/schemas/FieldId" + }, + "type": "array" + }, + "exploreName": { + "type": "string" + } + }, + "required": [ + "tableCalculations", + "limit", + "sorts", + "filters", + "metrics", + "dimensions", + "exploreName" + ], + "type": "object" + }, + "CustomLabel": { + "properties": {}, + "additionalProperties": { + "type": "string" + }, + "type": "object" + }, + "UploadMetricGsheet": { + "properties": { + "hiddenFields": { + "items": { + "type": "string" + }, + "type": "array" + }, + "customLabels": { + "$ref": "#/components/schemas/CustomLabel" + }, + "columnOrder": { + "items": { + "type": "string" + }, + "type": "array" + }, + "showTableNames": { + "type": "boolean" + }, + "metricQuery": { + "$ref": "#/components/schemas/MetricQueryResponse" + }, + "exploreId": { + "type": "string" + }, + "projectUuid": { + "type": "string" + } + }, + "required": [ + "columnOrder", + "showTableNames", + "metricQuery", + "exploreId", + "projectUuid" + ], + "type": "object" + }, + "Group": { + "properties": { + "organizationUuid": { + "type": "string", + "description": "The UUID of the organization that the group belongs to" + }, + "updatedByUserUuid": { + "type": "string", + "nullable": true, + "description": "The UUID of the user that last updated the group" + }, + "updatedAt": { + "type": "string", + "format": "date-time", + "description": "The time that the group was last updated" + }, + "createdByUserUuid": { + "type": "string", + "nullable": true, + "description": "The UUID of the user that created the group" + }, + "createdAt": { + "type": "string", + "format": "date-time", + "description": "The time that the group was created" + }, + "name": { + "type": "string", + "description": "A friendly name for the group" + }, + "uuid": { + "type": "string", + "description": "The group's UUID" + } + }, + "required": [ + "organizationUuid", + "updatedByUserUuid", + "updatedAt", + "createdByUserUuid", + "createdAt", + "name", + "uuid" + ], + "type": "object" + }, + "GroupMember": { + "properties": { + "lastName": { + "type": "string", + "description": "The user's last name" + }, + "firstName": { + "type": "string", + "description": "The user's first name" + }, + "email": { + "type": "string", + "description": "Primary email address for the user" + }, + "userUuid": { + "type": "string", + "description": "Unique id for the user", + "format": "uuid" + } + }, + "required": ["lastName", "firstName", "email", "userUuid"], + "type": "object", + "description": "A summary for a Lightdash user within a group" + }, + "GroupWithMembers": { + "allOf": [ + { + "$ref": "#/components/schemas/Group" + }, + { + "properties": { + "memberUuids": { + "items": { + "type": "string" + }, + "type": "array" + }, + "members": { + "items": { + "$ref": "#/components/schemas/GroupMember" + }, + "type": "array", + "description": "A list of the group's members." + } + }, + "required": ["memberUuids", "members"], + "type": "object" + } + ], + "description": "Details for a group including a list of the group's members." + }, + "ApiGroupResponse": { + "properties": { + "results": { + "anyOf": [ + { + "$ref": "#/components/schemas/Group" + }, + { + "$ref": "#/components/schemas/GroupWithMembers" + } + ] + }, + "status": { + "type": "string", + "enum": ["ok"], + "nullable": false + } + }, + "required": ["results", "status"], + "type": "object" + }, + "ApiGroupMembersResponse": { + "properties": { + "results": { + "items": { + "$ref": "#/components/schemas/GroupMember" + }, + "type": "array" + }, + "status": { + "type": "string", + "enum": ["ok"], + "nullable": false + } + }, + "required": ["results", "status"], + "type": "object" + }, + "Pick_GroupMember.userUuid_": { + "properties": { + "userUuid": { + "type": "string", + "description": "Unique id for the user", + "format": "uuid" + } + }, + "required": ["userUuid"], + "type": "object", + "description": "From T, pick a set of properties whose keys are in the union K" + }, + "UpdateGroupWithMembers": { + "properties": { + "members": { + "items": { + "$ref": "#/components/schemas/Pick_GroupMember.userUuid_" + }, + "type": "array" + }, + "name": { + "type": "string" + } + }, + "type": "object" + }, + "ProjectMemberRole": { + "enum": [ + "viewer", + "interactive_viewer", + "editor", + "developer", + "admin" + ], + "type": "string" + }, + "ProjectGroupAccess": { + "properties": { + "role": { + "$ref": "#/components/schemas/ProjectMemberRole" + }, + "groupUuid": { + "type": "string" + }, + "projectUuid": { + "type": "string" + } + }, + "required": ["role", "groupUuid", "projectUuid"], + "type": "object" + }, + "ApiCreateProjectGroupAccess": { + "properties": { + "results": { + "$ref": "#/components/schemas/ProjectGroupAccess" + }, + "status": { + "type": "string", + "enum": ["ok"], + "nullable": false + } + }, + "required": ["results", "status"], + "type": "object" + }, + "Pick_CreateDBProjectGroupAccess.role_": { + "properties": { + "role": { + "$ref": "#/components/schemas/ProjectMemberRole" + } + }, + "required": ["role"], + "type": "object", + "description": "From T, pick a set of properties whose keys are in the union K" + }, + "ApiUpdateProjectGroupAccess": { + "properties": { + "results": { + "$ref": "#/components/schemas/ProjectGroupAccess" + }, + "status": { + "type": "string", + "enum": ["ok"], + "nullable": false + } + }, + "required": ["results", "status"], + "type": "object" + }, + "Pick_DBProjectGroupAccess.role_": { + "properties": { + "role": { + "$ref": "#/components/schemas/ProjectMemberRole" + } + }, + "required": ["role"], + "type": "object", + "description": "From T, pick a set of properties whose keys are in the union K" + }, + "UpdateDBProjectGroupAccess": { + "$ref": "#/components/schemas/Pick_DBProjectGroupAccess.role_" + }, + "Record_string._value-ResultValue--__": { + "properties": {}, + "type": "object", + "description": "Construct a type with a set of properties K of type T" + }, + "ResultRow": { + "$ref": "#/components/schemas/Record_string._value-ResultValue--__" + }, + "Record_string.Field-or-TableCalculation-or-CustomDimension-or-Metric_": { + "properties": {}, + "type": "object", + "description": "Construct a type with a set of properties K of type T" + }, + "ItemsMap": { + "$ref": "#/components/schemas/Record_string.Field-or-TableCalculation-or-CustomDimension-or-Metric_" + }, + "MetricsExplorerQueryResults": { + "properties": { + "fields": { + "$ref": "#/components/schemas/ItemsMap" + }, + "comparisonRows": { + "items": { + "$ref": "#/components/schemas/ResultRow" + }, + "type": "array" + }, + "rows": { + "items": { + "$ref": "#/components/schemas/ResultRow" + }, + "type": "array" + } + }, + "required": ["fields", "rows"], + "type": "object" + }, + "ApiMetricsExplorerQueryResults": { + "properties": { + "results": { + "$ref": "#/components/schemas/MetricsExplorerQueryResults" + }, + "status": { + "type": "string", + "enum": ["ok"], + "nullable": false + } + }, + "required": ["results", "status"], + "type": "object" + }, + "NotificationBase": { + "properties": { + "url": { + "type": "string" + }, + "message": { + "type": "string" + }, + "resourceUuid": { + "type": "string" + }, + "viewed": { + "type": "boolean" + }, + "createdAt": { + "type": "string", + "format": "date-time" + }, + "notificationId": { + "type": "string" + } + }, + "required": ["viewed", "createdAt", "notificationId"], + "type": "object" + }, + "ApiNotificationResourceType.DashboardComments": { + "enum": ["dashboardComments"], + "type": "string" + }, + "NotificationDashboardTileCommentMetadata": { + "properties": { + "dashboardUuid": { + "type": "string" + }, + "dashboardName": { + "type": "string" + }, + "dashboardTileUuid": { + "type": "string" + }, + "dashboardTileName": { + "type": "string" + } + }, + "required": [ + "dashboardUuid", + "dashboardName", + "dashboardTileUuid", + "dashboardTileName" + ], + "type": "object", + "additionalProperties": true + }, + "NotificationDashboardComment": { + "allOf": [ + { + "$ref": "#/components/schemas/NotificationBase" + }, + { + "properties": { + "metadata": { + "$ref": "#/components/schemas/NotificationDashboardTileCommentMetadata" + }, + "resourceType": { + "$ref": "#/components/schemas/ApiNotificationResourceType.DashboardComments" + } + }, + "required": ["resourceType"], + "type": "object" + } + ] + }, + "Notification": { + "$ref": "#/components/schemas/NotificationDashboardComment" + }, + "ApiNotificationsResults": { + "items": { + "$ref": "#/components/schemas/Notification" + }, + "type": "array" + }, + "ApiGetNotifications": { + "properties": { + "results": { + "$ref": "#/components/schemas/ApiNotificationsResults" + }, + "status": { + "type": "string", + "enum": ["ok"], + "nullable": false + } + }, + "required": ["results", "status"], + "type": "object" + }, + "ApiNotificationResourceType": { + "enum": ["dashboardComments"], + "type": "string" + }, + "Pick_Notification.viewed_": { + "properties": { + "viewed": { + "type": "boolean" + } + }, + "required": ["viewed"], + "type": "object", + "description": "From T, pick a set of properties whose keys are in the union K" + }, + "ApiNotificationUpdateParams": { + "$ref": "#/components/schemas/Pick_Notification.viewed_" + }, + "Organization": { + "properties": { + "defaultProjectUuid": { + "type": "string", + "description": "The project a user sees when they first log in to the organization" + }, + "needsProject": { + "type": "boolean", + "description": "The organization needs a project if it doesn't have at least one project." + }, + "chartColors": { + "items": { + "type": "string" + }, + "type": "array", + "description": "The default color palette for all projects in the organization" + }, + "name": { + "type": "string", + "description": "The name of the organization" + }, + "organizationUuid": { + "type": "string", + "description": "The unique identifier of the organization", + "format": "uuid" + } + }, + "required": ["name", "organizationUuid"], + "type": "object", + "description": "Details of a user's Organization" + }, + "ApiOrganization": { + "properties": { + "results": { + "$ref": "#/components/schemas/Organization" + }, + "status": { + "type": "string", + "enum": ["ok"], + "nullable": false + } + }, + "required": ["results", "status"], + "type": "object" + }, + "Pick_Organization.name_": { + "properties": { + "name": { + "type": "string", + "description": "The name of the organization" + } + }, + "required": ["name"], + "type": "object", + "description": "From T, pick a set of properties whose keys are in the union K" + }, + "CreateOrganization": { + "$ref": "#/components/schemas/Pick_Organization.name_" + }, + "Partial_Omit_Organization.organizationUuid-or-needsProject__": { + "properties": { + "name": { + "type": "string", + "description": "The name of the organization" + }, + "chartColors": { + "items": { + "type": "string" + }, + "type": "array", + "description": "The default color palette for all projects in the organization" + }, + "defaultProjectUuid": { + "type": "string", + "description": "The project a user sees when they first log in to the organization" + } + }, + "type": "object", + "description": "Make all properties in T optional" + }, + "UpdateOrganization": { + "$ref": "#/components/schemas/Partial_Omit_Organization.organizationUuid-or-needsProject__" + }, + "ProjectType": { + "enum": ["DEFAULT", "PREVIEW"], + "type": "string" + }, + "WarehouseTypes": { + "enum": [ + "bigquery", + "postgres", + "redshift", + "snowflake", + "databricks", + "trino" + ], + "type": "string" + }, + "OrganizationProject": { + "properties": { + "requireUserCredentials": { + "type": "boolean" + }, + "warehouseType": { + "$ref": "#/components/schemas/WarehouseTypes" + }, + "upstreamProjectUuid": { + "type": "string", + "nullable": true + }, + "createdByUserUuid": { + "type": "string", + "nullable": true + }, + "type": { + "$ref": "#/components/schemas/ProjectType" + }, + "name": { + "type": "string" + }, + "projectUuid": { + "type": "string", + "description": "The unique identifier of the project", + "format": "uuid" + } + }, + "required": [ + "requireUserCredentials", + "warehouseType", + "upstreamProjectUuid", + "createdByUserUuid", + "type", + "name", + "projectUuid" + ], + "type": "object", + "description": "Summary of a project under an organization" + }, + "ApiOrganizationProjects": { + "properties": { + "results": { + "items": { + "$ref": "#/components/schemas/OrganizationProject" + }, + "type": "array" + }, + "status": { + "type": "string", + "enum": ["ok"], + "nullable": false + } + }, + "required": ["results", "status"], + "type": "object", + "description": "List of projects in the current organization" + }, + "OrganizationMemberRole": { + "enum": [ + "member", + "viewer", + "interactive_viewer", + "editor", + "developer", + "admin" + ], + "type": "string" + }, + "OrganizationMemberProfile": { + "properties": { + "isPending": { + "type": "boolean", + "description": "Whether the user doesn't have an authentication method (password or openId)" + }, + "isInviteExpired": { + "type": "boolean", + "description": "Whether the user's invite to the organization has expired" + }, + "isActive": { + "type": "boolean", + "description": "Whether the user can login" + }, + "role": { + "$ref": "#/components/schemas/OrganizationMemberRole", + "description": "The role of the user in the organization" + }, + "organizationUuid": { + "type": "string", + "description": "Unique identifier for the organization the user is a member of" + }, + "email": { + "type": "string" + }, + "lastName": { + "type": "string" + }, + "firstName": { + "type": "string" + }, + "userUpdatedAt": { + "type": "string", + "format": "date-time" + }, + "userCreatedAt": { + "type": "string", + "format": "date-time" + }, + "userUuid": { + "type": "string", + "description": "Unique identifier for the user", + "format": "uuid" + } + }, + "required": [ + "isActive", + "role", + "organizationUuid", + "email", + "lastName", + "firstName", + "userUpdatedAt", + "userCreatedAt", + "userUuid" + ], + "type": "object", + "description": "Profile for a user's membership in an organization" + }, + "KnexPaginatedData_OrganizationMemberProfile-Array_": { + "properties": { + "pagination": { + "allOf": [ + { + "$ref": "#/components/schemas/KnexPaginateArgs" + }, + { + "properties": { + "totalResults": { + "type": "number", + "format": "double" + }, + "totalPageCount": { + "type": "number", + "format": "double" + } + }, + "required": ["totalResults", "totalPageCount"], + "type": "object" + } + ] + }, + "data": { + "items": { + "$ref": "#/components/schemas/OrganizationMemberProfile" + }, + "type": "array" + } + }, + "required": ["data"], + "type": "object" + }, + "ApiOrganizationMemberProfiles": { + "properties": { + "results": { + "$ref": "#/components/schemas/KnexPaginatedData_OrganizationMemberProfile-Array_" + }, + "status": { + "type": "string", + "enum": ["ok"], + "nullable": false + } + }, + "required": ["results", "status"], + "type": "object" + }, + "ApiOrganizationMemberProfile": { + "properties": { + "results": { + "$ref": "#/components/schemas/OrganizationMemberProfile" + }, + "status": { + "type": "string", + "enum": ["ok"], + "nullable": false + } + }, + "required": ["results", "status"], + "type": "object" + }, + "UUID": { + "type": "string", + "format": "uuid", + "description": "Stringified UUIDv4.\nSee [RFC 4112](https://tools.ietf.org/html/rfc4122)", + "pattern": "[0-9A-Fa-f]{8}-[0-9A-Fa-f]{4}-4[0-9A-Fa-f]{3}-[89ABab][0-9A-Fa-f]{3}-[0-9A-Fa-f]{12}" + }, + "OrganizationMemberProfileUpdate": { + "properties": { + "role": { + "$ref": "#/components/schemas/OrganizationMemberRole" + } + }, + "required": ["role"], + "type": "object" + }, + "OrganizationMemberRole.EDITOR": { + "enum": ["editor"], + "type": "string" + }, + "OrganizationMemberRole.INTERACTIVE_VIEWER": { + "enum": ["interactive_viewer"], + "type": "string" + }, + "OrganizationMemberRole.VIEWER": { + "enum": ["viewer"], + "type": "string" + }, + "OrganizationMemberRole.MEMBER": { + "enum": ["member"], + "type": "string" + }, + "AllowedEmailDomainsRole": { + "anyOf": [ + { + "$ref": "#/components/schemas/OrganizationMemberRole.EDITOR" + }, + { + "$ref": "#/components/schemas/OrganizationMemberRole.INTERACTIVE_VIEWER" + }, + { + "$ref": "#/components/schemas/OrganizationMemberRole.VIEWER" + }, + { + "$ref": "#/components/schemas/OrganizationMemberRole.MEMBER" + } + ] + }, + "ProjectMemberRole.EDITOR": { + "enum": ["editor"], + "type": "string" + }, + "ProjectMemberRole.INTERACTIVE_VIEWER": { + "enum": ["interactive_viewer"], + "type": "string" + }, + "ProjectMemberRole.VIEWER": { + "enum": ["viewer"], + "type": "string" + }, + "AllowedEmailDomainProjectsRole": { + "anyOf": [ + { + "$ref": "#/components/schemas/ProjectMemberRole.EDITOR" + }, + { + "$ref": "#/components/schemas/ProjectMemberRole.INTERACTIVE_VIEWER" + }, + { + "$ref": "#/components/schemas/ProjectMemberRole.VIEWER" + } + ] + }, + "AllowedEmailDomains": { + "properties": { + "projects": { + "items": { + "properties": { + "role": { + "$ref": "#/components/schemas/AllowedEmailDomainProjectsRole" + }, + "projectUuid": { + "type": "string" + } + }, + "required": ["role", "projectUuid"], + "type": "object" + }, + "type": "array" + }, + "role": { + "$ref": "#/components/schemas/AllowedEmailDomainsRole" + }, + "emailDomains": { + "items": { + "type": "string" + }, + "type": "array" + }, + "organizationUuid": { + "type": "string" + } + }, + "required": [ + "projects", + "role", + "emailDomains", + "organizationUuid" + ], + "type": "object" + }, + "ApiOrganizationAllowedEmailDomains": { + "properties": { + "results": { + "$ref": "#/components/schemas/AllowedEmailDomains" + }, + "status": { + "type": "string", + "enum": ["ok"], + "nullable": false + } + }, + "required": ["results", "status"], + "type": "object" + }, + "Pick_AllowedEmailDomains.Exclude_keyofAllowedEmailDomains.organizationUuid__": { + "properties": { + "role": { + "$ref": "#/components/schemas/AllowedEmailDomainsRole" + }, + "emailDomains": { + "items": { + "type": "string" + }, + "type": "array" + }, + "projects": { + "items": { + "properties": { + "role": { + "$ref": "#/components/schemas/AllowedEmailDomainProjectsRole" + }, + "projectUuid": { + "type": "string" + } + }, + "required": ["role", "projectUuid"], + "type": "object" + }, + "type": "array" + } + }, + "required": ["role", "emailDomains", "projects"], + "type": "object", + "description": "From T, pick a set of properties whose keys are in the union K" + }, + "Omit_AllowedEmailDomains.organizationUuid_": { + "$ref": "#/components/schemas/Pick_AllowedEmailDomains.Exclude_keyofAllowedEmailDomains.organizationUuid__", + "description": "Construct a type with the properties of T except for those in type K." + }, + "UpdateAllowedEmailDomains": { + "$ref": "#/components/schemas/Omit_AllowedEmailDomains.organizationUuid_" + }, + "ApiCreateGroupResponse": { + "properties": { + "results": { + "$ref": "#/components/schemas/GroupWithMembers" + }, + "status": { + "type": "string", + "enum": ["ok"], + "nullable": false + } + }, + "required": ["results", "status"], + "type": "object" + }, + "Pick_Group.name_": { + "properties": { + "name": { + "type": "string", + "description": "A friendly name for the group" + } + }, + "required": ["name"], + "type": "object", + "description": "From T, pick a set of properties whose keys are in the union K" + }, + "CreateGroup": { + "allOf": [ + { + "$ref": "#/components/schemas/Pick_Group.name_" + }, + { + "properties": { + "members": { + "items": { + "$ref": "#/components/schemas/Pick_GroupMember.userUuid_" + }, + "type": "array" + } + }, + "type": "object" + } + ] + }, + "KnexPaginatedData_Group-Array-or-GroupWithMembers-Array_": { + "properties": { + "pagination": { + "allOf": [ + { + "$ref": "#/components/schemas/KnexPaginateArgs" + }, + { + "properties": { + "totalResults": { + "type": "number", + "format": "double" + }, + "totalPageCount": { + "type": "number", + "format": "double" + } + }, + "required": ["totalResults", "totalPageCount"], + "type": "object" + } + ] + }, + "data": { + "anyOf": [ + { + "items": { + "$ref": "#/components/schemas/Group" + }, + "type": "array" + }, + { + "items": { + "$ref": "#/components/schemas/GroupWithMembers" + }, + "type": "array" + } + ] + } + }, + "required": ["data"], + "type": "object" + }, + "ApiGroupListResponse": { + "properties": { + "results": { + "$ref": "#/components/schemas/KnexPaginatedData_Group-Array-or-GroupWithMembers-Array_" + }, + "status": { + "type": "string", + "enum": ["ok"], + "nullable": false + } + }, + "required": ["results", "status"], + "type": "object" + }, + "ResourceViewItemType.DASHBOARD": { + "enum": ["dashboard"], + "type": "string" + }, + "Pick_ValidationResponse.error-or-createdAt-or-validationId_": { + "properties": { + "validationId": { + "type": "number", + "format": "double" + }, + "createdAt": { + "type": "string", + "format": "date-time" + }, + "error": { + "type": "string" + } + }, + "required": ["validationId", "createdAt", "error"], + "type": "object", + "description": "From T, pick a set of properties whose keys are in the union K" + }, + "ValidationSummary": { + "$ref": "#/components/schemas/Pick_ValidationResponse.error-or-createdAt-or-validationId_" + }, + "Pick_DashboardBasicDetails.uuid-or-spaceUuid-or-description-or-name-or-views-or-firstViewedAt-or-pinnedListUuid-or-pinnedListOrder-or-updatedAt-or-updatedByUser-or-validationErrors_": { + "properties": { + "name": { + "type": "string" + }, + "description": { + "type": "string" + }, + "uuid": { + "type": "string" + }, + "spaceUuid": { + "type": "string" + }, + "pinnedListUuid": { + "type": "string", + "nullable": true + }, + "updatedAt": { + "type": "string", + "format": "date-time" + }, + "updatedByUser": { + "$ref": "#/components/schemas/UpdatedByUser" + }, + "views": { + "type": "number", + "format": "double" + }, + "firstViewedAt": { + "anyOf": [ + { + "type": "string", + "format": "date-time" + }, + { + "type": "string" + } + ], + "nullable": true + }, + "pinnedListOrder": { + "type": "number", + "format": "double", + "nullable": true + }, + "validationErrors": { + "items": { + "$ref": "#/components/schemas/ValidationSummary" + }, + "type": "array" + } + }, + "required": [ + "name", + "uuid", + "spaceUuid", + "pinnedListUuid", + "updatedAt", + "views", + "firstViewedAt", + "pinnedListOrder" + ], + "type": "object", + "description": "From T, pick a set of properties whose keys are in the union K" + }, + "ResourceItemCategory": { + "enum": ["mostPopular", "recentlyUpdated", "pinned"], + "type": "string" + }, + "ResourceViewDashboardItem": { + "properties": { + "category": { + "$ref": "#/components/schemas/ResourceItemCategory" + }, + "data": { + "$ref": "#/components/schemas/Pick_DashboardBasicDetails.uuid-or-spaceUuid-or-description-or-name-or-views-or-firstViewedAt-or-pinnedListUuid-or-pinnedListOrder-or-updatedAt-or-updatedByUser-or-validationErrors_" + }, + "type": { + "$ref": "#/components/schemas/ResourceViewItemType.DASHBOARD" + } + }, + "required": ["data", "type"], + "type": "object" + }, + "ResourceViewItemType.CHART": { + "enum": ["chart"], + "type": "string" + }, + "ChartType": { + "enum": [ + "cartesian", + "table", + "big_number", + "pie", + "funnel", + "custom" + ], + "type": "string" + }, + "Pick_SpaceQuery.uuid-or-name-or-chartType-or-chartKind-or-firstViewedAt-or-views-or-pinnedListUuid-or-pinnedListOrder-or-spaceUuid-or-description-or-updatedAt-or-updatedByUser-or-validationErrors-or-slug_": { + "properties": { + "name": { + "type": "string" + }, + "description": { + "type": "string" + }, + "uuid": { + "type": "string" + }, + "spaceUuid": { + "type": "string" + }, + "pinnedListUuid": { + "type": "string", + "nullable": true + }, + "slug": { + "type": "string" + }, + "chartKind": { + "$ref": "#/components/schemas/ChartKind" + }, + "updatedAt": { + "type": "string", + "format": "date-time" + }, + "updatedByUser": { + "$ref": "#/components/schemas/UpdatedByUser" + }, + "views": { + "type": "number", + "format": "double" + }, + "firstViewedAt": { + "anyOf": [ + { + "type": "string", + "format": "date-time" + }, + { + "type": "string" + } + ], + "nullable": true + }, + "pinnedListOrder": { + "type": "number", + "format": "double", + "nullable": true + }, + "validationErrors": { + "items": { + "$ref": "#/components/schemas/ValidationSummary" + }, + "type": "array" + }, + "chartType": { + "$ref": "#/components/schemas/ChartType" + } + }, + "required": [ + "name", + "uuid", + "spaceUuid", + "pinnedListUuid", + "slug", + "updatedAt", + "views", + "firstViewedAt", + "pinnedListOrder" + ], + "type": "object", + "description": "From T, pick a set of properties whose keys are in the union K" + }, + "ChartSourceType": { + "enum": ["dbt_explore", "sql", "semantic_layer"], + "type": "string" + }, + "ResourceViewChartItem": { + "properties": { + "category": { + "$ref": "#/components/schemas/ResourceItemCategory" + }, + "data": { + "allOf": [ + { + "$ref": "#/components/schemas/Pick_SpaceQuery.uuid-or-name-or-chartType-or-chartKind-or-firstViewedAt-or-views-or-pinnedListUuid-or-pinnedListOrder-or-spaceUuid-or-description-or-updatedAt-or-updatedByUser-or-validationErrors-or-slug_" + }, + { + "properties": { + "source": { + "$ref": "#/components/schemas/ChartSourceType" + } + }, + "type": "object" + } + ] + }, + "type": { + "$ref": "#/components/schemas/ResourceViewItemType.CHART" + } + }, + "required": ["data", "type"], + "type": "object" + }, + "ResourceViewItemType.SPACE": { + "enum": ["space"], + "type": "string" + }, + "Pick_Space.projectUuid-or-uuid-or-name-or-isPrivate-or-pinnedListUuid-or-pinnedListOrder-or-organizationUuid_": { + "properties": { + "name": { + "type": "string" + }, + "uuid": { + "type": "string" + }, + "projectUuid": { + "type": "string" + }, + "organizationUuid": { + "type": "string" + }, + "pinnedListUuid": { + "type": "string", + "nullable": true + }, + "isPrivate": { + "type": "boolean" + }, + "pinnedListOrder": { + "type": "number", + "format": "double", + "nullable": true + } + }, + "required": [ + "name", + "uuid", + "projectUuid", + "organizationUuid", + "pinnedListUuid", + "isPrivate", + "pinnedListOrder" + ], + "type": "object", + "description": "From T, pick a set of properties whose keys are in the union K" + }, + "ResourceViewSpaceItem": { + "properties": { + "data": { + "allOf": [ + { + "$ref": "#/components/schemas/Pick_Space.projectUuid-or-uuid-or-name-or-isPrivate-or-pinnedListUuid-or-pinnedListOrder-or-organizationUuid_" + }, + { + "properties": { + "chartCount": { + "type": "number", + "format": "double" + }, + "dashboardCount": { + "type": "number", + "format": "double" + }, + "accessListLength": { + "type": "number", + "format": "double" + }, + "access": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "required": [ + "chartCount", + "dashboardCount", + "accessListLength", + "access" + ], + "type": "object" + } + ] + }, + "type": { + "$ref": "#/components/schemas/ResourceViewItemType.SPACE" + } + }, + "required": ["data", "type"], + "type": "object" + }, + "PinnedItems": { + "items": { + "anyOf": [ + { + "$ref": "#/components/schemas/ResourceViewDashboardItem" + }, + { + "$ref": "#/components/schemas/ResourceViewChartItem" + }, + { + "$ref": "#/components/schemas/ResourceViewSpaceItem" + } + ] + }, + "type": "array" + }, + "ApiPinnedItems": { + "properties": { + "results": { + "$ref": "#/components/schemas/PinnedItems" + }, + "status": { + "type": "string", + "enum": ["ok"], + "nullable": false + } + }, + "required": ["results", "status"], + "type": "object" + }, + "ResourceViewItemType": { + "enum": ["chart", "dashboard", "space"], + "type": "string" + }, + "Pick_ResourceViewItem-at-data.uuid-or-pinnedListOrder_": { + "properties": { + "uuid": { + "type": "string" + }, + "pinnedListOrder": { + "type": "number", + "format": "double", + "nullable": true + } + }, + "required": ["uuid", "pinnedListOrder"], + "type": "object", + "description": "From T, pick a set of properties whose keys are in the union K" + }, + "UpdatePinnedItemOrder": { + "properties": { + "data": { + "$ref": "#/components/schemas/Pick_ResourceViewItem-at-data.uuid-or-pinnedListOrder_" + }, + "type": { + "$ref": "#/components/schemas/ResourceViewItemType" + } + }, + "required": ["data", "type"], + "type": "object" + }, + "DbtProjectType.DBT": { + "enum": ["dbt"], + "type": "string" + }, + "DbtProjectEnvironmentVariable": { + "properties": { + "value": { + "type": "string" + }, + "key": { + "type": "string" + } + }, + "required": ["value", "key"], + "type": "object" + }, + "DbtProjectType": { + "enum": [ + "dbt", + "dbt_cloud_ide", + "github", + "gitlab", + "bitbucket", + "azure_devops", + "none" + ], + "type": "string" + }, + "DbtLocalProjectConfig": { + "properties": { + "type": { + "$ref": "#/components/schemas/DbtProjectType.DBT" + }, + "target": { + "type": "string" + }, + "environment": { + "items": { + "$ref": "#/components/schemas/DbtProjectEnvironmentVariable" + }, + "type": "array" + }, + "profiles_dir": { + "type": "string" + }, + "project_dir": { + "type": "string" + } + }, + "required": ["type"], + "type": "object", + "additionalProperties": true + }, + "DbtProjectType.DBT_CLOUD_IDE": { + "enum": ["dbt_cloud_ide"], + "type": "string" + }, + "DbtCloudIDEProjectConfig": { + "properties": { + "type": { + "$ref": "#/components/schemas/DbtProjectType.DBT_CLOUD_IDE" + }, + "api_key": { + "type": "string" + }, + "environment_id": { + "type": "string" + } + }, + "required": ["type", "api_key", "environment_id"], + "type": "object", + "additionalProperties": true + }, + "DbtProjectType.GITHUB": { + "enum": ["github"], + "type": "string" + }, + "DbtGithubProjectConfig": { + "properties": { + "type": { + "$ref": "#/components/schemas/DbtProjectType.GITHUB" + }, + "target": { + "type": "string" + }, + "environment": { + "items": { + "$ref": "#/components/schemas/DbtProjectEnvironmentVariable" + }, + "type": "array" + }, + "personal_access_token": { + "type": "string" + }, + "repository": { + "type": "string" + }, + "branch": { + "type": "string" + }, + "project_sub_path": { + "type": "string" + }, + "host_domain": { + "type": "string" + } + }, + "required": [ + "type", + "personal_access_token", + "repository", + "branch", + "project_sub_path" + ], + "type": "object", + "additionalProperties": true + }, + "DbtProjectType.BITBUCKET": { + "enum": ["bitbucket"], + "type": "string" + }, + "DbtBitBucketProjectConfig": { + "properties": { + "type": { + "$ref": "#/components/schemas/DbtProjectType.BITBUCKET" + }, + "target": { + "type": "string" + }, + "environment": { + "items": { + "$ref": "#/components/schemas/DbtProjectEnvironmentVariable" + }, + "type": "array" + }, + "username": { + "type": "string" + }, + "personal_access_token": { + "type": "string" + }, + "repository": { + "type": "string" + }, + "branch": { + "type": "string" + }, + "project_sub_path": { + "type": "string" + }, + "host_domain": { + "type": "string" + } + }, + "required": [ + "type", + "username", + "personal_access_token", + "repository", + "branch", + "project_sub_path" + ], + "type": "object", + "additionalProperties": true + }, + "DbtProjectType.GITLAB": { + "enum": ["gitlab"], + "type": "string" + }, + "DbtGitlabProjectConfig": { + "properties": { + "type": { + "$ref": "#/components/schemas/DbtProjectType.GITLAB" + }, + "target": { + "type": "string" + }, + "environment": { + "items": { + "$ref": "#/components/schemas/DbtProjectEnvironmentVariable" + }, + "type": "array" + }, + "personal_access_token": { + "type": "string" + }, + "repository": { + "type": "string" + }, + "branch": { + "type": "string" + }, + "project_sub_path": { + "type": "string" + }, + "host_domain": { + "type": "string" + } + }, + "required": [ + "type", + "personal_access_token", + "repository", + "branch", + "project_sub_path" + ], + "type": "object", + "additionalProperties": true + }, + "DbtProjectType.AZURE_DEVOPS": { + "enum": ["azure_devops"], + "type": "string" + }, + "DbtAzureDevOpsProjectConfig": { + "properties": { + "type": { + "$ref": "#/components/schemas/DbtProjectType.AZURE_DEVOPS" + }, + "target": { + "type": "string" + }, + "environment": { + "items": { + "$ref": "#/components/schemas/DbtProjectEnvironmentVariable" + }, + "type": "array" + }, + "personal_access_token": { + "type": "string" + }, + "organization": { + "type": "string" + }, + "project": { + "type": "string" + }, + "repository": { + "type": "string" + }, + "branch": { + "type": "string" + }, + "project_sub_path": { + "type": "string" + } + }, + "required": [ + "type", + "personal_access_token", + "organization", + "project", + "repository", + "branch", + "project_sub_path" + ], + "type": "object", + "additionalProperties": true + }, + "DbtProjectType.NONE": { + "enum": ["none"], + "type": "string" + }, + "DbtNoneProjectConfig": { + "properties": { + "type": { + "$ref": "#/components/schemas/DbtProjectType.NONE" + }, + "target": { + "type": "string" + }, + "environment": { + "items": { + "$ref": "#/components/schemas/DbtProjectEnvironmentVariable" + }, + "type": "array" + }, + "hideRefreshButton": { + "type": "boolean" + } + }, + "required": ["type"], + "type": "object", + "additionalProperties": true + }, + "DbtProjectConfig": { + "anyOf": [ + { + "$ref": "#/components/schemas/DbtLocalProjectConfig" + }, + { + "$ref": "#/components/schemas/DbtCloudIDEProjectConfig" + }, + { + "$ref": "#/components/schemas/DbtGithubProjectConfig" + }, + { + "$ref": "#/components/schemas/DbtBitBucketProjectConfig" + }, + { + "$ref": "#/components/schemas/DbtGitlabProjectConfig" + }, + { + "$ref": "#/components/schemas/DbtAzureDevOpsProjectConfig" + }, + { + "$ref": "#/components/schemas/DbtNoneProjectConfig" + } + ] + }, + "WarehouseTypes.SNOWFLAKE": { + "enum": ["snowflake"], + "type": "string" + }, + "WeekDay": { + "enum": [0, 1, 2, 3, 4, 5, 6], + "type": "number" + }, + "Pick_CreateSnowflakeCredentials.Exclude_keyofCreateSnowflakeCredentials.SensitiveCredentialsFieldNames__": { + "properties": { + "type": { + "$ref": "#/components/schemas/WarehouseTypes.SNOWFLAKE" + }, + "warehouse": { + "type": "string" + }, + "role": { + "type": "string" + }, + "account": { + "type": "string" + }, + "requireUserCredentials": { + "type": "boolean" + }, + "database": { + "type": "string" + }, + "schema": { + "type": "string" + }, + "threads": { + "type": "number", + "format": "double" + }, + "clientSessionKeepAlive": { + "type": "boolean" + }, + "queryTag": { + "type": "string" + }, + "accessUrl": { + "type": "string" + }, + "startOfWeek": { + "allOf": [ + { + "$ref": "#/components/schemas/WeekDay" + } + ], + "nullable": true + }, + "quotedIdentifiersIgnoreCase": { + "type": "boolean" + }, + "override": { + "type": "string" + } + }, + "required": [ + "type", + "warehouse", + "account", + "database", + "schema" + ], + "type": "object", + "description": "From T, pick a set of properties whose keys are in the union K" + }, + "Omit_CreateSnowflakeCredentials.SensitiveCredentialsFieldNames_": { + "$ref": "#/components/schemas/Pick_CreateSnowflakeCredentials.Exclude_keyofCreateSnowflakeCredentials.SensitiveCredentialsFieldNames__", + "description": "Construct a type with the properties of T except for those in type K." + }, + "SnowflakeCredentials": { + "$ref": "#/components/schemas/Omit_CreateSnowflakeCredentials.SensitiveCredentialsFieldNames_" + }, + "WarehouseTypes.REDSHIFT": { + "enum": ["redshift"], + "type": "string" + }, + "Pick_CreateRedshiftCredentials.Exclude_keyofCreateRedshiftCredentials.SensitiveCredentialsFieldNames__": { + "properties": { + "type": { + "$ref": "#/components/schemas/WarehouseTypes.REDSHIFT" + }, + "requireUserCredentials": { + "type": "boolean" + }, + "schema": { + "type": "string" + }, + "threads": { + "type": "number", + "format": "double" + }, + "startOfWeek": { + "allOf": [ + { + "$ref": "#/components/schemas/WeekDay" + } + ], + "nullable": true + }, + "useSshTunnel": { + "type": "boolean" + }, + "sshTunnelHost": { + "type": "string" + }, + "sshTunnelPort": { + "type": "number", + "format": "double" + }, + "sshTunnelUser": { + "type": "string" + }, + "sshTunnelPublicKey": { + "type": "string" + }, + "host": { + "type": "string" + }, + "port": { + "type": "number", + "format": "double" + }, + "dbname": { + "type": "string" + }, + "keepalivesIdle": { + "type": "number", + "format": "double" + }, + "sslmode": { + "type": "string" + }, + "ra3Node": { + "type": "boolean" + } + }, + "required": ["type", "schema", "host", "port", "dbname"], + "type": "object", + "description": "From T, pick a set of properties whose keys are in the union K" + }, + "Omit_CreateRedshiftCredentials.SensitiveCredentialsFieldNames_": { + "$ref": "#/components/schemas/Pick_CreateRedshiftCredentials.Exclude_keyofCreateRedshiftCredentials.SensitiveCredentialsFieldNames__", + "description": "Construct a type with the properties of T except for those in type K." + }, + "RedshiftCredentials": { + "$ref": "#/components/schemas/Omit_CreateRedshiftCredentials.SensitiveCredentialsFieldNames_" + }, + "WarehouseTypes.POSTGRES": { + "enum": ["postgres"], + "type": "string" + }, + "Pick_CreatePostgresCredentials.Exclude_keyofCreatePostgresCredentials.SensitiveCredentialsFieldNames__": { + "properties": { + "type": { + "$ref": "#/components/schemas/WarehouseTypes.POSTGRES" + }, + "role": { + "type": "string" + }, + "requireUserCredentials": { + "type": "boolean" + }, + "schema": { + "type": "string" + }, + "threads": { + "type": "number", + "format": "double" + }, + "startOfWeek": { + "allOf": [ + { + "$ref": "#/components/schemas/WeekDay" + } + ], + "nullable": true + }, + "useSshTunnel": { + "type": "boolean" + }, + "sshTunnelHost": { + "type": "string" + }, + "sshTunnelPort": { + "type": "number", + "format": "double" + }, + "sshTunnelUser": { + "type": "string" + }, + "sshTunnelPublicKey": { + "type": "string" + }, + "host": { + "type": "string" + }, + "port": { + "type": "number", + "format": "double" + }, + "dbname": { + "type": "string" + }, + "keepalivesIdle": { + "type": "number", + "format": "double" + }, + "sslmode": { + "type": "string" + }, + "searchPath": { + "type": "string" + } + }, + "required": ["type", "schema", "host", "port", "dbname"], + "type": "object", + "description": "From T, pick a set of properties whose keys are in the union K" + }, + "Omit_CreatePostgresCredentials.SensitiveCredentialsFieldNames_": { + "$ref": "#/components/schemas/Pick_CreatePostgresCredentials.Exclude_keyofCreatePostgresCredentials.SensitiveCredentialsFieldNames__", + "description": "Construct a type with the properties of T except for those in type K." + }, + "PostgresCredentials": { + "$ref": "#/components/schemas/Omit_CreatePostgresCredentials.SensitiveCredentialsFieldNames_" + }, + "WarehouseTypes.BIGQUERY": { + "enum": ["bigquery"], + "type": "string" + }, + "Pick_CreateBigqueryCredentials.Exclude_keyofCreateBigqueryCredentials.SensitiveCredentialsFieldNames__": { + "properties": { + "type": { + "$ref": "#/components/schemas/WarehouseTypes.BIGQUERY" + }, + "requireUserCredentials": { + "type": "boolean" + }, + "threads": { + "type": "number", + "format": "double" + }, + "startOfWeek": { + "allOf": [ + { + "$ref": "#/components/schemas/WeekDay" + } + ], + "nullable": true + }, + "project": { + "type": "string" + }, + "dataset": { + "type": "string" + }, + "timeoutSeconds": { + "type": "number", + "format": "double" + }, + "priority": { + "type": "string", + "enum": ["interactive", "batch"] + }, + "retries": { + "type": "number", + "format": "double" + }, + "location": { + "type": "string" + }, + "maximumBytesBilled": { + "type": "number", + "format": "double" + }, + "executionProject": { + "type": "string" + } + }, + "required": ["type", "project", "dataset"], + "type": "object", + "description": "From T, pick a set of properties whose keys are in the union K" + }, + "Omit_CreateBigqueryCredentials.SensitiveCredentialsFieldNames_": { + "$ref": "#/components/schemas/Pick_CreateBigqueryCredentials.Exclude_keyofCreateBigqueryCredentials.SensitiveCredentialsFieldNames__", + "description": "Construct a type with the properties of T except for those in type K." + }, + "BigqueryCredentials": { + "$ref": "#/components/schemas/Omit_CreateBigqueryCredentials.SensitiveCredentialsFieldNames_" + }, + "WarehouseTypes.DATABRICKS": { + "enum": ["databricks"], + "type": "string" + }, + "Pick_CreateDatabricksCredentials.Exclude_keyofCreateDatabricksCredentials.SensitiveCredentialsFieldNames__": { + "properties": { + "type": { + "$ref": "#/components/schemas/WarehouseTypes.DATABRICKS" + }, + "requireUserCredentials": { + "type": "boolean" + }, + "database": { + "type": "string" + }, + "startOfWeek": { + "allOf": [ + { + "$ref": "#/components/schemas/WeekDay" + } + ], + "nullable": true + }, + "catalog": { + "type": "string" + }, + "serverHostName": { + "type": "string" + }, + "httpPath": { + "type": "string" + } + }, + "required": ["type", "database", "serverHostName", "httpPath"], + "type": "object", + "description": "From T, pick a set of properties whose keys are in the union K" + }, + "Omit_CreateDatabricksCredentials.SensitiveCredentialsFieldNames_": { + "$ref": "#/components/schemas/Pick_CreateDatabricksCredentials.Exclude_keyofCreateDatabricksCredentials.SensitiveCredentialsFieldNames__", + "description": "Construct a type with the properties of T except for those in type K." + }, + "DatabricksCredentials": { + "$ref": "#/components/schemas/Omit_CreateDatabricksCredentials.SensitiveCredentialsFieldNames_" + }, + "WarehouseTypes.TRINO": { + "enum": ["trino"], + "type": "string" + }, + "Pick_CreateTrinoCredentials.Exclude_keyofCreateTrinoCredentials.SensitiveCredentialsFieldNames__": { + "properties": { + "type": { + "$ref": "#/components/schemas/WarehouseTypes.TRINO" + }, + "requireUserCredentials": { + "type": "boolean" + }, + "schema": { + "type": "string" + }, + "startOfWeek": { + "allOf": [ + { + "$ref": "#/components/schemas/WeekDay" + } + ], + "nullable": true + }, + "host": { + "type": "string" + }, + "port": { + "type": "number", + "format": "double" + }, + "dbname": { + "type": "string" + }, + "http_scheme": { + "type": "string" + } + }, + "required": [ + "type", + "schema", + "host", + "port", + "dbname", + "http_scheme" + ], + "type": "object", + "description": "From T, pick a set of properties whose keys are in the union K" + }, + "Omit_CreateTrinoCredentials.SensitiveCredentialsFieldNames_": { + "$ref": "#/components/schemas/Pick_CreateTrinoCredentials.Exclude_keyofCreateTrinoCredentials.SensitiveCredentialsFieldNames__", + "description": "Construct a type with the properties of T except for those in type K." + }, + "TrinoCredentials": { + "$ref": "#/components/schemas/Omit_CreateTrinoCredentials.SensitiveCredentialsFieldNames_" + }, + "WarehouseCredentials": { + "anyOf": [ + { + "$ref": "#/components/schemas/SnowflakeCredentials" + }, + { + "$ref": "#/components/schemas/RedshiftCredentials" + }, + { + "$ref": "#/components/schemas/PostgresCredentials" + }, + { + "$ref": "#/components/schemas/BigqueryCredentials" + }, + { + "$ref": "#/components/schemas/DatabricksCredentials" + }, + { + "$ref": "#/components/schemas/TrinoCredentials" + } + ] + }, + "SupportedDbtVersions": { + "enum": ["v1.4", "v1.5", "v1.6", "v1.7", "v1.8"], + "type": "string" + }, + "SemanticLayerType.DBT": { + "enum": ["DBT"], + "type": "string" + }, + "DbtSemanticLayerConnection": { + "properties": { + "token": { + "type": "string" + }, + "domain": { + "type": "string" + }, + "environmentId": { + "type": "string" + }, + "type": { + "$ref": "#/components/schemas/SemanticLayerType.DBT" + } + }, + "required": ["token", "domain", "environmentId", "type"], + "type": "object" + }, + "SemanticLayerType.CUBE": { + "enum": ["CUBE"], + "type": "string" + }, + "CubeSemanticLayerConnection": { + "properties": { + "token": { + "type": "string" + }, + "domain": { + "type": "string" + }, + "type": { + "$ref": "#/components/schemas/SemanticLayerType.CUBE" + } + }, + "required": ["token", "domain", "type"], + "type": "object" + }, + "SemanticLayerConnection": { + "anyOf": [ + { + "$ref": "#/components/schemas/DbtSemanticLayerConnection" + }, + { + "$ref": "#/components/schemas/CubeSemanticLayerConnection" + } + ] + }, + "Project": { + "properties": { + "createdByUserUuid": { + "type": "string", + "nullable": true + }, + "schedulerTimezone": { + "type": "string" + }, + "semanticLayerConnection": { + "$ref": "#/components/schemas/SemanticLayerConnection" + }, + "dbtVersion": { + "$ref": "#/components/schemas/SupportedDbtVersions" + }, + "upstreamProjectUuid": { + "type": "string" + }, + "pinnedListUuid": { + "type": "string" + }, + "warehouseConnection": { + "$ref": "#/components/schemas/WarehouseCredentials" + }, + "dbtConnection": { + "$ref": "#/components/schemas/DbtProjectConfig" + }, + "type": { + "$ref": "#/components/schemas/ProjectType" + }, + "name": { + "type": "string" + }, + "projectUuid": { + "type": "string" + }, + "organizationUuid": { + "type": "string" + } + }, + "required": [ + "createdByUserUuid", + "schedulerTimezone", + "dbtVersion", + "dbtConnection", + "type", + "name", + "projectUuid", + "organizationUuid" + ], + "type": "object" + }, + "ApiProjectResponse": { + "properties": { + "results": { + "$ref": "#/components/schemas/Project" + }, + "status": { + "type": "string", + "enum": ["ok"], + "nullable": false + } + }, + "required": ["results", "status"], + "type": "object" + }, + "Pick_SavedChart.uuid-or-name-or-description-or-spaceName-or-spaceUuid-or-projectUuid-or-organizationUuid-or-pinnedListUuid-or-dashboardUuid-or-dashboardName-or-slug_": { + "properties": { + "name": { + "type": "string" + }, + "description": { + "type": "string" + }, + "uuid": { + "type": "string" + }, + "spaceName": { + "type": "string" + }, + "spaceUuid": { + "type": "string" + }, + "projectUuid": { + "type": "string" + }, + "organizationUuid": { + "type": "string" + }, + "pinnedListUuid": { + "type": "string", + "nullable": true + }, + "dashboardUuid": { + "type": "string", + "nullable": true + }, + "dashboardName": { + "type": "string", + "nullable": true + }, + "slug": { + "type": "string" + } + }, + "required": [ + "name", + "uuid", + "spaceName", + "spaceUuid", + "projectUuid", + "organizationUuid", + "pinnedListUuid", + "dashboardUuid", + "dashboardName", + "slug" + ], + "type": "object", + "description": "From T, pick a set of properties whose keys are in the union K" + }, + "ChartSummary": { + "allOf": [ + { + "$ref": "#/components/schemas/Pick_SavedChart.uuid-or-name-or-description-or-spaceName-or-spaceUuid-or-projectUuid-or-organizationUuid-or-pinnedListUuid-or-dashboardUuid-or-dashboardName-or-slug_" + }, + { + "properties": { + "source": { + "$ref": "#/components/schemas/ChartSourceType" + }, + "chartKind": { + "$ref": "#/components/schemas/ChartKind" + }, + "chartType": { + "$ref": "#/components/schemas/ChartType" + } + }, + "type": "object" + } + ] + }, + "Pick_SavedChart.updatedAt-or-updatedByUser-or-pinnedListOrder_": { + "properties": { + "updatedAt": { + "type": "string", + "format": "date-time" + }, + "updatedByUser": { + "$ref": "#/components/schemas/UpdatedByUser" + }, + "pinnedListOrder": { + "type": "number", + "format": "double", + "nullable": true + } + }, + "required": ["updatedAt", "pinnedListOrder"], + "type": "object", + "description": "From T, pick a set of properties whose keys are in the union K" + }, + "ViewStatistics": { + "properties": { + "firstViewedAt": { + "anyOf": [ + { + "type": "string", + "format": "date-time" + }, + { + "type": "string" + } + ], + "nullable": true + }, + "views": { + "type": "number", + "format": "double" + } + }, + "required": ["firstViewedAt", "views"], + "type": "object" + }, + "SpaceQuery": { + "allOf": [ + { + "$ref": "#/components/schemas/ChartSummary" + }, + { + "$ref": "#/components/schemas/Pick_SavedChart.updatedAt-or-updatedByUser-or-pinnedListOrder_" + }, + { + "$ref": "#/components/schemas/ViewStatistics" + }, + { + "properties": { + "validationErrors": { + "items": { + "$ref": "#/components/schemas/ValidationSummary" + }, + "type": "array" + } + }, + "type": "object" + } + ] + }, + "ApiChartListResponse": { + "properties": { + "results": { + "items": { + "$ref": "#/components/schemas/SpaceQuery" + }, + "type": "array" + }, + "status": { + "type": "string", + "enum": ["ok"], + "nullable": false + } + }, + "required": ["results", "status"], + "type": "object" + }, + "ApiChartSummaryListResponse": { + "properties": { + "results": { + "items": { + "$ref": "#/components/schemas/ChartSummary" + }, + "type": "array" + }, + "status": { + "type": "string", + "enum": ["ok"], + "nullable": false + } + }, + "required": ["results", "status"], + "type": "object" + }, + "Pick_Space.organizationUuid-or-projectUuid-or-uuid-or-name-or-isPrivate-or-pinnedListUuid-or-pinnedListOrder-or-slug_": { + "properties": { + "name": { + "type": "string" + }, + "uuid": { + "type": "string" + }, + "projectUuid": { + "type": "string" + }, + "organizationUuid": { + "type": "string" + }, + "pinnedListUuid": { + "type": "string", + "nullable": true + }, + "slug": { + "type": "string" + }, + "isPrivate": { + "type": "boolean" + }, + "pinnedListOrder": { + "type": "number", + "format": "double", + "nullable": true + } + }, + "required": [ + "name", + "uuid", + "projectUuid", + "organizationUuid", + "pinnedListUuid", + "slug", + "isPrivate", + "pinnedListOrder" + ], + "type": "object", + "description": "From T, pick a set of properties whose keys are in the union K" + }, + "SpaceMemberRole": { + "enum": ["viewer", "editor", "admin"], + "type": "string" + }, + "SpaceShare": { + "properties": { + "inheritedFrom": { + "type": "string", + "enum": [ + "organization", + "project", + "group", + "space_group" + ] + }, + "inheritedRole": { + "anyOf": [ + { + "$ref": "#/components/schemas/OrganizationMemberRole" + }, + { + "$ref": "#/components/schemas/ProjectMemberRole" + } + ] + }, + "projectRole": { + "$ref": "#/components/schemas/ProjectMemberRole" + }, + "hasDirectAccess": { + "type": "boolean" + }, + "role": { + "$ref": "#/components/schemas/SpaceMemberRole" + }, + "email": { + "type": "string" + }, + "lastName": { + "type": "string" + }, + "firstName": { + "type": "string" + }, + "userUuid": { + "type": "string" + } + }, + "required": [ + "hasDirectAccess", + "role", + "email", + "lastName", + "firstName", + "userUuid" + ], + "type": "object" + }, + "SpaceSummary": { + "allOf": [ + { + "$ref": "#/components/schemas/Pick_Space.organizationUuid-or-projectUuid-or-uuid-or-name-or-isPrivate-or-pinnedListUuid-or-pinnedListOrder-or-slug_" + }, + { + "properties": { + "dashboardCount": { + "type": "number", + "format": "double" + }, + "chartCount": { + "type": "number", + "format": "double" + }, + "access": { + "items": { + "type": "string" + }, + "type": "array" + }, + "userAccess": { + "$ref": "#/components/schemas/SpaceShare" + } + }, + "required": ["dashboardCount", "chartCount", "access"], + "type": "object" + } + ] + }, + "ApiSpaceSummaryListResponse": { + "properties": { + "results": { + "items": { + "$ref": "#/components/schemas/SpaceSummary" + }, + "type": "array" + }, + "status": { + "type": "string", + "enum": ["ok"], + "nullable": false + } + }, + "required": ["results", "status"], + "type": "object" + }, + "ProjectMemberProfile": { + "properties": { + "lastName": { + "type": "string" + }, + "firstName": { + "type": "string" + }, + "email": { + "type": "string" + }, + "role": { + "$ref": "#/components/schemas/ProjectMemberRole" + }, + "projectUuid": { + "type": "string" + }, + "userUuid": { + "type": "string" + } + }, + "required": [ + "lastName", + "firstName", + "email", + "role", + "projectUuid", + "userUuid" + ], + "type": "object" + }, + "ApiProjectAccessListResponse": { + "properties": { + "results": { + "items": { + "$ref": "#/components/schemas/ProjectMemberProfile" + }, + "type": "array" + }, + "status": { + "type": "string", + "enum": ["ok"], + "nullable": false + } + }, + "required": ["results", "status"], + "type": "object" + }, + "ApiGetProjectMemberResponse": { + "properties": { + "results": { + "$ref": "#/components/schemas/ProjectMemberProfile" + }, + "status": { + "type": "string", + "enum": ["ok"], + "nullable": false + } + }, + "required": ["results", "status"], + "type": "object" + }, + "CreateProjectMember": { + "properties": { + "sendEmail": { + "type": "boolean" + }, + "role": { + "$ref": "#/components/schemas/ProjectMemberRole" + }, + "email": { + "type": "string" + } + }, + "required": ["sendEmail", "role", "email"], + "type": "object" + }, + "UpdateProjectMember": { + "properties": { + "role": { + "$ref": "#/components/schemas/ProjectMemberRole" + } + }, + "required": ["role"], + "type": "object" + }, + "ApiGetProjectGroupAccesses": { + "properties": { + "results": { + "items": { + "$ref": "#/components/schemas/ProjectGroupAccess" + }, + "type": "array" + }, + "status": { + "type": "string", + "enum": ["ok"], + "nullable": false + } + }, + "required": ["results", "status"], + "type": "object" + }, + "Record_string._type-DimensionType--__": { + "properties": {}, + "type": "object", + "description": "Construct a type with a set of properties K of type T" + }, + "Record_string.unknown_": { + "properties": {}, + "type": "object", + "description": "Construct a type with a set of properties K of type T" + }, + "ApiSqlQueryResults": { + "properties": { + "rows": { + "items": { + "$ref": "#/components/schemas/Record_string.unknown_" + }, + "type": "array" + }, + "fields": { + "$ref": "#/components/schemas/Record_string._type-DimensionType--__" + } + }, + "required": ["rows", "fields"], + "type": "object" + }, + "Record_string.number_": { + "properties": {}, + "type": "object", + "description": "Construct a type with a set of properties K of type T" + }, + "ApiCalculateTotalResponse": { + "properties": { + "results": { + "$ref": "#/components/schemas/Record_string.number_" + }, + "status": { + "type": "string", + "enum": ["ok"], + "nullable": false + } + }, + "required": ["results", "status"], + "type": "object" + }, + "DateGranularity": { + "enum": ["Day", "Week", "Month", "Quarter", "Year"], + "type": "string" + }, + "MetricQueryRequest": { + "properties": { + "timezone": { + "type": "string" + }, + "metadata": { + "properties": { + "hasADateDimension": { + "$ref": "#/components/schemas/Pick_CompiledDimension.label-or-name_" + } + }, + "required": ["hasADateDimension"], + "type": "object" + }, + "granularity": { + "$ref": "#/components/schemas/DateGranularity" + }, + "customDimensions": { + "items": { + "$ref": "#/components/schemas/CustomDimension" + }, + "type": "array" + }, + "csvLimit": { + "type": "number", + "format": "double" + }, + "additionalMetrics": { + "items": { + "$ref": "#/components/schemas/AdditionalMetric" + }, + "type": "array" + }, + "tableCalculations": { + "items": { + "$ref": "#/components/schemas/TableCalculation" + }, + "type": "array" + }, + "limit": { + "type": "number", + "format": "double" + }, + "sorts": { + "items": { + "$ref": "#/components/schemas/SortField" + }, + "type": "array" + }, + "filters": { + "properties": { + "tableCalculations": {}, + "metrics": {}, + "dimensions": {} + }, + "type": "object" + }, + "metrics": { + "items": { + "$ref": "#/components/schemas/FieldId" + }, + "type": "array" + }, + "dimensions": { + "items": { + "$ref": "#/components/schemas/FieldId" + }, + "type": "array" + }, + "exploreName": { + "type": "string" + } + }, + "required": [ + "tableCalculations", + "limit", + "sorts", + "filters", + "metrics", + "dimensions", + "exploreName" + ], + "type": "object" + }, + "CalculateTotalFromQuery": { + "properties": { + "explore": { + "type": "string" + }, + "metricQuery": { + "$ref": "#/components/schemas/MetricQueryRequest" + } + }, + "required": ["explore", "metricQuery"], + "type": "object" + }, + "Record_string.DbtExposure_": { + "properties": {}, + "type": "object", + "description": "Construct a type with a set of properties K of type T" + }, + "Pick_CreateRedshiftCredentials-or-CreatePostgresCredentials-or-CreateSnowflakeCredentials-or-CreateTrinoCredentials.type-or-user_": { + "properties": { + "type": { + "$ref": "#/components/schemas/WarehouseTypes.SNOWFLAKE" + }, + "user": { + "type": "string" + } + }, + "required": ["type", "user"], + "type": "object", + "description": "From T, pick a set of properties whose keys are in the union K" + }, + "Pick_CreateBigqueryCredentials.type_": { + "properties": { + "type": { + "$ref": "#/components/schemas/WarehouseTypes.BIGQUERY" + } + }, + "required": ["type"], + "type": "object", + "description": "From T, pick a set of properties whose keys are in the union K" + }, + "Pick_CreateDatabricksCredentials.type_": { + "properties": { + "type": { + "$ref": "#/components/schemas/WarehouseTypes.DATABRICKS" + } + }, + "required": ["type"], + "type": "object", + "description": "From T, pick a set of properties whose keys are in the union K" + }, + "UserWarehouseCredentials": { + "properties": { + "credentials": { + "anyOf": [ + { + "$ref": "#/components/schemas/Pick_CreateRedshiftCredentials-or-CreatePostgresCredentials-or-CreateSnowflakeCredentials-or-CreateTrinoCredentials.type-or-user_" + }, + { + "$ref": "#/components/schemas/Pick_CreateBigqueryCredentials.type_" + }, + { + "$ref": "#/components/schemas/Pick_CreateDatabricksCredentials.type_" + } + ] + }, + "updatedAt": { + "type": "string", + "format": "date-time" + }, + "createdAt": { + "type": "string", + "format": "date-time" + }, + "name": { + "type": "string" + }, + "userUuid": { + "type": "string" + }, + "uuid": { + "type": "string" + } + }, + "required": [ + "credentials", + "updatedAt", + "createdAt", + "name", + "userUuid", + "uuid" + ], + "type": "object" + }, + "UpdateMetadata": { + "properties": { + "upstreamProjectUuid": { + "type": "string", + "nullable": true + } + }, + "type": "object" + }, + "Partial_DbtSemanticLayerConnection_": { + "properties": { + "type": { + "$ref": "#/components/schemas/SemanticLayerType.DBT" + }, + "environmentId": { + "type": "string" + }, + "domain": { + "type": "string" + }, + "token": { + "type": "string" + } + }, + "type": "object", + "description": "Make all properties in T optional" + }, + "Partial_CubeSemanticLayerConnection_": { + "properties": { + "type": { + "$ref": "#/components/schemas/SemanticLayerType.CUBE" + }, + "domain": { + "type": "string" + }, + "token": { + "type": "string" + } + }, + "type": "object", + "description": "Make all properties in T optional" + }, + "SemanticLayerConnectionUpdate": { + "anyOf": [ + { + "allOf": [ + { + "$ref": "#/components/schemas/Partial_DbtSemanticLayerConnection_" + }, + { + "properties": { + "type": { + "$ref": "#/components/schemas/SemanticLayerType.DBT" + } + }, + "required": ["type"], + "type": "object" + } + ] + }, + { + "allOf": [ + { + "$ref": "#/components/schemas/Partial_CubeSemanticLayerConnection_" + }, + { + "properties": { + "type": { + "$ref": "#/components/schemas/SemanticLayerType.CUBE" + } + }, + "required": ["type"], + "type": "object" + } + ] + } + ] + }, + "Pick_Dashboard.uuid-or-name-or-description-or-updatedAt-or-projectUuid-or-updatedByUser-or-organizationUuid-or-spaceUuid-or-views-or-firstViewedAt-or-pinnedListUuid-or-pinnedListOrder_": { + "properties": { + "name": { + "type": "string" + }, + "description": { + "type": "string" + }, + "uuid": { + "type": "string" + }, + "spaceUuid": { + "type": "string" + }, + "projectUuid": { + "type": "string" + }, + "organizationUuid": { + "type": "string" + }, + "pinnedListUuid": { + "type": "string", + "nullable": true + }, + "updatedAt": { + "type": "string", + "format": "date-time" + }, + "updatedByUser": { + "$ref": "#/components/schemas/UpdatedByUser" + }, + "views": { + "type": "number", + "format": "double" + }, + "firstViewedAt": { + "anyOf": [ + { + "type": "string", + "format": "date-time" + }, + { + "type": "string" + } + ], + "nullable": true + }, + "pinnedListOrder": { + "type": "number", + "format": "double", + "nullable": true + } + }, + "required": [ + "name", + "uuid", + "spaceUuid", + "projectUuid", + "organizationUuid", + "pinnedListUuid", + "updatedAt", + "views", + "firstViewedAt", + "pinnedListOrder" + ], + "type": "object", + "description": "From T, pick a set of properties whose keys are in the union K" + }, + "DashboardBasicDetails": { + "allOf": [ + { + "$ref": "#/components/schemas/Pick_Dashboard.uuid-or-name-or-description-or-updatedAt-or-projectUuid-or-updatedByUser-or-organizationUuid-or-spaceUuid-or-views-or-firstViewedAt-or-pinnedListUuid-or-pinnedListOrder_" + }, + { + "properties": { + "validationErrors": { + "items": { + "$ref": "#/components/schemas/ValidationSummary" + }, + "type": "array" + } + }, + "type": "object" + } + ] + }, + "DashboardBasicDetailsWithTileTypes": { + "allOf": [ + { + "$ref": "#/components/schemas/DashboardBasicDetails" + }, + { + "properties": { + "tileTypes": { + "items": { + "$ref": "#/components/schemas/DashboardTileTypes" + }, + "type": "array" + } + }, + "required": ["tileTypes"], + "type": "object" + } + ] + }, + "ApiGetDashboardsResponse": { + "properties": { + "results": { + "items": { + "$ref": "#/components/schemas/DashboardBasicDetailsWithTileTypes" + }, + "type": "array" + }, + "status": { + "type": "string", + "enum": ["ok"], + "nullable": false + } + }, + "required": ["results", "status"], + "type": "object" + }, + "Dashboard": { + "properties": { + "slug": { + "type": "string" + }, + "access": { + "items": { + "$ref": "#/components/schemas/SpaceShare" + }, + "type": "array", + "nullable": true + }, + "isPrivate": { + "type": "boolean", + "nullable": true + }, + "tabs": { + "items": { + "$ref": "#/components/schemas/DashboardTab" + }, + "type": "array" + }, + "pinnedListOrder": { + "type": "number", + "format": "double", + "nullable": true + }, + "pinnedListUuid": { + "type": "string", + "nullable": true + }, + "firstViewedAt": { + "anyOf": [ + { + "type": "string", + "format": "date-time" + }, + { + "type": "string" + } + ], + "nullable": true + }, + "views": { + "type": "number", + "format": "double" + }, + "spaceName": { + "type": "string" + }, + "spaceUuid": { + "type": "string" + }, + "updatedByUser": { + "$ref": "#/components/schemas/UpdatedByUser" + }, + "filters": { + "$ref": "#/components/schemas/DashboardFilters" + }, + "tiles": { + "items": { + "$ref": "#/components/schemas/DashboardTile" + }, + "type": "array" + }, + "updatedAt": { + "type": "string", + "format": "date-time" + }, + "description": { + "type": "string" + }, + "name": { + "type": "string" + }, + "uuid": { + "type": "string" + }, + "dashboardVersionId": { + "type": "number", + "format": "double" + }, + "projectUuid": { + "type": "string" + }, + "organizationUuid": { + "type": "string" + } + }, + "required": [ + "slug", + "access", + "isPrivate", + "tabs", + "pinnedListOrder", + "pinnedListUuid", + "firstViewedAt", + "views", + "spaceName", + "spaceUuid", + "filters", + "tiles", + "updatedAt", + "name", + "uuid", + "dashboardVersionId", + "projectUuid", + "organizationUuid" + ], + "type": "object" + }, + "ApiCreateDashboardResponse": { + "properties": { + "results": { + "$ref": "#/components/schemas/Dashboard" + }, + "status": { + "type": "string", + "enum": ["ok"], + "nullable": false + } + }, + "required": ["results", "status"], + "type": "object" + }, + "DuplicateDashboardParams": { + "properties": { + "dashboardDesc": { + "type": "string" + }, + "dashboardName": { + "type": "string" + } + }, + "required": ["dashboardDesc", "dashboardName"], + "type": "object" + }, + "CreateDashboardTileBase": { + "properties": { + "tabUuid": { + "type": "string" + }, + "w": { + "type": "number", + "format": "double" + }, + "h": { + "type": "number", + "format": "double" + }, + "y": { + "type": "number", + "format": "double" + }, + "x": { + "type": "number", + "format": "double" + }, + "type": { + "$ref": "#/components/schemas/DashboardTileTypes" + }, + "uuid": { + "type": "string" + } + }, + "required": ["w", "h", "y", "x", "type"], + "type": "object" + }, + "CreateDashboardChartTile": { + "allOf": [ + { + "$ref": "#/components/schemas/CreateDashboardTileBase" + }, + { + "$ref": "#/components/schemas/DashboardChartTileProperties" + } + ] + }, + "CreateDashboardMarkdownTile": { + "allOf": [ + { + "$ref": "#/components/schemas/CreateDashboardTileBase" + }, + { + "$ref": "#/components/schemas/DashboardMarkdownTileProperties" + } + ] + }, + "CreateDashboardLoomTile": { + "allOf": [ + { + "$ref": "#/components/schemas/CreateDashboardTileBase" + }, + { + "$ref": "#/components/schemas/DashboardLoomTileProperties" + } + ] + }, + "CreateDashboardSqlChartTile": { + "allOf": [ + { + "$ref": "#/components/schemas/CreateDashboardTileBase" + }, + { + "$ref": "#/components/schemas/DashboardSqlChartTileProperties" + } + ] + }, + "CreateDashboardSemanticViewerChartTile": { + "allOf": [ + { + "$ref": "#/components/schemas/CreateDashboardTileBase" + }, + { + "$ref": "#/components/schemas/DashboardSemanticViewerChartTileProperties" + } + ] + }, + "Pick_UpdatedByUser.userUuid_": { + "properties": { + "userUuid": { + "type": "string" + } + }, + "required": ["userUuid"], + "type": "object", + "description": "From T, pick a set of properties whose keys are in the union K" + }, + "CreateDashboard": { + "properties": { + "tabs": { + "items": { + "$ref": "#/components/schemas/DashboardTab" + }, + "type": "array" + }, + "spaceUuid": { + "type": "string" + }, + "updatedByUser": { + "$ref": "#/components/schemas/Pick_UpdatedByUser.userUuid_" + }, + "filters": { + "$ref": "#/components/schemas/DashboardFilters" + }, + "tiles": { + "items": { + "anyOf": [ + { + "$ref": "#/components/schemas/CreateDashboardChartTile" + }, + { + "$ref": "#/components/schemas/CreateDashboardMarkdownTile" + }, + { + "$ref": "#/components/schemas/CreateDashboardLoomTile" + }, + { + "$ref": "#/components/schemas/CreateDashboardSqlChartTile" + }, + { + "$ref": "#/components/schemas/CreateDashboardSemanticViewerChartTile" + } + ] + }, + "type": "array" + }, + "description": { + "type": "string" + }, + "name": { + "type": "string" + } + }, + "required": ["tabs", "tiles", "name"], + "type": "object" + }, + "ApiUpdateDashboardsResponse": { + "properties": { + "results": { + "items": { + "$ref": "#/components/schemas/Dashboard" + }, + "type": "array" + }, + "status": { + "type": "string", + "enum": ["ok"], + "nullable": false + } + }, + "required": ["results", "status"], + "type": "object" + }, + "Pick_Dashboard.uuid-or-name-or-description-or-spaceUuid_": { + "properties": { + "name": { + "type": "string" + }, + "description": { + "type": "string" + }, + "uuid": { + "type": "string" + }, + "spaceUuid": { + "type": "string" + } + }, + "required": ["name", "uuid", "spaceUuid"], + "type": "object", + "description": "From T, pick a set of properties whose keys are in the union K" + }, + "UpdateMultipleDashboards": { + "$ref": "#/components/schemas/Pick_Dashboard.uuid-or-name-or-description-or-spaceUuid_" + }, + "UpdateSchedulerSettings": { + "properties": { + "schedulerTimezone": { + "type": "string" + } + }, + "required": ["schedulerTimezone"], + "type": "object" + }, + "ApiCreateTagResponse": { + "properties": { + "results": { + "properties": { + "tagUuid": { + "type": "string" + } + }, + "required": ["tagUuid"], + "type": "object" + }, + "status": { + "type": "string", + "enum": ["ok"], + "nullable": false + } + }, + "required": ["results", "status"], + "type": "object" + }, + "Pick_Tag.name-or-color_": { + "properties": { + "name": { + "type": "string" + }, + "color": { + "type": "string" + } + }, + "required": ["name", "color"], + "type": "object", + "description": "From T, pick a set of properties whose keys are in the union K" + }, + "Partial_Pick_DbTag.name-or-color__": { + "properties": { + "name": { + "type": "string" + }, + "color": { + "type": "string" + } + }, + "type": "object", + "description": "Make all properties in T optional" + }, + "DbTagUpdate": { + "$ref": "#/components/schemas/Partial_Pick_DbTag.name-or-color__" + }, + "Pick_LightdashUser.userUuid-or-firstName-or-lastName_": { + "properties": { + "userUuid": { + "type": "string" + }, + "firstName": { + "type": "string" + }, + "lastName": { + "type": "string" + } + }, + "required": ["userUuid", "firstName", "lastName"], + "type": "object", + "description": "From T, pick a set of properties whose keys are in the union K" + }, + "Tag": { + "properties": { + "createdBy": { + "allOf": [ + { + "$ref": "#/components/schemas/Pick_LightdashUser.userUuid-or-firstName-or-lastName_" + } + ], + "nullable": true + }, + "createdAt": { + "type": "string", + "format": "date-time" + }, + "color": { + "type": "string" + }, + "name": { + "type": "string" + }, + "projectUuid": { + "type": "string" + }, + "tagUuid": { + "type": "string" + } + }, + "required": [ + "createdBy", + "createdAt", + "color", + "name", + "projectUuid", + "tagUuid" + ], + "type": "object" + }, + "ApiGetTagsResponse": { + "properties": { + "results": { + "items": { + "$ref": "#/components/schemas/Tag" + }, + "type": "array" + }, + "status": { + "type": "string", + "enum": ["ok"], + "nullable": false + } + }, + "required": ["results", "status"], + "type": "object" + }, + "Pick_SavedChart.name-or-description-or-tableName-or-metricQuery-or-chartConfig-or-tableConfig-or-slug-or-dashboardUuid-or-updatedAt_": { + "properties": { + "name": { + "type": "string" + }, + "description": { + "type": "string" + }, + "dashboardUuid": { + "type": "string", + "nullable": true + }, + "slug": { + "type": "string" + }, + "updatedAt": { + "type": "string", + "format": "date-time" + }, + "tableName": { + "type": "string" + }, + "metricQuery": { + "$ref": "#/components/schemas/MetricQuery" + }, + "chartConfig": { + "$ref": "#/components/schemas/ChartConfig" + }, + "tableConfig": { + "properties": { + "columnOrder": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "required": ["columnOrder"], + "type": "object" + } + }, + "required": [ + "name", + "dashboardUuid", + "slug", + "updatedAt", + "tableName", + "metricQuery", + "chartConfig", + "tableConfig" + ], + "type": "object", + "description": "From T, pick a set of properties whose keys are in the union K" + }, + "ChartAsCode": { + "allOf": [ + { + "$ref": "#/components/schemas/Pick_SavedChart.name-or-description-or-tableName-or-metricQuery-or-chartConfig-or-tableConfig-or-slug-or-dashboardUuid-or-updatedAt_" + }, + { + "properties": { + "downloadedAt": { + "type": "string", + "format": "date-time" + }, + "spaceSlug": { + "type": "string" + }, + "version": { + "type": "number", + "format": "double" + } + }, + "required": ["spaceSlug", "version"], + "type": "object" + } + ] + }, + "ApiChartAsCodeListResponse": { + "properties": { + "results": { + "items": { + "$ref": "#/components/schemas/ChartAsCode" + }, + "type": "array" + }, + "status": { + "type": "string", + "enum": ["ok"], + "nullable": false + } + }, + "required": ["results", "status"], + "type": "object" + }, + "Pick_Dashboard.name-or-description-or-updatedAt-or-filters-or-tabs-or-slug_": { + "properties": { + "name": { + "type": "string" + }, + "description": { + "type": "string" + }, + "slug": { + "type": "string" + }, + "updatedAt": { + "type": "string", + "format": "date-time" + }, + "filters": { + "$ref": "#/components/schemas/DashboardFilters" + }, + "tabs": { + "items": { + "$ref": "#/components/schemas/DashboardTab" + }, + "type": "array" + } + }, + "required": ["name", "slug", "updatedAt", "filters", "tabs"], + "type": "object", + "description": "From T, pick a set of properties whose keys are in the union K" + }, + "Pick_DashboardTile.Exclude_keyofDashboardTile.properties__": { + "properties": { + "type": { + "$ref": "#/components/schemas/DashboardTileTypes" + }, + "uuid": { + "type": "string" + }, + "x": { + "type": "number", + "format": "double" + }, + "y": { + "type": "number", + "format": "double" + }, + "h": { + "type": "number", + "format": "double" + }, + "w": { + "type": "number", + "format": "double" + }, + "tabUuid": { + "type": "string" + } + }, + "required": ["type", "x", "y", "h", "w"], + "type": "object", + "description": "From T, pick a set of properties whose keys are in the union K" + }, + "Omit_DashboardTile.properties_": { + "$ref": "#/components/schemas/Pick_DashboardTile.Exclude_keyofDashboardTile.properties__", + "description": "Construct a type with the properties of T except for those in type K." + }, + "Pick_DashboardTile-at-properties.Exclude_keyofDashboardTile-at-properties.savedChartUuid-or-savedSqlUuid-or-savedSemanticViewerChartUuid__": { + "properties": { + "title": { + "type": "string" + } + }, + "type": "object", + "description": "From T, pick a set of properties whose keys are in the union K" + }, + "Omit_DashboardTile-at-properties.savedChartUuid-or-savedSqlUuid-or-savedSemanticViewerChartUuid_": { + "$ref": "#/components/schemas/Pick_DashboardTile-at-properties.Exclude_keyofDashboardTile-at-properties.savedChartUuid-or-savedSqlUuid-or-savedSemanticViewerChartUuid__", + "description": "Construct a type with the properties of T except for those in type K." + }, + "DashboardTileWithoutUuids": { + "allOf": [ + { + "$ref": "#/components/schemas/Omit_DashboardTile.properties_" + }, + { + "properties": { + "properties": { + "$ref": "#/components/schemas/Omit_DashboardTile-at-properties.savedChartUuid-or-savedSqlUuid-or-savedSemanticViewerChartUuid_" + } + }, + "required": ["properties"], + "type": "object" + } + ] + }, + "DashboardAsCode": { + "allOf": [ + { + "$ref": "#/components/schemas/Pick_Dashboard.name-or-description-or-updatedAt-or-filters-or-tabs-or-slug_" + }, + { + "properties": { + "downloadedAt": { + "type": "string", + "format": "date-time" + }, + "spaceSlug": { + "type": "string" + }, + "version": { + "type": "number", + "format": "double" + }, + "tiles": { + "items": { + "$ref": "#/components/schemas/DashboardTileWithoutUuids" + }, + "type": "array" + } + }, + "required": ["spaceSlug", "version", "tiles"], + "type": "object" + } + ] + }, + "ApiDashboardAsCodeListResponse": { + "properties": { + "results": { + "items": { + "$ref": "#/components/schemas/DashboardAsCode" + }, + "type": "array" + }, + "status": { + "type": "string", + "enum": ["ok"], + "nullable": false + } + }, + "required": ["results", "status"], + "type": "object" + }, + "ApiChartAsCodeUpsertResponse": { + "properties": { + "results": { + "$ref": "#/components/schemas/PromotionChanges" + }, + "status": { + "type": "string", + "enum": ["ok"], + "nullable": false + } + }, + "required": ["results", "status"], + "type": "object" + }, + "Pick_ChartAsCode.Exclude_keyofChartAsCode.metricQuery-or-chartConfig__": { + "properties": { + "name": { + "type": "string" + }, + "description": { + "type": "string" + }, + "dashboardUuid": { + "type": "string", + "nullable": true + }, + "slug": { + "type": "string" + }, + "updatedAt": { + "type": "string", + "format": "date-time" + }, + "tableName": { + "type": "string" + }, + "tableConfig": { + "properties": { + "columnOrder": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "required": ["columnOrder"], + "type": "object" + }, + "version": { + "type": "number", + "format": "double" + }, + "spaceSlug": { + "type": "string" + }, + "downloadedAt": { + "type": "string", + "format": "date-time" + } + }, + "required": [ + "name", + "dashboardUuid", + "slug", + "updatedAt", + "tableName", + "tableConfig", + "version", + "spaceSlug" + ], + "type": "object", + "description": "From T, pick a set of properties whose keys are in the union K" + }, + "Omit_ChartAsCode.metricQuery-or-chartConfig_": { + "$ref": "#/components/schemas/Pick_ChartAsCode.Exclude_keyofChartAsCode.metricQuery-or-chartConfig__", + "description": "Construct a type with the properties of T except for those in type K." + }, + "ApiDashboardAsCodeUpsertResponse": { + "properties": { + "results": { + "$ref": "#/components/schemas/PromotionChanges" + }, + "status": { + "type": "string", + "enum": ["ok"], + "nullable": false + } + }, + "required": ["results", "status"], + "type": "object" + }, + "Pick_DashboardAsCode.Exclude_keyofDashboardAsCode.filters-or-tiles-or-description__": { + "properties": { + "name": { + "type": "string" + }, + "slug": { + "type": "string" + }, + "updatedAt": { + "type": "string", + "format": "date-time" + }, + "tabs": { + "items": { + "$ref": "#/components/schemas/DashboardTab" + }, + "type": "array" + }, + "version": { + "type": "number", + "format": "double" + }, + "spaceSlug": { + "type": "string" + }, + "downloadedAt": { + "type": "string", + "format": "date-time" + } + }, + "required": [ + "name", + "slug", + "updatedAt", + "tabs", + "version", + "spaceSlug" + ], + "type": "object", + "description": "From T, pick a set of properties whose keys are in the union K" + }, + "Omit_DashboardAsCode.filters-or-tiles-or-description_": { + "$ref": "#/components/schemas/Pick_DashboardAsCode.Exclude_keyofDashboardAsCode.filters-or-tiles-or-description__", + "description": "Construct a type with the properties of T except for those in type K." + }, + "CacheMetadata": { + "properties": { + "cacheHit": { + "type": "boolean" + }, + "cacheUpdatedTime": { + "type": "string", + "format": "date-time" + } + }, + "required": ["cacheHit"], + "type": "object" + }, + "Record_string.Item-or-AdditionalMetric_": { + "properties": {}, + "type": "object", + "description": "Construct a type with a set of properties K of type T" + }, + "ApiRunQueryResponse": { + "properties": { + "results": { + "properties": { + "fields": { + "$ref": "#/components/schemas/Record_string.Item-or-AdditionalMetric_" + }, + "rows": { + "items": {}, + "type": "array" + }, + "cacheMetadata": { + "$ref": "#/components/schemas/CacheMetadata" + }, + "metricQuery": { + "$ref": "#/components/schemas/MetricQueryResponse" + } + }, + "required": ["rows", "cacheMetadata", "metricQuery"], + "type": "object" + }, + "status": { + "type": "string", + "enum": ["ok"], + "nullable": false + } + }, + "required": ["results", "status"], + "type": "object" + }, + "Pick_ChartVersion.chartUuid-or-versionUuid-or-createdAt-or-createdBy_": { + "properties": { + "createdAt": { + "type": "string", + "format": "date-time" + }, + "chartUuid": { + "type": "string" + }, + "versionUuid": { + "type": "string" + }, + "createdBy": { + "allOf": [ + { + "$ref": "#/components/schemas/Pick_LightdashUser.userUuid-or-firstName-or-lastName_" + } + ], + "nullable": true + } + }, + "required": [ + "createdAt", + "chartUuid", + "versionUuid", + "createdBy" + ], + "type": "object", + "description": "From T, pick a set of properties whose keys are in the union K" + }, + "ChartVersionSummary": { + "$ref": "#/components/schemas/Pick_ChartVersion.chartUuid-or-versionUuid-or-createdAt-or-createdBy_" + }, + "ChartHistory": { + "properties": { + "history": { + "items": { + "$ref": "#/components/schemas/ChartVersionSummary" + }, + "type": "array" + } + }, + "required": ["history"], + "type": "object" + }, + "ApiGetChartHistoryResponse": { + "properties": { + "results": { + "$ref": "#/components/schemas/ChartHistory" + }, + "status": { + "type": "string", + "enum": ["ok"], + "nullable": false + } + }, + "required": ["results", "status"], + "type": "object" + }, + "SavedChart": { + "properties": { + "slug": { + "type": "string" + }, + "access": { + "items": { + "$ref": "#/components/schemas/SpaceShare" + }, + "type": "array" + }, + "isPrivate": { + "type": "boolean" + }, + "colorPalette": { + "items": { + "type": "string" + }, + "type": "array" + }, + "dashboardName": { + "type": "string", + "nullable": true + }, + "dashboardUuid": { + "type": "string", + "nullable": true + }, + "pinnedListOrder": { + "type": "number", + "format": "double", + "nullable": true + }, + "pinnedListUuid": { + "type": "string", + "nullable": true + }, + "spaceName": { + "type": "string" + }, + "spaceUuid": { + "type": "string" + }, + "organizationUuid": { + "type": "string" + }, + "updatedByUser": { + "$ref": "#/components/schemas/UpdatedByUser" + }, + "updatedAt": { + "type": "string", + "format": "date-time" + }, + "tableConfig": { + "properties": { + "columnOrder": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "required": ["columnOrder"], + "type": "object" + }, + "chartConfig": { + "$ref": "#/components/schemas/ChartConfig" + }, + "pivotConfig": { + "properties": { + "columns": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "required": ["columns"], + "type": "object" + }, + "metricQuery": { + "$ref": "#/components/schemas/MetricQuery" + }, + "tableName": { + "type": "string" + }, + "description": { + "type": "string" + }, + "name": { + "type": "string" + }, + "projectUuid": { + "type": "string" + }, + "uuid": { + "type": "string" + } + }, + "required": [ + "slug", + "access", + "isPrivate", + "colorPalette", + "dashboardName", + "dashboardUuid", + "pinnedListOrder", + "pinnedListUuid", + "spaceName", + "spaceUuid", + "organizationUuid", + "updatedAt", + "tableConfig", + "chartConfig", + "metricQuery", + "tableName", + "name", + "projectUuid", + "uuid" + ], + "type": "object" + }, + "ChartVersion": { + "properties": { + "chart": { + "$ref": "#/components/schemas/SavedChart" + }, + "createdBy": { + "allOf": [ + { + "$ref": "#/components/schemas/Pick_LightdashUser.userUuid-or-firstName-or-lastName_" + } + ], + "nullable": true + }, + "createdAt": { + "type": "string", + "format": "date-time" + }, + "versionUuid": { + "type": "string" + }, + "chartUuid": { + "type": "string" + } + }, + "required": [ + "chart", + "createdBy", + "createdAt", + "versionUuid", + "chartUuid" + ], + "type": "object" + }, + "ApiGetChartVersionResponse": { + "properties": { + "results": { + "$ref": "#/components/schemas/ChartVersion" + }, + "status": { + "type": "string", + "enum": ["ok"], + "nullable": false + } + }, + "required": ["results", "status"], + "type": "object" + }, + "ApiPromoteChartResponse": { + "properties": { + "results": { + "$ref": "#/components/schemas/SavedChartDAO" + }, + "status": { + "type": "string", + "enum": ["ok"], + "nullable": false + } + }, + "required": ["results", "status"], + "type": "object" + }, + "SchedulerFormat": { + "enum": ["csv", "image", "gsheets"], + "type": "string" + }, + "SchedulerCsvOptions": { + "properties": { + "limit": { + "anyOf": [ + { + "type": "number", + "format": "double" + }, + { + "type": "string", + "enum": ["table", "all"] + } + ] + }, + "formatted": { + "type": "boolean" + } + }, + "required": ["limit", "formatted"], + "type": "object" + }, + "SchedulerImageOptions": { + "properties": { + "withPdf": { + "type": "boolean" + } + }, + "type": "object" + }, + "SchedulerGsheetsOptions": { + "properties": { + "url": { + "type": "string" + }, + "gdriveOrganizationName": { + "type": "string" + }, + "gdriveName": { + "type": "string" + }, + "gdriveId": { + "type": "string" + } + }, + "required": [ + "url", + "gdriveOrganizationName", + "gdriveName", + "gdriveId" + ], + "type": "object" + }, + "SchedulerOptions": { + "anyOf": [ + { + "$ref": "#/components/schemas/SchedulerCsvOptions" + }, + { + "$ref": "#/components/schemas/SchedulerImageOptions" + }, + { + "$ref": "#/components/schemas/SchedulerGsheetsOptions" + } + ] + }, + "ThresholdOperator": { + "enum": [ + "greaterThan", + "lessThan", + "increasedBy", + "decreasedBy" + ], + "type": "string" + }, + "ThresholdOptions": { + "properties": { + "value": { + "type": "number", + "format": "double" + }, + "fieldId": { + "type": "string" + }, + "operator": { + "$ref": "#/components/schemas/ThresholdOperator" + } + }, + "required": ["value", "fieldId", "operator"], + "type": "object" + }, + "NotificationFrequency": { + "enum": ["always", "once"], + "type": "string" + }, + "SchedulerBase": { + "properties": { + "includeLinks": { + "type": "boolean" + }, + "notificationFrequency": { + "$ref": "#/components/schemas/NotificationFrequency" + }, + "enabled": { + "type": "boolean" + }, + "thresholds": { + "items": { + "$ref": "#/components/schemas/ThresholdOptions" + }, + "type": "array" + }, + "options": { + "$ref": "#/components/schemas/SchedulerOptions" + }, + "dashboardUuid": { + "type": "string", + "nullable": true + }, + "savedChartUuid": { + "type": "string", + "nullable": true + }, + "timezone": { + "type": "string" + }, + "cron": { + "type": "string" + }, + "format": { + "$ref": "#/components/schemas/SchedulerFormat" + }, + "createdBy": { + "type": "string" + }, + "updatedAt": { + "type": "string", + "format": "date-time" + }, + "createdAt": { + "type": "string", + "format": "date-time" + }, + "message": { + "type": "string" + }, + "name": { + "type": "string" + }, + "schedulerUuid": { + "type": "string" + } + }, + "required": [ + "includeLinks", + "enabled", + "options", + "dashboardUuid", + "savedChartUuid", + "cron", + "format", + "createdBy", + "updatedAt", + "createdAt", + "name", + "schedulerUuid" + ], + "type": "object" + }, + "ChartScheduler": { + "allOf": [ + { + "$ref": "#/components/schemas/SchedulerBase" + }, + { + "properties": { + "dashboardUuid": { + "type": "number", + "enum": [null], + "nullable": true + }, + "savedChartUuid": { + "type": "string" + } + }, + "required": ["dashboardUuid", "savedChartUuid"], + "type": "object" + } + ] + }, + "SchedulerFilterRule": { + "allOf": [ + { + "$ref": "#/components/schemas/DashboardFilterRule" + }, + { + "properties": { + "tileTargets": {} + }, + "type": "object" + } + ] + }, + "DashboardScheduler": { + "allOf": [ + { + "$ref": "#/components/schemas/SchedulerBase" + }, + { + "properties": { + "selectedTabs": { + "items": { + "type": "string" + }, + "type": "array" + }, + "customViewportWidth": { + "type": "number", + "format": "double" + }, + "filters": { + "items": { + "$ref": "#/components/schemas/SchedulerFilterRule" + }, + "type": "array" + }, + "dashboardUuid": { + "type": "string" + }, + "savedChartUuid": { + "type": "number", + "enum": [null], + "nullable": true + } + }, + "required": ["dashboardUuid", "savedChartUuid"], + "type": "object" + } + ] + }, + "Scheduler": { + "anyOf": [ + { + "$ref": "#/components/schemas/ChartScheduler" + }, + { + "$ref": "#/components/schemas/DashboardScheduler" + } + ] + }, + "SchedulerSlackTarget": { + "properties": { + "channel": { + "type": "string" + }, + "schedulerUuid": { + "type": "string" + }, + "updatedAt": { + "type": "string", + "format": "date-time" + }, + "createdAt": { + "type": "string", + "format": "date-time" + }, + "schedulerSlackTargetUuid": { + "type": "string" + } + }, + "required": [ + "channel", + "schedulerUuid", + "updatedAt", + "createdAt", + "schedulerSlackTargetUuid" + ], + "type": "object" + }, + "SchedulerEmailTarget": { + "properties": { + "recipient": { + "type": "string" + }, + "schedulerUuid": { + "type": "string" + }, + "updatedAt": { + "type": "string", + "format": "date-time" + }, + "createdAt": { + "type": "string", + "format": "date-time" + }, + "schedulerEmailTargetUuid": { + "type": "string" + } + }, + "required": [ + "recipient", + "schedulerUuid", + "updatedAt", + "createdAt", + "schedulerEmailTargetUuid" + ], + "type": "object" + }, + "SchedulerAndTargets": { + "allOf": [ + { + "$ref": "#/components/schemas/Scheduler" + }, + { + "properties": { + "targets": { + "items": { + "anyOf": [ + { + "$ref": "#/components/schemas/SchedulerSlackTarget" + }, + { + "$ref": "#/components/schemas/SchedulerEmailTarget" + } + ] + }, + "type": "array" + } + }, + "required": ["targets"], + "type": "object" + } + ] + }, + "SchedulerJobStatus": { + "enum": ["scheduled", "started", "completed", "error"], + "type": "string" + }, + "Record_string.any_": { + "properties": {}, + "type": "object", + "description": "Construct a type with a set of properties K of type T" + }, + "SchedulerLog": { + "properties": { + "details": { + "$ref": "#/components/schemas/Record_string.any_" + }, + "targetType": { + "type": "string", + "enum": ["email", "slack", "gsheets"] + }, + "target": { + "type": "string" + }, + "status": { + "$ref": "#/components/schemas/SchedulerJobStatus" + }, + "createdAt": { + "type": "string", + "format": "date-time" + }, + "scheduledTime": { + "type": "string", + "format": "date-time" + }, + "jobGroup": { + "type": "string" + }, + "jobId": { + "type": "string" + }, + "schedulerUuid": { + "type": "string" + }, + "task": { + "type": "string", + "enum": [ + "handleScheduledDelivery", + "sendEmailNotification", + "sendSlackNotification", + "uploadGsheets", + "downloadCsv", + "uploadGsheetFromQuery", + "createProjectWithCompile", + "compileProject", + "testAndCompileProject", + "validateProject", + "sqlRunner", + "sqlRunnerPivotQuery", + "semanticLayer", + "indexCatalog" + ] + } + }, + "required": [ + "status", + "createdAt", + "scheduledTime", + "jobId", + "task" + ], + "type": "object" + }, + "SchedulerWithLogs": { + "properties": { + "logs": { + "items": { + "$ref": "#/components/schemas/SchedulerLog" + }, + "type": "array" + }, + "dashboards": { + "items": { + "properties": { + "dashboardUuid": { + "type": "string" + }, + "name": { + "type": "string" + } + }, + "required": ["dashboardUuid", "name"], + "type": "object" + }, + "type": "array" + }, + "charts": { + "items": { + "properties": { + "savedChartUuid": { + "type": "string" + }, + "name": { + "type": "string" + } + }, + "required": ["savedChartUuid", "name"], + "type": "object" + }, + "type": "array" + }, + "users": { + "items": { + "properties": { + "userUuid": { + "type": "string" + }, + "lastName": { + "type": "string" + }, + "firstName": { + "type": "string" + } + }, + "required": ["userUuid", "lastName", "firstName"], + "type": "object" + }, + "type": "array" + }, + "schedulers": { + "items": { + "$ref": "#/components/schemas/SchedulerAndTargets" + }, + "type": "array" + } + }, + "required": [ + "logs", + "dashboards", + "charts", + "users", + "schedulers" + ], + "type": "object" + }, + "ApiSchedulerLogsResponse": { + "properties": { + "results": { + "$ref": "#/components/schemas/SchedulerWithLogs" + }, + "status": { + "type": "string", + "enum": ["ok"], + "nullable": false + } + }, + "required": ["results", "status"], + "type": "object" + }, + "ApiSchedulerAndTargetsResponse": { + "properties": { + "results": { + "$ref": "#/components/schemas/SchedulerAndTargets" + }, + "status": { + "type": "string", + "enum": ["ok"], + "nullable": false + } + }, + "required": ["results", "status"], + "type": "object" + }, + "ScheduledJobs": { + "properties": { + "id": { + "type": "string" + }, + "date": { + "type": "string", + "format": "date-time" + } + }, + "required": ["id", "date"], + "type": "object" + }, + "ApiScheduledJobsResponse": { + "properties": { + "results": { + "items": { + "$ref": "#/components/schemas/ScheduledJobs" + }, + "type": "array" + }, + "status": { + "type": "string", + "enum": ["ok"], + "nullable": false + } + }, + "required": ["results", "status"], + "type": "object" + }, + "ApiJobStatusResponse": { + "properties": { + "results": { + "properties": { + "details": { + "allOf": [ + { + "$ref": "#/components/schemas/Record_string.any_" + } + ], + "nullable": true + }, + "status": { + "$ref": "#/components/schemas/SchedulerJobStatus" + } + }, + "required": ["details", "status"], + "type": "object" + }, + "status": { + "type": "string", + "enum": ["ok"], + "nullable": false + } + }, + "required": ["results", "status"], + "type": "object" + }, + "ApiTestSchedulerResponse": { + "properties": { + "results": { + "properties": { + "jobId": { + "type": "string" + } + }, + "required": ["jobId"], + "type": "object" + }, + "status": { + "type": "string", + "enum": ["ok"], + "nullable": false + } + }, + "required": ["results", "status"], + "type": "object" + }, + "ShareUrl": { + "properties": { + "host": { + "type": "string" + }, + "url": { + "type": "string" + }, + "shareUrl": { + "type": "string" + }, + "organizationUuid": { + "type": "string", + "format": "uuid" + }, + "createdByUserUuid": { + "type": "string", + "format": "uuid" + }, + "params": { + "type": "string" + }, + "path": { + "type": "string", + "description": "The URL path of the full URL" + }, + "nanoid": { + "type": "string", + "description": "Unique shareable id" + } + }, + "required": ["params", "path", "nanoid"], + "type": "object", + "description": "A ShareUrl maps a short shareable id to a full URL\nin the Lightdash UI. This allows very long URLs\nto be represented by short ids." + }, + "ApiShareResponse": { + "properties": { + "results": { + "$ref": "#/components/schemas/ShareUrl" + }, + "status": { + "type": "string", + "enum": ["ok"], + "nullable": false + } + }, + "required": ["results", "status"], + "type": "object" + }, + "Pick_ShareUrl.path-or-params_": { + "properties": { + "path": { + "type": "string", + "description": "The URL path of the full URL" + }, + "params": { + "type": "string" + } + }, + "required": ["path", "params"], + "type": "object", + "description": "From T, pick a set of properties whose keys are in the union K" + }, + "CreateShareUrl": { + "$ref": "#/components/schemas/Pick_ShareUrl.path-or-params_", + "description": "Contains the detail of a full URL to generate a short URL id" + }, + "SlackChannel": { + "properties": { + "name": { + "type": "string" + }, + "id": { + "type": "string" + } + }, + "required": ["name", "id"], + "type": "object" + }, + "ApiSlackChannelsResponse": { + "properties": { + "results": { + "items": { + "$ref": "#/components/schemas/SlackChannel" + }, + "type": "array" + }, + "status": { + "type": "string", + "enum": ["ok"], + "nullable": false + } + }, + "required": ["status"], + "type": "object" + }, + "ApiSlackCustomSettingsResponse": { + "properties": { + "results": {}, + "status": { + "type": "string", + "enum": ["ok"], + "nullable": false + } + }, + "required": ["results", "status"], + "type": "object" + }, + "SlackChannelProjectMapping": { + "properties": { + "slackChannelId": { + "type": "string" + }, + "projectUuid": { + "type": "string" + } + }, + "required": ["slackChannelId", "projectUuid"], + "type": "object" + }, + "SlackAppCustomSettings": { + "properties": { + "slackChannelProjectMappings": { + "items": { + "$ref": "#/components/schemas/SlackChannelProjectMapping" + }, + "type": "array" + }, + "appProfilePhotoUrl": { + "type": "string", + "nullable": true + }, + "notificationChannel": { + "type": "string", + "nullable": true + } + }, + "required": ["appProfilePhotoUrl", "notificationChannel"], + "type": "object" + }, + "SpaceDashboard": { + "$ref": "#/components/schemas/DashboardBasicDetails" + }, + "SpaceGroup": { + "properties": { + "spaceRole": { + "$ref": "#/components/schemas/SpaceMemberRole" + }, + "groupName": { + "type": "string" + }, + "groupUuid": { + "type": "string" + } + }, + "required": ["spaceRole", "groupName", "groupUuid"], + "type": "object" + }, + "Space": { + "properties": { + "slug": { + "type": "string" + }, + "pinnedListOrder": { + "type": "number", + "format": "double", + "nullable": true + }, + "pinnedListUuid": { + "type": "string", + "nullable": true + }, + "groupsAccess": { + "items": { + "$ref": "#/components/schemas/SpaceGroup" + }, + "type": "array" + }, + "access": { + "items": { + "$ref": "#/components/schemas/SpaceShare" + }, + "type": "array" + }, + "dashboards": { + "items": { + "$ref": "#/components/schemas/SpaceDashboard" + }, + "type": "array" + }, + "projectUuid": { + "type": "string" + }, + "queries": { + "items": { + "$ref": "#/components/schemas/SpaceQuery" + }, + "type": "array" + }, + "isPrivate": { + "type": "boolean" + }, + "name": { + "type": "string" + }, + "uuid": { + "type": "string" + }, + "organizationUuid": { + "type": "string" + } + }, + "required": [ + "slug", + "pinnedListOrder", + "pinnedListUuid", + "groupsAccess", + "access", + "dashboards", + "projectUuid", + "queries", + "isPrivate", + "name", + "uuid", + "organizationUuid" + ], + "type": "object" + }, + "ApiSpaceResponse": { + "properties": { + "results": { + "$ref": "#/components/schemas/Space" + }, + "status": { + "type": "string", + "enum": ["ok"], + "nullable": false + } + }, + "required": ["results", "status"], + "type": "object" + }, + "Pick_SpaceShare.userUuid-or-role_": { + "properties": { + "userUuid": { + "type": "string" + }, + "role": { + "$ref": "#/components/schemas/SpaceMemberRole" + } + }, + "required": ["userUuid", "role"], + "type": "object", + "description": "From T, pick a set of properties whose keys are in the union K" + }, + "CreateSpace": { + "properties": { + "access": { + "items": { + "$ref": "#/components/schemas/Pick_SpaceShare.userUuid-or-role_" + }, + "type": "array" + }, + "isPrivate": { + "type": "boolean" + }, + "name": { + "type": "string" + } + }, + "required": ["name"], + "type": "object" + }, + "UpdateSpace": { + "properties": { + "isPrivate": { + "type": "boolean" + }, + "name": { + "type": "string" + } + }, + "required": ["isPrivate", "name"], + "type": "object" + }, + "AddSpaceUserAccess": { + "properties": { + "spaceRole": { + "$ref": "#/components/schemas/SpaceMemberRole" + }, + "userUuid": { + "type": "string" + } + }, + "required": ["spaceRole", "userUuid"], + "type": "object" + }, + "AddSpaceGroupAccess": { + "properties": { + "spaceRole": { + "$ref": "#/components/schemas/SpaceMemberRole" + }, + "groupUuid": { + "type": "string" + } + }, + "required": ["spaceRole", "groupUuid"], + "type": "object" + }, + "PartitionType": { + "enum": ["DATE", "RANGE"], + "type": "string" + }, + "PartitionColumn": { + "properties": { + "field": { + "type": "string" + }, + "partitionType": { + "$ref": "#/components/schemas/PartitionType" + } + }, + "required": ["field", "partitionType"], + "type": "object" + }, + "WarehouseTablesCatalog": { + "properties": {}, + "additionalProperties": { + "properties": {}, + "additionalProperties": { + "properties": {}, + "additionalProperties": { + "properties": { + "partitionColumn": { + "$ref": "#/components/schemas/PartitionColumn" + } + }, + "type": "object" + }, + "type": "object" + }, + "type": "object" + }, + "type": "object" + }, + "ApiWarehouseTablesCatalog": { + "properties": { + "results": { + "$ref": "#/components/schemas/WarehouseTablesCatalog" + }, + "status": { + "type": "string", + "enum": ["ok"], + "nullable": false + } + }, + "required": ["results", "status"], + "type": "object" + }, + "WarehouseTableSchema": { + "properties": {}, + "additionalProperties": { + "$ref": "#/components/schemas/DimensionType" + }, + "type": "object" + }, + "ApiWarehouseTableFields": { + "properties": { + "results": { + "$ref": "#/components/schemas/WarehouseTableSchema" + }, + "status": { + "type": "string", + "enum": ["ok"], + "nullable": false + } + }, + "required": ["results", "status"], + "type": "object" + }, + "SqlRunnerBody": { + "properties": { + "limit": { + "type": "number", + "format": "double" + }, + "sql": { + "type": "string" + } + }, + "required": ["sql"], + "type": "object" + }, + "VizIndexType": { + "enum": ["time", "category"], + "type": "string" + }, + "PivotIndexColum": { + "properties": { + "type": { + "$ref": "#/components/schemas/VizIndexType" + }, + "reference": { + "type": "string" + } + }, + "required": ["type", "reference"], + "type": "object" + }, + "VizAggregationOptions": { + "enum": ["sum", "count", "avg", "min", "max", "any"], + "type": "string" + }, + "SortByDirection": { + "enum": ["ASC", "DESC"], + "type": "string" + }, + "VizSortBy": { + "properties": { + "direction": { + "$ref": "#/components/schemas/SortByDirection" + }, + "reference": { + "type": "string" + } + }, + "required": ["direction", "reference"], + "type": "object" + }, + "ApiSqlRunnerPivotQueryPayload": { + "properties": { + "sortBy": { + "items": { + "$ref": "#/components/schemas/VizSortBy" + }, + "type": "array" + }, + "groupByColumns": { + "items": { + "properties": { + "reference": { + "type": "string" + } + }, + "required": ["reference"], + "type": "object" + }, + "type": "array" + }, + "valuesColumns": { + "items": { + "properties": { + "aggregation": { + "$ref": "#/components/schemas/VizAggregationOptions" + }, + "reference": { + "type": "string" + } + }, + "required": ["aggregation", "reference"], + "type": "object" + }, + "type": "array" + }, + "indexColumn": { + "$ref": "#/components/schemas/PivotIndexColum" + }, + "savedSqlUuid": { + "type": "string" + } + }, + "required": ["valuesColumns", "indexColumn"], + "type": "object" + }, + "SqlRunnerPivotQueryBody": { + "allOf": [ + { + "$ref": "#/components/schemas/SqlRunnerBody" + }, + { + "$ref": "#/components/schemas/ApiSqlRunnerPivotQueryPayload" + } + ] + }, + "VizBaseConfig": { + "properties": { + "type": { + "$ref": "#/components/schemas/ChartKind" + }, + "metadata": { + "properties": { + "version": { + "type": "number", + "format": "double" + } + }, + "required": ["version"], + "type": "object" + } + }, + "required": ["type", "metadata"], + "type": "object" + }, + "ChartKind.VERTICAL_BAR": { + "enum": ["vertical_bar"], + "type": "string" + }, + "ChartKind.LINE": { + "enum": ["line"], + "type": "string" + }, + "PivotChartLayout": { + "properties": { + "sortBy": { + "items": { + "$ref": "#/components/schemas/VizSortBy" + }, + "type": "array" + }, + "groupBy": { + "items": { + "properties": { + "reference": { + "type": "string" + } + }, + "required": ["reference"], + "type": "object" + }, + "type": "array" + }, + "y": { + "items": { + "properties": { + "aggregation": { + "$ref": "#/components/schemas/VizAggregationOptions" + }, + "reference": { + "type": "string" + } + }, + "required": ["aggregation", "reference"], + "type": "object" + }, + "type": "array" + }, + "x": { + "properties": { + "type": { + "$ref": "#/components/schemas/VizIndexType" + }, + "reference": { + "type": "string" + } + }, + "required": ["type", "reference"], + "type": "object" + } + }, + "required": ["y"], + "type": "object" + }, + "CartesianSeriesType.LINE": { + "enum": ["line"], + "type": "string" + }, + "CartesianSeriesType.BAR": { + "enum": ["bar"], + "type": "string" + }, + "ValueLabelPositionOptions": { + "enum": ["hidden", "top", "bottom", "left", "right", "inside"], + "type": "string" + }, + "CartesianChartDisplay": { + "properties": { + "stack": { + "type": "boolean" + }, + "legend": { + "properties": { + "align": { + "type": "string", + "enum": ["start", "center", "end"] + }, + "position": { + "type": "string", + "enum": ["top", "bottom", "left", "right"] + } + }, + "required": ["align", "position"], + "type": "object" + }, + "series": { + "properties": {}, + "additionalProperties": { + "properties": { + "whichYAxis": { + "type": "number", + "format": "double" + }, + "valueLabelPosition": { + "$ref": "#/components/schemas/ValueLabelPositionOptions" + }, + "type": { + "anyOf": [ + { + "$ref": "#/components/schemas/CartesianSeriesType.LINE" + }, + { + "$ref": "#/components/schemas/CartesianSeriesType.BAR" + } + ] + }, + "color": { + "type": "string" + }, + "yAxisIndex": { + "type": "number", + "format": "double" + }, + "format": { + "$ref": "#/components/schemas/Format" + }, + "label": { + "type": "string" + } + }, + "type": "object" + }, + "type": "object" + }, + "yAxis": { + "items": { + "properties": { + "format": { + "$ref": "#/components/schemas/Format" + }, + "position": { + "type": "string" + }, + "label": { + "type": "string" + } + }, + "type": "object" + }, + "type": "array" + }, + "xAxis": { + "properties": { + "type": { + "$ref": "#/components/schemas/VizIndexType" + }, + "label": { + "type": "string" + } + }, + "type": "object" + } + }, + "type": "object" + }, + "VizCartesianChartConfig": { + "allOf": [ + { + "$ref": "#/components/schemas/VizBaseConfig" + }, + { + "properties": { + "display": { + "$ref": "#/components/schemas/CartesianChartDisplay" + }, + "fieldConfig": { + "$ref": "#/components/schemas/PivotChartLayout" + }, + "type": { + "anyOf": [ + { + "$ref": "#/components/schemas/ChartKind.VERTICAL_BAR" + }, + { + "$ref": "#/components/schemas/ChartKind.LINE" + } + ] + } + }, + "required": ["type"], + "type": "object" + } + ] + }, + "ChartKind.PIE": { + "enum": ["pie"], + "type": "string" + }, + "VizPieChartDisplay": { + "properties": { + "isDonut": { + "type": "boolean" + } + }, + "type": "object" + }, + "VizPieChartConfig": { + "allOf": [ + { + "$ref": "#/components/schemas/VizBaseConfig" + }, + { + "properties": { + "display": { + "$ref": "#/components/schemas/VizPieChartDisplay" + }, + "fieldConfig": { + "$ref": "#/components/schemas/PivotChartLayout" + }, + "type": { + "$ref": "#/components/schemas/ChartKind.PIE" + } + }, + "required": ["type"], + "type": "object" + } + ] + }, + "ChartKind.TABLE": { + "enum": ["table"], + "type": "string" + }, + "VizColumnConfig": { + "properties": { + "aggregation": { + "$ref": "#/components/schemas/VizAggregationOptions" + }, + "order": { + "type": "number", + "format": "double" + }, + "frozen": { + "type": "boolean" + }, + "label": { + "type": "string" + }, + "reference": { + "type": "string" + }, + "visible": { + "type": "boolean" + } + }, + "required": ["frozen", "label", "reference", "visible"], + "type": "object" + }, + "VizColumnsConfig": { + "properties": {}, + "additionalProperties": { + "$ref": "#/components/schemas/VizColumnConfig" + }, + "type": "object" + }, + "VizTableDisplay": { + "properties": {}, + "type": "object" + }, + "VizTableConfig": { + "allOf": [ + { + "$ref": "#/components/schemas/VizBaseConfig" + }, + { + "properties": { + "display": { + "$ref": "#/components/schemas/VizTableDisplay" + }, + "columns": { + "$ref": "#/components/schemas/VizColumnsConfig" + }, + "type": { + "$ref": "#/components/schemas/ChartKind.TABLE" + } + }, + "required": ["columns", "type"], + "type": "object" + } + ] + }, + "Pick_SpaceSummary.uuid-or-name-or-isPrivate-or-userAccess_": { + "properties": { + "name": { + "type": "string" + }, + "uuid": { + "type": "string" + }, + "isPrivate": { + "type": "boolean" + }, + "userAccess": { + "$ref": "#/components/schemas/SpaceShare" + } + }, + "required": ["name", "uuid", "isPrivate"], + "type": "object", + "description": "From T, pick a set of properties whose keys are in the union K" + }, + "Pick_Dashboard.uuid-or-name_": { + "properties": { + "name": { + "type": "string" + }, + "uuid": { + "type": "string" + } + }, + "required": ["name", "uuid"], + "type": "object", + "description": "From T, pick a set of properties whose keys are in the union K" + }, + "Pick_Project.projectUuid_": { + "properties": { + "projectUuid": { + "type": "string" + } + }, + "required": ["projectUuid"], + "type": "object", + "description": "From T, pick a set of properties whose keys are in the union K" + }, + "Pick_Organization.organizationUuid_": { + "properties": { + "organizationUuid": { + "type": "string", + "description": "The unique identifier of the organization", + "format": "uuid" + } + }, + "required": ["organizationUuid"], + "type": "object", + "description": "From T, pick a set of properties whose keys are in the union K" + }, + "SqlChart": { + "properties": { + "lastViewedAt": { + "type": "string", + "format": "date-time" + }, + "firstViewedAt": { + "type": "string", + "format": "date-time" + }, + "views": { + "type": "number", + "format": "double" + }, + "organization": { + "$ref": "#/components/schemas/Pick_Organization.organizationUuid_" + }, + "project": { + "$ref": "#/components/schemas/Pick_Project.projectUuid_" + }, + "dashboard": { + "allOf": [ + { + "$ref": "#/components/schemas/Pick_Dashboard.uuid-or-name_" + } + ], + "nullable": true + }, + "space": { + "$ref": "#/components/schemas/Pick_SpaceSummary.uuid-or-name-or-isPrivate-or-userAccess_" + }, + "lastUpdatedBy": { + "allOf": [ + { + "$ref": "#/components/schemas/Pick_LightdashUser.userUuid-or-firstName-or-lastName_" + } + ], + "nullable": true + }, + "lastUpdatedAt": { + "type": "string", + "format": "date-time" + }, + "createdBy": { + "allOf": [ + { + "$ref": "#/components/schemas/Pick_LightdashUser.userUuid-or-firstName-or-lastName_" + } + ], + "nullable": true + }, + "createdAt": { + "type": "string", + "format": "date-time" + }, + "chartKind": { + "$ref": "#/components/schemas/ChartKind" + }, + "config": { + "allOf": [ + { + "$ref": "#/components/schemas/VizBaseConfig" + }, + { + "anyOf": [ + { + "$ref": "#/components/schemas/VizCartesianChartConfig" + }, + { + "$ref": "#/components/schemas/VizPieChartConfig" + }, + { + "$ref": "#/components/schemas/VizTableConfig" + } + ] + } + ] + }, + "limit": { + "type": "number", + "format": "double" + }, + "sql": { + "type": "string" + }, + "slug": { + "type": "string" + }, + "description": { + "type": "string", + "nullable": true + }, + "name": { + "type": "string" + }, + "savedSqlUuid": { + "type": "string" + } + }, + "required": [ + "lastViewedAt", + "firstViewedAt", + "views", + "organization", + "project", + "dashboard", + "space", + "lastUpdatedBy", + "lastUpdatedAt", + "createdBy", + "createdAt", + "chartKind", + "config", + "limit", + "sql", + "slug", + "description", + "name", + "savedSqlUuid" + ], + "type": "object" + }, + "ApiSqlChart": { + "properties": { + "results": { + "$ref": "#/components/schemas/SqlChart" + }, + "status": { + "type": "string", + "enum": ["ok"], + "nullable": false + } + }, + "required": ["results", "status"], + "type": "object" + }, + "ApiCreateSqlChart": { + "properties": { + "results": { + "properties": { + "slug": { + "type": "string" + }, + "savedSqlUuid": { + "type": "string" + } + }, + "required": ["slug", "savedSqlUuid"], + "type": "object" + }, + "status": { + "type": "string", + "enum": ["ok"], + "nullable": false + } + }, + "required": ["results", "status"], + "type": "object" + }, + "VizBarChartConfig": { + "allOf": [ + { + "$ref": "#/components/schemas/VizBaseConfig" + }, + { + "properties": { + "display": { + "$ref": "#/components/schemas/CartesianChartDisplay" + }, + "fieldConfig": { + "$ref": "#/components/schemas/PivotChartLayout" + }, + "type": { + "$ref": "#/components/schemas/ChartKind.VERTICAL_BAR" + } + }, + "required": ["type"], + "type": "object" + } + ] + }, + "VizLineChartConfig": { + "allOf": [ + { + "$ref": "#/components/schemas/VizBaseConfig" + }, + { + "properties": { + "display": { + "$ref": "#/components/schemas/CartesianChartDisplay" + }, + "fieldConfig": { + "$ref": "#/components/schemas/PivotChartLayout" + }, + "type": { + "$ref": "#/components/schemas/ChartKind.LINE" + } + }, + "required": ["type"], + "type": "object" + } + ] + }, + "AllVizChartConfig": { + "anyOf": [ + { + "$ref": "#/components/schemas/VizBarChartConfig" + }, + { + "$ref": "#/components/schemas/VizLineChartConfig" + }, + { + "$ref": "#/components/schemas/VizPieChartConfig" + }, + { + "$ref": "#/components/schemas/VizTableConfig" + } + ] + }, + "CreateSqlChart": { + "properties": { + "spaceUuid": { + "type": "string" + }, + "config": { + "$ref": "#/components/schemas/AllVizChartConfig" + }, + "limit": { + "type": "number", + "format": "double" + }, + "sql": { + "type": "string" + }, + "description": { + "type": "string", + "nullable": true + }, + "name": { + "type": "string" + } + }, + "required": [ + "spaceUuid", + "config", + "limit", + "sql", + "description", + "name" + ], + "type": "object" + }, + "ApiUpdateSqlChart": { + "properties": { + "results": { + "properties": { + "savedSqlVersionUuid": { + "type": "string", + "nullable": true + }, + "savedSqlUuid": { + "type": "string" + } + }, + "required": ["savedSqlVersionUuid", "savedSqlUuid"], + "type": "object" + }, + "status": { + "type": "string", + "enum": ["ok"], + "nullable": false + } + }, + "required": ["results", "status"], + "type": "object" + }, + "UpdateUnversionedSqlChart": { + "properties": { + "spaceUuid": { + "type": "string" + }, + "description": { + "type": "string", + "nullable": true + }, + "name": { + "type": "string" + } + }, + "required": ["spaceUuid", "description", "name"], + "type": "object" + }, + "UpdateVersionedSqlChart": { + "properties": { + "config": { + "$ref": "#/components/schemas/AllVizChartConfig" + }, + "limit": { + "type": "number", + "format": "double" + }, + "sql": { + "type": "string" + } + }, + "required": ["config", "limit", "sql"], + "type": "object" + }, + "UpdateSqlChart": { + "properties": { + "versionedData": { + "$ref": "#/components/schemas/UpdateVersionedSqlChart" + }, + "unversionedData": { + "$ref": "#/components/schemas/UpdateUnversionedSqlChart" + } + }, + "type": "object" + }, + "Pick_Explore.name_": { + "properties": { + "name": { + "type": "string" + } + }, + "required": ["name"], + "type": "object", + "description": "From T, pick a set of properties whose keys are in the union K" + }, + "ApiCreateVirtualView": { + "properties": { + "results": { + "$ref": "#/components/schemas/Pick_Explore.name_" + }, + "status": { + "type": "string", + "enum": ["ok"], + "nullable": false + } + }, + "required": ["results", "status"], + "type": "object" + }, + "VizColumn": { + "properties": { + "type": { + "$ref": "#/components/schemas/DimensionType" + }, + "reference": { + "type": "string" + } + }, + "required": ["reference"], + "type": "object" + }, + "CreateVirtualViewPayload": { + "properties": { + "columns": { + "items": { + "$ref": "#/components/schemas/VizColumn" + }, + "type": "array" + }, + "sql": { + "type": "string" + }, + "name": { + "type": "string" + } + }, + "required": ["columns", "sql", "name"], + "type": "object" + }, + "UpdateVirtualViewPayload": { + "$ref": "#/components/schemas/CreateVirtualViewPayload" + }, + "ApiGithubDbtWritePreview": { + "properties": { + "results": { + "properties": { + "owner": { + "type": "string" + }, + "files": { + "items": { + "type": "string" + }, + "type": "array" + }, + "path": { + "type": "string" + }, + "repo": { + "type": "string" + }, + "url": { + "type": "string" + } + }, + "required": ["owner", "files", "path", "repo", "url"], + "type": "object" + }, + "status": { + "type": "string", + "enum": ["ok"], + "nullable": false + } + }, + "required": ["results", "status"], + "type": "object" + }, + "ApiGithubDbtWriteBack": { + "properties": { + "results": { + "$ref": "#/components/schemas/PullRequestCreated" + }, + "status": { + "type": "string", + "enum": ["ok"], + "nullable": false + } + }, + "required": ["results", "status"], + "type": "object" + }, + "Pick_SshKeyPair.publicKey_": { + "properties": { + "publicKey": { + "type": "string" + } + }, + "required": ["publicKey"], + "type": "object", + "description": "From T, pick a set of properties whose keys are in the union K" + }, + "ApiSshKeyPairResponse": { + "properties": { + "results": { + "$ref": "#/components/schemas/Pick_SshKeyPair.publicKey_" + }, + "status": { + "type": "string", + "enum": ["ok"], + "nullable": false + } + }, + "required": ["results", "status"], + "type": "object" + }, + "UserAttributeValue": { + "properties": { + "value": { + "type": "string" + }, + "email": { + "type": "string" + }, + "userUuid": { + "type": "string" + } + }, + "required": ["value", "email", "userUuid"], + "type": "object" + }, + "GroupAttributeValue": { + "properties": { + "value": { + "type": "string" + }, + "groupUuid": { + "type": "string" + } + }, + "required": ["value", "groupUuid"], + "type": "object" + }, + "UserAttribute": { + "properties": { + "attributeDefault": { + "type": "string", + "nullable": true + }, + "groups": { + "items": { + "$ref": "#/components/schemas/GroupAttributeValue" + }, + "type": "array" + }, + "users": { + "items": { + "$ref": "#/components/schemas/UserAttributeValue" + }, + "type": "array" + }, + "description": { + "type": "string" + }, + "organizationUuid": { + "type": "string" + }, + "name": { + "type": "string" + }, + "createdAt": { + "type": "string", + "format": "date-time" + }, + "uuid": { + "type": "string" + } + }, + "required": [ + "attributeDefault", + "groups", + "users", + "organizationUuid", + "name", + "createdAt", + "uuid" + ], + "type": "object" + }, + "ApiUserAttributesResponse": { + "properties": { + "results": { + "items": { + "$ref": "#/components/schemas/UserAttribute" + }, + "type": "array" + }, + "status": { + "type": "string", + "enum": ["ok"], + "nullable": false + } + }, + "required": ["results", "status"], + "type": "object" + }, + "ApiCreateUserAttributeResponse": { + "properties": { + "results": { + "$ref": "#/components/schemas/UserAttribute" + }, + "status": { + "type": "string", + "enum": ["ok"], + "nullable": false + } + }, + "required": ["results", "status"], + "type": "object" + }, + "Pick_UserAttribute.name-or-description-or-attributeDefault_": { + "properties": { + "name": { + "type": "string" + }, + "description": { + "type": "string" + }, + "attributeDefault": { + "type": "string", + "nullable": true + } + }, + "required": ["name", "attributeDefault"], + "type": "object", + "description": "From T, pick a set of properties whose keys are in the union K" + }, + "Pick_UserAttributeValue.Exclude_keyofUserAttributeValue.email__": { + "properties": { + "userUuid": { + "type": "string" + }, + "value": { + "type": "string" + } + }, + "required": ["userUuid", "value"], + "type": "object", + "description": "From T, pick a set of properties whose keys are in the union K" + }, + "Omit_UserAttributeValue.email_": { + "$ref": "#/components/schemas/Pick_UserAttributeValue.Exclude_keyofUserAttributeValue.email__", + "description": "Construct a type with the properties of T except for those in type K." + }, + "CreateUserAttributeValue": { + "$ref": "#/components/schemas/Omit_UserAttributeValue.email_" + }, + "CreateGroupAttributeValue": { + "$ref": "#/components/schemas/GroupAttributeValue" + }, + "CreateUserAttribute": { + "allOf": [ + { + "$ref": "#/components/schemas/Pick_UserAttribute.name-or-description-or-attributeDefault_" + }, + { + "properties": { + "groups": { + "items": { + "$ref": "#/components/schemas/CreateGroupAttributeValue" + }, + "type": "array" + }, + "users": { + "items": { + "$ref": "#/components/schemas/CreateUserAttributeValue" + }, + "type": "array" + } + }, + "required": ["groups", "users"], + "type": "object" + } + ] + }, + "LightdashUser": { + "properties": { + "userUuid": { + "type": "string" + }, + "email": { + "type": "string" + }, + "firstName": { + "type": "string" + }, + "lastName": { + "type": "string" + }, + "organizationUuid": { + "type": "string" + }, + "organizationName": { + "type": "string" + }, + "organizationCreatedAt": { + "type": "string", + "format": "date-time" + }, + "isTrackingAnonymized": { + "type": "boolean" + }, + "isMarketingOptedIn": { + "type": "boolean" + }, + "isSetupComplete": { + "type": "boolean" + }, + "role": { + "$ref": "#/components/schemas/OrganizationMemberRole" + }, + "createdAt": { + "type": "string", + "format": "date-time" + }, + "updatedAt": { + "type": "string", + "format": "date-time" + }, + "isActive": { + "type": "boolean", + "description": "Whether the user can login" + }, + "isPending": { + "type": "boolean", + "description": "Whether the user doesn't have an authentication method (password or openId)" + } + }, + "required": [ + "userUuid", + "firstName", + "lastName", + "isTrackingAnonymized", + "isMarketingOptedIn", + "isSetupComplete", + "createdAt", + "updatedAt", + "isActive" + ], + "type": "object", + "additionalProperties": true + }, + "ApiGetAuthenticatedUserResponse": { + "properties": { + "results": { + "$ref": "#/components/schemas/LightdashUser" + }, + "status": { + "type": "string", + "enum": ["ok"], + "nullable": false + } + }, + "required": ["results", "status"], + "type": "object", + "description": "Shows the authenticated user" + }, + "ApiRegisterUserResponse": { + "properties": { + "results": { + "$ref": "#/components/schemas/LightdashUser" + }, + "status": { + "type": "string", + "enum": ["ok"], + "nullable": false + } + }, + "required": ["results", "status"], + "type": "object" + }, + "ActivateUser": { + "properties": { + "password": { + "type": "string" + }, + "lastName": { + "type": "string" + }, + "firstName": { + "type": "string" + } + }, + "required": ["password", "lastName", "firstName"], + "type": "object" + }, + "ActivateUserWithInviteCode": { + "allOf": [ + { + "$ref": "#/components/schemas/ActivateUser" + }, + { + "properties": { + "inviteCode": { + "type": "string" + } + }, + "required": ["inviteCode"], + "type": "object" + } + ] + }, + "Email": { + "type": "string", + "description": "Email", + "pattern": "^(([^<>()[\\]\\\\.,;:\\s@\"]+(\\.[^<>()[\\]\\\\.,;:\\s@\"]+)*)|(\".+\"))@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\])|(([a-zA-Z\\-0-9]+\\.)+[a-zA-Z]{2,}))$" + }, + "CreateUserArgs": { + "properties": { + "password": { + "type": "string" + }, + "email": { + "$ref": "#/components/schemas/Email" + }, + "lastName": { + "type": "string" + }, + "firstName": { + "type": "string" + } + }, + "required": ["password", "email", "lastName", "firstName"], + "type": "object" + }, + "RegisterOrActivateUser": { + "anyOf": [ + { + "$ref": "#/components/schemas/ActivateUserWithInviteCode" + }, + { + "$ref": "#/components/schemas/CreateUserArgs" + } + ] + }, + "EmailOneTimePassword": { + "properties": { + "numberOfAttempts": { + "type": "number", + "format": "double", + "description": "Number of times the passcode has been attempted" + }, + "createdAt": { + "type": "string", + "format": "date-time", + "description": "Time that the passcode was created" + } + }, + "required": ["numberOfAttempts", "createdAt"], + "type": "object" + }, + "EmailStatus": { + "properties": { + "otp": { + "$ref": "#/components/schemas/EmailOneTimePassword" + }, + "isVerified": { + "type": "boolean" + }, + "email": { + "type": "string" + } + }, + "required": ["isVerified", "email"], + "type": "object" + }, + "EmailOneTimePasswordExpiring": { + "allOf": [ + { + "$ref": "#/components/schemas/EmailOneTimePassword" + }, + { + "properties": { + "isMaxAttempts": { + "type": "boolean" + }, + "isExpired": { + "type": "boolean" + }, + "expiresAt": { + "type": "string", + "format": "date-time" + } + }, + "required": ["isMaxAttempts", "isExpired", "expiresAt"], + "type": "object" + } + ] + }, + "EmailStatusExpiring": { + "allOf": [ + { + "$ref": "#/components/schemas/EmailStatus" + }, + { + "properties": { + "otp": { + "$ref": "#/components/schemas/EmailOneTimePasswordExpiring", + "description": "One time passcode information\nIf there is no active passcode, this will be undefined" + } + }, + "type": "object" + } + ], + "description": "Verification status of an email address" + }, + "ApiEmailStatusResponse": { + "properties": { + "results": { + "$ref": "#/components/schemas/EmailStatusExpiring" + }, + "status": { + "type": "string", + "enum": ["ok"], + "nullable": false + } + }, + "required": ["results", "status"], + "type": "object", + "description": "Shows the current verification status of an email address" + }, + "UserAllowedOrganization": { + "properties": { + "membersCount": { + "type": "number", + "format": "double" + }, + "name": { + "type": "string" + }, + "organizationUuid": { + "type": "string" + } + }, + "required": ["membersCount", "name", "organizationUuid"], + "type": "object" + }, + "ApiUserAllowedOrganizationsResponse": { + "properties": { + "results": { + "items": { + "$ref": "#/components/schemas/UserAllowedOrganization" + }, + "type": "array" + }, + "status": { + "type": "string", + "enum": ["ok"], + "nullable": false + } + }, + "required": ["results", "status"], + "type": "object" + }, + "Pick_CreateRedshiftCredentials.type-or-user-or-password_": { + "properties": { + "type": { + "$ref": "#/components/schemas/WarehouseTypes.REDSHIFT" + }, + "user": { + "type": "string" + }, + "password": { + "type": "string" + } + }, + "required": ["type", "user", "password"], + "type": "object", + "description": "From T, pick a set of properties whose keys are in the union K" + }, + "Pick_CreatePostgresCredentials.type-or-user-or-password_": { + "properties": { + "type": { + "$ref": "#/components/schemas/WarehouseTypes.POSTGRES" + }, + "user": { + "type": "string" + }, + "password": { + "type": "string" + } + }, + "required": ["type", "user", "password"], + "type": "object", + "description": "From T, pick a set of properties whose keys are in the union K" + }, + "Pick_CreateSnowflakeCredentials.type-or-user-or-password_": { + "properties": { + "type": { + "$ref": "#/components/schemas/WarehouseTypes.SNOWFLAKE" + }, + "user": { + "type": "string" + }, + "password": { + "type": "string" + } + }, + "required": ["type", "user"], + "type": "object", + "description": "From T, pick a set of properties whose keys are in the union K" + }, + "Pick_CreateTrinoCredentials.type-or-user-or-password_": { + "properties": { + "type": { + "$ref": "#/components/schemas/WarehouseTypes.TRINO" + }, + "user": { + "type": "string" + }, + "password": { + "type": "string" + } + }, + "required": ["type", "user", "password"], + "type": "object", + "description": "From T, pick a set of properties whose keys are in the union K" + }, + "Pick_CreateBigqueryCredentials.type-or-keyfileContents_": { + "properties": { + "type": { + "$ref": "#/components/schemas/WarehouseTypes.BIGQUERY" + }, + "keyfileContents": { + "$ref": "#/components/schemas/Record_string.string_" + } + }, + "required": ["type", "keyfileContents"], + "type": "object", + "description": "From T, pick a set of properties whose keys are in the union K" + }, + "Pick_CreateDatabricksCredentials.type-or-personalAccessToken_": { + "properties": { + "type": { + "$ref": "#/components/schemas/WarehouseTypes.DATABRICKS" + }, + "personalAccessToken": { + "type": "string" + } + }, + "required": ["type", "personalAccessToken"], + "type": "object", + "description": "From T, pick a set of properties whose keys are in the union K" + }, + "UpsertUserWarehouseCredentials": { + "properties": { + "credentials": { + "anyOf": [ + { + "$ref": "#/components/schemas/Pick_CreateRedshiftCredentials.type-or-user-or-password_" + }, + { + "$ref": "#/components/schemas/Pick_CreatePostgresCredentials.type-or-user-or-password_" + }, + { + "$ref": "#/components/schemas/Pick_CreateSnowflakeCredentials.type-or-user-or-password_" + }, + { + "$ref": "#/components/schemas/Pick_CreateTrinoCredentials.type-or-user-or-password_" + }, + { + "$ref": "#/components/schemas/Pick_CreateBigqueryCredentials.type-or-keyfileContents_" + }, + { + "$ref": "#/components/schemas/Pick_CreateDatabricksCredentials.type-or-personalAccessToken_" + } + ] + }, + "name": { + "type": "string" + } + }, + "required": ["credentials", "name"], + "type": "object" + }, + "OpenIdIdentityIssuerType": { + "enum": ["google", "okta", "oneLogin", "azuread", "oidc"], + "type": "string" + }, + "LocalIssuerTypes": { + "enum": ["email", "apiToken"], + "type": "string" + }, + "LoginOptionTypes": { + "anyOf": [ + { + "$ref": "#/components/schemas/OpenIdIdentityIssuerType" + }, + { + "$ref": "#/components/schemas/LocalIssuerTypes" + } + ] + }, + "LoginOptions": { + "properties": { + "redirectUri": { + "type": "string" + }, + "forceRedirect": { + "type": "boolean" + }, + "showOptions": { + "items": { + "$ref": "#/components/schemas/LoginOptionTypes" + }, + "type": "array" + } + }, + "required": ["showOptions"], + "type": "object" + }, + "ApiGetLoginOptionsResponse": { + "properties": { + "results": { + "$ref": "#/components/schemas/LoginOptions" + }, + "status": { + "type": "string", + "enum": ["ok"], + "nullable": false + } + }, + "required": ["results", "status"], + "type": "object" + }, + "PersonalAccessToken": { + "properties": { + "description": { + "type": "string" + }, + "expiresAt": { + "type": "string", + "format": "date-time", + "nullable": true + }, + "rotatedAt": { + "type": "string", + "format": "date-time", + "nullable": true + }, + "lastUsedAt": { + "type": "string", + "format": "date-time", + "nullable": true + }, + "createdAt": { + "type": "string", + "format": "date-time" + }, + "uuid": { + "type": "string" + } + }, + "required": [ + "description", + "expiresAt", + "rotatedAt", + "lastUsedAt", + "createdAt", + "uuid" + ], + "type": "object" + }, + "PersonalAccessTokenWithToken": { + "allOf": [ + { + "$ref": "#/components/schemas/PersonalAccessToken" + }, + { + "properties": { + "token": { + "type": "string" + } + }, + "required": ["token"], + "type": "object" + } + ] + }, + "ContentType.CHART": { + "enum": ["chart"], + "type": "string" + }, + "ContentType": { + "enum": ["chart", "dashboard"], + "type": "string" + }, + "ChartContent": { + "properties": { + "contentType": { + "$ref": "#/components/schemas/ContentType.CHART" + }, + "uuid": { + "type": "string" + }, + "slug": { + "type": "string" + }, + "name": { + "type": "string" + }, + "description": { + "type": "string", + "nullable": true + }, + "createdAt": { + "type": "string", + "format": "date-time" + }, + "createdBy": { + "properties": { + "lastName": { + "type": "string" + }, + "firstName": { + "type": "string" + }, + "uuid": { + "type": "string" + } + }, + "required": ["lastName", "firstName", "uuid"], + "type": "object", + "nullable": true + }, + "lastUpdatedAt": { + "type": "string", + "format": "date-time", + "nullable": true + }, + "lastUpdatedBy": { + "properties": { + "lastName": { + "type": "string" + }, + "firstName": { + "type": "string" + }, + "uuid": { + "type": "string" + } + }, + "required": ["lastName", "firstName", "uuid"], + "type": "object", + "nullable": true + }, + "project": { + "properties": { + "name": { + "type": "string" + }, + "uuid": { + "type": "string" + } + }, + "required": ["name", "uuid"], + "type": "object" + }, + "organization": { + "properties": { + "name": { + "type": "string" + }, + "uuid": { + "type": "string" + } + }, + "required": ["name", "uuid"], + "type": "object" + }, + "space": { + "properties": { + "name": { + "type": "string" + }, + "uuid": { + "type": "string" + } + }, + "required": ["name", "uuid"], + "type": "object" + }, + "pinnedList": { + "properties": { + "uuid": { + "type": "string" + } + }, + "required": ["uuid"], + "type": "object", + "nullable": true + }, + "views": { + "type": "number", + "format": "double" + }, + "firstViewedAt": { + "type": "string", + "format": "date-time", + "nullable": true + }, + "source": { + "$ref": "#/components/schemas/ChartSourceType" + }, + "chartKind": { + "$ref": "#/components/schemas/ChartKind" + }, + "dashboard": { + "properties": { + "name": { + "type": "string" + }, + "uuid": { + "type": "string" + } + }, + "required": ["name", "uuid"], + "type": "object", + "nullable": true + } + }, + "required": [ + "contentType", + "uuid", + "slug", + "name", + "description", + "createdAt", + "createdBy", + "lastUpdatedAt", + "lastUpdatedBy", + "project", + "organization", + "space", + "pinnedList", + "views", + "firstViewedAt", + "source", + "chartKind", + "dashboard" + ], + "type": "object", + "additionalProperties": true + }, + "ContentType.DASHBOARD": { + "enum": ["dashboard"], + "type": "string" + }, + "DashboardContent": { + "properties": { + "contentType": { + "$ref": "#/components/schemas/ContentType.DASHBOARD" + }, + "uuid": { + "type": "string" + }, + "slug": { + "type": "string" + }, + "name": { + "type": "string" + }, + "description": { + "type": "string", + "nullable": true + }, + "createdAt": { + "type": "string", + "format": "date-time" + }, + "createdBy": { + "properties": { + "lastName": { + "type": "string" + }, + "firstName": { + "type": "string" + }, + "uuid": { + "type": "string" + } + }, + "required": ["lastName", "firstName", "uuid"], + "type": "object", + "nullable": true + }, + "lastUpdatedAt": { + "type": "string", + "format": "date-time", + "nullable": true + }, + "lastUpdatedBy": { + "properties": { + "lastName": { + "type": "string" + }, + "firstName": { + "type": "string" + }, + "uuid": { + "type": "string" + } + }, + "required": ["lastName", "firstName", "uuid"], + "type": "object", + "nullable": true + }, + "project": { + "properties": { + "name": { + "type": "string" + }, + "uuid": { + "type": "string" + } + }, + "required": ["name", "uuid"], + "type": "object" + }, + "organization": { + "properties": { + "name": { + "type": "string" + }, + "uuid": { + "type": "string" + } + }, + "required": ["name", "uuid"], + "type": "object" + }, + "space": { + "properties": { + "name": { + "type": "string" + }, + "uuid": { + "type": "string" + } + }, + "required": ["name", "uuid"], + "type": "object" + }, + "pinnedList": { + "properties": { + "uuid": { + "type": "string" + } + }, + "required": ["uuid"], + "type": "object", + "nullable": true + }, + "views": { + "type": "number", + "format": "double" + }, + "firstViewedAt": { + "type": "string", + "format": "date-time", + "nullable": true + } + }, + "required": [ + "contentType", + "uuid", + "slug", + "name", + "description", + "createdAt", + "createdBy", + "lastUpdatedAt", + "lastUpdatedBy", + "project", + "organization", + "space", + "pinnedList", + "views", + "firstViewedAt" + ], + "type": "object", + "additionalProperties": true + }, + "SummaryContent": { + "anyOf": [ + { + "$ref": "#/components/schemas/ChartContent" + }, + { + "$ref": "#/components/schemas/DashboardContent" + } + ] + }, + "KnexPaginatedData_SummaryContent-Array_": { + "properties": { + "pagination": { + "allOf": [ + { + "$ref": "#/components/schemas/KnexPaginateArgs" + }, + { + "properties": { + "totalResults": { + "type": "number", + "format": "double" + }, + "totalPageCount": { + "type": "number", + "format": "double" + } + }, + "required": ["totalResults", "totalPageCount"], + "type": "object" + } + ] + }, + "data": { + "items": { + "$ref": "#/components/schemas/SummaryContent" + }, + "type": "array" + } + }, + "required": ["data"], + "type": "object" + }, + "ApiContentResponse": { + "properties": { + "results": { + "$ref": "#/components/schemas/KnexPaginatedData_SummaryContent-Array_" + }, + "status": { + "type": "string", + "enum": ["ok"], + "nullable": false + } + }, + "required": ["results", "status"], + "type": "object" + }, + "SemanticLayerClientInfo": { + "properties": { + "name": { + "type": "string" + }, + "features": { + "properties": { + "views": { + "type": "boolean" + } + }, + "required": ["views"], + "type": "object" + }, + "config": { + "properties": { + "maxQueryLimit": { + "type": "number", + "format": "double" + } + }, + "required": ["maxQueryLimit"], + "type": "object" + } + }, + "required": ["name", "features", "config"], + "type": "object", + "additionalProperties": true + }, + "ApiSemanticLayerClientInfo": { + "properties": { + "status": { + "type": "string", + "enum": ["ok"], + "nullable": false + }, + "results": { + "allOf": [ + { + "$ref": "#/components/schemas/SemanticLayerClientInfo" + } + ], + "nullable": true + } + }, + "required": ["status", "results"], + "type": "object", + "additionalProperties": true + }, + "SemanticLayerView": { + "properties": { + "visible": { + "type": "boolean" + }, + "description": { + "type": "string" + }, + "label": { + "type": "string" + }, + "name": { + "type": "string" + } + }, + "required": ["visible", "label", "name"], + "type": "object" + }, + "SemanticLayerFieldType": { + "enum": ["time", "number", "string", "boolean"], + "type": "string" + }, + "SemanticLayerTimeGranularity": { + "enum": [ + "NANOSECOND", + "MICROSECOND", + "MILLISECOND", + "SECOND", + "MINUTE", + "HOUR", + "DAY", + "WEEK", + "MONTH", + "QUARTER", + "YEAR" + ], + "type": "string" + }, + "SemanticLayerFilterBaseOperator": { + "enum": ["IS", "IS_NOT"], + "type": "string" + }, + "SemanticLayerField": { + "properties": { + "availableOperators": { + "items": { + "$ref": "#/components/schemas/SemanticLayerFilterBaseOperator" + }, + "type": "array" + }, + "availableGranularities": { + "items": { + "$ref": "#/components/schemas/SemanticLayerTimeGranularity" + }, + "type": "array" + }, + "aggType": { + "$ref": "#/components/schemas/VizAggregationOptions" + }, + "visible": { + "type": "boolean" + }, + "description": { + "type": "string" + }, + "kind": { + "$ref": "#/components/schemas/FieldType" + }, + "type": { + "$ref": "#/components/schemas/SemanticLayerFieldType" + }, + "label": { + "type": "string" + }, + "name": { + "type": "string" + } + }, + "required": [ + "availableOperators", + "availableGranularities", + "visible", + "kind", + "type", + "label", + "name" + ], + "type": "object" + }, + "Pick_SemanticLayerField.name_": { + "properties": { + "name": { + "type": "string" + } + }, + "required": ["name"], + "type": "object", + "description": "From T, pick a set of properties whose keys are in the union K" + }, + "Pick_SemanticLayerTimeDimension.name-or-granularity_": { + "properties": { + "name": { + "type": "string" + }, + "granularity": { + "$ref": "#/components/schemas/SemanticLayerTimeGranularity" + } + }, + "required": ["name"], + "type": "object", + "description": "From T, pick a set of properties whose keys are in the union K" + }, + "Pick_SemanticLayerQuery.dimensions-or-timeDimensions-or-metrics_": { + "properties": { + "dimensions": { + "items": { + "$ref": "#/components/schemas/Pick_SemanticLayerField.name_" + }, + "type": "array" + }, + "timeDimensions": { + "items": { + "$ref": "#/components/schemas/Pick_SemanticLayerTimeDimension.name-or-granularity_" + }, + "type": "array" + }, + "metrics": { + "items": { + "$ref": "#/components/schemas/Pick_SemanticLayerField.name_" + }, + "type": "array" + } + }, + "required": ["dimensions", "timeDimensions", "metrics"], + "type": "object", + "description": "From T, pick a set of properties whose keys are in the union K" + }, + "Pick_SemanticLayerField.name-or-kind_": { + "properties": { + "name": { + "type": "string" + }, + "kind": { + "$ref": "#/components/schemas/FieldType" + } + }, + "required": ["name", "kind"], + "type": "object", + "description": "From T, pick a set of properties whose keys are in the union K" + }, + "SemanticLayerSortBy": { + "allOf": [ + { + "$ref": "#/components/schemas/Pick_SemanticLayerField.name-or-kind_" + }, + { + "properties": { + "direction": { + "$ref": "#/components/schemas/SortByDirection" + } + }, + "required": ["direction"], + "type": "object" + } + ] + }, + "SemanticLayerPivot": { + "properties": { + "values": { + "items": { + "type": "string" + }, + "type": "array" + }, + "index": { + "items": { + "type": "string" + }, + "type": "array" + }, + "on": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "required": ["values", "index", "on"], + "type": "object" + }, + "SemanticLayerFilterBase": { + "properties": { + "fieldType": { + "$ref": "#/components/schemas/SemanticLayerFieldType" + }, + "fieldKind": { + "$ref": "#/components/schemas/FieldType" + }, + "fieldRef": { + "type": "string" + }, + "uuid": { + "type": "string" + } + }, + "required": ["fieldType", "fieldKind", "fieldRef", "uuid"], + "type": "object" + }, + "SemanticLayerFieldType.STRING": { + "enum": ["string"], + "type": "string" + }, + "SemanticLayerStringFilter": { + "allOf": [ + { + "$ref": "#/components/schemas/SemanticLayerFilterBase" + }, + { + "properties": { + "values": { + "items": { + "type": "string" + }, + "type": "array" + }, + "operator": { + "$ref": "#/components/schemas/SemanticLayerFilterBaseOperator" + }, + "fieldType": { + "$ref": "#/components/schemas/SemanticLayerFieldType.STRING" + } + }, + "required": ["values", "operator", "fieldType"], + "type": "object" + } + ] + }, + "SemanticLayerFieldType.TIME": { + "enum": ["time"], + "type": "string" + }, + "SemanticLayerExactTimeFilter": { + "allOf": [ + { + "$ref": "#/components/schemas/SemanticLayerFilterBase" + }, + { + "properties": { + "values": { + "properties": { + "time": { + "type": "string" + } + }, + "required": ["time"], + "type": "object" + }, + "operator": { + "$ref": "#/components/schemas/SemanticLayerFilterBaseOperator" + }, + "fieldType": { + "$ref": "#/components/schemas/SemanticLayerFieldType.TIME" + } + }, + "required": ["values", "operator", "fieldType"], + "type": "object" + } + ] + }, + "SemanticLayerFilterRelativeTimeValue": { + "enum": ["TODAY", "YESTERDAY", "LAST_7_DAYS", "LAST_30_DAYS"], + "type": "string" + }, + "SemanticLayerRelativeTimeFilter": { + "allOf": [ + { + "$ref": "#/components/schemas/SemanticLayerFilterBase" + }, + { + "properties": { + "values": { + "properties": { + "relativeTime": { + "$ref": "#/components/schemas/SemanticLayerFilterRelativeTimeValue" + } + }, + "required": ["relativeTime"], + "type": "object" + }, + "operator": { + "$ref": "#/components/schemas/SemanticLayerFilterBaseOperator" + }, + "fieldType": { + "$ref": "#/components/schemas/SemanticLayerFieldType.TIME" + } + }, + "required": ["values", "operator", "fieldType"], + "type": "object" + } + ] + }, + "SemanticLayerTimeFilter": { + "anyOf": [ + { + "$ref": "#/components/schemas/SemanticLayerExactTimeFilter" + }, + { + "$ref": "#/components/schemas/SemanticLayerRelativeTimeFilter" + } + ] + }, + "SemanticLayerFilterTypes": { + "anyOf": [ + { + "$ref": "#/components/schemas/SemanticLayerStringFilter" + }, + { + "$ref": "#/components/schemas/SemanticLayerTimeFilter" + } + ] + }, + "SemanticLayerFilter": { + "allOf": [ + { + "$ref": "#/components/schemas/SemanticLayerFilterTypes" + }, + { + "properties": { + "or": { + "items": { + "$ref": "#/components/schemas/SemanticLayerFilter" + }, + "type": "array" + }, + "and": { + "items": { + "$ref": "#/components/schemas/SemanticLayerFilter" + }, + "type": "array" + } + }, + "type": "object" + } + ] + }, + "Pick_SemanticLayerField.name-or-aggType_": { + "properties": { + "name": { + "type": "string" + }, + "aggType": { + "$ref": "#/components/schemas/VizAggregationOptions" + } + }, + "required": ["name"], + "type": "object", + "description": "From T, pick a set of properties whose keys are in the union K" + }, + "SemanticLayerQuery": { + "properties": { + "customMetrics": { + "items": { + "allOf": [ + { + "$ref": "#/components/schemas/Pick_SemanticLayerField.name-or-aggType_" + }, + { + "properties": { + "baseDimension": { + "type": "string" + } + }, + "type": "object" + } + ] + }, + "type": "array" + }, + "sql": { + "type": "string" + }, + "filters": { + "items": { + "$ref": "#/components/schemas/SemanticLayerFilter" + }, + "type": "array" + }, + "pivot": { + "$ref": "#/components/schemas/SemanticLayerPivot" + }, + "timezone": { + "type": "string" + }, + "limit": { + "type": "number", + "format": "double" + }, + "sortBy": { + "items": { + "$ref": "#/components/schemas/SemanticLayerSortBy" + }, + "type": "array" + }, + "metrics": { + "items": { + "$ref": "#/components/schemas/Pick_SemanticLayerField.name_" + }, + "type": "array" + }, + "timeDimensions": { + "items": { + "$ref": "#/components/schemas/Pick_SemanticLayerTimeDimension.name-or-granularity_" + }, + "type": "array" + }, + "dimensions": { + "items": { + "$ref": "#/components/schemas/Pick_SemanticLayerField.name_" + }, + "type": "array" + } + }, + "required": [ + "filters", + "sortBy", + "metrics", + "timeDimensions", + "dimensions" + ], + "type": "object" + }, + "SemanticViewerChartCreateResult": { + "properties": { + "slug": { + "type": "string" + }, + "savedSemanticViewerChartUuid": { + "type": "string" + } + }, + "required": ["slug", "savedSemanticViewerChartUuid"], + "type": "object" + }, + "ApiSemanticViewerChartCreate": { + "properties": { + "results": { + "$ref": "#/components/schemas/SemanticViewerChartCreateResult" + }, + "status": { + "type": "string", + "enum": ["ok"], + "nullable": false + } + }, + "required": ["results", "status"], + "type": "object" + }, + "SemanticViewerChartCreate": { + "properties": { + "spaceUuid": { + "type": "string" + }, + "config": { + "$ref": "#/components/schemas/AllVizChartConfig" + }, + "semanticLayerQuery": { + "$ref": "#/components/schemas/SemanticLayerQuery" + }, + "semanticLayerView": { + "type": "string", + "nullable": true + }, + "description": { + "type": "string", + "nullable": true + }, + "name": { + "type": "string" + } + }, + "required": [ + "spaceUuid", + "config", + "semanticLayerQuery", + "semanticLayerView", + "description", + "name" + ], + "type": "object" + }, + "SavedSemanticViewerChart": { + "properties": { + "lastViewedAt": { + "type": "string", + "format": "date-time" + }, + "firstViewedAt": { + "type": "string", + "format": "date-time" + }, + "views": { + "type": "number", + "format": "double" + }, + "organization": { + "$ref": "#/components/schemas/Pick_Organization.organizationUuid_" + }, + "project": { + "$ref": "#/components/schemas/Pick_Project.projectUuid_" + }, + "dashboard": { + "allOf": [ + { + "$ref": "#/components/schemas/Pick_Dashboard.uuid-or-name_" + } + ], + "nullable": true + }, + "space": { + "$ref": "#/components/schemas/Pick_SpaceSummary.uuid-or-name-or-isPrivate-or-userAccess_" + }, + "lastUpdatedBy": { + "allOf": [ + { + "$ref": "#/components/schemas/Pick_LightdashUser.userUuid-or-firstName-or-lastName_" + } + ], + "nullable": true + }, + "lastUpdatedAt": { + "type": "string", + "format": "date-time" + }, + "createdBy": { + "allOf": [ + { + "$ref": "#/components/schemas/Pick_LightdashUser.userUuid-or-firstName-or-lastName_" + } + ], + "nullable": true + }, + "createdAt": { + "type": "string", + "format": "date-time" + }, + "chartKind": { + "$ref": "#/components/schemas/ChartKind" + }, + "semanticLayerQuery": { + "$ref": "#/components/schemas/SemanticLayerQuery" + }, + "semanticLayerView": { + "type": "string", + "nullable": true + }, + "config": { + "$ref": "#/components/schemas/AllVizChartConfig" + }, + "slug": { + "type": "string" + }, + "description": { + "type": "string", + "nullable": true + }, + "name": { + "type": "string" + }, + "savedSemanticViewerChartUuid": { + "type": "string" + } + }, + "required": [ + "lastViewedAt", + "firstViewedAt", + "views", + "organization", + "project", + "dashboard", + "space", + "lastUpdatedBy", + "lastUpdatedAt", + "createdBy", + "createdAt", + "chartKind", + "semanticLayerQuery", + "semanticLayerView", + "config", + "slug", + "description", + "name", + "savedSemanticViewerChartUuid" + ], + "type": "object" + }, + "ApiSemanticViewerChartGet": { + "properties": { + "results": { + "$ref": "#/components/schemas/SavedSemanticViewerChart" + }, + "status": { + "type": "string", + "enum": ["ok"], + "nullable": false + } + }, + "required": ["results", "status"], + "type": "object" + }, + "SemanticViewerChartUpdateResult": { + "properties": { + "savedSemanticViewerChartVersionUuid": { + "type": "string", + "nullable": true + }, + "savedSemanticViewerChartUuid": { + "type": "string" + } + }, + "required": [ + "savedSemanticViewerChartVersionUuid", + "savedSemanticViewerChartUuid" + ], + "type": "object" + }, + "ApiSemanticViewerChartUpdate": { + "properties": { + "results": { + "$ref": "#/components/schemas/SemanticViewerChartUpdateResult" + }, + "status": { + "type": "string", + "enum": ["ok"], + "nullable": false + } + }, + "required": ["results", "status"], + "type": "object" + }, + "SemanticViewerChartUpdate": { + "properties": { + "versionedData": { + "properties": { + "chartKind": { + "$ref": "#/components/schemas/ChartKind" + }, + "config": { + "$ref": "#/components/schemas/AllVizChartConfig" + }, + "semanticLayerQuery": { + "$ref": "#/components/schemas/SemanticLayerQuery" + }, + "semanticLayerView": { + "type": "string", + "nullable": true + } + }, + "required": [ + "chartKind", + "config", + "semanticLayerQuery", + "semanticLayerView" + ], + "type": "object" + }, + "unversionedData": { + "properties": { + "spaceUuid": { + "type": "string" + }, + "description": { + "type": "string", + "nullable": true + }, + "name": { + "type": "string" + } + }, + "required": ["spaceUuid", "description", "name"], + "type": "object" + } + }, + "type": "object" + }, + "ValidationTarget": { + "enum": ["charts", "dashboards", "tables"], + "type": "string" + }, + "ValidationErrorType": { + "enum": [ + "chart", + "sorting", + "filter", + "metric", + "model", + "dimension", + "custom metric" + ], + "type": "string" + }, + "ValidationSourceType": { + "enum": ["chart", "dashboard", "table"], + "type": "string" + }, + "ValidationResponseBase": { + "properties": { + "source": { + "$ref": "#/components/schemas/ValidationSourceType" + }, + "spaceUuid": { + "type": "string" + }, + "projectUuid": { + "type": "string" + }, + "errorType": { + "$ref": "#/components/schemas/ValidationErrorType" + }, + "error": { + "type": "string" + }, + "name": { + "type": "string" + }, + "createdAt": { + "type": "string", + "format": "date-time" + }, + "validationId": { + "type": "number", + "format": "double" + } + }, + "required": [ + "projectUuid", + "errorType", + "error", + "name", + "createdAt", + "validationId" + ], + "type": "object" + }, + "ValidationErrorChartResponse": { + "allOf": [ + { + "$ref": "#/components/schemas/ValidationResponseBase" + }, + { + "properties": { + "chartName": { + "type": "string" + }, + "chartViews": { + "type": "number", + "format": "double" + }, + "lastUpdatedAt": { + "type": "string", + "format": "date-time" + }, + "lastUpdatedBy": { + "type": "string" + }, + "fieldName": { + "type": "string" + }, + "chartKind": { + "$ref": "#/components/schemas/ChartKind" + }, + "chartUuid": { + "type": "string" + } + }, + "required": ["chartViews"], + "type": "object" + } + ] + }, + "ValidationErrorDashboardResponse": { + "allOf": [ + { + "$ref": "#/components/schemas/ValidationResponseBase" + }, + { + "properties": { + "dashboardViews": { + "type": "number", + "format": "double" + }, + "lastUpdatedAt": { + "type": "string", + "format": "date-time" + }, + "lastUpdatedBy": { + "type": "string" + }, + "fieldName": { + "type": "string" + }, + "chartName": { + "type": "string" + }, + "dashboardUuid": { + "type": "string" + } + }, + "required": ["dashboardViews"], + "type": "object" + } + ] + }, + "Pick_ValidationResponseBase.Exclude_keyofValidationResponseBase.name__": { + "properties": { + "spaceUuid": { + "type": "string" + }, + "projectUuid": { + "type": "string" + }, + "validationId": { + "type": "number", + "format": "double" + }, + "createdAt": { + "type": "string", + "format": "date-time" + }, + "error": { + "type": "string" + }, + "errorType": { + "$ref": "#/components/schemas/ValidationErrorType" + }, + "source": { + "$ref": "#/components/schemas/ValidationSourceType" + } + }, + "required": [ + "projectUuid", + "validationId", + "createdAt", + "error", + "errorType" + ], + "type": "object", + "description": "From T, pick a set of properties whose keys are in the union K" + }, + "Omit_ValidationResponseBase.name_": { + "$ref": "#/components/schemas/Pick_ValidationResponseBase.Exclude_keyofValidationResponseBase.name__", + "description": "Construct a type with the properties of T except for those in type K." + }, + "ValidationErrorTableResponse": { + "allOf": [ + { + "$ref": "#/components/schemas/Omit_ValidationResponseBase.name_" + }, + { + "properties": { + "name": { + "type": "string" + } + }, + "type": "object" + } + ] + }, + "ValidationResponse": { + "anyOf": [ + { + "$ref": "#/components/schemas/ValidationErrorChartResponse" + }, + { + "$ref": "#/components/schemas/ValidationErrorDashboardResponse" + }, + { + "$ref": "#/components/schemas/ValidationErrorTableResponse" + } + ] + }, + "ApiValidateResponse": { + "properties": { + "results": { + "items": { + "$ref": "#/components/schemas/ValidationResponse" + }, + "type": "array" + }, + "status": { + "type": "string", + "enum": ["ok"], + "nullable": false + } + }, + "required": ["results", "status"], + "type": "object" + }, + "ApiValidationDismissResponse": { + "properties": { + "status": { + "type": "string", + "enum": ["ok"], + "nullable": false + } + }, + "required": ["status"], + "type": "object" + } + }, + "securitySchemes": { + "session_cookie": { + "type": "apiKey", + "in": "cookie", + "name": "connect.sid" + }, + "api_key": { + "type": "apiKey", + "in": "header", + "name": "Authorization", + "description": "Value should be 'ApiKey '" + } + } + }, + "info": { + "title": "Lightdash API", + "version": "0.1391.0", + "description": "Open API documentation for all public Lightdash API endpoints. # Authentication Before you get started, you might need to create a Personal Access Token to authenticate via the API. You can create a token by following this guide: https://docs.lightdash.com/references/personal_tokens\n", + "license": { + "name": "MIT" + }, + "contact": { + "name": "Lightdash Support", + "email": "support@lightdash.com", + "url": "https://docs.lightdash.com/help-and-contact/contact/contact_info/" + } + }, + "openapi": "3.0.0", + "paths": { + "/api/v1/projects/{projectUuid}/dataCatalog": { + "get": { + "operationId": "getCatalog", + "responses": { + "200": { + "description": "Success", + "content": { + "application/json": { + "schema": { + "properties": { + "results": { + "$ref": "#/components/schemas/ApiCatalogResults" + }, + "status": { + "type": "string", + "enum": ["ok"], + "nullable": false + } + }, + "required": ["results", "status"], + "type": "object" + } + } + } + }, + "default": { + "description": "Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorPayload" + } + } + } + } + }, + "description": "Get catalog items", + "tags": ["Catalog"], + "security": [], + "parameters": [ + { + "in": "path", + "name": "projectUuid", + "required": true, + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "search", + "required": false, + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "type", + "required": false, + "schema": { + "$ref": "#/components/schemas/CatalogType" + } + }, + { + "in": "query", + "name": "filter", + "required": false, + "schema": { + "$ref": "#/components/schemas/CatalogFilter" + } + } + ] + } + }, + "/api/v1/projects/{projectUuid}/dataCatalog/{table}/metadata": { + "get": { + "operationId": "getMetadata", + "responses": { + "200": { + "description": "Success", + "content": { + "application/json": { + "schema": { + "properties": { + "results": { + "$ref": "#/components/schemas/ApiCatalogMetadataResults" + }, + "status": { + "type": "string", + "enum": ["ok"], + "nullable": false + } + }, + "required": ["results", "status"], + "type": "object" + } + } + } + }, + "default": { + "description": "Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorPayload" + } + } + } + } + }, + "description": "Get catalog metadata for tables", + "tags": ["Catalog"], + "security": [], + "parameters": [ + { + "in": "path", + "name": "projectUuid", + "required": true, + "schema": { + "type": "string" + } + }, + { + "description": "Table name to get metadata for", + "in": "path", + "name": "table", + "required": true, + "schema": { + "type": "string" + } + } + ] + } + }, + "/api/v1/projects/{projectUuid}/dataCatalog/{table}/analytics": { + "get": { + "operationId": "getAnalytics", + "responses": { + "200": { + "description": "Success", + "content": { + "application/json": { + "schema": { + "properties": { + "results": { + "$ref": "#/components/schemas/ApiCatalogAnalyticsResults" + }, + "status": { + "type": "string", + "enum": ["ok"], + "nullable": false + } + }, + "required": ["results", "status"], + "type": "object" + } + } + } + }, + "default": { + "description": "Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorPayload" + } + } + } + } + }, + "description": "Get catalog analytics for tables", + "tags": ["Catalog"], + "security": [], + "parameters": [ + { + "in": "path", + "name": "projectUuid", + "required": true, + "schema": { + "type": "string" + } + }, + { + "description": "Table name to get analytics for", + "in": "path", + "name": "table", + "required": true, + "schema": { + "type": "string" + } + } + ] + } + }, + "/api/v1/projects/{projectUuid}/dataCatalog/{table}/analytics/{field}": { + "get": { + "operationId": "getAnalyticsField", + "responses": { + "200": { + "description": "Success", + "content": { + "application/json": { + "schema": { + "properties": { + "results": { + "$ref": "#/components/schemas/ApiCatalogAnalyticsResults" + }, + "status": { + "type": "string", + "enum": ["ok"], + "nullable": false + } + }, + "required": ["results", "status"], + "type": "object" + } + } + } + }, + "default": { + "description": "Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorPayload" + } + } + } + } + }, + "description": "Get catalog analytics for fields", + "tags": ["Catalog"], + "security": [], + "parameters": [ + { + "in": "path", + "name": "projectUuid", + "required": true, + "schema": { + "type": "string" + } + }, + { + "description": "Table where this field belongs", + "in": "path", + "name": "table", + "required": true, + "schema": { + "type": "string" + } + }, + { + "description": "Field name to get analytics for", + "in": "path", + "name": "field", + "required": true, + "schema": { + "type": "string" + } + } + ] + } + }, + "/api/v1/projects/{projectUuid}/dataCatalog/metrics": { + "get": { + "operationId": "getMetricsCatalog", + "responses": { + "200": { + "description": "Success", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiMetricsCatalog" + } + } + } + }, + "default": { + "description": "Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorPayload" + } + } + } + } + }, + "description": "Get metrics catalog", + "tags": ["Catalog"], + "security": [], + "parameters": [ + { + "in": "path", + "name": "projectUuid", + "required": true, + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "search", + "required": false, + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "page", + "required": false, + "schema": { + "format": "double", + "type": "number" + } + }, + { + "in": "query", + "name": "pageSize", + "required": false, + "schema": { + "format": "double", + "type": "number" + } + }, + { + "in": "query", + "name": "sort", + "required": false, + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "order", + "required": false, + "schema": { + "$ref": "#/components/schemas/ApiSortDirection" + } + }, + { + "in": "query", + "name": "categories", + "required": false, + "schema": { + "type": "array", + "items": { + "type": "string" + } + } + } + ] + } + }, + "/api/v1/projects/{projectUuid}/dataCatalog/metrics/{tableName}/{metricName}": { + "get": { + "operationId": "getMetric", + "responses": { + "200": { + "description": "Success", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiGetMetricPeek" + } + } + } + }, + "default": { + "description": "Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorPayload" + } + } + } + } + }, + "description": "Get metric by table and metric name", + "tags": ["Catalog"], + "security": [], + "parameters": [ + { + "in": "path", + "name": "projectUuid", + "required": true, + "schema": { + "type": "string" + } + }, + { + "in": "path", + "name": "tableName", + "required": true, + "schema": { + "type": "string" + } + }, + { + "in": "path", + "name": "metricName", + "required": true, + "schema": { + "type": "string" + } + } + ] + } + }, + "/api/v1/projects/{projectUuid}/dataCatalog/{catalogSearchUuid}/categories": { + "post": { + "operationId": "addCategoryToCatalogItem", + "responses": { + "200": { + "description": "Success", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiSuccessEmpty" + } + } + } + }, + "default": { + "description": "Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorPayload" + } + } + } + } + }, + "tags": ["Catalog"], + "security": [], + "parameters": [ + { + "in": "path", + "name": "catalogSearchUuid", + "required": true, + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "properties": { + "tagUuid": { + "type": "string" + } + }, + "required": ["tagUuid"], + "type": "object" + } + } + } + } + } + }, + "/api/v1/projects/{projectUuid}/dataCatalog/{catalogSearchUuid}/categories/{tagUuid}": { + "delete": { + "operationId": "removeCategoryFromCatalogItem", + "responses": { + "200": { + "description": "Success", + "content": { + "application/json": { + "schema": { + "properties": { + "results": {}, + "status": { + "type": "string" + } + }, + "required": ["results", "status"], + "type": "object" + } + } + } + }, + "default": { + "description": "Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorPayload" + } + } + } + } + }, + "tags": ["Catalog"], + "security": [], + "parameters": [ + { + "in": "path", + "name": "catalogSearchUuid", + "required": true, + "schema": { + "type": "string" + } + }, + { + "in": "path", + "name": "tagUuid", + "required": true, + "schema": { + "type": "string" + } + } + ] + } + }, + "/api/v1/projects/{projectUuid}/dataCatalog/{catalogSearchUuid}/icon": { + "patch": { + "operationId": "updateCatalogItemIcon", + "responses": { + "200": { + "description": "Success", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiSuccessEmpty" + } + } + } + }, + "default": { + "description": "Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorPayload" + } + } + } + } + }, + "tags": ["Catalog"], + "security": [], + "parameters": [ + { + "in": "path", + "name": "projectUuid", + "required": true, + "schema": { + "type": "string" + } + }, + { + "in": "path", + "name": "catalogSearchUuid", + "required": true, + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "properties": { + "icon": { + "allOf": [ + { + "$ref": "#/components/schemas/CatalogItemIcon" + } + ], + "nullable": true + } + }, + "required": ["icon"], + "type": "object" + } + } + } + } + } + }, + "/api/v1/comments/dashboards/{dashboardUuid}/{dashboardTileUuid}": { + "post": { + "operationId": "createComment", + "responses": { + "200": { + "description": "Success", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiCreateComment" + } + } + } + }, + "default": { + "description": "Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorPayload" + } + } + } + } + }, + "description": "Creates a comment on a dashboard tile", + "tags": ["Comments"], + "security": [], + "parameters": [ + { + "description": "the uuid of the dashboard", + "in": "path", + "name": "dashboardUuid", + "required": true, + "schema": { + "type": "string" + } + }, + { + "description": "the uuid of the dashboard tile", + "in": "path", + "name": "dashboardTileUuid", + "required": true, + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "description": "the comment to create", + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Pick_Comment.text-or-replyTo-or-mentions-or-textHtml_", + "description": "the comment to create" + } + } + } + } + } + }, + "/api/v1/comments/dashboards/{dashboardUuid}": { + "get": { + "operationId": "getComments", + "responses": { + "200": { + "description": "Success", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiGetComments" + } + } + } + }, + "default": { + "description": "Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorPayload" + } + } + } + } + }, + "description": "Gets all comments for a dashboard", + "tags": ["Comments"], + "security": [], + "parameters": [ + { + "description": "the uuid of the dashboard", + "in": "path", + "name": "dashboardUuid", + "required": true, + "schema": { + "type": "string" + } + } + ] + } + }, + "/api/v1/comments/dashboards/{dashboardUuid}/{commentId}": { + "patch": { + "operationId": "resolveComment", + "responses": { + "200": { + "description": "Success", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiResolveComment" + } + } + } + }, + "default": { + "description": "Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorPayload" + } + } + } + } + }, + "description": "Resolves a comment on a dashboard", + "tags": ["Comments"], + "security": [], + "parameters": [ + { + "description": "the uuid of the dashboard", + "in": "path", + "name": "dashboardUuid", + "required": true, + "schema": { + "type": "string" + } + }, + { + "description": "the uuid of the comment", + "in": "path", + "name": "commentId", + "required": true, + "schema": { + "type": "string" + } + } + ] + }, + "delete": { + "operationId": "deleteComment", + "responses": { + "200": { + "description": "Success", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiResolveComment" + } + } + } + }, + "default": { + "description": "Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorPayload" + } + } + } + } + }, + "description": "Deletes a comment on a dashboard", + "tags": ["Comments"], + "security": [], + "parameters": [ + { + "description": "the uuid of the dashboard", + "in": "path", + "name": "dashboardUuid", + "required": true, + "schema": { + "type": "string" + } + }, + { + "description": "the uuid of the comment", + "in": "path", + "name": "commentId", + "required": true, + "schema": { + "type": "string" + } + } + ] + } + }, + "/api/v1/csv/{jobId}": { + "get": { + "operationId": "getCsvUrl", + "responses": { + "200": { + "description": "Success", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiCsvUrlResponse" + } + } + } + }, + "default": { + "description": "Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorPayload" + } + } + } + } + }, + "description": "Get a Csv", + "tags": ["Exports"], + "security": [], + "parameters": [ + { + "description": "the jobId for the CSV", + "in": "path", + "name": "jobId", + "required": true, + "schema": { + "type": "string" + } + } + ] + } + }, + "/api/v1/dashboards/{dashboardUuid}/promote": { + "post": { + "operationId": "promoteDashboard", + "responses": { + "200": { + "description": "Success", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiPromoteDashboardResponse" + } + } + } + }, + "default": { + "description": "Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorPayload" + } + } + } + } + }, + "description": "Promote dashboard to its upstream project", + "tags": ["Dashboards"], + "security": [], + "parameters": [ + { + "description": "dashboardUuid for the dashboard to run", + "in": "path", + "name": "dashboardUuid", + "required": true, + "schema": { + "type": "string" + } + } + ] + } + }, + "/api/v1/dashboards/{dashboardUuid}/promoteDiff": { + "get": { + "operationId": "promoteDashboardDiff", + "responses": { + "200": { + "description": "Success", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiPromotionChangesResponse" + } + } + } + }, + "default": { + "description": "Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorPayload" + } + } + } + } + }, + "description": "Get diff from dashboard to promote", + "tags": ["Dashboards"], + "security": [], + "parameters": [ + { + "description": "dashboardUuid for the dashboard to check diff", + "in": "path", + "name": "dashboardUuid", + "required": true, + "schema": { + "type": "string" + } + } + ] + } + }, + "/api/v1/projects/{projectUuid}/explores": { + "put": { + "operationId": "SetExplores", + "responses": { + "200": { + "description": "Success", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiSuccessEmpty" + } + } + } + }, + "default": { + "description": "Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorPayload" + } + } + } + } + }, + "tags": ["Projects"], + "security": [], + "parameters": [ + { + "in": "path", + "name": "projectUuid", + "required": true, + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "items": {}, + "type": "array" + } + } + } + } + }, + "get": { + "operationId": "GetExplores", + "responses": { + "200": { + "description": "Success", + "content": { + "application/json": { + "schema": { + "properties": { + "results": { + "$ref": "#/components/schemas/ApiExploresResults" + }, + "status": { + "type": "string", + "enum": ["ok"], + "nullable": false + } + }, + "required": ["results", "status"], + "type": "object" + } + } + } + }, + "default": { + "description": "Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorPayload" + } + } + } + } + }, + "tags": ["Projects"], + "security": [], + "parameters": [ + { + "in": "path", + "name": "projectUuid", + "required": true, + "schema": { + "type": "string" + } + } + ] + } + }, + "/api/v1/projects/{projectUuid}/explores/{exploreId}": { + "get": { + "operationId": "GetExplore", + "responses": { + "200": { + "description": "Success", + "content": { + "application/json": { + "schema": { + "properties": { + "results": { + "$ref": "#/components/schemas/ApiExploreResults" + }, + "status": { + "type": "string", + "enum": ["ok"], + "nullable": false + } + }, + "required": ["results", "status"], + "type": "object" + } + } + } + }, + "default": { + "description": "Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorPayload" + } + } + } + } + }, + "tags": ["Projects"], + "security": [], + "parameters": [ + { + "in": "path", + "name": "exploreId", + "required": true, + "schema": { + "type": "string" + } + }, + { + "in": "path", + "name": "projectUuid", + "required": true, + "schema": { + "type": "string" + } + } + ] + } + }, + "/api/v1/projects/{projectUuid}/explores/{exploreId}/compileQuery": { + "post": { + "operationId": "CompileQuery", + "responses": { + "200": { + "description": "Success", + "content": { + "application/json": { + "schema": { + "properties": { + "results": { + "$ref": "#/components/schemas/ApiCompiledQueryResults" + }, + "status": { + "type": "string", + "enum": ["ok"], + "nullable": false + } + }, + "required": ["results", "status"], + "type": "object" + } + } + } + }, + "default": { + "description": "Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorPayload" + } + } + } + } + }, + "tags": ["Projects"], + "security": [], + "parameters": [ + { + "in": "path", + "name": "exploreId", + "required": true, + "schema": { + "type": "string" + } + }, + { + "in": "path", + "name": "projectUuid", + "required": true, + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/MetricQuery" + } + } + } + } + } + }, + "/api/v1/projects/{projectUuid}/explores/{exploreId}/downloadCsv": { + "post": { + "operationId": "DownloadCsvFromExplore", + "responses": { + "200": { + "description": "Success", + "content": { + "application/json": { + "schema": { + "properties": { + "results": { + "properties": { + "jobId": { + "type": "string" + } + }, + "required": ["jobId"], + "type": "object" + }, + "status": { + "type": "string", + "enum": ["ok"], + "nullable": false + } + }, + "required": ["results", "status"], + "type": "object" + } + } + } + }, + "default": { + "description": "Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorPayload" + } + } + } + } + }, + "tags": ["Projects"], + "security": [], + "parameters": [ + { + "in": "path", + "name": "exploreId", + "required": true, + "schema": { + "type": "string" + } + }, + { + "in": "path", + "name": "projectUuid", + "required": true, + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/MetricQuery" + }, + { + "properties": { + "pivotColumns": { + "items": { + "type": "string" + }, + "type": "array" + }, + "chartName": { + "type": "string" + }, + "hiddenFields": { + "items": { + "type": "string" + }, + "type": "array" + }, + "columnOrder": { + "items": { + "type": "string" + }, + "type": "array" + }, + "customLabels": { + "properties": {}, + "additionalProperties": { + "type": "string" + }, + "type": "object" + }, + "showTableNames": { + "type": "boolean" + }, + "csvLimit": { + "type": "number", + "format": "double", + "nullable": true + }, + "onlyRaw": { + "type": "boolean" + } + }, + "required": [ + "columnOrder", + "showTableNames", + "onlyRaw" + ], + "type": "object" + } + ] + } + } + } + } + } + }, + "/api/v1/github/install": { + "get": { + "operationId": "installGithubAppForOrganization", + "responses": { + "302": { + "description": "Not found" + } + }, + "description": "Install the Lightdash GitHub App and link to an organization", + "security": [], + "parameters": [] + } + }, + "/api/v1/github/oauth/callback": { + "get": { + "operationId": "githubOauthCallback", + "responses": { + "204": { + "description": "No content" + } + }, + "description": "Callback URL for GitHub App Authorization also used for GitHub App Installation with combined Authorization", + "security": [], + "parameters": [ + { + "description": "authorization code from GitHub", + "in": "query", + "name": "code", + "required": false, + "schema": { + "type": "string" + } + }, + { + "description": "oauth state parameter", + "in": "query", + "name": "state", + "required": false, + "schema": { + "type": "string" + } + }, + { + "description": "installation id from GitHub", + "in": "query", + "name": "installation_id", + "required": false, + "schema": { + "type": "string" + } + }, + { + "description": "setup action from GitHub", + "in": "query", + "name": "setup_action", + "required": false, + "schema": { + "type": "string" + } + } + ] + } + }, + "/api/v1/github/uninstall": { + "delete": { + "operationId": "uninstallGithubAppForOrganization", + "responses": { + "200": { + "description": "Ok", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiSuccessEmpty" + } + } + } + } + }, + "security": [], + "parameters": [] + } + }, + "/api/v1/github/repos/list": { + "get": { + "operationId": "getGithubListRepositories", + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "properties": { + "results": { + "items": { + "$ref": "#/components/schemas/GitRepo" + }, + "type": "array" + }, + "status": { + "type": "string", + "enum": ["ok"], + "nullable": false + } + }, + "required": ["results", "status"], + "type": "object" + } + } + } + } + }, + "security": [], + "parameters": [] + } + }, + "/api/v1/projects/{projectUuid}/git-integration": { + "get": { + "operationId": "GetConfiguration", + "responses": { + "200": { + "description": "Success", + "content": { + "application/json": { + "schema": { + "properties": { + "results": { + "$ref": "#/components/schemas/GitIntegrationConfiguration" + }, + "status": { + "type": "string", + "enum": ["ok"], + "nullable": false + } + }, + "required": ["results", "status"], + "type": "object" + } + } + } + }, + "default": { + "description": "Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorPayload" + } + } + } + } + }, + "tags": ["Git Integration"], + "security": [], + "parameters": [ + { + "in": "path", + "name": "projectUuid", + "required": true, + "schema": { + "type": "string" + } + } + ] + } + }, + "/api/v1/projects/{projectUuid}/git-integration/pull-requests/chart/{chartUuid}/fields": { + "get": { + "operationId": "CreatePullRequestForChartFields", + "responses": { + "200": { + "description": "Success", + "content": { + "application/json": { + "schema": { + "properties": { + "results": { + "$ref": "#/components/schemas/PullRequestCreated" + }, + "status": { + "type": "string", + "enum": ["ok"], + "nullable": false + } + }, + "required": ["results", "status"], + "type": "object" + } + } + } + }, + "default": { + "description": "Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorPayload" + } + } + } + } + }, + "tags": ["Git Integration"], + "security": [], + "parameters": [ + { + "in": "path", + "name": "projectUuid", + "required": true, + "schema": { + "type": "string" + } + }, + { + "in": "path", + "name": "chartUuid", + "required": true, + "schema": { + "type": "string" + } + } + ] + } + }, + "/api/v1/projects/{projectUuid}/git-integration/pull-requests/custom-metrics": { + "post": { + "operationId": "CreatePullRequestForCustomMetrics", + "responses": { + "200": { + "description": "Success", + "content": { + "application/json": { + "schema": { + "properties": { + "results": { + "$ref": "#/components/schemas/PullRequestCreated" + }, + "status": { + "type": "string", + "enum": ["ok"], + "nullable": false + } + }, + "required": ["results", "status"], + "type": "object" + } + } + } + }, + "default": { + "description": "Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorPayload" + } + } + } + } + }, + "tags": ["Git Integration"], + "security": [], + "parameters": [ + { + "in": "path", + "name": "projectUuid", + "required": true, + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "properties": { + "quoteChar": { + "type": "string", + "enum": ["\"", "'"] + }, + "customMetrics": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "required": ["quoteChar", "customMetrics"], + "type": "object" + } + } + } + } + } + }, + "/api/v1/gdrive/get-access-token": { + "get": { + "operationId": "getAccessToken", + "responses": { + "200": { + "description": "Success", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiGdriveAccessTokenResponse" + } + } + } + }, + "default": { + "description": "Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorPayload" + } + } + } + } + }, + "description": "Get access token for google drive", + "tags": ["Integrations"], + "security": [], + "parameters": [] + } + }, + "/api/v1/gdrive/upload-gsheet": { + "post": { + "operationId": "uploadGsheet", + "responses": { + "200": { + "description": "Success", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiJobScheduledResponse" + } + } + } + }, + "default": { + "description": "Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorPayload" + } + } + } + } + }, + "description": "Upload results from query to Google Sheet", + "tags": ["Integrations"], + "security": [], + "parameters": [], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UploadMetricGsheet" + } + } + } + } + } + }, + "/api/v1/groups/{groupUuid}": { + "get": { + "operationId": "getGroup", + "responses": { + "200": { + "description": "Ok", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiGroupResponse" + } + } + } + }, + "default": { + "description": "Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorPayload" + } + } + } + } + }, + "description": "Get group details", + "tags": ["User Groups"], + "security": [], + "parameters": [ + { + "description": "unique id of the group", + "in": "path", + "name": "groupUuid", + "required": true, + "schema": { + "type": "string" + } + }, + { + "description": "number of members to include", + "in": "query", + "name": "includeMembers", + "required": false, + "schema": { + "format": "double", + "type": "number" + } + }, + { + "description": "offset of members to include", + "in": "query", + "name": "offset", + "required": false, + "schema": { + "format": "double", + "type": "number" + } + } + ] + }, + "delete": { + "operationId": "deleteGroup", + "responses": { + "200": { + "description": "Ok", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiSuccessEmpty" + } + } + } + }, + "default": { + "description": "Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorPayload" + } + } + } + } + }, + "description": "Delete a group", + "tags": ["User Groups"], + "security": [], + "parameters": [ + { + "in": "path", + "name": "groupUuid", + "required": true, + "schema": { + "type": "string" + } + } + ] + }, + "patch": { + "operationId": "updateGroup", + "responses": { + "200": { + "description": "Ok", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiGroupResponse" + } + } + } + }, + "default": { + "description": "Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorPayload" + } + } + } + } + }, + "description": "Update a group", + "tags": ["User Groups"], + "security": [], + "parameters": [ + { + "in": "path", + "name": "groupUuid", + "required": true, + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpdateGroupWithMembers" + } + } + } + } + } + }, + "/api/v1/groups/{groupUuid}/members/{userUuid}": { + "put": { + "operationId": "addUserToGroup", + "responses": { + "200": { + "description": "Ok", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiSuccessEmpty" + } + } + } + }, + "default": { + "description": "Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorPayload" + } + } + } + } + }, + "description": "Add a Lightdash user to a group", + "tags": ["User Groups"], + "security": [], + "parameters": [ + { + "description": "the UUID for the group to add the user to", + "in": "path", + "name": "groupUuid", + "required": true, + "schema": { + "type": "string" + } + }, + { + "description": "the UUID for the user to add to the group", + "in": "path", + "name": "userUuid", + "required": true, + "schema": { + "type": "string" + } + } + ] + }, + "delete": { + "operationId": "removeUserFromGroup", + "responses": { + "200": { + "description": "Ok", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiSuccessEmpty" + } + } + } + }, + "default": { + "description": "Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorPayload" + } + } + } + } + }, + "description": "Remove a user from a group", + "tags": ["User Groups"], + "security": [], + "parameters": [ + { + "description": "the UUID for the group to remove the user from", + "in": "path", + "name": "groupUuid", + "required": true, + "schema": { + "type": "string" + } + }, + { + "description": "the UUID for the user to remove from the group", + "in": "path", + "name": "userUuid", + "required": true, + "schema": { + "type": "string" + } + } + ] + } + }, + "/api/v1/groups/{groupUuid}/members": { + "get": { + "operationId": "getGroupMembers", + "responses": { + "200": { + "description": "Ok", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiGroupMembersResponse" + } + } + } + }, + "default": { + "description": "Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorPayload" + } + } + } + } + }, + "description": "View members of a group", + "tags": ["User Groups"], + "security": [], + "parameters": [ + { + "description": "the UUID for the group to view the members of", + "in": "path", + "name": "groupUuid", + "required": true, + "schema": { + "type": "string" + } + } + ] + } + }, + "/api/v1/groups/{groupUuid}/projects/{projectUuid}": { + "post": { + "operationId": "addProjectAccessToGroup", + "responses": { + "200": { + "description": "Ok", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiCreateProjectGroupAccess" + } + } + } + }, + "default": { + "description": "Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorPayload" + } + } + } + } + }, + "description": "Add project access to a group", + "tags": ["User Groups"], + "security": [], + "parameters": [ + { + "in": "path", + "name": "groupUuid", + "required": true, + "schema": { + "type": "string" + } + }, + { + "in": "path", + "name": "projectUuid", + "required": true, + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Pick_CreateDBProjectGroupAccess.role_" + } + } + } + } + }, + "patch": { + "operationId": "updateProjectAccessForGroup", + "responses": { + "200": { + "description": "Ok", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiUpdateProjectGroupAccess" + } + } + } + }, + "default": { + "description": "Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorPayload" + } + } + } + } + }, + "description": "Update project access for a group", + "tags": ["User Groups"], + "security": [], + "parameters": [ + { + "in": "path", + "name": "groupUuid", + "required": true, + "schema": { + "type": "string" + } + }, + { + "in": "path", + "name": "projectUuid", + "required": true, + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpdateDBProjectGroupAccess" + } + } + } + } + }, + "delete": { + "operationId": "removeProjectAccessFromGroup", + "responses": { + "200": { + "description": "Ok", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiSuccessEmpty" + } + } + } + }, + "default": { + "description": "Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorPayload" + } + } + } + } + }, + "description": "Remove project access from a group", + "tags": ["User Groups"], + "security": [], + "parameters": [ + { + "in": "path", + "name": "groupUuid", + "required": true, + "schema": { + "type": "string" + } + }, + { + "in": "path", + "name": "projectUuid", + "required": true, + "schema": { + "type": "string" + } + } + ] + } + }, + "/api/v1/projects/{projectUuid}/metricsExplorer/{explore}/{metric}/runMetricExplorerQuery": { + "post": { + "operationId": "runMetricExplorerQuery", + "responses": { + "200": { + "description": "Success", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiMetricsExplorerQueryResults" + } + } + } + }, + "default": { + "description": "Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorPayload" + } + } + } + } + }, + "description": "Run a metrics explorer query", + "tags": ["Metrics Explorer", "Metrics", "Explorer"], + "security": [], + "parameters": [ + { + "description": "The project UUID", + "in": "path", + "name": "projectUuid", + "required": true, + "schema": { + "type": "string" + } + }, + { + "description": "The explore name", + "in": "path", + "name": "explore", + "required": true, + "schema": { + "type": "string" + } + }, + { + "description": "The metric name", + "in": "path", + "name": "metric", + "required": true, + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "compareToPreviousPeriod", + "required": false, + "schema": { + "type": "boolean" + } + }, + { + "in": "query", + "name": "compareToMetric", + "required": false, + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "startDate", + "required": false, + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "endDate", + "required": false, + "schema": { + "type": "string" + } + } + ] + } + }, + "/api/v1/notifications": { + "get": { + "operationId": "getNotifications", + "responses": { + "200": { + "description": "Success", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiGetNotifications" + } + } + } + }, + "default": { + "description": "Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorPayload" + } + } + } + } + }, + "description": "Gets notifications for a user based on the type", + "tags": ["Notifications"], + "security": [], + "parameters": [ + { + "in": "query", + "name": "type", + "required": true, + "schema": { + "$ref": "#/components/schemas/ApiNotificationResourceType" + } + } + ] + } + }, + "/api/v1/notifications/{notificationId}": { + "patch": { + "operationId": "updateNotification", + "responses": { + "200": { + "description": "Success", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiSuccessEmpty" + } + } + } + }, + "default": { + "description": "Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorPayload" + } + } + } + } + }, + "description": "Update notification", + "tags": ["Notifications"], + "security": [], + "parameters": [ + { + "description": "the id of the notification", + "in": "path", + "name": "notificationId", + "required": true, + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiNotificationUpdateParams" + } + } + } + } + } + }, + "/api/v1/org": { + "get": { + "operationId": "GetMyOrganization", + "responses": { + "200": { + "description": "Ok", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiOrganization" + } + } + } + }, + "default": { + "description": "Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorPayload" + } + } + } + } + }, + "description": "Get the current user's organization", + "tags": ["Organizations"], + "security": [], + "parameters": [] + }, + "put": { + "operationId": "CreateOrganization", + "responses": { + "200": { + "description": "Ok", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiSuccessEmpty" + } + } + } + }, + "default": { + "description": "Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorPayload" + } + } + } + } + }, + "description": "Creates a new organization, the current user becomes the Admin of the new organization.\nThis is only available to users that are not already in an organization.", + "tags": ["Organizations"], + "security": [], + "parameters": [], + "requestBody": { + "description": "the new organization settings", + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CreateOrganization", + "description": "the new organization settings" + } + } + } + } + }, + "patch": { + "operationId": "UpdateMyOrganization", + "responses": { + "200": { + "description": "Ok", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiSuccessEmpty" + } + } + } + }, + "default": { + "description": "Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorPayload" + } + } + } + } + }, + "description": "Update the current user's organization", + "tags": ["Organizations"], + "security": [], + "parameters": [], + "requestBody": { + "description": "the new organization settings", + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpdateOrganization", + "description": "the new organization settings" + } + } + } + } + } + }, + "/api/v1/org/{organizationUuid}": { + "delete": { + "operationId": "DeleteMyOrganization", + "responses": { + "200": { + "description": "Ok", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiSuccessEmpty" + } + } + } + }, + "default": { + "description": "Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorPayload" + } + } + } + } + }, + "description": "Deletes an organization and all users inside that organization", + "tags": ["Organizations"], + "security": [], + "parameters": [ + { + "description": "the uuid of the organization to delete", + "in": "path", + "name": "organizationUuid", + "required": true, + "schema": { + "type": "string" + } + } + ] + } + }, + "/api/v1/org/projects": { + "get": { + "operationId": "ListOrganizationProjects", + "responses": { + "200": { + "description": "Ok", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiOrganizationProjects" + } + } + } + }, + "default": { + "description": "Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorPayload" + } + } + } + } + }, + "description": "Gets all projects of the current user's organization", + "tags": ["Organizations"], + "security": [], + "parameters": [] + } + }, + "/api/v1/org/users": { + "get": { + "operationId": "ListOrganizationMembers", + "responses": { + "200": { + "description": "Ok", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiOrganizationMemberProfiles" + } + } + } + }, + "default": { + "description": "Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorPayload" + } + } + } + } + }, + "description": "Gets all the members of the current user's organization", + "tags": ["Organizations"], + "security": [], + "parameters": [ + { + "in": "query", + "name": "includeGroups", + "required": false, + "schema": { + "format": "double", + "type": "number" + } + }, + { + "in": "query", + "name": "pageSize", + "required": false, + "schema": { + "format": "double", + "type": "number" + } + }, + { + "in": "query", + "name": "page", + "required": false, + "schema": { + "format": "double", + "type": "number" + } + }, + { + "in": "query", + "name": "searchQuery", + "required": false, + "schema": { + "type": "string" + } + }, + { + "description": "filter users who can view this project", + "in": "query", + "name": "projectUuid", + "required": false, + "schema": { + "type": "string" + } + } + ] + } + }, + "/api/v1/org/users/{userUuid}": { + "get": { + "operationId": "GetOrganizationMemberByUuid", + "responses": { + "200": { + "description": "Ok", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiOrganizationMemberProfile" + } + } + } + }, + "default": { + "description": "Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorPayload" + } + } + } + } + }, + "description": "Get the member profile for a user in the current user's organization by uuid", + "tags": ["Organizations"], + "security": [], + "parameters": [ + { + "description": "the uuid of the user", + "in": "path", + "name": "userUuid", + "required": true, + "schema": { + "$ref": "#/components/schemas/UUID" + } + } + ] + }, + "patch": { + "operationId": "UpdateOrganizationMember", + "responses": { + "200": { + "description": "Ok", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiOrganizationMemberProfile" + } + } + } + }, + "default": { + "description": "Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorPayload" + } + } + } + } + }, + "description": "Updates the membership profile for a user in the current user's organization", + "tags": ["Roles & Permissions", "Organizations"], + "security": [], + "parameters": [ + { + "description": "the uuid of the user to update", + "in": "path", + "name": "userUuid", + "required": true, + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "description": "the new membership profile", + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/OrganizationMemberProfileUpdate", + "description": "the new membership profile" + } + } + } + } + } + }, + "/api/v1/org/user/{userUuid}": { + "delete": { + "operationId": "DeleteOrganizationMember", + "responses": { + "200": { + "description": "Ok", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiSuccessEmpty" + } + } + } + }, + "default": { + "description": "Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorPayload" + } + } + } + } + }, + "description": "Deletes a user from the current user's organization", + "tags": ["Organizations"], + "security": [], + "parameters": [ + { + "description": "the uuid of the user to delete", + "in": "path", + "name": "userUuid", + "required": true, + "schema": { + "type": "string" + } + } + ] + } + }, + "/api/v1/org/allowedEmailDomains": { + "get": { + "operationId": "ListOrganizationEmailDomains", + "responses": { + "200": { + "description": "Ok", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiOrganizationAllowedEmailDomains" + } + } + } + }, + "default": { + "description": "Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorPayload" + } + } + } + } + }, + "description": "Gets the allowed email domains for the current user's organization", + "tags": ["Organizations"], + "security": [], + "parameters": [] + }, + "patch": { + "operationId": "UpdateOrganizationEmailDomains", + "responses": { + "200": { + "description": "Ok", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiOrganizationAllowedEmailDomains" + } + } + } + }, + "default": { + "description": "Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorPayload" + } + } + } + } + }, + "description": "Updates the allowed email domains for the current user's organization", + "tags": ["Organizations"], + "security": [], + "parameters": [], + "requestBody": { + "description": "the new allowed email domains", + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpdateAllowedEmailDomains", + "description": "the new allowed email domains" + } + } + } + } + } + }, + "/api/v1/org/groups": { + "post": { + "operationId": "CreateGroupInOrganization", + "responses": { + "200": { + "description": "Ok", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiCreateGroupResponse" + } + } + } + }, + "default": { + "description": "Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorPayload" + } + } + } + } + }, + "description": "Creates a new group in the current user's organization", + "tags": ["Organizations"], + "security": [], + "parameters": [], + "requestBody": { + "description": "the new group details", + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CreateGroup", + "description": "the new group details" + } + } + } + } + }, + "get": { + "operationId": "ListGroupsInOrganization", + "responses": { + "200": { + "description": "Ok", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiGroupListResponse" + } + } + } + }, + "default": { + "description": "Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorPayload" + } + } + } + } + }, + "description": "Gets all the groups in the current user's organization", + "tags": ["Organizations"], + "security": [], + "parameters": [ + { + "in": "query", + "name": "page", + "required": false, + "schema": { + "format": "double", + "type": "number" + } + }, + { + "in": "query", + "name": "pageSize", + "required": false, + "schema": { + "format": "double", + "type": "number" + } + }, + { + "description": "number of members to include", + "in": "query", + "name": "includeMembers", + "required": false, + "schema": { + "format": "double", + "type": "number" + } + }, + { + "in": "query", + "name": "searchQuery", + "required": false, + "schema": { + "type": "string" + } + } + ] + } + }, + "/api/v1/projects/{projectUuid}/pinned-lists/{pinnedListUuid}/items": { + "get": { + "operationId": "getPinnedItems", + "responses": { + "200": { + "description": "Success", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiPinnedItems" + } + } + } + }, + "default": { + "description": "Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorPayload" + } + } + } + } + }, + "description": "Get pinned items", + "tags": ["Content"], + "security": [], + "parameters": [ + { + "description": "project uuid", + "in": "path", + "name": "projectUuid", + "required": true, + "schema": { + "type": "string" + } + }, + { + "description": "the list uuid for the pinned items", + "in": "path", + "name": "pinnedListUuid", + "required": true, + "schema": { + "type": "string" + } + } + ] + } + }, + "/api/v1/projects/{projectUuid}/pinned-lists/{pinnedListUuid}/items/order": { + "patch": { + "operationId": "updatePinnedItemsOrder", + "responses": { + "200": { + "description": "Success", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiPinnedItems" + } + } + } + }, + "default": { + "description": "Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorPayload" + } + } + } + } + }, + "description": "Update pinned items order", + "tags": ["Content"], + "security": [], + "parameters": [ + { + "description": "project uuid", + "in": "path", + "name": "projectUuid", + "required": true, + "schema": { + "type": "string" + } + }, + { + "description": "the list uuid for the pinned items", + "in": "path", + "name": "pinnedListUuid", + "required": true, + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "description": "the new order of the pinned items", + "required": true, + "content": { + "application/json": { + "schema": { + "items": { + "$ref": "#/components/schemas/UpdatePinnedItemOrder" + }, + "type": "array", + "description": "the new order of the pinned items" + } + } + } + } + } + }, + "/api/v1/projects/{projectUuid}": { + "get": { + "operationId": "GetProject", + "responses": { + "200": { + "description": "Success", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiProjectResponse" + } + } + } + }, + "default": { + "description": "Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorPayload" + } + } + } + } + }, + "description": "Get a project of an organiztion", + "tags": ["Projects"], + "security": [], + "parameters": [ + { + "in": "path", + "name": "projectUuid", + "required": true, + "schema": { + "type": "string" + } + } + ] + } + }, + "/api/v1/projects/{projectUuid}/charts": { + "get": { + "operationId": "ListChartsInProject", + "responses": { + "200": { + "description": "Success", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiChartListResponse" + } + } + } + }, + "default": { + "description": "Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorPayload" + } + } + } + } + }, + "description": "List all charts in a project", + "tags": ["Projects"], + "security": [], + "parameters": [ + { + "description": "The uuid of the project to get charts for", + "in": "path", + "name": "projectUuid", + "required": true, + "schema": { + "type": "string" + } + } + ] + } + }, + "/api/v1/projects/{projectUuid}/chart-summaries": { + "get": { + "operationId": "ListChartSummariesInProject", + "responses": { + "200": { + "description": "Success", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiChartSummaryListResponse" + } + } + } + }, + "default": { + "description": "Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorPayload" + } + } + } + } + }, + "description": "List all charts summaries in a project", + "tags": ["Projects"], + "security": [], + "parameters": [ + { + "description": "The uuid of the project to get charts for", + "in": "path", + "name": "projectUuid", + "required": true, + "schema": { + "type": "string" + } + }, + { + "description": "Whether to exclude charts that are saved in dashboards", + "in": "query", + "name": "excludeChartsSavedInDashboard", + "required": false, + "schema": { + "type": "boolean" + } + } + ] + } + }, + "/api/v1/projects/{projectUuid}/spaces": { + "get": { + "operationId": "ListSpacesInProject", + "responses": { + "200": { + "description": "Success", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiSpaceSummaryListResponse" + } + } + } + }, + "default": { + "description": "Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorPayload" + } + } + } + } + }, + "description": "List all spaces in a project", + "tags": ["Projects"], + "security": [], + "parameters": [ + { + "description": "The uuid of the project to get spaces for", + "in": "path", + "name": "projectUuid", + "required": true, + "schema": { + "type": "string" + } + } + ] + }, + "post": { + "operationId": "CreateSpaceInProject", + "responses": { + "200": { + "description": "Created", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiSpaceResponse" + } + } + } + }, + "default": { + "description": "Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorPayload" + } + } + } + } + }, + "description": "Create a new space inside a project", + "tags": ["Roles & Permissions", "Spaces"], + "security": [], + "parameters": [ + { + "description": "The uuid of the space's parent project", + "in": "path", + "name": "projectUuid", + "required": true, + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CreateSpace" + } + } + } + } + } + }, + "/api/v1/projects/{projectUuid}/access": { + "get": { + "operationId": "GetProjectAccessList", + "responses": { + "200": { + "description": "Success", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiProjectAccessListResponse" + } + } + } + }, + "default": { + "description": "Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorPayload" + } + } + } + } + }, + "description": "Get access list for a project. This is a list of users that have been explictly granted access to the project.\nThere may be other users that have access to the project via their organization membership.", + "tags": ["Roles & Permissions", "Projects"], + "security": [], + "parameters": [ + { + "in": "path", + "name": "projectUuid", + "required": true, + "schema": { + "type": "string" + } + } + ] + }, + "post": { + "operationId": "GrantProjectAccessToUser", + "responses": { + "200": { + "description": "Success", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiSuccessEmpty" + } + } + } + }, + "default": { + "description": "Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorPayload" + } + } + } + } + }, + "description": "Grant a user access to a project", + "tags": ["Roles & Permissions", "Projects"], + "security": [], + "parameters": [ + { + "in": "path", + "name": "projectUuid", + "required": true, + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CreateProjectMember" + } + } + } + } + } + }, + "/api/v1/projects/{projectUuid}/user/{userUuid}": { + "get": { + "operationId": "GetProjectMemberAccess", + "responses": { + "200": { + "description": "Success", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiGetProjectMemberResponse" + } + } + } + }, + "default": { + "description": "Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorPayload" + } + } + } + } + }, + "description": "Get a project explicit member's access.\nThere may be users that have access to the project via their organization membership.\n\nNOTE:\nWe don't use the API on the frontend. Instead, we can call the API\nso that we make sure of the user's access to the project.", + "tags": ["Roles & Permissions", "Projects"], + "security": [], + "parameters": [ + { + "in": "path", + "name": "projectUuid", + "required": true, + "schema": { + "type": "string" + } + }, + { + "in": "path", + "name": "userUuid", + "required": true, + "schema": { + "type": "string" + } + } + ] + } + }, + "/api/v1/projects/{projectUuid}/access/{userUuid}": { + "patch": { + "operationId": "UpdateProjectAccessForUser", + "responses": { + "200": { + "description": "Success", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiSuccessEmpty" + } + } + } + }, + "default": { + "description": "Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorPayload" + } + } + } + } + }, + "description": "Update a user's access to a project", + "tags": ["Roles & Permissions", "Projects"], + "security": [], + "parameters": [ + { + "in": "path", + "name": "projectUuid", + "required": true, + "schema": { + "type": "string" + } + }, + { + "in": "path", + "name": "userUuid", + "required": true, + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpdateProjectMember" + } + } + } + } + }, + "delete": { + "operationId": "RevokeProjectAccessForUser", + "responses": { + "200": { + "description": "Success", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiSuccessEmpty" + } + } + } + }, + "default": { + "description": "Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorPayload" + } + } + } + } + }, + "description": "Remove a user's access to a project", + "tags": ["Roles & Permissions", "Projects"], + "security": [], + "parameters": [ + { + "in": "path", + "name": "projectUuid", + "required": true, + "schema": { + "type": "string" + } + }, + { + "in": "path", + "name": "userUuid", + "required": true, + "schema": { + "type": "string" + } + } + ] + } + }, + "/api/v1/projects/{projectUuid}/groupAccesses": { + "get": { + "operationId": "GetProjectGroupAccesses", + "responses": { + "200": { + "description": "Success", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiGetProjectGroupAccesses" + } + } + } + }, + "default": { + "description": "Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorPayload" + } + } + } + } + }, + "description": "List group access for projects", + "tags": ["Projects"], + "security": [], + "parameters": [ + { + "in": "path", + "name": "projectUuid", + "required": true, + "schema": { + "type": "string" + } + } + ] + } + }, + "/api/v1/projects/{projectUuid}/sqlQuery": { + "post": { + "operationId": "RunSqlQuery", + "responses": { + "200": { + "description": "Success", + "content": { + "application/json": { + "schema": { + "properties": { + "results": { + "$ref": "#/components/schemas/ApiSqlQueryResults" + }, + "status": { + "type": "string", + "enum": ["ok"], + "nullable": false + } + }, + "required": ["results", "status"], + "type": "object" + } + } + } + }, + "default": { + "description": "Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorPayload" + } + } + } + } + }, + "description": "Run a raw sql query against the project's warehouse connection", + "tags": ["Exploring", "Projects"], + "security": [], + "parameters": [ + { + "description": "The uuid of the project to run the query against", + "in": "path", + "name": "projectUuid", + "required": true, + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "description": "The query to run", + "required": true, + "content": { + "application/json": { + "schema": { + "properties": { + "sql": { + "type": "string" + } + }, + "required": ["sql"], + "type": "object", + "description": "The query to run" + } + } + } + } + } + }, + "/api/v1/projects/{projectUuid}/calculate-total": { + "post": { + "operationId": "CalculateTotalFromQuery", + "responses": { + "200": { + "description": "Success", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiCalculateTotalResponse" + } + } + } + }, + "default": { + "description": "Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorPayload" + } + } + } + } + }, + "description": "Calculate all metric totals from a metricQuery", + "tags": ["Projects"], + "security": [], + "parameters": [ + { + "description": "The uuid of the project to get charts for", + "in": "path", + "name": "projectUuid", + "required": true, + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "description": "The metric query to calculate totals for", + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CalculateTotalFromQuery", + "description": "The metric query to calculate totals for" + } + } + } + } + } + }, + "/api/v1/projects/{projectUuid}/user-credentials": { + "get": { + "operationId": "getUserWarehouseCredentialsPreference", + "responses": { + "200": { + "description": "Success", + "content": { + "application/json": { + "schema": { + "properties": { + "results": { + "$ref": "#/components/schemas/UserWarehouseCredentials" + }, + "status": { + "type": "string", + "enum": ["ok"], + "nullable": false + } + }, + "required": ["status"], + "type": "object" + } + } + } + }, + "default": { + "description": "Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorPayload" + } + } + } + } + }, + "tags": ["Projects"], + "security": [], + "parameters": [ + { + "in": "path", + "name": "projectUuid", + "required": true, + "schema": { + "type": "string" + } + } + ] + } + }, + "/api/v1/projects/{projectUuid}/user-credentials/{userWarehouseCredentialsUuid}": { + "patch": { + "operationId": "updateUserWarehouseCredentialsPreference", + "responses": { + "200": { + "description": "Success", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiSuccessEmpty" + } + } + } + }, + "default": { + "description": "Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorPayload" + } + } + } + } + }, + "tags": ["Projects"], + "security": [], + "parameters": [ + { + "in": "path", + "name": "projectUuid", + "required": true, + "schema": { + "type": "string" + } + }, + { + "in": "path", + "name": "userWarehouseCredentialsUuid", + "required": true, + "schema": { + "type": "string" + } + } + ] + } + }, + "/api/v1/projects/{projectUuid}/custom-metrics": { + "get": { + "operationId": "getCustomMetrics", + "responses": { + "200": { + "description": "Success", + "content": { + "application/json": { + "schema": { + "properties": { + "results": { + "items": { + "properties": { + "chartUrl": { + "type": "string" + }, + "chartLabel": { + "type": "string" + }, + "yml": { + "type": "string" + }, + "modelName": { + "type": "string" + }, + "label": { + "type": "string" + }, + "name": { + "type": "string" + } + }, + "required": [ + "chartUrl", + "chartLabel", + "yml", + "modelName", + "label", + "name" + ], + "type": "object" + }, + "type": "array" + }, + "status": { + "type": "string", + "enum": ["ok"], + "nullable": false + } + }, + "required": ["results", "status"], + "type": "object" + } + } + } + }, + "default": { + "description": "Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorPayload" + } + } + } + } + }, + "tags": ["Projects"], + "security": [], + "parameters": [ + { + "in": "path", + "name": "projectUuid", + "required": true, + "schema": { + "type": "string" + } + } + ] + } + }, + "/api/v1/projects/{projectUuid}/metadata": { + "patch": { + "operationId": "updateProjectMetadata", + "responses": { + "200": { + "description": "Success", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiSuccessEmpty" + } + } + } + }, + "default": { + "description": "Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorPayload" + } + } + } + } + }, + "description": "Update project metadata like upstreamProjectUuid\nwe don't trigger a compile, so not for updating warehouse or credentials", + "tags": ["Projects"], + "security": [], + "parameters": [ + { + "in": "path", + "name": "projectUuid", + "required": true, + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpdateMetadata" + } + } + } + } + } + }, + "/api/v1/projects/{projectUuid}/semantic-layer-connection": { + "patch": { + "operationId": "updateProjectSemanticLayerConnection", + "responses": { + "200": { + "description": "Success", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiSuccessEmpty" + } + } + } + }, + "default": { + "description": "Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorPayload" + } + } + } + } + }, + "tags": ["Projects"], + "security": [], + "parameters": [ + { + "in": "path", + "name": "projectUuid", + "required": true, + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SemanticLayerConnectionUpdate" + } + } + } + } + }, + "delete": { + "operationId": "deleteProjectSemanticLayerConnection", + "responses": { + "200": { + "description": "Success", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiSuccessEmpty" + } + } + } + }, + "default": { + "description": "Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorPayload" + } + } + } + } + }, + "tags": ["Projects"], + "security": [], + "parameters": [ + { + "in": "path", + "name": "projectUuid", + "required": true, + "schema": { + "type": "string" + } + } + ] + } + }, + "/api/v1/projects/{projectUuid}/dashboards": { + "get": { + "operationId": "getDashboards", + "responses": { + "200": { + "description": "Success", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiGetDashboardsResponse" + } + } + } + }, + "default": { + "description": "Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorPayload" + } + } + } + } + }, + "tags": ["Projects"], + "security": [], + "parameters": [ + { + "in": "path", + "name": "projectUuid", + "required": true, + "schema": { + "type": "string" + } + } + ] + }, + "post": { + "operationId": "createDashboard", + "responses": { + "201": { + "description": "Created", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiCreateDashboardResponse" + } + } + } + }, + "default": { + "description": "Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorPayload" + } + } + } + } + }, + "tags": ["Projects"], + "security": [], + "parameters": [ + { + "in": "path", + "name": "projectUuid", + "required": true, + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "duplicateFrom", + "required": false, + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "anyOf": [ + { + "$ref": "#/components/schemas/DuplicateDashboardParams" + }, + { + "$ref": "#/components/schemas/CreateDashboard" + } + ] + } + } + } + } + }, + "patch": { + "operationId": "updateDashboards", + "responses": { + "200": { + "description": "Updated", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiUpdateDashboardsResponse" + } + } + } + }, + "default": { + "description": "Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorPayload" + } + } + } + } + }, + "tags": ["Projects"], + "security": [], + "parameters": [ + { + "in": "path", + "name": "projectUuid", + "required": true, + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "items": { + "$ref": "#/components/schemas/UpdateMultipleDashboards" + }, + "type": "array" + } + } + } + } + } + }, + "/api/v1/projects/{projectUuid}/createPreview": { + "post": { + "operationId": "createPreview", + "responses": { + "200": { + "description": "Created", + "content": { + "application/json": { + "schema": { + "properties": { + "results": { + "type": "string" + }, + "status": { + "type": "string", + "enum": ["ok"], + "nullable": false + } + }, + "required": ["results", "status"], + "type": "object" + } + } + } + }, + "default": { + "description": "Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorPayload" + } + } + } + } + }, + "tags": ["Projects"], + "security": [], + "parameters": [ + { + "in": "path", + "name": "projectUuid", + "required": true, + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "properties": { + "copyContent": { + "type": "boolean" + }, + "name": { + "type": "string" + } + }, + "required": ["copyContent", "name"], + "type": "object" + } + } + } + } + } + }, + "/api/v1/projects/{projectUuid}/schedulerSettings": { + "patch": { + "operationId": "updateSchedulerSettings", + "responses": { + "200": { + "description": "Updated", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiSuccessEmpty" + } + } + } + }, + "default": { + "description": "Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorPayload" + } + } + } + } + }, + "tags": ["Projects"], + "security": [], + "parameters": [ + { + "in": "path", + "name": "projectUuid", + "required": true, + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpdateSchedulerSettings" + } + } + } + } + } + }, + "/api/v1/projects/{projectUuid}/tags": { + "post": { + "operationId": "createTag", + "responses": { + "201": { + "description": "Success", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiCreateTagResponse" + } + } + } + }, + "default": { + "description": "Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorPayload" + } + } + } + } + }, + "tags": ["Projects"], + "security": [], + "parameters": [ + { + "in": "path", + "name": "projectUuid", + "required": true, + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Pick_Tag.name-or-color_" + } + } + } + } + }, + "get": { + "operationId": "getTags", + "responses": { + "200": { + "description": "Success", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiGetTagsResponse" + } + } + } + }, + "default": { + "description": "Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorPayload" + } + } + } + } + }, + "tags": ["Projects"], + "security": [], + "parameters": [ + { + "in": "path", + "name": "projectUuid", + "required": true, + "schema": { + "type": "string" + } + } + ] + } + }, + "/api/v1/projects/{projectUuid}/tags/{tagUuid}": { + "delete": { + "operationId": "deleteTag", + "responses": { + "204": { + "description": "Deleted", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiSuccessEmpty" + } + } + } + }, + "default": { + "description": "Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorPayload" + } + } + } + } + }, + "tags": ["Projects"], + "security": [], + "parameters": [ + { + "in": "path", + "name": "tagUuid", + "required": true, + "schema": { + "type": "string" + } + } + ] + }, + "patch": { + "operationId": "updateTag", + "responses": { + "200": { + "description": "Updated", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiSuccessEmpty" + } + } + } + }, + "default": { + "description": "Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorPayload" + } + } + } + } + }, + "tags": ["Projects"], + "security": [], + "parameters": [ + { + "in": "path", + "name": "tagUuid", + "required": true, + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/DbTagUpdate" + } + } + } + } + } + }, + "/api/v1/projects/{projectUuid}/charts/code": { + "get": { + "operationId": "getChartsAsCode", + "responses": { + "200": { + "description": "Success", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiChartAsCodeListResponse" + } + } + } + }, + "default": { + "description": "Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorPayload" + } + } + } + } + }, + "description": "Charts as code", + "tags": ["Projects"], + "security": [], + "parameters": [ + { + "in": "path", + "name": "projectUuid", + "required": true, + "schema": { + "type": "string" + } + } + ] + } + }, + "/api/v1/projects/{projectUuid}/dashboards/code": { + "get": { + "operationId": "getDashboardsAsCode", + "responses": { + "200": { + "description": "Success", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiDashboardAsCodeListResponse" + } + } + } + }, + "default": { + "description": "Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorPayload" + } + } + } + } + }, + "tags": ["Projects"], + "security": [], + "parameters": [ + { + "in": "path", + "name": "projectUuid", + "required": true, + "schema": { + "type": "string" + } + } + ] + } + }, + "/api/v1/projects/{projectUuid}/charts/{slug}/code": { + "post": { + "operationId": "upsertChartAsCode", + "responses": { + "200": { + "description": "Success", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiChartAsCodeUpsertResponse" + } + } + } + }, + "default": { + "description": "Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorPayload" + } + } + } + } + }, + "tags": ["Projects"], + "security": [], + "parameters": [ + { + "in": "path", + "name": "projectUuid", + "required": true, + "schema": { + "type": "string" + } + }, + { + "in": "path", + "name": "slug", + "required": true, + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/Omit_ChartAsCode.metricQuery-or-chartConfig_" + }, + { + "properties": { + "metricQuery": {}, + "chartConfig": {} + }, + "required": [ + "metricQuery", + "chartConfig" + ], + "type": "object" + } + ] + } + } + } + } + } + }, + "/api/v1/projects/{projectUuid}/dashboards/{slug}/code": { + "post": { + "operationId": "upsertDashboardAsCode", + "responses": { + "200": { + "description": "Success", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiDashboardAsCodeUpsertResponse" + } + } + } + }, + "default": { + "description": "Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorPayload" + } + } + } + } + }, + "tags": ["Projects"], + "security": [], + "parameters": [ + { + "in": "path", + "name": "projectUuid", + "required": true, + "schema": { + "type": "string" + } + }, + { + "in": "path", + "name": "slug", + "required": true, + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/Omit_DashboardAsCode.filters-or-tiles-or-description_" + }, + { + "properties": { + "description": { + "type": "string", + "nullable": true + }, + "tiles": {}, + "filters": {} + }, + "required": ["tiles", "filters"], + "type": "object" + } + ] + } + } + } + } + } + }, + "/api/v1/projects/{projectUuid}/explores/{exploreId}/runUnderlyingDataQuery": { + "post": { + "operationId": "postRunUnderlyingDataQuery", + "responses": { + "200": { + "description": "Success", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiRunQueryResponse" + } + } + } + }, + "default": { + "description": "Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorPayload" + } + } + } + } + }, + "description": "Run a query for underlying data results", + "tags": ["Exploring"], + "security": [], + "parameters": [ + { + "description": "The uuid of the project", + "in": "path", + "name": "projectUuid", + "required": true, + "schema": { + "type": "string" + } + }, + { + "description": "table name", + "in": "path", + "name": "exploreId", + "required": true, + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "description": "metricQuery for the chart to run", + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/MetricQueryRequest", + "description": "metricQuery for the chart to run" + } + } + } + } + } + }, + "/api/v1/projects/{projectUuid}/explores/{exploreId}/runQuery": { + "post": { + "operationId": "RunMetricQuery", + "responses": { + "200": { + "description": "Success", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiRunQueryResponse" + } + } + } + }, + "default": { + "description": "Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorPayload" + } + } + } + } + }, + "description": "Run a query for explore", + "tags": ["Exploring"], + "security": [], + "parameters": [ + { + "description": "The uuid of the project", + "in": "path", + "name": "projectUuid", + "required": true, + "schema": { + "type": "string" + } + }, + { + "description": "table name", + "in": "path", + "name": "exploreId", + "required": true, + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "description": "metricQuery for the chart to run", + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/MetricQueryRequest", + "description": "metricQuery for the chart to run" + } + } + } + } + } + }, + "/api/v1/saved/{chartUuid}/results": { + "post": { + "operationId": "PostChartResults", + "responses": { + "200": { + "description": "Success", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiRunQueryResponse" + } + } + } + }, + "default": { + "description": "Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorPayload" + } + } + } + } + }, + "description": "Run a query for a chart", + "tags": ["Charts"], + "security": [], + "parameters": [ + { + "description": "chartUuid for the chart to run", + "in": "path", + "name": "chartUuid", + "required": true, + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "properties": { + "invalidateCache": { + "type": "boolean" + } + }, + "type": "object" + } + } + } + } + } + }, + "/api/v1/saved/{chartUuid}/chart-and-results": { + "post": { + "operationId": "PostDashboardTile", + "responses": { + "200": { + "description": "Success", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiRunQueryResponse" + } + } + } + }, + "default": { + "description": "Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorPayload" + } + } + } + } + }, + "tags": ["Charts"], + "security": [], + "parameters": [ + { + "in": "path", + "name": "chartUuid", + "required": true, + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "properties": { + "autoRefresh": { + "type": "boolean" + }, + "granularity": { + "$ref": "#/components/schemas/DateGranularity" + }, + "dashboardUuid": { + "type": "string" + }, + "dashboardSorts": { + "items": { + "$ref": "#/components/schemas/SortField" + }, + "type": "array" + }, + "invalidateCache": { + "type": "boolean" + }, + "dashboardFilters": {} + }, + "required": [ + "dashboardUuid", + "dashboardSorts", + "dashboardFilters" + ], + "type": "object" + } + } + } + } + } + }, + "/api/v1/saved/{chartUuid}/history": { + "get": { + "operationId": "GetChartHistory", + "responses": { + "200": { + "description": "Success", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiGetChartHistoryResponse" + } + } + } + }, + "default": { + "description": "Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorPayload" + } + } + } + } + }, + "description": "Get chart version history from last 30 days", + "tags": ["Charts"], + "security": [], + "parameters": [ + { + "description": "chartUuid for the chart", + "in": "path", + "name": "chartUuid", + "required": true, + "schema": { + "type": "string" + } + } + ] + } + }, + "/api/v1/saved/{chartUuid}/version/{versionUuid}": { + "get": { + "operationId": "GetChartVersion", + "responses": { + "200": { + "description": "Success", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiGetChartVersionResponse" + } + } + } + }, + "default": { + "description": "Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorPayload" + } + } + } + } + }, + "description": "Get chart version", + "tags": ["Charts"], + "security": [], + "parameters": [ + { + "description": "chartUuid for the chart", + "in": "path", + "name": "chartUuid", + "required": true, + "schema": { + "type": "string" + } + }, + { + "description": "versionUuid for the chart version", + "in": "path", + "name": "versionUuid", + "required": true, + "schema": { + "type": "string" + } + } + ] + } + }, + "/api/v1/saved/{chartUuid}/version/{versionUuid}/results": { + "post": { + "operationId": "getChartVersionResults", + "responses": { + "200": { + "description": "Success", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiRunQueryResponse" + } + } + } + }, + "default": { + "description": "Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorPayload" + } + } + } + } + }, + "description": "Run a query for a chart version", + "tags": ["Charts"], + "security": [], + "parameters": [ + { + "description": "chartUuid for the chart to run", + "in": "path", + "name": "chartUuid", + "required": true, + "schema": { + "type": "string" + } + }, + { + "description": "versionUuid for the chart version", + "in": "path", + "name": "versionUuid", + "required": true, + "schema": { + "type": "string" + } + } + ] + } + }, + "/api/v1/saved/{chartUuid}/rollback/{versionUuid}": { + "post": { + "operationId": "postChartVersionRollback", + "responses": { + "200": { + "description": "Success", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiSuccessEmpty" + } + } + } + }, + "default": { + "description": "Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorPayload" + } + } + } + } + }, + "description": "Rollback chart to version", + "tags": ["Charts"], + "security": [], + "parameters": [ + { + "description": "chartUuid for the chart to run", + "in": "path", + "name": "chartUuid", + "required": true, + "schema": { + "type": "string" + } + }, + { + "description": "versionUuid for the chart version", + "in": "path", + "name": "versionUuid", + "required": true, + "schema": { + "type": "string" + } + } + ] + } + }, + "/api/v1/saved/{chartUuid}/calculate-total": { + "post": { + "operationId": "CalculateTotalFromSavedChart", + "responses": { + "200": { + "description": "Success", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiCalculateTotalResponse" + } + } + } + }, + "default": { + "description": "Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorPayload" + } + } + } + } + }, + "description": "Calculate metric totals from a saved chart", + "tags": ["Charts"], + "security": [], + "parameters": [ + { + "description": "chartUuid for the chart to run", + "in": "path", + "name": "chartUuid", + "required": true, + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "properties": { + "invalidateCache": { + "type": "boolean" + }, + "dashboardFilters": {} + }, + "type": "object" + } + } + } + } + } + }, + "/api/v1/saved/{chartUuid}/promote": { + "post": { + "operationId": "promoteChart", + "responses": { + "200": { + "description": "Success", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiPromoteChartResponse" + } + } + } + }, + "default": { + "description": "Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorPayload" + } + } + } + } + }, + "description": "Promote chart to its upstream project", + "tags": ["Charts"], + "security": [], + "parameters": [ + { + "description": "chartUuid for the chart to run", + "in": "path", + "name": "chartUuid", + "required": true, + "schema": { + "type": "string" + } + } + ] + } + }, + "/api/v1/saved/{chartUuid}/promoteDiff": { + "get": { + "operationId": "promoteChartDiff", + "responses": { + "200": { + "description": "Success", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiPromotionChangesResponse" + } + } + } + }, + "default": { + "description": "Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorPayload" + } + } + } + } + }, + "description": "Get diff from chart to promote", + "tags": ["Charts"], + "security": [], + "parameters": [ + { + "description": "chartUuid for the chart to check diff", + "in": "path", + "name": "chartUuid", + "required": true, + "schema": { + "type": "string" + } + } + ] + } + }, + "/api/v1/saved/{chartUuid}/downloadCsv": { + "post": { + "operationId": "DownloadCsvFromSavedChart", + "responses": { + "200": { + "description": "Success", + "content": { + "application/json": { + "schema": { + "properties": { + "results": { + "properties": { + "jobId": { + "type": "string" + } + }, + "required": ["jobId"], + "type": "object" + }, + "status": { + "type": "string", + "enum": ["ok"], + "nullable": false + } + }, + "required": ["results", "status"], + "type": "object" + } + } + } + }, + "default": { + "description": "Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorPayload" + } + } + } + } + }, + "description": "Download a CSV from a saved chart uuid", + "tags": ["Charts"], + "security": [], + "parameters": [ + { + "in": "path", + "name": "chartUuid", + "required": true, + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "properties": { + "csvLimit": { + "type": "number", + "format": "double", + "nullable": true + }, + "onlyRaw": { + "type": "boolean" + }, + "tileUuid": { + "type": "string" + }, + "dashboardFilters": {} + }, + "required": ["onlyRaw", "dashboardFilters"], + "type": "object" + } + } + } + } + } + }, + "/api/v1/schedulers/{projectUuid}/logs": { + "get": { + "operationId": "getSchedulerLogs", + "responses": { + "200": { + "description": "Success", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiSchedulerLogsResponse" + } + } + } + }, + "default": { + "description": "Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorPayload" + } + } + } + } + }, + "description": "Get scheduled logs", + "tags": ["Schedulers"], + "security": [], + "parameters": [ + { + "in": "path", + "name": "projectUuid", + "required": true, + "schema": { + "type": "string" + } + } + ] + } + }, + "/api/v1/schedulers/{schedulerUuid}": { + "get": { + "operationId": "getScheduler", + "responses": { + "200": { + "description": "Success", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiSchedulerAndTargetsResponse" + } + } + } + }, + "default": { + "description": "Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorPayload" + } + } + } + } + }, + "description": "Get a scheduler", + "tags": ["Schedulers"], + "security": [], + "parameters": [ + { + "description": "The uuid of the scheduler to update", + "in": "path", + "name": "schedulerUuid", + "required": true, + "schema": { + "type": "string" + } + } + ] + }, + "patch": { + "operationId": "updateScheduler", + "responses": { + "201": { + "description": "Updated", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiSchedulerAndTargetsResponse" + } + } + } + }, + "default": { + "description": "Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorPayload" + } + } + } + } + }, + "description": "Update a scheduler", + "tags": ["Schedulers"], + "security": [], + "parameters": [ + { + "description": "The uuid of the scheduler to update", + "in": "path", + "name": "schedulerUuid", + "required": true, + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "description": "the new scheduler data", + "required": true, + "content": { + "application/json": { + "schema": { + "description": "the new scheduler data" + } + } + } + } + }, + "delete": { + "operationId": "deleteScheduler", + "responses": { + "201": { + "description": "Deleted", + "content": { + "application/json": { + "schema": { + "properties": { + "results": {}, + "status": { + "type": "string", + "enum": ["ok"], + "nullable": false + } + }, + "required": ["status"], + "type": "object" + } + } + } + }, + "default": { + "description": "Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorPayload" + } + } + } + } + }, + "description": "Delete a scheduler", + "tags": ["Schedulers"], + "security": [], + "parameters": [ + { + "description": "The uuid of the scheduler to delete", + "in": "path", + "name": "schedulerUuid", + "required": true, + "schema": { + "type": "string" + } + } + ] + } + }, + "/api/v1/schedulers/{schedulerUuid}/enabled": { + "patch": { + "operationId": "updateSchedulerEnabled", + "responses": { + "201": { + "description": "Updated", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiSchedulerAndTargetsResponse" + } + } + } + }, + "default": { + "description": "Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorPayload" + } + } + } + } + }, + "description": "Set scheduler enabled", + "tags": ["Schedulers"], + "security": [], + "parameters": [ + { + "description": "The uuid of the scheduler to update", + "in": "path", + "name": "schedulerUuid", + "required": true, + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "description": "the enabled flag", + "required": true, + "content": { + "application/json": { + "schema": { + "properties": { + "enabled": { + "type": "boolean" + } + }, + "required": ["enabled"], + "type": "object", + "description": "the enabled flag" + } + } + } + } + } + }, + "/api/v1/schedulers/{schedulerUuid}/jobs": { + "get": { + "operationId": "getScheduledJobs", + "responses": { + "200": { + "description": "Success", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiScheduledJobsResponse" + } + } + } + }, + "default": { + "description": "Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorPayload" + } + } + } + } + }, + "description": "Get scheduled jobs", + "tags": ["Schedulers"], + "security": [], + "parameters": [ + { + "description": "The uuid of the scheduler to update", + "in": "path", + "name": "schedulerUuid", + "required": true, + "schema": { + "type": "string" + } + } + ] + } + }, + "/api/v1/schedulers/job/{jobId}/status": { + "get": { + "operationId": "getSchedulerJobStatus", + "responses": { + "200": { + "description": "Success", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiJobStatusResponse" + } + } + } + }, + "default": { + "description": "Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorPayload" + } + } + } + } + }, + "description": "Get a generic job status\nThis method can be used when polling from the frontend", + "tags": ["Schedulers"], + "security": [], + "parameters": [ + { + "description": "the jobId for the status to check", + "in": "path", + "name": "jobId", + "required": true, + "schema": { + "type": "string" + } + } + ] + } + }, + "/api/v1/schedulers/send": { + "post": { + "operationId": "sendScheduler", + "responses": { + "200": { + "description": "Success", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiTestSchedulerResponse" + } + } + } + }, + "default": { + "description": "Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorPayload" + } + } + } + } + }, + "description": "Send a scheduler now before saving it", + "tags": ["Schedulers"], + "security": [], + "parameters": [], + "requestBody": { + "description": "the create scheduler data", + "required": true, + "content": { + "application/json": { + "schema": { + "description": "the create scheduler data" + } + } + } + } + } + }, + "/api/v1/share/{nanoId}": { + "get": { + "operationId": "getShareUrl", + "responses": { + "200": { + "description": "Ok", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiShareResponse" + } + } + } + }, + "default": { + "description": "Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorPayload" + } + } + } + } + }, + "description": "Get a share url from a short url id", + "tags": ["Share links"], + "security": [], + "parameters": [ + { + "description": "the short id for the share url", + "in": "path", + "name": "nanoId", + "required": true, + "schema": { + "type": "string" + } + } + ] + } + }, + "/api/v1/share": { + "post": { + "operationId": "CreateShareUrl", + "responses": { + "201": { + "description": "Created", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiShareResponse" + } + } + } + }, + "default": { + "description": "Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorPayload" + } + } + } + } + }, + "description": "Given a full URL generates a short url id that can be used for sharing", + "tags": ["Share links"], + "security": [], + "parameters": [], + "requestBody": { + "description": "a full URL used to generate a short url id", + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CreateShareUrl", + "description": "a full URL used to generate a short url id" + } + } + } + } + } + }, + "/api/v1/slack/channels": { + "get": { + "operationId": "getSlackChannels", + "responses": { + "200": { + "description": "Success", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiSlackChannelsResponse" + } + } + } + }, + "default": { + "description": "Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorPayload" + } + } + } + } + }, + "description": "Get slack channels", + "tags": ["Integrations"], + "security": [], + "parameters": [ + { + "in": "query", + "name": "search", + "required": false, + "schema": { + "type": "string" + } + } + ] + } + }, + "/api/v1/slack/custom-settings": { + "put": { + "operationId": "UpdateCustomSettings", + "responses": { + "200": { + "description": "Success", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiSlackCustomSettingsResponse" + } + } + } + }, + "default": { + "description": "Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorPayload" + } + } + } + } + }, + "description": "Update slack notification channel to send notifications to scheduled jobs fail", + "tags": ["Integrations"], + "security": [], + "parameters": [], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SlackAppCustomSettings" + } + } + } + } + } + }, + "/api/v1/projects/{projectUuid}/spaces/{spaceUuid}": { + "get": { + "operationId": "GetSpace", + "responses": { + "200": { + "description": "Success", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiSpaceResponse" + } + } + } + }, + "default": { + "description": "Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorPayload" + } + } + } + } + }, + "description": "Get details for a space in a project", + "tags": ["Spaces"], + "security": [], + "parameters": [ + { + "description": "The uuid of the space's parent project", + "in": "path", + "name": "projectUuid", + "required": true, + "schema": { + "type": "string" + } + }, + { + "description": "The uuid of the space to get", + "in": "path", + "name": "spaceUuid", + "required": true, + "schema": { + "type": "string" + } + } + ] + }, + "delete": { + "operationId": "DeleteSpace", + "responses": { + "204": { + "description": "Deleted", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiSuccessEmpty" + } + } + } + }, + "default": { + "description": "Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorPayload" + } + } + } + } + }, + "description": "Delete a space from a project", + "tags": ["Spaces"], + "security": [], + "parameters": [ + { + "description": "The uuid of the space's parent project", + "in": "path", + "name": "projectUuid", + "required": true, + "schema": { + "type": "string" + } + }, + { + "description": "The uuid of the space to delete", + "in": "path", + "name": "spaceUuid", + "required": true, + "schema": { + "type": "string" + } + } + ] + }, + "patch": { + "operationId": "UpdateSpace", + "responses": { + "200": { + "description": "Updated", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiSpaceResponse" + } + } + } + }, + "default": { + "description": "Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorPayload" + } + } + } + } + }, + "description": "Update a space in a project", + "tags": ["Roles & Permissions", "Spaces"], + "security": [], + "parameters": [ + { + "description": "The uuid of the space's parent project", + "in": "path", + "name": "projectUuid", + "required": true, + "schema": { + "type": "string" + } + }, + { + "description": "The uuid of the space to update", + "in": "path", + "name": "spaceUuid", + "required": true, + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpdateSpace" + } + } + } + } + } + }, + "/api/v1/projects/{projectUuid}/spaces/{spaceUuid}/share": { + "post": { + "operationId": "AddSpaceUserAccess", + "responses": { + "200": { + "description": "Success", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiSuccessEmpty" + } + } + } + }, + "default": { + "description": "Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorPayload" + } + } + } + } + }, + "description": "Grant a user access to a space", + "tags": ["Roles & Permissions", "Spaces"], + "security": [], + "parameters": [ + { + "description": "The uuid of the space's parent project", + "in": "path", + "name": "projectUuid", + "required": true, + "schema": { + "type": "string" + } + }, + { + "in": "path", + "name": "spaceUuid", + "required": true, + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AddSpaceUserAccess" + } + } + } + } + } + }, + "/api/v1/projects/{projectUuid}/spaces/{spaceUuid}/share/{userUuid}": { + "delete": { + "operationId": "RevokeSpaceAccessForUser", + "responses": { + "200": { + "description": "Success", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiSuccessEmpty" + } + } + } + }, + "default": { + "description": "Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorPayload" + } + } + } + } + }, + "description": "Remove a user's access to a space", + "tags": ["Roles & Permissions", "Spaces"], + "security": [], + "parameters": [ + { + "description": "The uuid of the space's parent project", + "in": "path", + "name": "projectUuid", + "required": true, + "schema": { + "type": "string" + } + }, + { + "description": "The uuid of the space to update", + "in": "path", + "name": "spaceUuid", + "required": true, + "schema": { + "type": "string" + } + }, + { + "description": "The uuid of the user to revoke access from", + "in": "path", + "name": "userUuid", + "required": true, + "schema": { + "type": "string" + } + } + ] + } + }, + "/api/v1/projects/{projectUuid}/spaces/{spaceUuid}/group/share": { + "post": { + "operationId": "AddSpaceGroupAccess", + "responses": { + "200": { + "description": "Success", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiSuccessEmpty" + } + } + } + }, + "default": { + "description": "Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorPayload" + } + } + } + } + }, + "description": "Grant a group access to a space", + "tags": ["Roles & Permissions", "Spaces"], + "security": [], + "parameters": [ + { + "description": "The uuid of the space's parent project", + "in": "path", + "name": "projectUuid", + "required": true, + "schema": { + "type": "string" + } + }, + { + "description": "The uuid of the space to update", + "in": "path", + "name": "spaceUuid", + "required": true, + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AddSpaceGroupAccess" + } + } + } + } + } + }, + "/api/v1/projects/{projectUuid}/spaces/{spaceUuid}/group/share/{groupUuid}": { + "delete": { + "operationId": "RevokeGroupSpaceAccess", + "responses": { + "200": { + "description": "Success", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiSuccessEmpty" + } + } + } + }, + "default": { + "description": "Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorPayload" + } + } + } + } + }, + "description": "Remove a group's access to a space", + "tags": ["Roles & Permissions", "Spaces"], + "security": [], + "parameters": [ + { + "description": "The uuid of the space's parent project", + "in": "path", + "name": "projectUuid", + "required": true, + "schema": { + "type": "string" + } + }, + { + "description": "The uuid of the space to update", + "in": "path", + "name": "spaceUuid", + "required": true, + "schema": { + "type": "string" + } + }, + { + "description": "The uuid of the group to revoke access from", + "in": "path", + "name": "groupUuid", + "required": true, + "schema": { + "type": "string" + } + } + ] + } + }, + "/api/v1/ssh/key-pairs": { + "post": { + "operationId": "createSshKeyPair", + "responses": { + "201": { + "description": "Success", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiSshKeyPairResponse" + } + } + } + }, + "default": { + "description": "Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorPayload" + } + } + } + } + }, + "tags": ["SSH Keypairs"], + "security": [], + "parameters": [] + } + }, + "/api/v1/org/attributes": { + "get": { + "operationId": "getUserAttributes", + "responses": { + "200": { + "description": "Ok", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiUserAttributesResponse" + } + } + } + }, + "default": { + "description": "Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorPayload" + } + } + } + } + }, + "description": "Get all user attributes", + "tags": ["User attributes"], + "security": [], + "parameters": [] + }, + "post": { + "operationId": "createUserAttribute", + "responses": { + "200": { + "description": "Ok", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiCreateUserAttributeResponse" + } + } + } + }, + "default": { + "description": "Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorPayload" + } + } + } + } + }, + "description": "Creates new user attribute", + "tags": ["User attributes"], + "security": [], + "parameters": [], + "requestBody": { + "description": "the user attribute to create", + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CreateUserAttribute", + "description": "the user attribute to create" + } + } + } + } + } + }, + "/api/v1/org/attributes/{userAttributeUuid}": { + "put": { + "operationId": "updateUserAttribute", + "responses": { + "200": { + "description": "Ok", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiCreateUserAttributeResponse" + } + } + } + }, + "default": { + "description": "Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorPayload" + } + } + } + } + }, + "description": "Updates a user attribute", + "tags": ["User attributes"], + "security": [], + "parameters": [ + { + "description": "the UUID for the group to add the user to", + "in": "path", + "name": "userAttributeUuid", + "required": true, + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "description": "the user attribute to update", + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CreateUserAttribute", + "description": "the user attribute to update" + } + } + } + } + }, + "delete": { + "operationId": "removeUserAttribute", + "responses": { + "200": { + "description": "Ok", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiSuccessEmpty" + } + } + } + }, + "default": { + "description": "Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorPayload" + } + } + } + } + }, + "description": "Remove a user attribute", + "tags": ["User attributes"], + "security": [], + "parameters": [ + { + "description": "the user attribute UUID to remove", + "in": "path", + "name": "userAttributeUuid", + "required": true, + "schema": { + "type": "string" + } + } + ] + } + }, + "/api/v1/user": { + "get": { + "operationId": "GetAuthenticatedUser", + "responses": { + "200": { + "description": "Ok", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiGetAuthenticatedUserResponse" + } + } + } + }, + "default": { + "description": "Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorPayload" + } + } + } + } + }, + "description": "Get authenticated user", + "tags": ["My Account"], + "security": [], + "parameters": [] + }, + "post": { + "operationId": "RegisterUser", + "responses": { + "200": { + "description": "Ok", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiRegisterUserResponse" + } + } + } + }, + "default": { + "description": "Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorPayload" + } + } + } + } + }, + "description": "Register user", + "tags": ["My Account"], + "security": [], + "parameters": [], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/RegisterOrActivateUser" + } + } + } + } + } + }, + "/api/v1/user/me/email/otp": { + "put": { + "operationId": "CreateEmailOneTimePasscode", + "responses": { + "200": { + "description": "Ok", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiEmailStatusResponse" + } + } + } + }, + "default": { + "description": "Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorPayload" + } + } + } + } + }, + "description": "Create a new one-time passcode for the current user's primary email.\nThe user will receive an email with the passcode.", + "tags": ["My Account"], + "security": [], + "parameters": [] + } + }, + "/api/v1/user/me/email/status": { + "get": { + "operationId": "GetEmailVerificationStatus", + "responses": { + "200": { + "description": "Ok", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiEmailStatusResponse" + } + } + } + }, + "default": { + "description": "Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorPayload" + } + } + } + } + }, + "description": "Get the verification status for the current user's primary email", + "tags": ["My Account"], + "security": [], + "parameters": [ + { + "description": "the one-time passcode sent to the user's primary email", + "in": "query", + "name": "passcode", + "required": false, + "schema": { + "type": "string" + } + } + ] + } + }, + "/api/v1/user/me/allowedOrganizations": { + "get": { + "operationId": "ListMyAvailableOrganizations", + "responses": { + "200": { + "description": "Ok", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiUserAllowedOrganizationsResponse" + } + } + } + }, + "default": { + "description": "Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorPayload" + } + } + } + } + }, + "description": "List the organizations that the current user can join.\nThis is based on the user's primary email domain and the organization's allowed email domains.", + "tags": ["My Account"], + "security": [], + "parameters": [] + } + }, + "/api/v1/user/me/joinOrganization/{organizationUuid}": { + "post": { + "operationId": "JoinOrganization", + "responses": { + "200": { + "description": "Ok", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiSuccessEmpty" + } + } + } + }, + "default": { + "description": "Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorPayload" + } + } + } + } + }, + "description": "Add the current user to an organization that accepts users with a verified email domain.\nThis will fail if the organization email domain does not match the user's primary email domain.", + "tags": ["My Account"], + "security": [], + "parameters": [ + { + "description": "the uuid of the organization to join", + "in": "path", + "name": "organizationUuid", + "required": true, + "schema": { + "type": "string" + } + } + ] + } + }, + "/api/v1/user/me": { + "delete": { + "operationId": "DeleteMe", + "responses": { + "200": { + "description": "Ok", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiSuccessEmpty" + } + } + } + }, + "default": { + "description": "Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorPayload" + } + } + } + } + }, + "description": "Delete user", + "tags": ["My Account"], + "security": [], + "parameters": [] + } + }, + "/api/v1/user/warehouseCredentials": { + "get": { + "operationId": "getWarehouseCredentials", + "responses": { + "200": { + "description": "Ok", + "content": { + "application/json": { + "schema": { + "properties": { + "results": { + "items": { + "$ref": "#/components/schemas/UserWarehouseCredentials" + }, + "type": "array" + }, + "status": { + "type": "string", + "enum": ["ok"], + "nullable": false + } + }, + "required": ["results", "status"], + "type": "object" + } + } + } + }, + "default": { + "description": "Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorPayload" + } + } + } + } + }, + "description": "Get user warehouse credentials", + "tags": ["My Account"], + "security": [], + "parameters": [] + }, + "post": { + "operationId": "createWarehouseCredentials", + "responses": { + "200": { + "description": "Ok", + "content": { + "application/json": { + "schema": { + "properties": { + "results": { + "$ref": "#/components/schemas/UserWarehouseCredentials" + }, + "status": { + "type": "string", + "enum": ["ok"], + "nullable": false + } + }, + "required": ["results", "status"], + "type": "object" + } + } + } + }, + "default": { + "description": "Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorPayload" + } + } + } + } + }, + "description": "Create user warehouse credentials", + "tags": ["My Account"], + "security": [], + "parameters": [], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpsertUserWarehouseCredentials" + } + } + } + } + } + }, + "/api/v1/user/warehouseCredentials/{uuid}": { + "patch": { + "operationId": "updateWarehouseCredentials", + "responses": { + "200": { + "description": "Ok", + "content": { + "application/json": { + "schema": { + "properties": { + "results": { + "$ref": "#/components/schemas/UserWarehouseCredentials" + }, + "status": { + "type": "string", + "enum": ["ok"], + "nullable": false + } + }, + "required": ["results", "status"], + "type": "object" + } + } + } + }, + "default": { + "description": "Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorPayload" + } + } + } + } + }, + "description": "Update user warehouse credentials", + "tags": ["My Account"], + "security": [], + "parameters": [ + { + "in": "path", + "name": "uuid", + "required": true, + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpsertUserWarehouseCredentials" + } + } + } + } + }, + "delete": { + "operationId": "deleteWarehouseCredentials", + "responses": { + "200": { + "description": "Ok", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiSuccessEmpty" + } + } + } + }, + "default": { + "description": "Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorPayload" + } + } + } + } + }, + "description": "Delete user warehouse credentials", + "tags": ["My Account"], + "security": [], + "parameters": [ + { + "in": "path", + "name": "uuid", + "required": true, + "schema": { + "type": "string" + } + } + ] + } + }, + "/api/v1/user/login-options": { + "get": { + "operationId": "getLoginOptions", + "responses": { + "200": { + "description": "Ok", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiGetLoginOptionsResponse" + } + } + } + }, + "default": { + "description": "Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorPayload" + } + } + } + } + }, + "description": "Get login options", + "tags": ["My Account"], + "security": [], + "parameters": [ + { + "in": "query", + "name": "email", + "required": false, + "schema": { + "type": "string" + } + } + ] + } + }, + "/api/v1/user/me/personal-access-tokens/{personalAccessTokenUuid}/rotate": { + "patch": { + "operationId": "Rotate personal access token", + "responses": { + "200": { + "description": "Success", + "content": { + "application/json": { + "schema": { + "properties": { + "results": { + "$ref": "#/components/schemas/PersonalAccessTokenWithToken" + }, + "status": { + "type": "string", + "enum": ["ok"], + "nullable": false + } + }, + "required": ["results", "status"], + "type": "object" + } + } + } + }, + "default": { + "description": "Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorPayload" + } + } + } + } + }, + "description": "Rotate personal access token", + "tags": ["My Account"], + "security": [], + "parameters": [ + { + "in": "path", + "name": "personalAccessTokenUuid", + "required": true, + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "properties": { + "expiresAt": { + "type": "string", + "format": "date-time" + } + }, + "required": ["expiresAt"], + "type": "object" + } + } + } + } + } + }, + "/api/v1/projects/{projectUuid}/validate": { + "post": { + "operationId": "ValidateProject", + "responses": { + "200": { + "description": "Success", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiJobScheduledResponse" + } + } + } + }, + "default": { + "description": "Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorPayload" + } + } + } + } + }, + "description": "Validate content inside a project. This will start a validation job and return the job id.\n\nValidation jobs scan all charts and dashboards inside a project to find any broken references\nto metrics or dimensions that aren't available. Results are available after the job is completed.", + "tags": ["Projects"], + "security": [], + "parameters": [ + { + "description": "the projectId for the validation", + "in": "path", + "name": "projectUuid", + "required": true, + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "description": "the compiled explores to validate against an existing project, this is used in the CLI to validate a project without creating a preview", + "required": true, + "content": { + "application/json": { + "schema": { + "properties": { + "validationTargets": { + "items": { + "$ref": "#/components/schemas/ValidationTarget" + }, + "type": "array" + }, + "explores": { + "items": {}, + "type": "array" + } + }, + "type": "object", + "description": "the compiled explores to validate against an existing project, this is used in the CLI to validate a project without creating a preview" + } + } + } + } + }, + "get": { + "operationId": "GetLatestValidationResults", + "responses": { + "200": { + "description": "Success", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiValidateResponse" + } + } + } + }, + "default": { + "description": "Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorPayload" + } + } + } + } + }, + "description": "Get validation results for a project. This will return the results of the latest validation job.", + "tags": ["Projects"], + "security": [], + "parameters": [ + { + "description": "the projectId for the validation", + "in": "path", + "name": "projectUuid", + "required": true, + "schema": { + "type": "string" + } + }, + { + "description": "boolean to know if this request is made from the settings page, for analytics", + "in": "query", + "name": "fromSettings", + "required": false, + "schema": { + "type": "boolean" + } + }, + { + "description": "optional jobId to get results for a specific job, used on CLI", + "in": "query", + "name": "jobId", + "required": false, + "schema": { + "type": "string" + } + } + ] + } + }, + "/api/v1/projects/{projectUuid}/validate/{validationId}": { + "delete": { + "operationId": "DeleteValidationDismiss", + "responses": { + "200": { + "description": "Success", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiValidationDismissResponse" + } + } + } + }, + "default": { + "description": "Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorPayload" + } + } + } + } + }, + "description": "Deletes a single validation error.", + "tags": ["Projects"], + "security": [], + "parameters": [ + { + "in": "path", + "name": "projectUuid", + "required": true, + "schema": { + "type": "string" + } + }, + { + "description": "the projectId for the validation", + "in": "path", + "name": "validationId", + "required": true, + "schema": { + "format": "double", + "type": "number" + } + } + ] + } + } + }, + "servers": [ + { + "url": "/" + } + ], + "tags": [ + { + "name": "My Account", + "description": "These routes allow users to manage their own user account." + }, + { + "name": "Organizations", + "description": "Each user is a member of a single organization. These routes allow users to manage their organization. Most actions are only available to admin users." + }, + { + "name": "Projects", + "description": "Projects belong to a single organization. These routes allow users to manage their projects, browse content, and execute queries. Users inside an organization might have access to a project from an organization-level role or they might be granted access to a project directly." + }, + { + "name": "Spaces", + "description": "Spaces allow you to organize charts and dashboards within a project. They also allow granular access to content by allowing you to create private spaces, which are only accessible to the creator and admins." + }, + { + "name": "Roles & Permissions", + "description": "These routes allow users to manage roles and permissions for their organization.", + "externalDocs": { + "url": "https://docs.lightdash.com/references/roles" + } + } + ] +} diff --git a/yarn.lock b/yarn.lock new file mode 100644 index 0000000..ad7bc59 --- /dev/null +++ b/yarn.lock @@ -0,0 +1,10679 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@algolia/autocomplete-core@1.9.3": + version "1.9.3" + resolved "https://registry.yarnpkg.com/@algolia/autocomplete-core/-/autocomplete-core-1.9.3.tgz#1d56482a768c33aae0868c8533049e02e8961be7" + integrity sha512-009HdfugtGCdC4JdXUbVJClA0q0zh24yyePn+KUGk3rP7j8FEe/m5Yo/z65gn6nP/cM39PxpzqKrL7A6fP6PPw== + dependencies: + "@algolia/autocomplete-plugin-algolia-insights" "1.9.3" + "@algolia/autocomplete-shared" "1.9.3" + +"@algolia/autocomplete-plugin-algolia-insights@1.9.3": + version "1.9.3" + resolved "https://registry.yarnpkg.com/@algolia/autocomplete-plugin-algolia-insights/-/autocomplete-plugin-algolia-insights-1.9.3.tgz#9b7f8641052c8ead6d66c1623d444cbe19dde587" + integrity sha512-a/yTUkcO/Vyy+JffmAnTWbr4/90cLzw+CC3bRbhnULr/EM0fGNvM13oQQ14f2moLMcVDyAx/leczLlAOovhSZg== + dependencies: + "@algolia/autocomplete-shared" "1.9.3" + +"@algolia/autocomplete-preset-algolia@1.9.3": + version "1.9.3" + resolved "https://registry.yarnpkg.com/@algolia/autocomplete-preset-algolia/-/autocomplete-preset-algolia-1.9.3.tgz#64cca4a4304cfcad2cf730e83067e0c1b2f485da" + integrity sha512-d4qlt6YmrLMYy95n5TB52wtNDr6EgAIPH81dvvvW8UmuWRgxEtY0NJiPwl/h95JtG2vmRM804M0DSwMCNZlzRA== + dependencies: + "@algolia/autocomplete-shared" "1.9.3" + +"@algolia/autocomplete-shared@1.9.3": + version "1.9.3" + resolved "https://registry.yarnpkg.com/@algolia/autocomplete-shared/-/autocomplete-shared-1.9.3.tgz#2e22e830d36f0a9cf2c0ccd3c7f6d59435b77dfa" + integrity sha512-Wnm9E4Ye6Rl6sTTqjoymD+l8DjSTHsHboVRYrKgEt8Q7UHm9nYbqhN/i0fhUYA3OAEH7WA8x3jfpnmJm3rKvaQ== + +"@algolia/cache-browser-local-storage@4.22.0": + version "4.22.0" + resolved "https://registry.yarnpkg.com/@algolia/cache-browser-local-storage/-/cache-browser-local-storage-4.22.0.tgz#548e3f9524988bbe0c14b7fc7b2a66335520eeb7" + integrity sha512-uZ1uZMLDZb4qODLfTSNHxSi4fH9RdrQf7DXEzW01dS8XK7QFtFh29N5NGKa9S+Yudf1vUMIF+/RiL4i/J0pWlQ== + dependencies: + "@algolia/cache-common" "4.22.0" + +"@algolia/cache-common@4.22.0": + version "4.22.0" + resolved "https://registry.yarnpkg.com/@algolia/cache-common/-/cache-common-4.22.0.tgz#83d6111caac74a71bebe5fc050a3b64f3e45d037" + integrity sha512-TPwUMlIGPN16eW67qamNQUmxNiGHg/WBqWcrOoCddhqNTqGDPVqmgfaM85LPbt24t3r1z0zEz/tdsmuq3Q6oaA== + +"@algolia/cache-in-memory@4.22.0": + version "4.22.0" + resolved "https://registry.yarnpkg.com/@algolia/cache-in-memory/-/cache-in-memory-4.22.0.tgz#ff86b08d8c80a9402f39e5c64cef2ba8299bbe1d" + integrity sha512-kf4Cio9NpPjzp1+uXQgL4jsMDeck7MP89BYThSvXSjf2A6qV/0KeqQf90TL2ECS02ovLOBXkk98P7qVarM+zGA== + dependencies: + "@algolia/cache-common" "4.22.0" + +"@algolia/client-account@4.22.0": + version "4.22.0" + resolved "https://registry.yarnpkg.com/@algolia/client-account/-/client-account-4.22.0.tgz#d7fa001dc062dca446f0620281fc0cec7c850487" + integrity sha512-Bjb5UXpWmJT+yGWiqAJL0prkENyEZTBzdC+N1vBuHjwIJcjLMjPB6j1hNBRbT12Lmwi55uzqeMIKS69w+0aPzA== + dependencies: + "@algolia/client-common" "4.22.0" + "@algolia/client-search" "4.22.0" + "@algolia/transporter" "4.22.0" + +"@algolia/client-analytics@4.22.0": + version "4.22.0" + resolved "https://registry.yarnpkg.com/@algolia/client-analytics/-/client-analytics-4.22.0.tgz#ea10e73d649aa1b9a1a25a786300d241fd4ad0d1" + integrity sha512-os2K+kHUcwwRa4ArFl5p/3YbF9lN3TLOPkbXXXxOvDpqFh62n9IRZuzfxpHxMPKAQS3Et1s0BkKavnNP02E9Hg== + dependencies: + "@algolia/client-common" "4.22.0" + "@algolia/client-search" "4.22.0" + "@algolia/requester-common" "4.22.0" + "@algolia/transporter" "4.22.0" + +"@algolia/client-common@4.22.0": + version "4.22.0" + resolved "https://registry.yarnpkg.com/@algolia/client-common/-/client-common-4.22.0.tgz#4bf298acec78fa988a5b829748e6c488b8a6b570" + integrity sha512-BlbkF4qXVWuwTmYxVWvqtatCR3lzXwxx628p1wj1Q7QP2+LsTmGt1DiUYRuy9jG7iMsnlExby6kRMOOlbhv2Ag== + dependencies: + "@algolia/requester-common" "4.22.0" + "@algolia/transporter" "4.22.0" + +"@algolia/client-personalization@4.22.0": + version "4.22.0" + resolved "https://registry.yarnpkg.com/@algolia/client-personalization/-/client-personalization-4.22.0.tgz#210c7d196b3c31da45e16db6ed98a7594fcf5e1c" + integrity sha512-pEOftCxeBdG5pL97WngOBi9w5Vxr5KCV2j2D+xMVZH8MuU/JX7CglDSDDb0ffQWYqcUN+40Ry+xtXEYaGXTGow== + dependencies: + "@algolia/client-common" "4.22.0" + "@algolia/requester-common" "4.22.0" + "@algolia/transporter" "4.22.0" + +"@algolia/client-search@4.22.0": + version "4.22.0" + resolved "https://registry.yarnpkg.com/@algolia/client-search/-/client-search-4.22.0.tgz#1113332cf973ce69067b741a17e8f798d71e07db" + integrity sha512-bn4qQiIdRPBGCwsNuuqB8rdHhGKKWIij9OqidM1UkQxnSG8yzxHdb7CujM30pvp5EnV7jTqDZRbxacbjYVW20Q== + dependencies: + "@algolia/client-common" "4.22.0" + "@algolia/requester-common" "4.22.0" + "@algolia/transporter" "4.22.0" + +"@algolia/events@^4.0.1": + version "4.0.1" + resolved "https://registry.yarnpkg.com/@algolia/events/-/events-4.0.1.tgz#fd39e7477e7bc703d7f893b556f676c032af3950" + integrity sha512-FQzvOCgoFXAbf5Y6mYozw2aj5KCJoA3m4heImceldzPSMbdyS4atVjJzXKMsfX3wnZTFYwkkt8/z8UesLHlSBQ== + +"@algolia/logger-common@4.22.0": + version "4.22.0" + resolved "https://registry.yarnpkg.com/@algolia/logger-common/-/logger-common-4.22.0.tgz#f9498729ca5b0e9c0bd1b8dd729edd91ddd02b5c" + integrity sha512-HMUQTID0ucxNCXs5d1eBJ5q/HuKg8rFVE/vOiLaM4Abfeq1YnTtGV3+rFEhOPWhRQxNDd+YHa4q864IMc0zHpQ== + +"@algolia/logger-console@4.22.0": + version "4.22.0" + resolved "https://registry.yarnpkg.com/@algolia/logger-console/-/logger-console-4.22.0.tgz#52e62b98fc01b40d6677b0ddf656b342e89f13c2" + integrity sha512-7JKb6hgcY64H7CRm3u6DRAiiEVXMvCJV5gRE672QFOUgDxo4aiDpfU61g6Uzy8NKjlEzHMmgG4e2fklELmPXhQ== + dependencies: + "@algolia/logger-common" "4.22.0" + +"@algolia/requester-browser-xhr@4.22.0": + version "4.22.0" + resolved "https://registry.yarnpkg.com/@algolia/requester-browser-xhr/-/requester-browser-xhr-4.22.0.tgz#ca16e4c6860458477a00b440a407c81591f14b8a" + integrity sha512-BHfv1h7P9/SyvcDJDaRuIwDu2yrDLlXlYmjvaLZTtPw6Ok/ZVhBR55JqW832XN/Fsl6k3LjdkYHHR7xnsa5Wvg== + dependencies: + "@algolia/requester-common" "4.22.0" + +"@algolia/requester-common@4.22.0": + version "4.22.0" + resolved "https://registry.yarnpkg.com/@algolia/requester-common/-/requester-common-4.22.0.tgz#d7a8283f5b77550eeab353c571a6566adf552fa7" + integrity sha512-Y9cEH/cKjIIZgzvI1aI0ARdtR/xRrOR13g5psCxkdhpgRN0Vcorx+zePhmAa4jdQNqexpxtkUdcKYugBzMZJgQ== + +"@algolia/requester-node-http@4.22.0": + version "4.22.0" + resolved "https://registry.yarnpkg.com/@algolia/requester-node-http/-/requester-node-http-4.22.0.tgz#41d5e7d5dc7adb930e7fe8dcd9d39bfc378cc5f5" + integrity sha512-8xHoGpxVhz3u2MYIieHIB6MsnX+vfd5PS4REgglejJ6lPigftRhTdBCToe6zbwq4p0anZXjjPDvNWMlgK2+xYA== + dependencies: + "@algolia/requester-common" "4.22.0" + +"@algolia/transporter@4.22.0": + version "4.22.0" + resolved "https://registry.yarnpkg.com/@algolia/transporter/-/transporter-4.22.0.tgz#733385f6457408228d2a4d7a4fe4e2b1599a5d33" + integrity sha512-ieO1k8x2o77GNvOoC+vAkFKppydQSVfbjM3YrSjLmgywiBejPTvU1R1nEvG59JIIUvtSLrZsLGPkd6vL14zopA== + dependencies: + "@algolia/cache-common" "4.22.0" + "@algolia/logger-common" "4.22.0" + "@algolia/requester-common" "4.22.0" + +"@ampproject/remapping@^2.2.0": + version "2.2.1" + resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.2.1.tgz#99e8e11851128b8702cd57c33684f1d0f260b630" + integrity sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg== + dependencies: + "@jridgewell/gen-mapping" "^0.3.0" + "@jridgewell/trace-mapping" "^0.3.9" + +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4", "@babel/code-frame@^7.16.0", "@babel/code-frame@^7.22.13", "@babel/code-frame@^7.23.5", "@babel/code-frame@^7.8.3": + version "7.23.5" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.23.5.tgz#9009b69a8c602293476ad598ff53e4562e15c244" + integrity sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA== + dependencies: + "@babel/highlight" "^7.23.4" + chalk "^2.4.2" + +"@babel/compat-data@^7.22.6", "@babel/compat-data@^7.23.3", "@babel/compat-data@^7.23.5": + version "7.23.5" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.23.5.tgz#ffb878728bb6bdcb6f4510aa51b1be9afb8cfd98" + integrity sha512-uU27kfDRlhfKl+w1U6vp16IuvSLtjAxdArVXPa9BvLkrr7CYIsxH5adpHObeAGY/41+syctUWOZ140a2Rvkgjw== + +"@babel/core@7.12.9": + version "7.12.9" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.12.9.tgz#fd450c4ec10cdbb980e2928b7aa7a28484593fc8" + integrity sha512-gTXYh3M5wb7FRXQy+FErKFAv90BnlOuNn1QkCK2lREoPAjrQCO49+HVSrFoe5uakFAF5eenS75KbO2vQiLrTMQ== + dependencies: + "@babel/code-frame" "^7.10.4" + "@babel/generator" "^7.12.5" + "@babel/helper-module-transforms" "^7.12.1" + "@babel/helpers" "^7.12.5" + "@babel/parser" "^7.12.7" + "@babel/template" "^7.12.7" + "@babel/traverse" "^7.12.9" + "@babel/types" "^7.12.7" + convert-source-map "^1.7.0" + debug "^4.1.0" + gensync "^1.0.0-beta.1" + json5 "^2.1.2" + lodash "^4.17.19" + resolve "^1.3.2" + semver "^5.4.1" + source-map "^0.5.0" + +"@babel/core@^7.18.6", "@babel/core@^7.19.6", "@babel/core@^7.21.3", "@babel/core@^7.23.3": + version "7.23.7" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.23.7.tgz#4d8016e06a14b5f92530a13ed0561730b5c6483f" + integrity sha512-+UpDgowcmqe36d4NwqvKsyPMlOLNGMsfMmQ5WGCu+siCe3t3dfe9njrzGfdN4qq+bcNUt0+Vw6haRxBOycs4dw== + dependencies: + "@ampproject/remapping" "^2.2.0" + "@babel/code-frame" "^7.23.5" + "@babel/generator" "^7.23.6" + "@babel/helper-compilation-targets" "^7.23.6" + "@babel/helper-module-transforms" "^7.23.3" + "@babel/helpers" "^7.23.7" + "@babel/parser" "^7.23.6" + "@babel/template" "^7.22.15" + "@babel/traverse" "^7.23.7" + "@babel/types" "^7.23.6" + convert-source-map "^2.0.0" + debug "^4.1.0" + gensync "^1.0.0-beta.2" + json5 "^2.2.3" + semver "^6.3.1" + +"@babel/generator@^7.12.5", "@babel/generator@^7.18.7", "@babel/generator@^7.23.3", "@babel/generator@^7.23.6": + version "7.23.6" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.23.6.tgz#9e1fca4811c77a10580d17d26b57b036133f3c2e" + integrity sha512-qrSfCYxYQB5owCmGLbl8XRpX1ytXlpueOb0N0UmQwA073KZxejgQTzAmJezxvpwQD9uGtK2shHdi55QT+MbjIw== + dependencies: + "@babel/types" "^7.23.6" + "@jridgewell/gen-mapping" "^0.3.2" + "@jridgewell/trace-mapping" "^0.3.17" + jsesc "^2.5.1" + +"@babel/helper-annotate-as-pure@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz#e7f06737b197d580a01edf75d97e2c8be99d3882" + integrity sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg== + dependencies: + "@babel/types" "^7.22.5" + +"@babel/helper-builder-binary-assignment-operator-visitor@^7.22.15": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.22.15.tgz#5426b109cf3ad47b91120f8328d8ab1be8b0b956" + integrity sha512-QkBXwGgaoC2GtGZRoma6kv7Szfv06khvhFav67ZExau2RaXzy8MpHSMO2PNoP2XtmQphJQRHFfg77Bq731Yizw== + dependencies: + "@babel/types" "^7.22.15" + +"@babel/helper-compilation-targets@^7.22.15", "@babel/helper-compilation-targets@^7.22.6", "@babel/helper-compilation-targets@^7.23.6": + version "7.23.6" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.23.6.tgz#4d79069b16cbcf1461289eccfbbd81501ae39991" + integrity sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ== + dependencies: + "@babel/compat-data" "^7.23.5" + "@babel/helper-validator-option" "^7.23.5" + browserslist "^4.22.2" + lru-cache "^5.1.1" + semver "^6.3.1" + +"@babel/helper-create-class-features-plugin@^7.22.15", "@babel/helper-create-class-features-plugin@^7.23.6": + version "7.23.7" + resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.23.7.tgz#b2e6826e0e20d337143655198b79d58fdc9bd43d" + integrity sha512-xCoqR/8+BoNnXOY7RVSgv6X+o7pmT5q1d+gGcRlXYkI+9B31glE4jeejhKVpA04O1AtzOt7OSQ6VYKP5FcRl9g== + dependencies: + "@babel/helper-annotate-as-pure" "^7.22.5" + "@babel/helper-environment-visitor" "^7.22.20" + "@babel/helper-function-name" "^7.23.0" + "@babel/helper-member-expression-to-functions" "^7.23.0" + "@babel/helper-optimise-call-expression" "^7.22.5" + "@babel/helper-replace-supers" "^7.22.20" + "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" + "@babel/helper-split-export-declaration" "^7.22.6" + semver "^6.3.1" + +"@babel/helper-create-regexp-features-plugin@^7.18.6", "@babel/helper-create-regexp-features-plugin@^7.22.15", "@babel/helper-create-regexp-features-plugin@^7.22.5": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.15.tgz#5ee90093914ea09639b01c711db0d6775e558be1" + integrity sha512-29FkPLFjn4TPEa3RE7GpW+qbE8tlsu3jntNYNfcGsc49LphF1PQIiD+vMZ1z1xVOKt+93khA9tc2JBs3kBjA7w== + dependencies: + "@babel/helper-annotate-as-pure" "^7.22.5" + regexpu-core "^5.3.1" + semver "^6.3.1" + +"@babel/helper-define-polyfill-provider@^0.4.4": + version "0.4.4" + resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.4.4.tgz#64df615451cb30e94b59a9696022cffac9a10088" + integrity sha512-QcJMILQCu2jm5TFPGA3lCpJJTeEP+mqeXooG/NZbg/h5FTFi6V0+99ahlRsW8/kRLyb24LZVCCiclDedhLKcBA== + dependencies: + "@babel/helper-compilation-targets" "^7.22.6" + "@babel/helper-plugin-utils" "^7.22.5" + debug "^4.1.1" + lodash.debounce "^4.0.8" + resolve "^1.14.2" + +"@babel/helper-environment-visitor@^7.22.20": + version "7.22.20" + resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz#96159db61d34a29dba454c959f5ae4a649ba9167" + integrity sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA== + +"@babel/helper-function-name@^7.22.5", "@babel/helper-function-name@^7.23.0": + version "7.23.0" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz#1f9a3cdbd5b2698a670c30d2735f9af95ed52759" + integrity sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw== + dependencies: + "@babel/template" "^7.22.15" + "@babel/types" "^7.23.0" + +"@babel/helper-hoist-variables@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz#c01a007dac05c085914e8fb652b339db50d823bb" + integrity sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw== + dependencies: + "@babel/types" "^7.22.5" + +"@babel/helper-member-expression-to-functions@^7.22.15", "@babel/helper-member-expression-to-functions@^7.23.0": + version "7.23.0" + resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.23.0.tgz#9263e88cc5e41d39ec18c9a3e0eced59a3e7d366" + integrity sha512-6gfrPwh7OuT6gZyJZvd6WbTfrqAo7vm4xCzAXOusKqq/vWdKXphTpj5klHKNmRUU6/QRGlBsyU9mAIPaWHlqJA== + dependencies: + "@babel/types" "^7.23.0" + +"@babel/helper-module-imports@^7.22.15": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz#16146307acdc40cc00c3b2c647713076464bdbf0" + integrity sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w== + dependencies: + "@babel/types" "^7.22.15" + +"@babel/helper-module-transforms@^7.12.1", "@babel/helper-module-transforms@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz#d7d12c3c5d30af5b3c0fcab2a6d5217773e2d0f1" + integrity sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ== + dependencies: + "@babel/helper-environment-visitor" "^7.22.20" + "@babel/helper-module-imports" "^7.22.15" + "@babel/helper-simple-access" "^7.22.5" + "@babel/helper-split-export-declaration" "^7.22.6" + "@babel/helper-validator-identifier" "^7.22.20" + +"@babel/helper-optimise-call-expression@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.22.5.tgz#f21531a9ccbff644fdd156b4077c16ff0c3f609e" + integrity sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw== + dependencies: + "@babel/types" "^7.22.5" + +"@babel/helper-plugin-utils@7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz#2f75a831269d4f677de49986dff59927533cf375" + integrity sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg== + +"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.22.5", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz#dd7ee3735e8a313b9f7b05a773d892e88e6d7295" + integrity sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg== + +"@babel/helper-remap-async-to-generator@^7.22.20": + version "7.22.20" + resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.20.tgz#7b68e1cb4fa964d2996fd063723fb48eca8498e0" + integrity sha512-pBGyV4uBqOns+0UvhsTO8qgl8hO89PmiDYv+/COyp1aeMcmfrfruz+/nCMFiYyFF/Knn0yfrC85ZzNFjembFTw== + dependencies: + "@babel/helper-annotate-as-pure" "^7.22.5" + "@babel/helper-environment-visitor" "^7.22.20" + "@babel/helper-wrap-function" "^7.22.20" + +"@babel/helper-replace-supers@^7.22.20": + version "7.22.20" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.22.20.tgz#e37d367123ca98fe455a9887734ed2e16eb7a793" + integrity sha512-qsW0In3dbwQUbK8kejJ4R7IHVGwHJlV6lpG6UA7a9hSa2YEiAib+N1T2kr6PEeUT+Fl7najmSOS6SmAwCHK6Tw== + dependencies: + "@babel/helper-environment-visitor" "^7.22.20" + "@babel/helper-member-expression-to-functions" "^7.22.15" + "@babel/helper-optimise-call-expression" "^7.22.5" + +"@babel/helper-simple-access@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz#4938357dc7d782b80ed6dbb03a0fba3d22b1d5de" + integrity sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w== + dependencies: + "@babel/types" "^7.22.5" + +"@babel/helper-skip-transparent-expression-wrappers@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.22.5.tgz#007f15240b5751c537c40e77abb4e89eeaaa8847" + integrity sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q== + dependencies: + "@babel/types" "^7.22.5" + +"@babel/helper-split-export-declaration@^7.22.6": + version "7.22.6" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz#322c61b7310c0997fe4c323955667f18fcefb91c" + integrity sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g== + dependencies: + "@babel/types" "^7.22.5" + +"@babel/helper-string-parser@^7.23.4": + version "7.23.4" + resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.23.4.tgz#9478c707febcbbe1ddb38a3d91a2e054ae622d83" + integrity sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ== + +"@babel/helper-validator-identifier@^7.22.20": + version "7.22.20" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz#c4ae002c61d2879e724581d96665583dbc1dc0e0" + integrity sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A== + +"@babel/helper-validator-option@^7.22.15", "@babel/helper-validator-option@^7.23.5": + version "7.23.5" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz#907a3fbd4523426285365d1206c423c4c5520307" + integrity sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw== + +"@babel/helper-wrap-function@^7.22.20": + version "7.22.20" + resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.22.20.tgz#15352b0b9bfb10fc9c76f79f6342c00e3411a569" + integrity sha512-pms/UwkOpnQe/PDAEdV/d7dVCoBbB+R4FvYoHGZz+4VPcg7RtYy2KP7S2lbuWM6FCSgob5wshfGESbC/hzNXZw== + dependencies: + "@babel/helper-function-name" "^7.22.5" + "@babel/template" "^7.22.15" + "@babel/types" "^7.22.19" + +"@babel/helpers@^7.12.5", "@babel/helpers@^7.23.7": + version "7.23.7" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.23.7.tgz#eb543c36f81da2873e47b76ee032343ac83bba60" + integrity sha512-6AMnjCoC8wjqBzDHkuqpa7jAKwvMo4dC+lr/TFBz+ucfulO1XMpDnwWPGBNwClOKZ8h6xn5N81W/R5OrcKtCbQ== + dependencies: + "@babel/template" "^7.22.15" + "@babel/traverse" "^7.23.7" + "@babel/types" "^7.23.6" + +"@babel/highlight@^7.23.4": + version "7.23.4" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.23.4.tgz#edaadf4d8232e1a961432db785091207ead0621b" + integrity sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A== + dependencies: + "@babel/helper-validator-identifier" "^7.22.20" + chalk "^2.4.2" + js-tokens "^4.0.0" + +"@babel/parser@^7.12.7", "@babel/parser@^7.18.8", "@babel/parser@^7.22.15", "@babel/parser@^7.22.7", "@babel/parser@^7.23.6": + version "7.23.6" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.23.6.tgz#ba1c9e512bda72a47e285ae42aff9d2a635a9e3b" + integrity sha512-Z2uID7YJ7oNvAI20O9X0bblw7Qqs8Q2hFy0R9tAfnfLkp5MW0UH9eUvnDSnFwKZ0AvgS1ucqR4KzvVHgnke1VQ== + +"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.23.3.tgz#5cd1c87ba9380d0afb78469292c954fee5d2411a" + integrity sha512-iRkKcCqb7iGnq9+3G6rZ+Ciz5VywC4XNRHe57lKM+jOeYAoR0lVqdeeDRfh0tQcTfw/+vBhHn926FmQhLtlFLQ== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.23.3.tgz#f6652bb16b94f8f9c20c50941e16e9756898dc5d" + integrity sha512-WwlxbfMNdVEpQjZmK5mhm7oSwD3dS6eU+Iwsi4Knl9wAletWem7kaRsGOG+8UEbRyqxY4SS5zvtfXwX+jMxUwQ== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" + "@babel/plugin-transform-optional-chaining" "^7.23.3" + +"@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@^7.23.7": + version "7.23.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.23.7.tgz#516462a95d10a9618f197d39ad291a9b47ae1d7b" + integrity sha512-LlRT7HgaifEpQA1ZgLVOIJZZFVPWN5iReq/7/JixwBtwcoeVGDBD53ZV28rrsLYOZs1Y/EHhA8N/Z6aazHR8cw== + dependencies: + "@babel/helper-environment-visitor" "^7.22.20" + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-proposal-object-rest-spread@7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.12.1.tgz#def9bd03cea0f9b72283dac0ec22d289c7691069" + integrity sha512-s6SowJIjzlhx8o7lsFx5zmY4At6CTtDvgNQDdPzkBQucle58A6b/TTeEBYtyDgmcXjUTM+vE8YOGHZzzbc/ioA== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/plugin-syntax-object-rest-spread" "^7.8.0" + "@babel/plugin-transform-parameters" "^7.12.1" + +"@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2": + version "7.21.0-placeholder-for-preset-env.2" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz#7844f9289546efa9febac2de4cfe358a050bd703" + integrity sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w== + +"@babel/plugin-syntax-async-generators@^7.8.4": + version "7.8.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz#a983fb1aeb2ec3f6ed042a210f640e90e786fe0d" + integrity sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-class-properties@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz#b5c987274c4a3a82b89714796931a6b53544ae10" + integrity sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA== + dependencies: + "@babel/helper-plugin-utils" "^7.12.13" + +"@babel/plugin-syntax-class-static-block@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz#195df89b146b4b78b3bf897fd7a257c84659d406" + integrity sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-syntax-dynamic-import@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz#62bf98b2da3cd21d626154fc96ee5b3cb68eacb3" + integrity sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-export-namespace-from@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz#028964a9ba80dbc094c915c487ad7c4e7a66465a" + integrity sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-syntax-import-assertions@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.23.3.tgz#9c05a7f592982aff1a2768260ad84bcd3f0c77fc" + integrity sha512-lPgDSU+SJLK3xmFDTV2ZRQAiM7UuUjGidwBywFavObCiZc1BeAAcMtHJKUya92hPHO+at63JJPLygilZard8jw== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-syntax-import-attributes@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.23.3.tgz#992aee922cf04512461d7dae3ff6951b90a2dc06" + integrity sha512-pawnE0P9g10xgoP7yKr6CK63K2FMsTE+FZidZO/1PwRdzmAPVs+HS1mAURUsgaoxammTJvULUdIkEK0gOcU2tA== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-syntax-import-meta@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz#ee601348c370fa334d2207be158777496521fd51" + integrity sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-syntax-json-strings@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz#01ca21b668cd8218c9e640cb6dd88c5412b2c96a" + integrity sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-jsx@7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.12.1.tgz#9d9d357cc818aa7ae7935917c1257f67677a0926" + integrity sha512-1yRi7yAtB0ETgxdY9ti/p2TivUxJkTdhu/ZbF9MshVGqOx1TdB3b7xCXs49Fupgg50N45KcAsRP/ZqWjs9SRjg== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-syntax-jsx@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.23.3.tgz#8f2e4f8a9b5f9aa16067e142c1ac9cd9f810f473" + integrity sha512-EB2MELswq55OHUoRZLGg/zC7QWUKfNLpE57m/S2yr1uEneIgsTgrSzXP3NXEsMkVn76OlaVVnzN+ugObuYGwhg== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-syntax-logical-assignment-operators@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz#ca91ef46303530448b906652bac2e9fe9941f699" + integrity sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-syntax-nullish-coalescing-operator@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz#167ed70368886081f74b5c36c65a88c03b66d1a9" + integrity sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-numeric-separator@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz#b9b070b3e33570cd9fd07ba7fa91c0dd37b9af97" + integrity sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-syntax-object-rest-spread@7.8.3", "@babel/plugin-syntax-object-rest-spread@^7.8.0", "@babel/plugin-syntax-object-rest-spread@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz#60e225edcbd98a640332a2e72dd3e66f1af55871" + integrity sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-optional-catch-binding@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz#6111a265bcfb020eb9efd0fdfd7d26402b9ed6c1" + integrity sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-optional-chaining@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz#4f69c2ab95167e0180cd5336613f8c5788f7d48a" + integrity sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-private-property-in-object@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz#0dc6671ec0ea22b6e94a1114f857970cd39de1ad" + integrity sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-syntax-top-level-await@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz#c1cfdadc35a646240001f06138247b741c34d94c" + integrity sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-syntax-typescript@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.23.3.tgz#24f460c85dbbc983cd2b9c4994178bcc01df958f" + integrity sha512-9EiNjVJOMwCO+43TqoTrgQ8jMwcAd0sWyXi9RPfIsLTj4R2MADDDQXELhffaUx/uJv2AYcxBgPwH6j4TIA4ytQ== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-syntax-unicode-sets-regex@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz#d49a3b3e6b52e5be6740022317580234a6a47357" + integrity sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-transform-arrow-functions@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.23.3.tgz#94c6dcfd731af90f27a79509f9ab7fb2120fc38b" + integrity sha512-NzQcQrzaQPkaEwoTm4Mhyl8jI1huEL/WWIEvudjTCMJ9aBZNpsJbMASx7EQECtQQPS/DcnFpo0FIh3LvEO9cxQ== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-async-generator-functions@^7.23.7": + version "7.23.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.23.7.tgz#3aa0b4f2fa3788b5226ef9346cf6d16ec61f99cd" + integrity sha512-PdxEpL71bJp1byMG0va5gwQcXHxuEYC/BgI/e88mGTtohbZN28O5Yit0Plkkm/dBzCF/BxmbNcses1RH1T+urA== + dependencies: + "@babel/helper-environment-visitor" "^7.22.20" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-remap-async-to-generator" "^7.22.20" + "@babel/plugin-syntax-async-generators" "^7.8.4" + +"@babel/plugin-transform-async-to-generator@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.23.3.tgz#d1f513c7a8a506d43f47df2bf25f9254b0b051fa" + integrity sha512-A7LFsKi4U4fomjqXJlZg/u0ft/n8/7n7lpffUP/ZULx/DtV9SGlNKZolHH6PE8Xl1ngCc0M11OaeZptXVkfKSw== + dependencies: + "@babel/helper-module-imports" "^7.22.15" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-remap-async-to-generator" "^7.22.20" + +"@babel/plugin-transform-block-scoped-functions@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.23.3.tgz#fe1177d715fb569663095e04f3598525d98e8c77" + integrity sha512-vI+0sIaPIO6CNuM9Kk5VmXcMVRiOpDh7w2zZt9GXzmE/9KD70CUEVhvPR/etAeNK/FAEkhxQtXOzVF3EuRL41A== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-block-scoping@^7.23.4": + version "7.23.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.23.4.tgz#b2d38589531c6c80fbe25e6b58e763622d2d3cf5" + integrity sha512-0QqbP6B6HOh7/8iNR4CQU2Th/bbRtBp4KS9vcaZd1fZ0wSh5Fyssg0UCIHwxh+ka+pNDREbVLQnHCMHKZfPwfw== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-class-properties@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.23.3.tgz#35c377db11ca92a785a718b6aa4e3ed1eb65dc48" + integrity sha512-uM+AN8yCIjDPccsKGlw271xjJtGii+xQIF/uMPS8H15L12jZTsLfF4o5vNO7d/oUguOyfdikHGc/yi9ge4SGIg== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.22.15" + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-class-static-block@^7.23.4": + version "7.23.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.23.4.tgz#2a202c8787a8964dd11dfcedf994d36bfc844ab5" + integrity sha512-nsWu/1M+ggti1SOALj3hfx5FXzAY06fwPJsUZD4/A5e1bWi46VUIWtD+kOX6/IdhXGsXBWllLFDSnqSCdUNydQ== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.22.15" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-class-static-block" "^7.14.5" + +"@babel/plugin-transform-classes@^7.23.5": + version "7.23.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.23.5.tgz#e7a75f815e0c534cc4c9a39c56636c84fc0d64f2" + integrity sha512-jvOTR4nicqYC9yzOHIhXG5emiFEOpappSJAl73SDSEDcybD+Puuze8Tnpb9p9qEyYup24tq891gkaygIFvWDqg== + dependencies: + "@babel/helper-annotate-as-pure" "^7.22.5" + "@babel/helper-compilation-targets" "^7.22.15" + "@babel/helper-environment-visitor" "^7.22.20" + "@babel/helper-function-name" "^7.23.0" + "@babel/helper-optimise-call-expression" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-replace-supers" "^7.22.20" + "@babel/helper-split-export-declaration" "^7.22.6" + globals "^11.1.0" + +"@babel/plugin-transform-computed-properties@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.23.3.tgz#652e69561fcc9d2b50ba4f7ac7f60dcf65e86474" + integrity sha512-dTj83UVTLw/+nbiHqQSFdwO9CbTtwq1DsDqm3CUEtDrZNET5rT5E6bIdTlOftDTDLMYxvxHNEYO4B9SLl8SLZw== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/template" "^7.22.15" + +"@babel/plugin-transform-destructuring@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.23.3.tgz#8c9ee68228b12ae3dff986e56ed1ba4f3c446311" + integrity sha512-n225npDqjDIr967cMScVKHXJs7rout1q+tt50inyBCPkyZ8KxeI6d+GIbSBTT/w/9WdlWDOej3V9HE5Lgk57gw== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-dotall-regex@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.23.3.tgz#3f7af6054882ede89c378d0cf889b854a993da50" + integrity sha512-vgnFYDHAKzFaTVp+mneDsIEbnJ2Np/9ng9iviHw3P/KVcgONxpNULEW/51Z/BaFojG2GI2GwwXck5uV1+1NOYQ== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.22.15" + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-duplicate-keys@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.23.3.tgz#664706ca0a5dfe8d066537f99032fc1dc8b720ce" + integrity sha512-RrqQ+BQmU3Oyav3J+7/myfvRCq7Tbz+kKLLshUmMwNlDHExbGL7ARhajvoBJEvc+fCguPPu887N+3RRXBVKZUA== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-dynamic-import@^7.23.4": + version "7.23.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.23.4.tgz#c7629e7254011ac3630d47d7f34ddd40ca535143" + integrity sha512-V6jIbLhdJK86MaLh4Jpghi8ho5fGzt3imHOBu/x0jlBaPYqDoWz4RDXjmMOfnh+JWNaQleEAByZLV0QzBT4YQQ== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-dynamic-import" "^7.8.3" + +"@babel/plugin-transform-exponentiation-operator@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.23.3.tgz#ea0d978f6b9232ba4722f3dbecdd18f450babd18" + integrity sha512-5fhCsl1odX96u7ILKHBj4/Y8vipoqwsJMh4csSA8qFfxrZDEA4Ssku2DyNvMJSmZNOEBT750LfFPbtrnTP90BQ== + dependencies: + "@babel/helper-builder-binary-assignment-operator-visitor" "^7.22.15" + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-export-namespace-from@^7.23.4": + version "7.23.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.23.4.tgz#084c7b25e9a5c8271e987a08cf85807b80283191" + integrity sha512-GzuSBcKkx62dGzZI1WVgTWvkkz84FZO5TC5T8dl/Tht/rAla6Dg/Mz9Yhypg+ezVACf/rgDuQt3kbWEv7LdUDQ== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-export-namespace-from" "^7.8.3" + +"@babel/plugin-transform-for-of@^7.23.6": + version "7.23.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.23.6.tgz#81c37e24171b37b370ba6aaffa7ac86bcb46f94e" + integrity sha512-aYH4ytZ0qSuBbpfhuofbg/e96oQ7U2w1Aw/UQmKT+1l39uEhUPoFS3fHevDc1G0OvewyDudfMKY1OulczHzWIw== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" + +"@babel/plugin-transform-function-name@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.23.3.tgz#8f424fcd862bf84cb9a1a6b42bc2f47ed630f8dc" + integrity sha512-I1QXp1LxIvt8yLaib49dRW5Okt7Q4oaxao6tFVKS/anCdEOMtYwWVKoiOA1p34GOWIZjUK0E+zCp7+l1pfQyiw== + dependencies: + "@babel/helper-compilation-targets" "^7.22.15" + "@babel/helper-function-name" "^7.23.0" + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-json-strings@^7.23.4": + version "7.23.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.23.4.tgz#a871d9b6bd171976efad2e43e694c961ffa3714d" + integrity sha512-81nTOqM1dMwZ/aRXQ59zVubN9wHGqk6UtqRK+/q+ciXmRy8fSolhGVvG09HHRGo4l6fr/c4ZhXUQH0uFW7PZbg== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-json-strings" "^7.8.3" + +"@babel/plugin-transform-literals@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.23.3.tgz#8214665f00506ead73de157eba233e7381f3beb4" + integrity sha512-wZ0PIXRxnwZvl9AYpqNUxpZ5BiTGrYt7kueGQ+N5FiQ7RCOD4cm8iShd6S6ggfVIWaJf2EMk8eRzAh52RfP4rQ== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-logical-assignment-operators@^7.23.4": + version "7.23.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.23.4.tgz#e599f82c51d55fac725f62ce55d3a0886279ecb5" + integrity sha512-Mc/ALf1rmZTP4JKKEhUwiORU+vcfarFVLfcFiolKUo6sewoxSEgl36ak5t+4WamRsNr6nzjZXQjM35WsU+9vbg== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" + +"@babel/plugin-transform-member-expression-literals@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.23.3.tgz#e37b3f0502289f477ac0e776b05a833d853cabcc" + integrity sha512-sC3LdDBDi5x96LA+Ytekz2ZPk8i/Ck+DEuDbRAll5rknJ5XRTSaPKEYwomLcs1AA8wg9b3KjIQRsnApj+q51Ag== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-modules-amd@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.23.3.tgz#e19b55436a1416829df0a1afc495deedfae17f7d" + integrity sha512-vJYQGxeKM4t8hYCKVBlZX/gtIY2I7mRGFNcm85sgXGMTBcoV3QdVtdpbcWEbzbfUIUZKwvgFT82mRvaQIebZzw== + dependencies: + "@babel/helper-module-transforms" "^7.23.3" + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-modules-commonjs@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.23.3.tgz#661ae831b9577e52be57dd8356b734f9700b53b4" + integrity sha512-aVS0F65LKsdNOtcz6FRCpE4OgsP2OFnW46qNxNIX9h3wuzaNcSQsJysuMwqSibC98HPrf2vCgtxKNwS0DAlgcA== + dependencies: + "@babel/helper-module-transforms" "^7.23.3" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-simple-access" "^7.22.5" + +"@babel/plugin-transform-modules-systemjs@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.23.3.tgz#fa7e62248931cb15b9404f8052581c302dd9de81" + integrity sha512-ZxyKGTkF9xT9YJuKQRo19ewf3pXpopuYQd8cDXqNzc3mUNbOME0RKMoZxviQk74hwzfQsEe66dE92MaZbdHKNQ== + dependencies: + "@babel/helper-hoist-variables" "^7.22.5" + "@babel/helper-module-transforms" "^7.23.3" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-validator-identifier" "^7.22.20" + +"@babel/plugin-transform-modules-umd@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.23.3.tgz#5d4395fccd071dfefe6585a4411aa7d6b7d769e9" + integrity sha512-zHsy9iXX2nIsCBFPud3jKn1IRPWg3Ing1qOZgeKV39m1ZgIdpJqvlWVeiHBZC6ITRG0MfskhYe9cLgntfSFPIg== + dependencies: + "@babel/helper-module-transforms" "^7.23.3" + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-named-capturing-groups-regex@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.22.5.tgz#67fe18ee8ce02d57c855185e27e3dc959b2e991f" + integrity sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-new-target@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.23.3.tgz#5491bb78ed6ac87e990957cea367eab781c4d980" + integrity sha512-YJ3xKqtJMAT5/TIZnpAR3I+K+WaDowYbN3xyxI8zxx/Gsypwf9B9h0VB+1Nh6ACAAPRS5NSRje0uVv5i79HYGQ== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-nullish-coalescing-operator@^7.23.4": + version "7.23.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.23.4.tgz#45556aad123fc6e52189ea749e33ce090637346e" + integrity sha512-jHE9EVVqHKAQx+VePv5LLGHjmHSJR76vawFPTdlxR/LVJPfOEGxREQwQfjuZEOPTwG92X3LINSh3M40Rv4zpVA== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" + +"@babel/plugin-transform-numeric-separator@^7.23.4": + version "7.23.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.23.4.tgz#03d08e3691e405804ecdd19dd278a40cca531f29" + integrity sha512-mps6auzgwjRrwKEZA05cOwuDc9FAzoyFS4ZsG/8F43bTLf/TgkJg7QXOrPO1JO599iA3qgK9MXdMGOEC8O1h6Q== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-numeric-separator" "^7.10.4" + +"@babel/plugin-transform-object-rest-spread@^7.23.4": + version "7.23.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.23.4.tgz#2b9c2d26bf62710460bdc0d1730d4f1048361b83" + integrity sha512-9x9K1YyeQVw0iOXJlIzwm8ltobIIv7j2iLyP2jIhEbqPRQ7ScNgwQufU2I0Gq11VjyG4gI4yMXt2VFags+1N3g== + dependencies: + "@babel/compat-data" "^7.23.3" + "@babel/helper-compilation-targets" "^7.22.15" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-object-rest-spread" "^7.8.3" + "@babel/plugin-transform-parameters" "^7.23.3" + +"@babel/plugin-transform-object-super@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.23.3.tgz#81fdb636dcb306dd2e4e8fd80db5b2362ed2ebcd" + integrity sha512-BwQ8q0x2JG+3lxCVFohg+KbQM7plfpBwThdW9A6TMtWwLsbDA01Ek2Zb/AgDN39BiZsExm4qrXxjk+P1/fzGrA== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-replace-supers" "^7.22.20" + +"@babel/plugin-transform-optional-catch-binding@^7.23.4": + version "7.23.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.23.4.tgz#318066de6dacce7d92fa244ae475aa8d91778017" + integrity sha512-XIq8t0rJPHf6Wvmbn9nFxU6ao4c7WhghTR5WyV8SrJfUFzyxhCm4nhC+iAp3HFhbAKLfYpgzhJ6t4XCtVwqO5A== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" + +"@babel/plugin-transform-optional-chaining@^7.23.3", "@babel/plugin-transform-optional-chaining@^7.23.4": + version "7.23.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.23.4.tgz#6acf61203bdfc4de9d4e52e64490aeb3e52bd017" + integrity sha512-ZU8y5zWOfjM5vZ+asjgAPwDaBjJzgufjES89Rs4Lpq63O300R/kOz30WCLo6BxxX6QVEilwSlpClnG5cZaikTA== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" + "@babel/plugin-syntax-optional-chaining" "^7.8.3" + +"@babel/plugin-transform-parameters@^7.12.1", "@babel/plugin-transform-parameters@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.23.3.tgz#83ef5d1baf4b1072fa6e54b2b0999a7b2527e2af" + integrity sha512-09lMt6UsUb3/34BbECKVbVwrT9bO6lILWln237z7sLaWnMsTi7Yc9fhX5DLpkJzAGfaReXI22wP41SZmnAA3Vw== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-private-methods@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.23.3.tgz#b2d7a3c97e278bfe59137a978d53b2c2e038c0e4" + integrity sha512-UzqRcRtWsDMTLrRWFvUBDwmw06tCQH9Rl1uAjfh6ijMSmGYQ+fpdB+cnqRC8EMh5tuuxSv0/TejGL+7vyj+50g== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.22.15" + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-private-property-in-object@^7.23.4": + version "7.23.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.23.4.tgz#3ec711d05d6608fd173d9b8de39872d8dbf68bf5" + integrity sha512-9G3K1YqTq3F4Vt88Djx1UZ79PDyj+yKRnUy7cZGSMe+a7jkwD259uKKuUzQlPkGam7R+8RJwh5z4xO27fA1o2A== + dependencies: + "@babel/helper-annotate-as-pure" "^7.22.5" + "@babel/helper-create-class-features-plugin" "^7.22.15" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-private-property-in-object" "^7.14.5" + +"@babel/plugin-transform-property-literals@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.23.3.tgz#54518f14ac4755d22b92162e4a852d308a560875" + integrity sha512-jR3Jn3y7cZp4oEWPFAlRsSWjxKe4PZILGBSd4nis1TsC5qeSpb+nrtihJuDhNI7QHiVbUaiXa0X2RZY3/TI6Nw== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-react-constant-elements@^7.18.12", "@babel/plugin-transform-react-constant-elements@^7.21.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.23.3.tgz#5efc001d07ef0f7da0d73c3a86c132f73d28e43c" + integrity sha512-zP0QKq/p6O42OL94udMgSfKXyse4RyJ0JqbQ34zDAONWjyrEsghYEyTSK5FIpmXmCpB55SHokL1cRRKHv8L2Qw== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-react-display-name@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.23.3.tgz#70529f034dd1e561045ad3c8152a267f0d7b6200" + integrity sha512-GnvhtVfA2OAtzdX58FJxU19rhoGeQzyVndw3GgtdECQvQFXPEZIOVULHVZGAYmOgmqjXpVpfocAbSjh99V/Fqw== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-react-jsx-development@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.22.5.tgz#e716b6edbef972a92165cd69d92f1255f7e73e87" + integrity sha512-bDhuzwWMuInwCYeDeMzyi7TaBgRQei6DqxhbyniL7/VG4RSS7HtSL2QbY4eESy1KJqlWt8g3xeEBGPuo+XqC8A== + dependencies: + "@babel/plugin-transform-react-jsx" "^7.22.5" + +"@babel/plugin-transform-react-jsx@^7.22.15", "@babel/plugin-transform-react-jsx@^7.22.5": + version "7.23.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.23.4.tgz#393f99185110cea87184ea47bcb4a7b0c2e39312" + integrity sha512-5xOpoPguCZCRbo/JeHlloSkTA8Bld1J/E1/kLfD1nsuiW1m8tduTA1ERCgIZokDflX/IBzKcqR3l7VlRgiIfHA== + dependencies: + "@babel/helper-annotate-as-pure" "^7.22.5" + "@babel/helper-module-imports" "^7.22.15" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-jsx" "^7.23.3" + "@babel/types" "^7.23.4" + +"@babel/plugin-transform-react-pure-annotations@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.23.3.tgz#fabedbdb8ee40edf5da96f3ecfc6958e3783b93c" + integrity sha512-qMFdSS+TUhB7Q/3HVPnEdYJDQIk57jkntAwSuz9xfSE4n+3I+vHYCli3HoHawN1Z3RfCz/y1zXA/JXjG6cVImQ== + dependencies: + "@babel/helper-annotate-as-pure" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-regenerator@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.23.3.tgz#141afd4a2057298602069fce7f2dc5173e6c561c" + integrity sha512-KP+75h0KghBMcVpuKisx3XTu9Ncut8Q8TuvGO4IhY+9D5DFEckQefOuIsB/gQ2tG71lCke4NMrtIPS8pOj18BQ== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + regenerator-transform "^0.15.2" + +"@babel/plugin-transform-reserved-words@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.23.3.tgz#4130dcee12bd3dd5705c587947eb715da12efac8" + integrity sha512-QnNTazY54YqgGxwIexMZva9gqbPa15t/x9VS+0fsEFWplwVpXYZivtgl43Z1vMpc1bdPP2PP8siFeVcnFvA3Cg== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-runtime@^7.18.6", "@babel/plugin-transform-runtime@^7.22.9": + version "7.23.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.23.7.tgz#52bbd20054855beb9deae3bee9ceb05289c343e6" + integrity sha512-fa0hnfmiXc9fq/weK34MUV0drz2pOL/vfKWvN7Qw127hiUPabFCUMgAbYWcchRzMJit4o5ARsK/s+5h0249pLw== + dependencies: + "@babel/helper-module-imports" "^7.22.15" + "@babel/helper-plugin-utils" "^7.22.5" + babel-plugin-polyfill-corejs2 "^0.4.7" + babel-plugin-polyfill-corejs3 "^0.8.7" + babel-plugin-polyfill-regenerator "^0.5.4" + semver "^6.3.1" + +"@babel/plugin-transform-shorthand-properties@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.23.3.tgz#97d82a39b0e0c24f8a981568a8ed851745f59210" + integrity sha512-ED2fgqZLmexWiN+YNFX26fx4gh5qHDhn1O2gvEhreLW2iI63Sqm4llRLCXALKrCnbN4Jy0VcMQZl/SAzqug/jg== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-spread@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.23.3.tgz#41d17aacb12bde55168403c6f2d6bdca563d362c" + integrity sha512-VvfVYlrlBVu+77xVTOAoxQ6mZbnIq5FM0aGBSFEcIh03qHf+zNqA4DC/3XMUozTg7bZV3e3mZQ0i13VB6v5yUg== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" + +"@babel/plugin-transform-sticky-regex@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.23.3.tgz#dec45588ab4a723cb579c609b294a3d1bd22ff04" + integrity sha512-HZOyN9g+rtvnOU3Yh7kSxXrKbzgrm5X4GncPY1QOquu7epga5MxKHVpYu2hvQnry/H+JjckSYRb93iNfsioAGg== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-template-literals@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.23.3.tgz#5f0f028eb14e50b5d0f76be57f90045757539d07" + integrity sha512-Flok06AYNp7GV2oJPZZcP9vZdszev6vPBkHLwxwSpaIqx75wn6mUd3UFWsSsA0l8nXAKkyCmL/sR02m8RYGeHg== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-typeof-symbol@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.23.3.tgz#9dfab97acc87495c0c449014eb9c547d8966bca4" + integrity sha512-4t15ViVnaFdrPC74be1gXBSMzXk3B4Us9lP7uLRQHTFpV5Dvt33pn+2MyyNxmN3VTTm3oTrZVMUmuw3oBnQ2oQ== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-typescript@^7.23.3": + version "7.23.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.23.6.tgz#aa36a94e5da8d94339ae3a4e22d40ed287feb34c" + integrity sha512-6cBG5mBvUu4VUD04OHKnYzbuHNP8huDsD3EDqqpIpsswTDoqHCjLoHb6+QgsV1WsT2nipRqCPgxD3LXnEO7XfA== + dependencies: + "@babel/helper-annotate-as-pure" "^7.22.5" + "@babel/helper-create-class-features-plugin" "^7.23.6" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-typescript" "^7.23.3" + +"@babel/plugin-transform-unicode-escapes@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.23.3.tgz#1f66d16cab01fab98d784867d24f70c1ca65b925" + integrity sha512-OMCUx/bU6ChE3r4+ZdylEqAjaQgHAgipgW8nsCfu5pGqDcFytVd91AwRvUJSBZDz0exPGgnjoqhgRYLRjFZc9Q== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-unicode-property-regex@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.23.3.tgz#19e234129e5ffa7205010feec0d94c251083d7ad" + integrity sha512-KcLIm+pDZkWZQAFJ9pdfmh89EwVfmNovFBcXko8szpBeF8z68kWIPeKlmSOkT9BXJxs2C0uk+5LxoxIv62MROA== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.22.15" + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-unicode-regex@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.23.3.tgz#26897708d8f42654ca4ce1b73e96140fbad879dc" + integrity sha512-wMHpNA4x2cIA32b/ci3AfwNgheiva2W0WUKWTK7vBHBhDKfPsc5cFGNWm69WBqpwd86u1qwZ9PWevKqm1A3yAw== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.22.15" + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-unicode-sets-regex@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.23.3.tgz#4fb6f0a719c2c5859d11f6b55a050cc987f3799e" + integrity sha512-W7lliA/v9bNR83Qc3q1ip9CQMZ09CcHDbHfbLRDNuAhn1Mvkr1ZNF7hPmztMQvtTGVLJ9m8IZqWsTkXOml8dbw== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.22.15" + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/preset-env@^7.18.6", "@babel/preset-env@^7.19.4", "@babel/preset-env@^7.20.2", "@babel/preset-env@^7.22.9": + version "7.23.7" + resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.23.7.tgz#e5d69b9f14db8a13bae4d8e5ce7f360973626241" + integrity sha512-SY27X/GtTz/L4UryMNJ6p4fH4nsgWbz84y9FE0bQeWJP6O5BhgVCt53CotQKHCOeXJel8VyhlhujhlltKms/CA== + dependencies: + "@babel/compat-data" "^7.23.5" + "@babel/helper-compilation-targets" "^7.23.6" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-validator-option" "^7.23.5" + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.23.3" + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.23.3" + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly" "^7.23.7" + "@babel/plugin-proposal-private-property-in-object" "7.21.0-placeholder-for-preset-env.2" + "@babel/plugin-syntax-async-generators" "^7.8.4" + "@babel/plugin-syntax-class-properties" "^7.12.13" + "@babel/plugin-syntax-class-static-block" "^7.14.5" + "@babel/plugin-syntax-dynamic-import" "^7.8.3" + "@babel/plugin-syntax-export-namespace-from" "^7.8.3" + "@babel/plugin-syntax-import-assertions" "^7.23.3" + "@babel/plugin-syntax-import-attributes" "^7.23.3" + "@babel/plugin-syntax-import-meta" "^7.10.4" + "@babel/plugin-syntax-json-strings" "^7.8.3" + "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" + "@babel/plugin-syntax-numeric-separator" "^7.10.4" + "@babel/plugin-syntax-object-rest-spread" "^7.8.3" + "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" + "@babel/plugin-syntax-optional-chaining" "^7.8.3" + "@babel/plugin-syntax-private-property-in-object" "^7.14.5" + "@babel/plugin-syntax-top-level-await" "^7.14.5" + "@babel/plugin-syntax-unicode-sets-regex" "^7.18.6" + "@babel/plugin-transform-arrow-functions" "^7.23.3" + "@babel/plugin-transform-async-generator-functions" "^7.23.7" + "@babel/plugin-transform-async-to-generator" "^7.23.3" + "@babel/plugin-transform-block-scoped-functions" "^7.23.3" + "@babel/plugin-transform-block-scoping" "^7.23.4" + "@babel/plugin-transform-class-properties" "^7.23.3" + "@babel/plugin-transform-class-static-block" "^7.23.4" + "@babel/plugin-transform-classes" "^7.23.5" + "@babel/plugin-transform-computed-properties" "^7.23.3" + "@babel/plugin-transform-destructuring" "^7.23.3" + "@babel/plugin-transform-dotall-regex" "^7.23.3" + "@babel/plugin-transform-duplicate-keys" "^7.23.3" + "@babel/plugin-transform-dynamic-import" "^7.23.4" + "@babel/plugin-transform-exponentiation-operator" "^7.23.3" + "@babel/plugin-transform-export-namespace-from" "^7.23.4" + "@babel/plugin-transform-for-of" "^7.23.6" + "@babel/plugin-transform-function-name" "^7.23.3" + "@babel/plugin-transform-json-strings" "^7.23.4" + "@babel/plugin-transform-literals" "^7.23.3" + "@babel/plugin-transform-logical-assignment-operators" "^7.23.4" + "@babel/plugin-transform-member-expression-literals" "^7.23.3" + "@babel/plugin-transform-modules-amd" "^7.23.3" + "@babel/plugin-transform-modules-commonjs" "^7.23.3" + "@babel/plugin-transform-modules-systemjs" "^7.23.3" + "@babel/plugin-transform-modules-umd" "^7.23.3" + "@babel/plugin-transform-named-capturing-groups-regex" "^7.22.5" + "@babel/plugin-transform-new-target" "^7.23.3" + "@babel/plugin-transform-nullish-coalescing-operator" "^7.23.4" + "@babel/plugin-transform-numeric-separator" "^7.23.4" + "@babel/plugin-transform-object-rest-spread" "^7.23.4" + "@babel/plugin-transform-object-super" "^7.23.3" + "@babel/plugin-transform-optional-catch-binding" "^7.23.4" + "@babel/plugin-transform-optional-chaining" "^7.23.4" + "@babel/plugin-transform-parameters" "^7.23.3" + "@babel/plugin-transform-private-methods" "^7.23.3" + "@babel/plugin-transform-private-property-in-object" "^7.23.4" + "@babel/plugin-transform-property-literals" "^7.23.3" + "@babel/plugin-transform-regenerator" "^7.23.3" + "@babel/plugin-transform-reserved-words" "^7.23.3" + "@babel/plugin-transform-shorthand-properties" "^7.23.3" + "@babel/plugin-transform-spread" "^7.23.3" + "@babel/plugin-transform-sticky-regex" "^7.23.3" + "@babel/plugin-transform-template-literals" "^7.23.3" + "@babel/plugin-transform-typeof-symbol" "^7.23.3" + "@babel/plugin-transform-unicode-escapes" "^7.23.3" + "@babel/plugin-transform-unicode-property-regex" "^7.23.3" + "@babel/plugin-transform-unicode-regex" "^7.23.3" + "@babel/plugin-transform-unicode-sets-regex" "^7.23.3" + "@babel/preset-modules" "0.1.6-no-external-plugins" + babel-plugin-polyfill-corejs2 "^0.4.7" + babel-plugin-polyfill-corejs3 "^0.8.7" + babel-plugin-polyfill-regenerator "^0.5.4" + core-js-compat "^3.31.0" + semver "^6.3.1" + +"@babel/preset-modules@0.1.6-no-external-plugins": + version "0.1.6-no-external-plugins" + resolved "https://registry.yarnpkg.com/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz#ccb88a2c49c817236861fee7826080573b8a923a" + integrity sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/types" "^7.4.4" + esutils "^2.0.2" + +"@babel/preset-react@^7.18.6", "@babel/preset-react@^7.22.5": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/preset-react/-/preset-react-7.23.3.tgz#f73ca07e7590f977db07eb54dbe46538cc015709" + integrity sha512-tbkHOS9axH6Ysf2OUEqoSZ6T3Fa2SrNH6WTWSPBboxKzdxNc9qOICeLXkNG0ZEwbQ1HY8liwOce4aN/Ceyuq6w== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-validator-option" "^7.22.15" + "@babel/plugin-transform-react-display-name" "^7.23.3" + "@babel/plugin-transform-react-jsx" "^7.22.15" + "@babel/plugin-transform-react-jsx-development" "^7.22.5" + "@babel/plugin-transform-react-pure-annotations" "^7.23.3" + +"@babel/preset-typescript@^7.18.6", "@babel/preset-typescript@^7.21.0", "@babel/preset-typescript@^7.22.5": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/preset-typescript/-/preset-typescript-7.23.3.tgz#14534b34ed5b6d435aa05f1ae1c5e7adcc01d913" + integrity sha512-17oIGVlqz6CchO9RFYn5U6ZpWRZIngayYCtrPRSgANSwC2V1Jb+iP74nVxzzXJte8b8BYxrL1yY96xfhTBrNNQ== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-validator-option" "^7.22.15" + "@babel/plugin-syntax-jsx" "^7.23.3" + "@babel/plugin-transform-modules-commonjs" "^7.23.3" + "@babel/plugin-transform-typescript" "^7.23.3" + +"@babel/regjsgen@^0.8.0": + version "0.8.0" + resolved "https://registry.yarnpkg.com/@babel/regjsgen/-/regjsgen-0.8.0.tgz#f0ba69b075e1f05fb2825b7fad991e7adbb18310" + integrity sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA== + +"@babel/runtime-corejs3@^7.18.6", "@babel/runtime-corejs3@^7.22.6": + version "7.23.7" + resolved "https://registry.yarnpkg.com/@babel/runtime-corejs3/-/runtime-corejs3-7.23.7.tgz#2c3d323d21569f2950c9126780bfa400632360bd" + integrity sha512-ER55qzLREVA5YxeyQ3Qu48tgsF2ZrFjFjUS6V6wF0cikSw+goBJgB9PBRM1T6+Ah4iiM+sxmfS/Sy/jdzFfhiQ== + dependencies: + core-js-pure "^3.30.2" + regenerator-runtime "^0.14.0" + +"@babel/runtime@^7.1.2", "@babel/runtime@^7.10.3", "@babel/runtime@^7.12.13", "@babel/runtime@^7.12.5", "@babel/runtime@^7.17.8", "@babel/runtime@^7.18.6", "@babel/runtime@^7.20.13", "@babel/runtime@^7.22.6", "@babel/runtime@^7.8.4": + version "7.23.7" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.23.7.tgz#dd7c88deeb218a0f8bd34d5db1aa242e0f203193" + integrity sha512-w06OXVOFso7LcbzMiDGt+3X7Rh7Ho8MmgPoWU3rarH+8upf+wSU/grlGbWzQyr3DkdN6ZeuMFjpdwW0Q+HxobA== + dependencies: + regenerator-runtime "^0.14.0" + +"@babel/template@^7.12.7", "@babel/template@^7.22.15": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.22.15.tgz#09576efc3830f0430f4548ef971dde1350ef2f38" + integrity sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w== + dependencies: + "@babel/code-frame" "^7.22.13" + "@babel/parser" "^7.22.15" + "@babel/types" "^7.22.15" + +"@babel/traverse@^7.12.9", "@babel/traverse@^7.18.8", "@babel/traverse@^7.22.8", "@babel/traverse@^7.23.7": + version "7.23.7" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.23.7.tgz#9a7bf285c928cb99b5ead19c3b1ce5b310c9c305" + integrity sha512-tY3mM8rH9jM0YHFGyfC0/xf+SB5eKUu7HPj7/k3fpi9dAlsMc5YbQvDi0Sh2QTPXqMhyaAtzAr807TIyfQrmyg== + dependencies: + "@babel/code-frame" "^7.23.5" + "@babel/generator" "^7.23.6" + "@babel/helper-environment-visitor" "^7.22.20" + "@babel/helper-function-name" "^7.23.0" + "@babel/helper-hoist-variables" "^7.22.5" + "@babel/helper-split-export-declaration" "^7.22.6" + "@babel/parser" "^7.23.6" + "@babel/types" "^7.23.6" + debug "^4.3.1" + globals "^11.1.0" + +"@babel/types@^7.12.7", "@babel/types@^7.20.0", "@babel/types@^7.21.3", "@babel/types@^7.22.15", "@babel/types@^7.22.19", "@babel/types@^7.22.5", "@babel/types@^7.23.0", "@babel/types@^7.23.4", "@babel/types@^7.23.6", "@babel/types@^7.4.4": + version "7.23.6" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.23.6.tgz#be33fdb151e1f5a56877d704492c240fc71c7ccd" + integrity sha512-+uarb83brBzPKN38NX1MkB6vb6+mwvR6amUulqAE7ccQw1pEl+bCia9TbdG1lsnFP7lZySvUn37CHyXQdfTwzg== + dependencies: + "@babel/helper-string-parser" "^7.23.4" + "@babel/helper-validator-identifier" "^7.22.20" + to-fast-properties "^2.0.0" + +"@colors/colors@1.5.0": + version "1.5.0" + resolved "https://registry.yarnpkg.com/@colors/colors/-/colors-1.5.0.tgz#bb504579c1cae923e6576a4f5da43d25f97bdbd9" + integrity sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ== + +"@discoveryjs/json-ext@0.5.7": + version "0.5.7" + resolved "https://registry.yarnpkg.com/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz#1d572bfbbe14b7704e0ba0f39b74815b84870d70" + integrity sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw== + +"@docsearch/css@3.5.2": + version "3.5.2" + resolved "https://registry.yarnpkg.com/@docsearch/css/-/css-3.5.2.tgz#610f47b48814ca94041df969d9fcc47b91fc5aac" + integrity sha512-SPiDHaWKQZpwR2siD0KQUwlStvIAnEyK6tAE2h2Wuoq8ue9skzhlyVQ1ddzOxX6khULnAALDiR/isSF3bnuciA== + +"@docsearch/react@^3.1.1": + version "3.5.2" + resolved "https://registry.yarnpkg.com/@docsearch/react/-/react-3.5.2.tgz#2e6bbee00eb67333b64906352734da6aef1232b9" + integrity sha512-9Ahcrs5z2jq/DcAvYtvlqEBHImbm4YJI8M9y0x6Tqg598P40HTEkX7hsMcIuThI+hTFxRGZ9hll0Wygm2yEjng== + dependencies: + "@algolia/autocomplete-core" "1.9.3" + "@algolia/autocomplete-preset-algolia" "1.9.3" + "@docsearch/css" "3.5.2" + algoliasearch "^4.19.1" + +"@docusaurus/core@2.4.3", "@docusaurus/core@^2.4.3": + version "2.4.3" + resolved "https://registry.yarnpkg.com/@docusaurus/core/-/core-2.4.3.tgz#d86624901386fd8164ce4bff9cc7f16fde57f523" + integrity sha512-dWH5P7cgeNSIg9ufReX6gaCl/TmrGKD38Orbwuz05WPhAQtFXHd5B8Qym1TiXfvUNvwoYKkAJOJuGe8ou0Z7PA== + dependencies: + "@babel/core" "^7.18.6" + "@babel/generator" "^7.18.7" + "@babel/plugin-syntax-dynamic-import" "^7.8.3" + "@babel/plugin-transform-runtime" "^7.18.6" + "@babel/preset-env" "^7.18.6" + "@babel/preset-react" "^7.18.6" + "@babel/preset-typescript" "^7.18.6" + "@babel/runtime" "^7.18.6" + "@babel/runtime-corejs3" "^7.18.6" + "@babel/traverse" "^7.18.8" + "@docusaurus/cssnano-preset" "2.4.3" + "@docusaurus/logger" "2.4.3" + "@docusaurus/mdx-loader" "2.4.3" + "@docusaurus/react-loadable" "5.5.2" + "@docusaurus/utils" "2.4.3" + "@docusaurus/utils-common" "2.4.3" + "@docusaurus/utils-validation" "2.4.3" + "@slorber/static-site-generator-webpack-plugin" "^4.0.7" + "@svgr/webpack" "^6.2.1" + autoprefixer "^10.4.7" + babel-loader "^8.2.5" + babel-plugin-dynamic-import-node "^2.3.3" + boxen "^6.2.1" + chalk "^4.1.2" + chokidar "^3.5.3" + clean-css "^5.3.0" + cli-table3 "^0.6.2" + combine-promises "^1.1.0" + commander "^5.1.0" + copy-webpack-plugin "^11.0.0" + core-js "^3.23.3" + css-loader "^6.7.1" + css-minimizer-webpack-plugin "^4.0.0" + cssnano "^5.1.12" + del "^6.1.1" + detect-port "^1.3.0" + escape-html "^1.0.3" + eta "^2.0.0" + file-loader "^6.2.0" + fs-extra "^10.1.0" + html-minifier-terser "^6.1.0" + html-tags "^3.2.0" + html-webpack-plugin "^5.5.0" + import-fresh "^3.3.0" + leven "^3.1.0" + lodash "^4.17.21" + mini-css-extract-plugin "^2.6.1" + postcss "^8.4.14" + postcss-loader "^7.0.0" + prompts "^2.4.2" + react-dev-utils "^12.0.1" + react-helmet-async "^1.3.0" + react-loadable "npm:@docusaurus/react-loadable@5.5.2" + react-loadable-ssr-addon-v5-slorber "^1.0.1" + react-router "^5.3.3" + react-router-config "^5.1.1" + react-router-dom "^5.3.3" + rtl-detect "^1.0.4" + semver "^7.3.7" + serve-handler "^6.1.3" + shelljs "^0.8.5" + terser-webpack-plugin "^5.3.3" + tslib "^2.4.0" + update-notifier "^5.1.0" + url-loader "^4.1.1" + wait-on "^6.0.1" + webpack "^5.73.0" + webpack-bundle-analyzer "^4.5.0" + webpack-dev-server "^4.9.3" + webpack-merge "^5.8.0" + webpackbar "^5.0.2" + +"@docusaurus/core@3.0.1": + version "3.0.1" + resolved "https://registry.yarnpkg.com/@docusaurus/core/-/core-3.0.1.tgz#ad9a66b20802ea81b25e65db75d4ca952eda7e01" + integrity sha512-CXrLpOnW+dJdSv8M5FAJ3JBwXtL6mhUWxFA8aS0ozK6jBG/wgxERk5uvH28fCeFxOGbAT9v1e9dOMo1X2IEVhQ== + dependencies: + "@babel/core" "^7.23.3" + "@babel/generator" "^7.23.3" + "@babel/plugin-syntax-dynamic-import" "^7.8.3" + "@babel/plugin-transform-runtime" "^7.22.9" + "@babel/preset-env" "^7.22.9" + "@babel/preset-react" "^7.22.5" + "@babel/preset-typescript" "^7.22.5" + "@babel/runtime" "^7.22.6" + "@babel/runtime-corejs3" "^7.22.6" + "@babel/traverse" "^7.22.8" + "@docusaurus/cssnano-preset" "3.0.1" + "@docusaurus/logger" "3.0.1" + "@docusaurus/mdx-loader" "3.0.1" + "@docusaurus/react-loadable" "5.5.2" + "@docusaurus/utils" "3.0.1" + "@docusaurus/utils-common" "3.0.1" + "@docusaurus/utils-validation" "3.0.1" + "@slorber/static-site-generator-webpack-plugin" "^4.0.7" + "@svgr/webpack" "^6.5.1" + autoprefixer "^10.4.14" + babel-loader "^9.1.3" + babel-plugin-dynamic-import-node "^2.3.3" + boxen "^6.2.1" + chalk "^4.1.2" + chokidar "^3.5.3" + clean-css "^5.3.2" + cli-table3 "^0.6.3" + combine-promises "^1.1.0" + commander "^5.1.0" + copy-webpack-plugin "^11.0.0" + core-js "^3.31.1" + css-loader "^6.8.1" + css-minimizer-webpack-plugin "^4.2.2" + cssnano "^5.1.15" + del "^6.1.1" + detect-port "^1.5.1" + escape-html "^1.0.3" + eta "^2.2.0" + file-loader "^6.2.0" + fs-extra "^11.1.1" + html-minifier-terser "^7.2.0" + html-tags "^3.3.1" + html-webpack-plugin "^5.5.3" + leven "^3.1.0" + lodash "^4.17.21" + mini-css-extract-plugin "^2.7.6" + postcss "^8.4.26" + postcss-loader "^7.3.3" + prompts "^2.4.2" + react-dev-utils "^12.0.1" + react-helmet-async "^1.3.0" + react-loadable "npm:@docusaurus/react-loadable@5.5.2" + react-loadable-ssr-addon-v5-slorber "^1.0.1" + react-router "^5.3.4" + react-router-config "^5.1.1" + react-router-dom "^5.3.4" + rtl-detect "^1.0.4" + semver "^7.5.4" + serve-handler "^6.1.5" + shelljs "^0.8.5" + terser-webpack-plugin "^5.3.9" + tslib "^2.6.0" + update-notifier "^6.0.2" + url-loader "^4.1.1" + webpack "^5.88.1" + webpack-bundle-analyzer "^4.9.0" + webpack-dev-server "^4.15.1" + webpack-merge "^5.9.0" + webpackbar "^5.0.2" + +"@docusaurus/cssnano-preset@2.4.3": + version "2.4.3" + resolved "https://registry.yarnpkg.com/@docusaurus/cssnano-preset/-/cssnano-preset-2.4.3.tgz#1d7e833c41ce240fcc2812a2ac27f7b862f32de0" + integrity sha512-ZvGSRCi7z9wLnZrXNPG6DmVPHdKGd8dIn9pYbEOFiYihfv4uDR3UtxogmKf+rT8ZlKFf5Lqne8E8nt08zNM8CA== + dependencies: + cssnano-preset-advanced "^5.3.8" + postcss "^8.4.14" + postcss-sort-media-queries "^4.2.1" + tslib "^2.4.0" + +"@docusaurus/cssnano-preset@3.0.1": + version "3.0.1" + resolved "https://registry.yarnpkg.com/@docusaurus/cssnano-preset/-/cssnano-preset-3.0.1.tgz#22fbf2e97389e338747864baf011743846e8fd26" + integrity sha512-wjuXzkHMW+ig4BD6Ya1Yevx9UJadO4smNZCEljqBoQfIQrQskTswBs7lZ8InHP7mCt273a/y/rm36EZhqJhknQ== + dependencies: + cssnano-preset-advanced "^5.3.10" + postcss "^8.4.26" + postcss-sort-media-queries "^4.4.1" + tslib "^2.6.0" + +"@docusaurus/logger@2.4.3": + version "2.4.3" + resolved "https://registry.yarnpkg.com/@docusaurus/logger/-/logger-2.4.3.tgz#518bbc965fb4ebe8f1d0b14e5f4161607552d34c" + integrity sha512-Zxws7r3yLufk9xM1zq9ged0YHs65mlRmtsobnFkdZTxWXdTYlWWLWdKyNKAsVC+D7zg+pv2fGbyabdOnyZOM3w== + dependencies: + chalk "^4.1.2" + tslib "^2.4.0" + +"@docusaurus/logger@3.0.1": + version "3.0.1" + resolved "https://registry.yarnpkg.com/@docusaurus/logger/-/logger-3.0.1.tgz#06f512eef6c6ae4e2da63064257e01b1cdc41a82" + integrity sha512-I5L6Nk8OJzkVA91O2uftmo71LBSxe1vmOn9AMR6JRCzYeEBrqneWMH02AqMvjJ2NpMiviO+t0CyPjyYV7nxCWQ== + dependencies: + chalk "^4.1.2" + tslib "^2.6.0" + +"@docusaurus/mdx-loader@2.4.3": + version "2.4.3" + resolved "https://registry.yarnpkg.com/@docusaurus/mdx-loader/-/mdx-loader-2.4.3.tgz#e8ff37f30a060eaa97b8121c135f74cb531a4a3e" + integrity sha512-b1+fDnWtl3GiqkL0BRjYtc94FZrcDDBV1j8446+4tptB9BAOlePwG2p/pK6vGvfL53lkOsszXMghr2g67M0vCw== + dependencies: + "@babel/parser" "^7.18.8" + "@babel/traverse" "^7.18.8" + "@docusaurus/logger" "2.4.3" + "@docusaurus/utils" "2.4.3" + "@mdx-js/mdx" "^1.6.22" + escape-html "^1.0.3" + file-loader "^6.2.0" + fs-extra "^10.1.0" + image-size "^1.0.1" + mdast-util-to-string "^2.0.0" + remark-emoji "^2.2.0" + stringify-object "^3.3.0" + tslib "^2.4.0" + unified "^9.2.2" + unist-util-visit "^2.0.3" + url-loader "^4.1.1" + webpack "^5.73.0" + +"@docusaurus/mdx-loader@3.0.1": + version "3.0.1" + resolved "https://registry.yarnpkg.com/@docusaurus/mdx-loader/-/mdx-loader-3.0.1.tgz#89f221e5bcc570983fd61d7ab56d6fbe36810b59" + integrity sha512-ldnTmvnvlrONUq45oKESrpy+lXtbnTcTsFkOTIDswe5xx5iWJjt6eSa0f99ZaWlnm24mlojcIGoUWNCS53qVlQ== + dependencies: + "@babel/parser" "^7.22.7" + "@babel/traverse" "^7.22.8" + "@docusaurus/logger" "3.0.1" + "@docusaurus/utils" "3.0.1" + "@docusaurus/utils-validation" "3.0.1" + "@mdx-js/mdx" "^3.0.0" + "@slorber/remark-comment" "^1.0.0" + escape-html "^1.0.3" + estree-util-value-to-estree "^3.0.1" + file-loader "^6.2.0" + fs-extra "^11.1.1" + image-size "^1.0.2" + mdast-util-mdx "^3.0.0" + mdast-util-to-string "^4.0.0" + rehype-raw "^7.0.0" + remark-directive "^3.0.0" + remark-emoji "^4.0.0" + remark-frontmatter "^5.0.0" + remark-gfm "^4.0.0" + stringify-object "^3.3.0" + tslib "^2.6.0" + unified "^11.0.3" + unist-util-visit "^5.0.0" + url-loader "^4.1.1" + vfile "^6.0.1" + webpack "^5.88.1" + +"@docusaurus/module-type-aliases@2.4.3": + version "2.4.3" + resolved "https://registry.yarnpkg.com/@docusaurus/module-type-aliases/-/module-type-aliases-2.4.3.tgz#d08ef67e4151e02f352a2836bcf9ecde3b9c56ac" + integrity sha512-cwkBkt1UCiduuvEAo7XZY01dJfRn7UR/75mBgOdb1hKknhrabJZ8YH+7savd/y9kLExPyrhe0QwdS9GuzsRRIA== + dependencies: + "@docusaurus/react-loadable" "5.5.2" + "@docusaurus/types" "2.4.3" + "@types/history" "^4.7.11" + "@types/react" "*" + "@types/react-router-config" "*" + "@types/react-router-dom" "*" + react-helmet-async "*" + react-loadable "npm:@docusaurus/react-loadable@5.5.2" + +"@docusaurus/module-type-aliases@3.0.1": + version "3.0.1" + resolved "https://registry.yarnpkg.com/@docusaurus/module-type-aliases/-/module-type-aliases-3.0.1.tgz#d45990fe377d7ffaa68841cf89401188a5d65293" + integrity sha512-DEHpeqUDsLynl3AhQQiO7AbC7/z/lBra34jTcdYuvp9eGm01pfH1wTVq8YqWZq6Jyx0BgcVl/VJqtE9StRd9Ag== + dependencies: + "@docusaurus/react-loadable" "5.5.2" + "@docusaurus/types" "3.0.1" + "@types/history" "^4.7.11" + "@types/react" "*" + "@types/react-router-config" "*" + "@types/react-router-dom" "*" + react-helmet-async "*" + react-loadable "npm:@docusaurus/react-loadable@5.5.2" + +"@docusaurus/plugin-client-redirects@^2.4.3": + version "2.4.3" + resolved "https://registry.yarnpkg.com/@docusaurus/plugin-client-redirects/-/plugin-client-redirects-2.4.3.tgz#0da7e6facadbca3bd7cb8d0453f21bea7f4f1721" + integrity sha512-iCwc/zH8X6eNtLYdyUJFY6+GbsbRgMgvAC/TmSmCYTmwnoN5Y1Bc5OwUkdtoch0XKizotJMRAmGIAhP8sAetdQ== + dependencies: + "@docusaurus/core" "2.4.3" + "@docusaurus/logger" "2.4.3" + "@docusaurus/utils" "2.4.3" + "@docusaurus/utils-common" "2.4.3" + "@docusaurus/utils-validation" "2.4.3" + eta "^2.0.0" + fs-extra "^10.1.0" + lodash "^4.17.21" + tslib "^2.4.0" + +"@docusaurus/plugin-content-blog@2.4.3": + version "2.4.3" + resolved "https://registry.yarnpkg.com/@docusaurus/plugin-content-blog/-/plugin-content-blog-2.4.3.tgz#6473b974acab98e967414d8bbb0d37e0cedcea14" + integrity sha512-PVhypqaA0t98zVDpOeTqWUTvRqCEjJubtfFUQ7zJNYdbYTbS/E/ytq6zbLVsN/dImvemtO/5JQgjLxsh8XLo8Q== + dependencies: + "@docusaurus/core" "2.4.3" + "@docusaurus/logger" "2.4.3" + "@docusaurus/mdx-loader" "2.4.3" + "@docusaurus/types" "2.4.3" + "@docusaurus/utils" "2.4.3" + "@docusaurus/utils-common" "2.4.3" + "@docusaurus/utils-validation" "2.4.3" + cheerio "^1.0.0-rc.12" + feed "^4.2.2" + fs-extra "^10.1.0" + lodash "^4.17.21" + reading-time "^1.5.0" + tslib "^2.4.0" + unist-util-visit "^2.0.3" + utility-types "^3.10.0" + webpack "^5.73.0" + +"@docusaurus/plugin-content-docs@2.4.3": + version "2.4.3" + resolved "https://registry.yarnpkg.com/@docusaurus/plugin-content-docs/-/plugin-content-docs-2.4.3.tgz#aa224c0512351e81807adf778ca59fd9cd136973" + integrity sha512-N7Po2LSH6UejQhzTCsvuX5NOzlC+HiXOVvofnEPj0WhMu1etpLEXE6a4aTxrtg95lQ5kf0xUIdjX9sh3d3G76A== + dependencies: + "@docusaurus/core" "2.4.3" + "@docusaurus/logger" "2.4.3" + "@docusaurus/mdx-loader" "2.4.3" + "@docusaurus/module-type-aliases" "2.4.3" + "@docusaurus/types" "2.4.3" + "@docusaurus/utils" "2.4.3" + "@docusaurus/utils-validation" "2.4.3" + "@types/react-router-config" "^5.0.6" + combine-promises "^1.1.0" + fs-extra "^10.1.0" + import-fresh "^3.3.0" + js-yaml "^4.1.0" + lodash "^4.17.21" + tslib "^2.4.0" + utility-types "^3.10.0" + webpack "^5.73.0" + +"@docusaurus/plugin-content-docs@^2 || ^3": + version "3.0.1" + resolved "https://registry.yarnpkg.com/@docusaurus/plugin-content-docs/-/plugin-content-docs-3.0.1.tgz#d9b1884562186573d5c4521ac3546b68512c1126" + integrity sha512-dRfAOA5Ivo+sdzzJGXEu33yAtvGg8dlZkvt/NEJ7nwi1F2j4LEdsxtfX2GKeETB2fP6XoGNSQnFXqa2NYGrHFg== + dependencies: + "@docusaurus/core" "3.0.1" + "@docusaurus/logger" "3.0.1" + "@docusaurus/mdx-loader" "3.0.1" + "@docusaurus/module-type-aliases" "3.0.1" + "@docusaurus/types" "3.0.1" + "@docusaurus/utils" "3.0.1" + "@docusaurus/utils-validation" "3.0.1" + "@types/react-router-config" "^5.0.7" + combine-promises "^1.1.0" + fs-extra "^11.1.1" + js-yaml "^4.1.0" + lodash "^4.17.21" + tslib "^2.6.0" + utility-types "^3.10.0" + webpack "^5.88.1" + +"@docusaurus/plugin-content-pages@2.4.3": + version "2.4.3" + resolved "https://registry.yarnpkg.com/@docusaurus/plugin-content-pages/-/plugin-content-pages-2.4.3.tgz#7f285e718b53da8c8d0101e70840c75b9c0a1ac0" + integrity sha512-txtDVz7y3zGk67q0HjG0gRttVPodkHqE0bpJ+7dOaTH40CQFLSh7+aBeGnPOTl+oCPG+hxkim4SndqPqXjQ8Bg== + dependencies: + "@docusaurus/core" "2.4.3" + "@docusaurus/mdx-loader" "2.4.3" + "@docusaurus/types" "2.4.3" + "@docusaurus/utils" "2.4.3" + "@docusaurus/utils-validation" "2.4.3" + fs-extra "^10.1.0" + tslib "^2.4.0" + webpack "^5.73.0" + +"@docusaurus/plugin-debug@2.4.3": + version "2.4.3" + resolved "https://registry.yarnpkg.com/@docusaurus/plugin-debug/-/plugin-debug-2.4.3.tgz#2f90eb0c9286a9f225444e3a88315676fe02c245" + integrity sha512-LkUbuq3zCmINlFb+gAd4ZvYr+bPAzMC0hwND4F7V9bZ852dCX8YoWyovVUBKq4er1XsOwSQaHmNGtObtn8Av8Q== + dependencies: + "@docusaurus/core" "2.4.3" + "@docusaurus/types" "2.4.3" + "@docusaurus/utils" "2.4.3" + fs-extra "^10.1.0" + react-json-view "^1.21.3" + tslib "^2.4.0" + +"@docusaurus/plugin-google-analytics@2.4.3": + version "2.4.3" + resolved "https://registry.yarnpkg.com/@docusaurus/plugin-google-analytics/-/plugin-google-analytics-2.4.3.tgz#0d19993136ade6f7a7741251b4f617400d92ab45" + integrity sha512-KzBV3k8lDkWOhg/oYGxlK5o9bOwX7KpPc/FTWoB+SfKhlHfhq7qcQdMi1elAaVEIop8tgK6gD1E58Q+XC6otSQ== + dependencies: + "@docusaurus/core" "2.4.3" + "@docusaurus/types" "2.4.3" + "@docusaurus/utils-validation" "2.4.3" + tslib "^2.4.0" + +"@docusaurus/plugin-google-gtag@2.4.3": + version "2.4.3" + resolved "https://registry.yarnpkg.com/@docusaurus/plugin-google-gtag/-/plugin-google-gtag-2.4.3.tgz#e1a80b0696771b488562e5b60eff21c9932d9e1c" + integrity sha512-5FMg0rT7sDy4i9AGsvJC71MQrqQZwgLNdDetLEGDHLfSHLvJhQbTCUGbGXknUgWXQJckcV/AILYeJy+HhxeIFA== + dependencies: + "@docusaurus/core" "2.4.3" + "@docusaurus/types" "2.4.3" + "@docusaurus/utils-validation" "2.4.3" + tslib "^2.4.0" + +"@docusaurus/plugin-google-tag-manager@2.4.3": + version "2.4.3" + resolved "https://registry.yarnpkg.com/@docusaurus/plugin-google-tag-manager/-/plugin-google-tag-manager-2.4.3.tgz#e41fbf79b0ffc2de1cc4013eb77798cff0ad98e3" + integrity sha512-1jTzp71yDGuQiX9Bi0pVp3alArV0LSnHXempvQTxwCGAEzUWWaBg4d8pocAlTpbP9aULQQqhgzrs8hgTRPOM0A== + dependencies: + "@docusaurus/core" "2.4.3" + "@docusaurus/types" "2.4.3" + "@docusaurus/utils-validation" "2.4.3" + tslib "^2.4.0" + +"@docusaurus/plugin-sitemap@2.4.3": + version "2.4.3" + resolved "https://registry.yarnpkg.com/@docusaurus/plugin-sitemap/-/plugin-sitemap-2.4.3.tgz#1b3930900a8f89670ce7e8f83fb4730cd3298c32" + integrity sha512-LRQYrK1oH1rNfr4YvWBmRzTL0LN9UAPxBbghgeFRBm5yloF6P+zv1tm2pe2hQTX/QP5bSKdnajCvfnScgKXMZQ== + dependencies: + "@docusaurus/core" "2.4.3" + "@docusaurus/logger" "2.4.3" + "@docusaurus/types" "2.4.3" + "@docusaurus/utils" "2.4.3" + "@docusaurus/utils-common" "2.4.3" + "@docusaurus/utils-validation" "2.4.3" + fs-extra "^10.1.0" + sitemap "^7.1.1" + tslib "^2.4.0" + +"@docusaurus/preset-classic@^2.4.3": + version "2.4.3" + resolved "https://registry.yarnpkg.com/@docusaurus/preset-classic/-/preset-classic-2.4.3.tgz#074c57ebf29fa43d23bd1c8ce691226f542bc262" + integrity sha512-tRyMliepY11Ym6hB1rAFSNGwQDpmszvWYJvlK1E+md4SW8i6ylNHtpZjaYFff9Mdk3i/Pg8ItQq9P0daOJAvQw== + dependencies: + "@docusaurus/core" "2.4.3" + "@docusaurus/plugin-content-blog" "2.4.3" + "@docusaurus/plugin-content-docs" "2.4.3" + "@docusaurus/plugin-content-pages" "2.4.3" + "@docusaurus/plugin-debug" "2.4.3" + "@docusaurus/plugin-google-analytics" "2.4.3" + "@docusaurus/plugin-google-gtag" "2.4.3" + "@docusaurus/plugin-google-tag-manager" "2.4.3" + "@docusaurus/plugin-sitemap" "2.4.3" + "@docusaurus/theme-classic" "2.4.3" + "@docusaurus/theme-common" "2.4.3" + "@docusaurus/theme-search-algolia" "2.4.3" + "@docusaurus/types" "2.4.3" + +"@docusaurus/react-loadable@5.5.2": + version "5.5.2" + resolved "https://registry.yarnpkg.com/@docusaurus/react-loadable/-/react-loadable-5.5.2.tgz#81aae0db81ecafbdaee3651f12804580868fa6ce" + integrity sha512-A3dYjdBGuy0IGT+wyLIGIKLRE+sAk1iNk0f1HjNDysO7u8lhL4N3VEm+FAubmJbAztn94F7MxBTPmnixbiyFdQ== + dependencies: + "@types/react" "*" + prop-types "^15.6.2" + +"@docusaurus/theme-classic@2.4.3": + version "2.4.3" + resolved "https://registry.yarnpkg.com/@docusaurus/theme-classic/-/theme-classic-2.4.3.tgz#29360f2eb03a0e1686eb19668633ef313970ee8f" + integrity sha512-QKRAJPSGPfDY2yCiPMIVyr+MqwZCIV2lxNzqbyUW0YkrlmdzzP3WuQJPMGLCjWgQp/5c9kpWMvMxjhpZx1R32Q== + dependencies: + "@docusaurus/core" "2.4.3" + "@docusaurus/mdx-loader" "2.4.3" + "@docusaurus/module-type-aliases" "2.4.3" + "@docusaurus/plugin-content-blog" "2.4.3" + "@docusaurus/plugin-content-docs" "2.4.3" + "@docusaurus/plugin-content-pages" "2.4.3" + "@docusaurus/theme-common" "2.4.3" + "@docusaurus/theme-translations" "2.4.3" + "@docusaurus/types" "2.4.3" + "@docusaurus/utils" "2.4.3" + "@docusaurus/utils-common" "2.4.3" + "@docusaurus/utils-validation" "2.4.3" + "@mdx-js/react" "^1.6.22" + clsx "^1.2.1" + copy-text-to-clipboard "^3.0.1" + infima "0.2.0-alpha.43" + lodash "^4.17.21" + nprogress "^0.2.0" + postcss "^8.4.14" + prism-react-renderer "^1.3.5" + prismjs "^1.28.0" + react-router-dom "^5.3.3" + rtlcss "^3.5.0" + tslib "^2.4.0" + utility-types "^3.10.0" + +"@docusaurus/theme-common@2.4.3": + version "2.4.3" + resolved "https://registry.yarnpkg.com/@docusaurus/theme-common/-/theme-common-2.4.3.tgz#bb31d70b6b67d0bdef9baa343192dcec49946a2e" + integrity sha512-7KaDJBXKBVGXw5WOVt84FtN8czGWhM0lbyWEZXGp8AFfL6sZQfRTluFp4QriR97qwzSyOfQb+nzcDZZU4tezUw== + dependencies: + "@docusaurus/mdx-loader" "2.4.3" + "@docusaurus/module-type-aliases" "2.4.3" + "@docusaurus/plugin-content-blog" "2.4.3" + "@docusaurus/plugin-content-docs" "2.4.3" + "@docusaurus/plugin-content-pages" "2.4.3" + "@docusaurus/utils" "2.4.3" + "@docusaurus/utils-common" "2.4.3" + "@types/history" "^4.7.11" + "@types/react" "*" + "@types/react-router-config" "*" + clsx "^1.2.1" + parse-numeric-range "^1.3.0" + prism-react-renderer "^1.3.5" + tslib "^2.4.0" + use-sync-external-store "^1.2.0" + utility-types "^3.10.0" + +"@docusaurus/theme-search-algolia@2.4.3": + version "2.4.3" + resolved "https://registry.yarnpkg.com/@docusaurus/theme-search-algolia/-/theme-search-algolia-2.4.3.tgz#32d4cbefc3deba4112068fbdb0bde11ac51ece53" + integrity sha512-jziq4f6YVUB5hZOB85ELATwnxBz/RmSLD3ksGQOLDPKVzat4pmI8tddNWtriPpxR04BNT+ZfpPUMFkNFetSW1Q== + dependencies: + "@docsearch/react" "^3.1.1" + "@docusaurus/core" "2.4.3" + "@docusaurus/logger" "2.4.3" + "@docusaurus/plugin-content-docs" "2.4.3" + "@docusaurus/theme-common" "2.4.3" + "@docusaurus/theme-translations" "2.4.3" + "@docusaurus/utils" "2.4.3" + "@docusaurus/utils-validation" "2.4.3" + algoliasearch "^4.13.1" + algoliasearch-helper "^3.10.0" + clsx "^1.2.1" + eta "^2.0.0" + fs-extra "^10.1.0" + lodash "^4.17.21" + tslib "^2.4.0" + utility-types "^3.10.0" + +"@docusaurus/theme-translations@2.4.3": + version "2.4.3" + resolved "https://registry.yarnpkg.com/@docusaurus/theme-translations/-/theme-translations-2.4.3.tgz#91ac73fc49b8c652b7a54e88b679af57d6ac6102" + integrity sha512-H4D+lbZbjbKNS/Zw1Lel64PioUAIT3cLYYJLUf3KkuO/oc9e0QCVhIYVtUI2SfBCF2NNdlyhBDQEEMygsCedIg== + dependencies: + fs-extra "^10.1.0" + tslib "^2.4.0" + +"@docusaurus/theme-translations@^2 || ^3": + version "3.0.1" + resolved "https://registry.yarnpkg.com/@docusaurus/theme-translations/-/theme-translations-3.0.1.tgz#837a01a166ccd698a3eceaed0c2f798555bc024b" + integrity sha512-6UrbpzCTN6NIJnAtZ6Ne9492vmPVX+7Fsz4kmp+yor3KQwA1+MCzQP7ItDNkP38UmVLnvB/cYk/IvehCUqS3dg== + dependencies: + fs-extra "^11.1.1" + tslib "^2.6.0" + +"@docusaurus/types@2.4.3": + version "2.4.3" + resolved "https://registry.yarnpkg.com/@docusaurus/types/-/types-2.4.3.tgz#4aead281ca09f721b3c0a9b926818450cfa3db31" + integrity sha512-W6zNLGQqfrp/EoPD0bhb9n7OobP+RHpmvVzpA+Z/IuU3Q63njJM24hmT0GYboovWcDtFmnIJC9wcyx4RVPQscw== + dependencies: + "@types/history" "^4.7.11" + "@types/react" "*" + commander "^5.1.0" + joi "^17.6.0" + react-helmet-async "^1.3.0" + utility-types "^3.10.0" + webpack "^5.73.0" + webpack-merge "^5.8.0" + +"@docusaurus/types@3.0.1": + version "3.0.1" + resolved "https://registry.yarnpkg.com/@docusaurus/types/-/types-3.0.1.tgz#4fe306aa10ef7c97dbc07588864f6676a40f3b6f" + integrity sha512-plyX2iU1tcUsF46uQ01pAd4JhexR7n0iiQ5MSnBFX6M6NSJgDYdru/i1/YNPKOnQHBoXGLHv0dNT6OAlDWNjrg== + dependencies: + "@types/history" "^4.7.11" + "@types/react" "*" + commander "^5.1.0" + joi "^17.9.2" + react-helmet-async "^1.3.0" + utility-types "^3.10.0" + webpack "^5.88.1" + webpack-merge "^5.9.0" + +"@docusaurus/utils-common@2.4.3": + version "2.4.3" + resolved "https://registry.yarnpkg.com/@docusaurus/utils-common/-/utils-common-2.4.3.tgz#30656c39ef1ce7e002af7ba39ea08330f58efcfb" + integrity sha512-/jascp4GbLQCPVmcGkPzEQjNaAk3ADVfMtudk49Ggb+131B1WDD6HqlSmDf8MxGdy7Dja2gc+StHf01kiWoTDQ== + dependencies: + tslib "^2.4.0" + +"@docusaurus/utils-common@3.0.1", "@docusaurus/utils-common@^2 || ^3": + version "3.0.1" + resolved "https://registry.yarnpkg.com/@docusaurus/utils-common/-/utils-common-3.0.1.tgz#111f450089d5f0a290c0c25f8a574a270d08436f" + integrity sha512-W0AxD6w6T8g6bNro8nBRWf7PeZ/nn7geEWM335qHU2DDDjHuV4UZjgUGP1AQsdcSikPrlIqTJJbKzer1lRSlIg== + dependencies: + tslib "^2.6.0" + +"@docusaurus/utils-validation@2.4.3": + version "2.4.3" + resolved "https://registry.yarnpkg.com/@docusaurus/utils-validation/-/utils-validation-2.4.3.tgz#8122c394feef3e96c73f6433987837ec206a63fb" + integrity sha512-G2+Vt3WR5E/9drAobP+hhZQMaswRwDlp6qOMi7o7ZypB+VO7N//DZWhZEwhcRGepMDJGQEwtPv7UxtYwPL9PBw== + dependencies: + "@docusaurus/logger" "2.4.3" + "@docusaurus/utils" "2.4.3" + joi "^17.6.0" + js-yaml "^4.1.0" + tslib "^2.4.0" + +"@docusaurus/utils-validation@3.0.1", "@docusaurus/utils-validation@^2 || ^3": + version "3.0.1" + resolved "https://registry.yarnpkg.com/@docusaurus/utils-validation/-/utils-validation-3.0.1.tgz#3c5f12941b328a19fc9acb34d070219f3e865ec6" + integrity sha512-ujTnqSfyGQ7/4iZdB4RRuHKY/Nwm58IIb+41s5tCXOv/MBU2wGAjOHq3U+AEyJ8aKQcHbxvTKJaRchNHYUVUQg== + dependencies: + "@docusaurus/logger" "3.0.1" + "@docusaurus/utils" "3.0.1" + joi "^17.9.2" + js-yaml "^4.1.0" + tslib "^2.6.0" + +"@docusaurus/utils@2.4.3": + version "2.4.3" + resolved "https://registry.yarnpkg.com/@docusaurus/utils/-/utils-2.4.3.tgz#52b000d989380a2125831b84e3a7327bef471e89" + integrity sha512-fKcXsjrD86Smxv8Pt0TBFqYieZZCPh4cbf9oszUq/AMhZn3ujwpKaVYZACPX8mmjtYx0JOgNx52CREBfiGQB4A== + dependencies: + "@docusaurus/logger" "2.4.3" + "@svgr/webpack" "^6.2.1" + escape-string-regexp "^4.0.0" + file-loader "^6.2.0" + fs-extra "^10.1.0" + github-slugger "^1.4.0" + globby "^11.1.0" + gray-matter "^4.0.3" + js-yaml "^4.1.0" + lodash "^4.17.21" + micromatch "^4.0.5" + resolve-pathname "^3.0.0" + shelljs "^0.8.5" + tslib "^2.4.0" + url-loader "^4.1.1" + webpack "^5.73.0" + +"@docusaurus/utils@3.0.1", "@docusaurus/utils@^2 || ^3": + version "3.0.1" + resolved "https://registry.yarnpkg.com/@docusaurus/utils/-/utils-3.0.1.tgz#c64f68980a90c5bc6d53a5b8f32deb9026b1e303" + integrity sha512-TwZ33Am0q4IIbvjhUOs+zpjtD/mXNmLmEgeTGuRq01QzulLHuPhaBTTAC/DHu6kFx3wDgmgpAlaRuCHfTcXv8g== + dependencies: + "@docusaurus/logger" "3.0.1" + "@svgr/webpack" "^6.5.1" + escape-string-regexp "^4.0.0" + file-loader "^6.2.0" + fs-extra "^11.1.1" + github-slugger "^1.5.0" + globby "^11.1.0" + gray-matter "^4.0.3" + jiti "^1.20.0" + js-yaml "^4.1.0" + lodash "^4.17.21" + micromatch "^4.0.5" + resolve-pathname "^3.0.0" + shelljs "^0.8.5" + tslib "^2.6.0" + url-loader "^4.1.1" + webpack "^5.88.1" + +"@easyops-cn/autocomplete.js@^0.38.1": + version "0.38.1" + resolved "https://registry.yarnpkg.com/@easyops-cn/autocomplete.js/-/autocomplete.js-0.38.1.tgz#46dff5795a9a032fa9b9250fdf63ca6c61c07629" + integrity sha512-drg76jS6syilOUmVNkyo1c7ZEBPcPuK+aJA7AksM5ZIIbV57DMHCywiCr+uHyv8BE5jUTU98j/H7gVrkHrWW3Q== + dependencies: + cssesc "^3.0.0" + immediate "^3.2.3" + +"@easyops-cn/docusaurus-search-local@0.45.0": + version "0.45.0" + resolved "https://registry.yarnpkg.com/@easyops-cn/docusaurus-search-local/-/docusaurus-search-local-0.45.0.tgz#7101d59c9359b50b1add306d2504a09bd7176adb" + integrity sha512-ccJjeYmBHrv2v8Y9eQnH79S0PEKcogACKkEatEKPcad7usQj/14jA9POUUUYW/yougLSXghwe+uIncbuUBuBFg== + dependencies: + "@docusaurus/plugin-content-docs" "^2 || ^3" + "@docusaurus/theme-translations" "^2 || ^3" + "@docusaurus/utils" "^2 || ^3" + "@docusaurus/utils-common" "^2 || ^3" + "@docusaurus/utils-validation" "^2 || ^3" + "@easyops-cn/autocomplete.js" "^0.38.1" + "@node-rs/jieba" "^1.6.0" + cheerio "^1.0.0" + clsx "^1.1.1" + debug "^4.2.0" + fs-extra "^10.0.0" + klaw-sync "^6.0.0" + lunr "^2.3.9" + lunr-languages "^1.4.0" + mark.js "^8.11.1" + tslib "^2.4.0" + +"@emnapi/core@^0.45.0": + version "0.45.0" + resolved "https://registry.yarnpkg.com/@emnapi/core/-/core-0.45.0.tgz#e58dc1f70ab3af3f6708991ba56d988088daf204" + integrity sha512-DPWjcUDQkCeEM4VnljEOEcXdAD7pp8zSZsgOujk/LGIwCXWbXJngin+MO4zbH429lzeC3WbYLGjE2MaUOwzpyw== + dependencies: + tslib "^2.4.0" + +"@emnapi/runtime@^0.45.0": + version "0.45.0" + resolved "https://registry.yarnpkg.com/@emnapi/runtime/-/runtime-0.45.0.tgz#e754de04c683263f34fd0c7f32adfe718bbe4ddd" + integrity sha512-Txumi3td7J4A/xTTwlssKieHKTGl3j4A1tglBx72auZ49YK7ePY6XZricgIg9mnZT4xPfA+UPCUdnhRuEFDL+w== + dependencies: + tslib "^2.4.0" + +"@emotion/is-prop-valid@1.2.1": + version "1.2.1" + resolved "https://registry.yarnpkg.com/@emotion/is-prop-valid/-/is-prop-valid-1.2.1.tgz#23116cf1ed18bfeac910ec6436561ecb1a3885cc" + integrity sha512-61Mf7Ufx4aDxx1xlDeOm8aFFigGHE4z+0sKCa+IHCeZKiyP9RLD0Mmx7m8b9/Cf37f7NAvQOOJAbQQGVr5uERw== + dependencies: + "@emotion/memoize" "^0.8.1" + +"@emotion/memoize@^0.8.1": + version "0.8.1" + resolved "https://registry.yarnpkg.com/@emotion/memoize/-/memoize-0.8.1.tgz#c1ddb040429c6d21d38cc945fe75c818cfb68e17" + integrity sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA== + +"@emotion/unitless@0.8.0": + version "0.8.0" + resolved "https://registry.yarnpkg.com/@emotion/unitless/-/unitless-0.8.0.tgz#a4a36e9cbdc6903737cd20d38033241e1b8833db" + integrity sha512-VINS5vEYAscRl2ZUDiT3uMPlrFQupiKgHz5AA4bCH1miKBg4qtwkim1qPmJj/4WG6TreYMY111rEFsjupcOKHw== + +"@exodus/schemasafe@^1.0.0-rc.2": + version "1.3.0" + resolved "https://registry.yarnpkg.com/@exodus/schemasafe/-/schemasafe-1.3.0.tgz#731656abe21e8e769a7f70a4d833e6312fe59b7f" + integrity sha512-5Aap/GaRupgNx/feGBwLLTVv8OQFfv3pq2lPRzPg9R+IOBnDgghTGW7l7EuVXOvg5cc/xSAlRW8rBrjIC3Nvqw== + +"@hapi/hoek@^9.0.0": + version "9.3.0" + resolved "https://registry.yarnpkg.com/@hapi/hoek/-/hoek-9.3.0.tgz#8368869dcb735be2e7f5cb7647de78e167a251fb" + integrity sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ== + +"@hapi/topo@^5.0.0": + version "5.1.0" + resolved "https://registry.yarnpkg.com/@hapi/topo/-/topo-5.1.0.tgz#dc448e332c6c6e37a4dc02fd84ba8d44b9afb012" + integrity sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg== + dependencies: + "@hapi/hoek" "^9.0.0" + +"@jest/schemas@^29.6.3": + version "29.6.3" + resolved "https://registry.yarnpkg.com/@jest/schemas/-/schemas-29.6.3.tgz#430b5ce8a4e0044a7e3819663305a7b3091c8e03" + integrity sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA== + dependencies: + "@sinclair/typebox" "^0.27.8" + +"@jest/types@^29.6.3": + version "29.6.3" + resolved "https://registry.yarnpkg.com/@jest/types/-/types-29.6.3.tgz#1131f8cf634e7e84c5e77bab12f052af585fba59" + integrity sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw== + dependencies: + "@jest/schemas" "^29.6.3" + "@types/istanbul-lib-coverage" "^2.0.0" + "@types/istanbul-reports" "^3.0.0" + "@types/node" "*" + "@types/yargs" "^17.0.8" + chalk "^4.0.0" + +"@jridgewell/gen-mapping@^0.3.0", "@jridgewell/gen-mapping@^0.3.2": + version "0.3.3" + resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz#7e02e6eb5df901aaedb08514203b096614024098" + integrity sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ== + dependencies: + "@jridgewell/set-array" "^1.0.1" + "@jridgewell/sourcemap-codec" "^1.4.10" + "@jridgewell/trace-mapping" "^0.3.9" + +"@jridgewell/resolve-uri@^3.1.0": + version "3.1.1" + resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz#c08679063f279615a3326583ba3a90d1d82cc721" + integrity sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA== + +"@jridgewell/set-array@^1.0.1": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.1.2.tgz#7c6cf998d6d20b914c0a55a91ae928ff25965e72" + integrity sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw== + +"@jridgewell/source-map@^0.3.3": + version "0.3.5" + resolved "https://registry.yarnpkg.com/@jridgewell/source-map/-/source-map-0.3.5.tgz#a3bb4d5c6825aab0d281268f47f6ad5853431e91" + integrity sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ== + dependencies: + "@jridgewell/gen-mapping" "^0.3.0" + "@jridgewell/trace-mapping" "^0.3.9" + +"@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.14": + version "1.4.15" + resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz#d7c6e6755c78567a951e04ab52ef0fd26de59f32" + integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== + +"@jridgewell/trace-mapping@^0.3.17", "@jridgewell/trace-mapping@^0.3.20", "@jridgewell/trace-mapping@^0.3.9": + version "0.3.20" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.20.tgz#72e45707cf240fa6b081d0366f8265b0cd10197f" + integrity sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q== + dependencies: + "@jridgewell/resolve-uri" "^3.1.0" + "@jridgewell/sourcemap-codec" "^1.4.14" + +"@leichtgewicht/ip-codec@^2.0.1": + version "2.0.4" + resolved "https://registry.yarnpkg.com/@leichtgewicht/ip-codec/-/ip-codec-2.0.4.tgz#b2ac626d6cb9c8718ab459166d4bb405b8ffa78b" + integrity sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A== + +"@mdx-js/mdx@^1.6.22": + version "1.6.22" + resolved "https://registry.yarnpkg.com/@mdx-js/mdx/-/mdx-1.6.22.tgz#8a723157bf90e78f17dc0f27995398e6c731f1ba" + integrity sha512-AMxuLxPz2j5/6TpF/XSdKpQP1NlG0z11dFOlq+2IP/lSgl11GY8ji6S/rgsViN/L0BDvHvUMruRb7ub+24LUYA== + dependencies: + "@babel/core" "7.12.9" + "@babel/plugin-syntax-jsx" "7.12.1" + "@babel/plugin-syntax-object-rest-spread" "7.8.3" + "@mdx-js/util" "1.6.22" + babel-plugin-apply-mdx-type-prop "1.6.22" + babel-plugin-extract-import-names "1.6.22" + camelcase-css "2.0.1" + detab "2.0.4" + hast-util-raw "6.0.1" + lodash.uniq "4.5.0" + mdast-util-to-hast "10.0.1" + remark-footnotes "2.0.0" + remark-mdx "1.6.22" + remark-parse "8.0.3" + remark-squeeze-paragraphs "4.0.0" + style-to-object "0.3.0" + unified "9.2.0" + unist-builder "2.0.3" + unist-util-visit "2.0.3" + +"@mdx-js/mdx@^3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@mdx-js/mdx/-/mdx-3.0.0.tgz#37ef87685143fafedf1165f0a79e9fe95fbe5154" + integrity sha512-Icm0TBKBLYqroYbNW3BPnzMGn+7mwpQOK310aZ7+fkCtiU3aqv2cdcX+nd0Ydo3wI5Rx8bX2Z2QmGb/XcAClCw== + dependencies: + "@types/estree" "^1.0.0" + "@types/estree-jsx" "^1.0.0" + "@types/hast" "^3.0.0" + "@types/mdx" "^2.0.0" + collapse-white-space "^2.0.0" + devlop "^1.0.0" + estree-util-build-jsx "^3.0.0" + estree-util-is-identifier-name "^3.0.0" + estree-util-to-js "^2.0.0" + estree-walker "^3.0.0" + hast-util-to-estree "^3.0.0" + hast-util-to-jsx-runtime "^2.0.0" + markdown-extensions "^2.0.0" + periscopic "^3.0.0" + remark-mdx "^3.0.0" + remark-parse "^11.0.0" + remark-rehype "^11.0.0" + source-map "^0.7.0" + unified "^11.0.0" + unist-util-position-from-estree "^2.0.0" + unist-util-stringify-position "^4.0.0" + unist-util-visit "^5.0.0" + vfile "^6.0.0" + +"@mdx-js/react@^1.6.22": + version "1.6.22" + resolved "https://registry.yarnpkg.com/@mdx-js/react/-/react-1.6.22.tgz#ae09b4744fddc74714ee9f9d6f17a66e77c43573" + integrity sha512-TDoPum4SHdfPiGSAaRBw7ECyI8VaHpK8GJugbJIJuqyh6kzw9ZLJZW3HGL3NNrJGxcAixUvqROm+YuQOo5eXtg== + +"@mdx-js/util@1.6.22": + version "1.6.22" + resolved "https://registry.yarnpkg.com/@mdx-js/util/-/util-1.6.22.tgz#219dfd89ae5b97a8801f015323ffa4b62f45718b" + integrity sha512-H1rQc1ZOHANWBvPcW+JpGwr+juXSxM8Q8YCkm3GhZd8REu1fHR3z99CErO1p9pkcfcxZnMdIZdIsXkOHY0NilA== + +"@node-rs/jieba-android-arm-eabi@1.8.0": + version "1.8.0" + resolved "https://registry.yarnpkg.com/@node-rs/jieba-android-arm-eabi/-/jieba-android-arm-eabi-1.8.0.tgz#e758d3480c41f974d8cb0531a4accbcf9909d027" + integrity sha512-aytaOo5eMnwEH/PWIuT/XL1QajXxIYZ12nu6ANIJsIXS04tCHvpcORI/2jekTxWLPEegMBQfiT5x7VDrGLawFQ== + +"@node-rs/jieba-android-arm64@1.8.0": + version "1.8.0" + resolved "https://registry.yarnpkg.com/@node-rs/jieba-android-arm64/-/jieba-android-arm64-1.8.0.tgz#04943137575d20d1553811358dfa53ff4fb58855" + integrity sha512-lOLC44H8rseNK8/8Zxe4OZLcrDDeVN0LbUyJUBmn54Iwnmrju8bdVFHMOXhOZx2lo77aJKupFDxF+Q9ao9OaSw== + +"@node-rs/jieba-darwin-arm64@1.8.0": + version "1.8.0" + resolved "https://registry.yarnpkg.com/@node-rs/jieba-darwin-arm64/-/jieba-darwin-arm64-1.8.0.tgz#e842584bbf0532039f60bc25912094fc47b81880" + integrity sha512-c2MlVgqgU9ARyaWGswYeZL1Zt9aRPbuZchbFL2Okbf6Tnwv8so5kawKeSr/1zR8WJabAdkT0jHNWa1gyhVBpaA== + +"@node-rs/jieba-darwin-x64@1.8.0": + version "1.8.0" + resolved "https://registry.yarnpkg.com/@node-rs/jieba-darwin-x64/-/jieba-darwin-x64-1.8.0.tgz#c8d596d18f0a30f44a956a1365795aea5c21f5fd" + integrity sha512-8TZgcFKRrJI82LY+P0sw0A1ASHoCwn+WdyBHSQ9xZAVtfWHtRgzG3ccSsN/DdWIv+Kc686j9joV7Mhb08QRYaw== + +"@node-rs/jieba-freebsd-x64@1.8.0": + version "1.8.0" + resolved "https://registry.yarnpkg.com/@node-rs/jieba-freebsd-x64/-/jieba-freebsd-x64-1.8.0.tgz#1be208691cd4e02a4c0a3a3d1a03aea0d10bb742" + integrity sha512-dBnkMi9urpS7vKlMekPq7s80euf6o2Spj5cueD3g89GSFKH0vuDrJizSxwOlA6EE1tmA9SpS1rv5DWGh3Lev4Q== + +"@node-rs/jieba-linux-arm-gnueabihf@1.8.0": + version "1.8.0" + resolved "https://registry.yarnpkg.com/@node-rs/jieba-linux-arm-gnueabihf/-/jieba-linux-arm-gnueabihf-1.8.0.tgz#fa7a777f8c7801abfd7fd779901ebbbc0c9102fb" + integrity sha512-lWZoQnkBXm+y2d88Scw1EsS7Smr+PLkeUOJosB9aPPNEqjnewJpAC1hJBcSm+xnvimk7l4H1E12DR2+8/yFIYQ== + +"@node-rs/jieba-linux-arm64-gnu@1.8.0": + version "1.8.0" + resolved "https://registry.yarnpkg.com/@node-rs/jieba-linux-arm64-gnu/-/jieba-linux-arm64-gnu-1.8.0.tgz#64452d386def83849b0ebd2f0365b9756fb6efc2" + integrity sha512-TKndzSs9l0TRa6WT0Dn/J5Tvwf94ZuVuoctJ3vk4odWaKnqgIjEAauochHpRn8hfpfs5bEAEJns8YZBQGaS/Vw== + +"@node-rs/jieba-linux-arm64-musl@1.8.0": + version "1.8.0" + resolved "https://registry.yarnpkg.com/@node-rs/jieba-linux-arm64-musl/-/jieba-linux-arm64-musl-1.8.0.tgz#39d42b0cbacc45a24f57a68b528ada51d06268c8" + integrity sha512-c5MOWuczY/76Fip4DCnQy+OYMd3dLpLe9O2Q2PXIOR/wSnS0m7Ob/eR0fZGQSZkdVXKCp/POyGaWxHxD4fKKsA== + +"@node-rs/jieba-linux-x64-gnu@1.8.0": + version "1.8.0" + resolved "https://registry.yarnpkg.com/@node-rs/jieba-linux-x64-gnu/-/jieba-linux-x64-gnu-1.8.0.tgz#ca56b8cf6907037132871e7e1b53e33d0083dd90" + integrity sha512-+R4gR3InDXsREpXjrlknDf3QPiBTm/Ai4jVCqHUhvbF1HWtrW3VOBmrDbGJ801o5UoS4+jVbiXqTt5slehh3pw== + +"@node-rs/jieba-linux-x64-musl@1.8.0": + version "1.8.0" + resolved "https://registry.yarnpkg.com/@node-rs/jieba-linux-x64-musl/-/jieba-linux-x64-musl-1.8.0.tgz#4a4c191f646ec82b128785b74a3332f27e1e32ad" + integrity sha512-HL+6NWAVDtRy0F1FvwL8f7PNBTOgPJf1kyRPvFo5OsW1acpOt9tqOyPWrL8NzSSu2O2eUAZup/KDCidP1Iw77g== + +"@node-rs/jieba-wasm32-wasi@1.8.0": + version "1.8.0" + resolved "https://registry.yarnpkg.com/@node-rs/jieba-wasm32-wasi/-/jieba-wasm32-wasi-1.8.0.tgz#ee878798096870e6392ccc34a6e36fd8eacf2c5e" + integrity sha512-IKj9+SZmdiSD/lXpGH8qQnqCdRqEDF74vEYTRUN5lzNL2YF4FyjN3cHSuIxUZSCj9hJZf+js34qZm+ZOFYYvSw== + dependencies: + "@emnapi/core" "^0.45.0" + "@emnapi/runtime" "^0.45.0" + +"@node-rs/jieba-win32-arm64-msvc@1.8.0": + version "1.8.0" + resolved "https://registry.yarnpkg.com/@node-rs/jieba-win32-arm64-msvc/-/jieba-win32-arm64-msvc-1.8.0.tgz#3b4988c5009c27152b153c7abb967c2523419dbc" + integrity sha512-gKCs1r6NxrWM3xjY6Vc4nnXDinpkY0XWXZD9nCI3mYroDi7FDt9Txzf4ymUk6WFaBLDYeZA33csukgnMOn+e9A== + +"@node-rs/jieba-win32-ia32-msvc@1.8.0": + version "1.8.0" + resolved "https://registry.yarnpkg.com/@node-rs/jieba-win32-ia32-msvc/-/jieba-win32-ia32-msvc-1.8.0.tgz#709193db52ef7bd046cec6f55ba438fda3bb4864" + integrity sha512-S5V8vTkMVJPf50HW1d2BqmYLFWHGwy5TwRMUwxCcJCbH1g0JzZPCBVh855FZcLkIdGh5rpJR/fYuoKP3JT2GVw== + +"@node-rs/jieba-win32-x64-msvc@1.8.0": + version "1.8.0" + resolved "https://registry.yarnpkg.com/@node-rs/jieba-win32-x64-msvc/-/jieba-win32-x64-msvc-1.8.0.tgz#275ec3f2023c088cc4dd6605d15cb057eb26ee4d" + integrity sha512-9Y5k2eIHz4xiQ8WrDy1fbfh7k0yrkeS1kiXPRDZPhR4wylDSZHRjDaNz8o2PtQJ8dIuXudM/Vlo9pXv6+2xU5g== + +"@node-rs/jieba@^1.6.0": + version "1.8.0" + resolved "https://registry.yarnpkg.com/@node-rs/jieba/-/jieba-1.8.0.tgz#bae0b268c7997b677dec2b78a7c5fc6ded36e2d4" + integrity sha512-aZrqp40IRD5niZb+oxGCq+l0GAnAZaWy+sHNONOhgZIRBrixT86eu84IvvPHm+LxEy4G2moDMsFviDcsK59G5A== + optionalDependencies: + "@node-rs/jieba-android-arm-eabi" "1.8.0" + "@node-rs/jieba-android-arm64" "1.8.0" + "@node-rs/jieba-darwin-arm64" "1.8.0" + "@node-rs/jieba-darwin-x64" "1.8.0" + "@node-rs/jieba-freebsd-x64" "1.8.0" + "@node-rs/jieba-linux-arm-gnueabihf" "1.8.0" + "@node-rs/jieba-linux-arm64-gnu" "1.8.0" + "@node-rs/jieba-linux-arm64-musl" "1.8.0" + "@node-rs/jieba-linux-x64-gnu" "1.8.0" + "@node-rs/jieba-linux-x64-musl" "1.8.0" + "@node-rs/jieba-wasm32-wasi" "1.8.0" + "@node-rs/jieba-win32-arm64-msvc" "1.8.0" + "@node-rs/jieba-win32-ia32-msvc" "1.8.0" + "@node-rs/jieba-win32-x64-msvc" "1.8.0" + +"@nodelib/fs.scandir@2.1.5": + version "2.1.5" + resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" + integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== + dependencies: + "@nodelib/fs.stat" "2.0.5" + run-parallel "^1.1.9" + +"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": + version "2.0.5" + resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" + integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== + +"@nodelib/fs.walk@^1.2.3": + version "1.2.8" + resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" + integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== + dependencies: + "@nodelib/fs.scandir" "2.1.5" + fastq "^1.6.0" + +"@pnpm/config.env-replace@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@pnpm/config.env-replace/-/config.env-replace-1.1.0.tgz#ab29da53df41e8948a00f2433f085f54de8b3a4c" + integrity sha512-htyl8TWnKL7K/ESFa1oW2UB5lVDxuF5DpM7tBi6Hu2LNL3mWkIzNLG6N4zoCUP1lCKNxWy/3iu8mS8MvToGd6w== + +"@pnpm/network.ca-file@^1.0.1": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@pnpm/network.ca-file/-/network.ca-file-1.0.2.tgz#2ab05e09c1af0cdf2fcf5035bea1484e222f7983" + integrity sha512-YcPQ8a0jwYU9bTdJDpXjMi7Brhkr1mXsXrUJvjqM2mQDgkRiz8jFaQGOdaLxgjtUfQgZhKy/O3cG/YwmgKaxLA== + dependencies: + graceful-fs "4.2.10" + +"@pnpm/npm-conf@^2.1.0": + version "2.2.2" + resolved "https://registry.yarnpkg.com/@pnpm/npm-conf/-/npm-conf-2.2.2.tgz#0058baf1c26cbb63a828f0193795401684ac86f0" + integrity sha512-UA91GwWPhFExt3IizW6bOeY/pQ0BkuNwKjk9iQW9KqxluGCrg4VenZ0/L+2Y0+ZOtme72EVvg6v0zo3AMQRCeA== + dependencies: + "@pnpm/config.env-replace" "^1.1.0" + "@pnpm/network.ca-file" "^1.0.1" + config-chain "^1.1.11" + +"@polka/url@^1.0.0-next.24": + version "1.0.0-next.24" + resolved "https://registry.yarnpkg.com/@polka/url/-/url-1.0.0-next.24.tgz#58601079e11784d20f82d0585865bb42305c4df3" + integrity sha512-2LuNTFBIO0m7kKIQvvPHN6UE63VjpmL9rnEEaOOaiSPbZK+zUOYIzBAWcED+3XYzhYsd/0mD57VdxAEqqV52CQ== + +"@redocly/ajv@^8.11.0": + version "8.11.0" + resolved "https://registry.yarnpkg.com/@redocly/ajv/-/ajv-8.11.0.tgz#2fad322888dc0113af026e08fceb3e71aae495ae" + integrity sha512-9GWx27t7xWhDIR02PA18nzBdLcKQRgc46xNQvjFkrYk4UOmvKhJ/dawwiX0cCOeetN5LcaaiqQbVOWYK62SGHw== + dependencies: + fast-deep-equal "^3.1.1" + json-schema-traverse "^1.0.0" + require-from-string "^2.0.2" + uri-js "^4.2.2" + +"@redocly/openapi-core@1.10.3", "@redocly/openapi-core@^1.0.0-rc.2": + version "1.10.3" + resolved "https://registry.yarnpkg.com/@redocly/openapi-core/-/openapi-core-1.10.3.tgz#907b148dc72caba22b6ddbe76e15c67db84dc10d" + integrity sha512-4SnIWh8r3EM1ylcoHIJSnQnuvqRTpQMnf2RU3BfVdcCBa0A1uEyH6XSxgcO5ehxfQGuGGpUXJ+vPh32PUaQDkA== + dependencies: + "@redocly/ajv" "^8.11.0" + colorette "^1.2.0" + js-levenshtein "^1.1.6" + js-yaml "^4.1.0" + lodash.isequal "^4.5.0" + minimatch "^5.0.1" + node-fetch "^2.6.1" + pluralize "^8.0.0" + yaml-ast-parser "0.0.43" + +"@sideway/address@^4.1.3": + version "4.1.4" + resolved "https://registry.yarnpkg.com/@sideway/address/-/address-4.1.4.tgz#03dccebc6ea47fdc226f7d3d1ad512955d4783f0" + integrity sha512-7vwq+rOHVWjyXxVlR76Agnvhy8I9rpzjosTESvmhNeXOXdZZB15Fl+TI9x1SiHZH5Jv2wTGduSxFDIaq0m3DUw== + dependencies: + "@hapi/hoek" "^9.0.0" + +"@sideway/formula@^3.0.1": + version "3.0.1" + resolved "https://registry.yarnpkg.com/@sideway/formula/-/formula-3.0.1.tgz#80fcbcbaf7ce031e0ef2dd29b1bfc7c3f583611f" + integrity sha512-/poHZJJVjx3L+zVD6g9KgHfYnb443oi7wLu/XKojDviHy6HOEOA6z1Trk5aR1dGcmPenJEgb2sK2I80LeS3MIg== + +"@sideway/pinpoint@^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@sideway/pinpoint/-/pinpoint-2.0.0.tgz#cff8ffadc372ad29fd3f78277aeb29e632cc70df" + integrity sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ== + +"@sinclair/typebox@^0.27.8": + version "0.27.8" + resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.27.8.tgz#6667fac16c436b5434a387a34dedb013198f6e6e" + integrity sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA== + +"@sindresorhus/is@^0.14.0": + version "0.14.0" + resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-0.14.0.tgz#9fb3a3cf3132328151f353de4632e01e52102bea" + integrity sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ== + +"@sindresorhus/is@^4.6.0": + version "4.6.0" + resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-4.6.0.tgz#3c7c9c46e678feefe7a2e5bb609d3dbd665ffb3f" + integrity sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw== + +"@sindresorhus/is@^5.2.0": + version "5.6.0" + resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-5.6.0.tgz#41dd6093d34652cddb5d5bdeee04eafc33826668" + integrity sha512-TV7t8GKYaJWsn00tFDqBw8+Uqmr8A0fRU1tvTQhyZzGv0sJCGRQL3JGMI3ucuKo3XIZdUP+Lx7/gh2t3lewy7g== + +"@slorber/remark-comment@^1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@slorber/remark-comment/-/remark-comment-1.0.0.tgz#2a020b3f4579c89dec0361673206c28d67e08f5a" + integrity sha512-RCE24n7jsOj1M0UPvIQCHTe7fI0sFL4S2nwKVWwHyVr/wI/H8GosgsJGyhnsZoGFnD/P2hLf1mSbrrgSLN93NA== + dependencies: + micromark-factory-space "^1.0.0" + micromark-util-character "^1.1.0" + micromark-util-symbol "^1.0.1" + +"@slorber/static-site-generator-webpack-plugin@^4.0.7": + version "4.0.7" + resolved "https://registry.yarnpkg.com/@slorber/static-site-generator-webpack-plugin/-/static-site-generator-webpack-plugin-4.0.7.tgz#fc1678bddefab014e2145cbe25b3ce4e1cfc36f3" + integrity sha512-Ug7x6z5lwrz0WqdnNFOMYrDQNTPAprvHLSh6+/fmml3qUiz6l5eq+2MzLKWtn/q5K5NpSiFsZTP/fck/3vjSxA== + dependencies: + eval "^0.1.8" + p-map "^4.0.0" + webpack-sources "^3.2.2" + +"@svgr/babel-plugin-add-jsx-attribute@8.0.0": + version "8.0.0" + resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-8.0.0.tgz#4001f5d5dd87fa13303e36ee106e3ff3a7eb8b22" + integrity sha512-b9MIk7yhdS1pMCZM8VeNfUlSKVRhsHZNMl5O9SfaX0l0t5wjdgu4IDzGB8bpnGBBOjGST3rRFVsaaEtI4W6f7g== + +"@svgr/babel-plugin-add-jsx-attribute@^6.5.1": + version "6.5.1" + resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-6.5.1.tgz#74a5d648bd0347bda99d82409d87b8ca80b9a1ba" + integrity sha512-9PYGcXrAxitycIjRmZB+Q0JaN07GZIWaTBIGQzfaZv+qr1n8X1XUEJ5rZ/vx6OVD9RRYlrNnXWExQXcmZeD/BQ== + +"@svgr/babel-plugin-remove-jsx-attribute@*", "@svgr/babel-plugin-remove-jsx-attribute@8.0.0": + version "8.0.0" + resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-8.0.0.tgz#69177f7937233caca3a1afb051906698f2f59186" + integrity sha512-BcCkm/STipKvbCl6b7QFrMh/vx00vIP63k2eM66MfHJzPr6O2U0jYEViXkHJWqXqQYjdeA9cuCl5KWmlwjDvbA== + +"@svgr/babel-plugin-remove-jsx-empty-expression@*", "@svgr/babel-plugin-remove-jsx-empty-expression@8.0.0": + version "8.0.0" + resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-8.0.0.tgz#c2c48104cfd7dcd557f373b70a56e9e3bdae1d44" + integrity sha512-5BcGCBfBxB5+XSDSWnhTThfI9jcO5f0Ai2V24gZpG+wXF14BzwxxdDb4g6trdOux0rhibGs385BeFMSmxtS3uA== + +"@svgr/babel-plugin-replace-jsx-attribute-value@8.0.0": + version "8.0.0" + resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-8.0.0.tgz#8fbb6b2e91fa26ac5d4aa25c6b6e4f20f9c0ae27" + integrity sha512-KVQ+PtIjb1BuYT3ht8M5KbzWBhdAjjUPdlMtpuw/VjT8coTrItWX6Qafl9+ji831JaJcu6PJNKCV0bp01lBNzQ== + +"@svgr/babel-plugin-replace-jsx-attribute-value@^6.5.1": + version "6.5.1" + resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-6.5.1.tgz#fb9d22ea26d2bc5e0a44b763d4c46d5d3f596c60" + integrity sha512-8DPaVVE3fd5JKuIC29dqyMB54sA6mfgki2H2+swh+zNJoynC8pMPzOkidqHOSc6Wj032fhl8Z0TVn1GiPpAiJg== + +"@svgr/babel-plugin-svg-dynamic-title@8.0.0": + version "8.0.0" + resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-8.0.0.tgz#1d5ba1d281363fc0f2f29a60d6d936f9bbc657b0" + integrity sha512-omNiKqwjNmOQJ2v6ge4SErBbkooV2aAWwaPFs2vUY7p7GhVkzRkJ00kILXQvRhA6miHnNpXv7MRnnSjdRjK8og== + +"@svgr/babel-plugin-svg-dynamic-title@^6.5.1": + version "6.5.1" + resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-6.5.1.tgz#01b2024a2b53ffaa5efceaa0bf3e1d5a4c520ce4" + integrity sha512-FwOEi0Il72iAzlkaHrlemVurgSQRDFbk0OC8dSvD5fSBPHltNh7JtLsxmZUhjYBZo2PpcU/RJvvi6Q0l7O7ogw== + +"@svgr/babel-plugin-svg-em-dimensions@8.0.0": + version "8.0.0" + resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-8.0.0.tgz#35e08df300ea8b1d41cb8f62309c241b0369e501" + integrity sha512-mURHYnu6Iw3UBTbhGwE/vsngtCIbHE43xCRK7kCw4t01xyGqb2Pd+WXekRRoFOBIY29ZoOhUCTEweDMdrjfi9g== + +"@svgr/babel-plugin-svg-em-dimensions@^6.5.1": + version "6.5.1" + resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-6.5.1.tgz#dd3fa9f5b24eb4f93bcf121c3d40ff5facecb217" + integrity sha512-gWGsiwjb4tw+ITOJ86ndY/DZZ6cuXMNE/SjcDRg+HLuCmwpcjOktwRF9WgAiycTqJD/QXqL2f8IzE2Rzh7aVXA== + +"@svgr/babel-plugin-transform-react-native-svg@8.1.0": + version "8.1.0" + resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-8.1.0.tgz#90a8b63998b688b284f255c6a5248abd5b28d754" + integrity sha512-Tx8T58CHo+7nwJ+EhUwx3LfdNSG9R2OKfaIXXs5soiy5HtgoAEkDay9LIimLOcG8dJQH1wPZp/cnAv6S9CrR1Q== + +"@svgr/babel-plugin-transform-react-native-svg@^6.5.1": + version "6.5.1" + resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-6.5.1.tgz#1d8e945a03df65b601551097d8f5e34351d3d305" + integrity sha512-2jT3nTayyYP7kI6aGutkyfJ7UMGtuguD72OjeGLwVNyfPRBD8zQthlvL+fAbAKk5n9ZNcvFkp/b1lZ7VsYqVJg== + +"@svgr/babel-plugin-transform-svg-component@8.0.0": + version "8.0.0" + resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-8.0.0.tgz#013b4bfca88779711f0ed2739f3f7efcefcf4f7e" + integrity sha512-DFx8xa3cZXTdb/k3kfPeaixecQLgKh5NVBMwD0AQxOzcZawK4oo1Jh9LbrcACUivsCA7TLG8eeWgrDXjTMhRmw== + +"@svgr/babel-plugin-transform-svg-component@^6.5.1": + version "6.5.1" + resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-6.5.1.tgz#48620b9e590e25ff95a80f811544218d27f8a250" + integrity sha512-a1p6LF5Jt33O3rZoVRBqdxL350oge54iZWHNI6LJB5tQ7EelvD/Mb1mfBiZNAan0dt4i3VArkFRjA4iObuNykQ== + +"@svgr/babel-preset@8.1.0": + version "8.1.0" + resolved "https://registry.yarnpkg.com/@svgr/babel-preset/-/babel-preset-8.1.0.tgz#0e87119aecdf1c424840b9d4565b7137cabf9ece" + integrity sha512-7EYDbHE7MxHpv4sxvnVPngw5fuR6pw79SkcrILHJ/iMpuKySNCl5W1qcwPEpU+LgyRXOaAFgH0KhwD18wwg6ug== + dependencies: + "@svgr/babel-plugin-add-jsx-attribute" "8.0.0" + "@svgr/babel-plugin-remove-jsx-attribute" "8.0.0" + "@svgr/babel-plugin-remove-jsx-empty-expression" "8.0.0" + "@svgr/babel-plugin-replace-jsx-attribute-value" "8.0.0" + "@svgr/babel-plugin-svg-dynamic-title" "8.0.0" + "@svgr/babel-plugin-svg-em-dimensions" "8.0.0" + "@svgr/babel-plugin-transform-react-native-svg" "8.1.0" + "@svgr/babel-plugin-transform-svg-component" "8.0.0" + +"@svgr/babel-preset@^6.5.1": + version "6.5.1" + resolved "https://registry.yarnpkg.com/@svgr/babel-preset/-/babel-preset-6.5.1.tgz#b90de7979c8843c5c580c7e2ec71f024b49eb828" + integrity sha512-6127fvO/FF2oi5EzSQOAjo1LE3OtNVh11R+/8FXa+mHx1ptAaS4cknIjnUA7e6j6fwGGJ17NzaTJFUwOV2zwCw== + dependencies: + "@svgr/babel-plugin-add-jsx-attribute" "^6.5.1" + "@svgr/babel-plugin-remove-jsx-attribute" "*" + "@svgr/babel-plugin-remove-jsx-empty-expression" "*" + "@svgr/babel-plugin-replace-jsx-attribute-value" "^6.5.1" + "@svgr/babel-plugin-svg-dynamic-title" "^6.5.1" + "@svgr/babel-plugin-svg-em-dimensions" "^6.5.1" + "@svgr/babel-plugin-transform-react-native-svg" "^6.5.1" + "@svgr/babel-plugin-transform-svg-component" "^6.5.1" + +"@svgr/core@8.1.0": + version "8.1.0" + resolved "https://registry.yarnpkg.com/@svgr/core/-/core-8.1.0.tgz#41146f9b40b1a10beaf5cc4f361a16a3c1885e88" + integrity sha512-8QqtOQT5ACVlmsvKOJNEaWmRPmcojMOzCz4Hs2BGG/toAp/K38LcsMRyLp349glq5AzJbCEeimEoxaX6v/fLrA== + dependencies: + "@babel/core" "^7.21.3" + "@svgr/babel-preset" "8.1.0" + camelcase "^6.2.0" + cosmiconfig "^8.1.3" + snake-case "^3.0.4" + +"@svgr/core@^6.5.1": + version "6.5.1" + resolved "https://registry.yarnpkg.com/@svgr/core/-/core-6.5.1.tgz#d3e8aa9dbe3fbd747f9ee4282c1c77a27410488a" + integrity sha512-/xdLSWxK5QkqG524ONSjvg3V/FkNyCv538OIBdQqPNaAta3AsXj/Bd2FbvR87yMbXO2hFSWiAe/Q6IkVPDw+mw== + dependencies: + "@babel/core" "^7.19.6" + "@svgr/babel-preset" "^6.5.1" + "@svgr/plugin-jsx" "^6.5.1" + camelcase "^6.2.0" + cosmiconfig "^7.0.1" + +"@svgr/hast-util-to-babel-ast@8.0.0": + version "8.0.0" + resolved "https://registry.yarnpkg.com/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-8.0.0.tgz#6952fd9ce0f470e1aded293b792a2705faf4ffd4" + integrity sha512-EbDKwO9GpfWP4jN9sGdYwPBU0kdomaPIL2Eu4YwmgP+sJeXT+L7bMwJUBnhzfH8Q2qMBqZ4fJwpCyYsAN3mt2Q== + dependencies: + "@babel/types" "^7.21.3" + entities "^4.4.0" + +"@svgr/hast-util-to-babel-ast@^6.5.1": + version "6.5.1" + resolved "https://registry.yarnpkg.com/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-6.5.1.tgz#81800bd09b5bcdb968bf6ee7c863d2288fdb80d2" + integrity sha512-1hnUxxjd83EAxbL4a0JDJoD3Dao3hmjvyvyEV8PzWmLK3B9m9NPlW7GKjFyoWE8nM7HnXzPcmmSyOW8yOddSXw== + dependencies: + "@babel/types" "^7.20.0" + entities "^4.4.0" + +"@svgr/plugin-jsx@8.1.0": + version "8.1.0" + resolved "https://registry.yarnpkg.com/@svgr/plugin-jsx/-/plugin-jsx-8.1.0.tgz#96969f04a24b58b174ee4cd974c60475acbd6928" + integrity sha512-0xiIyBsLlr8quN+WyuxooNW9RJ0Dpr8uOnH/xrCVO8GLUcwHISwj1AG0k+LFzteTkAA0GbX0kj9q6Dk70PTiPA== + dependencies: + "@babel/core" "^7.21.3" + "@svgr/babel-preset" "8.1.0" + "@svgr/hast-util-to-babel-ast" "8.0.0" + svg-parser "^2.0.4" + +"@svgr/plugin-jsx@^6.5.1": + version "6.5.1" + resolved "https://registry.yarnpkg.com/@svgr/plugin-jsx/-/plugin-jsx-6.5.1.tgz#0e30d1878e771ca753c94e69581c7971542a7072" + integrity sha512-+UdQxI3jgtSjCykNSlEMuy1jSRQlGC7pqBCPvkG/2dATdWo082zHTTK3uhnAju2/6XpE6B5mZ3z4Z8Ns01S8Gw== + dependencies: + "@babel/core" "^7.19.6" + "@svgr/babel-preset" "^6.5.1" + "@svgr/hast-util-to-babel-ast" "^6.5.1" + svg-parser "^2.0.4" + +"@svgr/plugin-svgo@8.1.0": + version "8.1.0" + resolved "https://registry.yarnpkg.com/@svgr/plugin-svgo/-/plugin-svgo-8.1.0.tgz#b115b7b967b564f89ac58feae89b88c3decd0f00" + integrity sha512-Ywtl837OGO9pTLIN/onoWLmDQ4zFUycI1g76vuKGEz6evR/ZTJlJuz3G/fIkb6OVBJ2g0o6CGJzaEjfmEo3AHA== + dependencies: + cosmiconfig "^8.1.3" + deepmerge "^4.3.1" + svgo "^3.0.2" + +"@svgr/plugin-svgo@^6.5.1": + version "6.5.1" + resolved "https://registry.yarnpkg.com/@svgr/plugin-svgo/-/plugin-svgo-6.5.1.tgz#0f91910e988fc0b842f88e0960c2862e022abe84" + integrity sha512-omvZKf8ixP9z6GWgwbtmP9qQMPX4ODXi+wzbVZgomNFsUIlHA1sf4fThdwTWSsZGgvGAG6yE+b/F5gWUkcZ/iQ== + dependencies: + cosmiconfig "^7.0.1" + deepmerge "^4.2.2" + svgo "^2.8.0" + +"@svgr/webpack@^6.2.1", "@svgr/webpack@^6.5.1": + version "6.5.1" + resolved "https://registry.yarnpkg.com/@svgr/webpack/-/webpack-6.5.1.tgz#ecf027814fc1cb2decc29dc92f39c3cf691e40e8" + integrity sha512-cQ/AsnBkXPkEK8cLbv4Dm7JGXq2XrumKnL1dRpJD9rIO2fTIlJI9a1uCciYG1F2aUsox/hJQyNGbt3soDxSRkA== + dependencies: + "@babel/core" "^7.19.6" + "@babel/plugin-transform-react-constant-elements" "^7.18.12" + "@babel/preset-env" "^7.19.4" + "@babel/preset-react" "^7.18.6" + "@babel/preset-typescript" "^7.18.6" + "@svgr/core" "^6.5.1" + "@svgr/plugin-jsx" "^6.5.1" + "@svgr/plugin-svgo" "^6.5.1" + +"@svgr/webpack@^8.1.0": + version "8.1.0" + resolved "https://registry.yarnpkg.com/@svgr/webpack/-/webpack-8.1.0.tgz#16f1b5346f102f89fda6ec7338b96a701d8be0c2" + integrity sha512-LnhVjMWyMQV9ZmeEy26maJk+8HTIbd59cH4F2MJ439k9DqejRisfFNGAPvRYlKETuh9LrImlS8aKsBgKjMA8WA== + dependencies: + "@babel/core" "^7.21.3" + "@babel/plugin-transform-react-constant-elements" "^7.21.3" + "@babel/preset-env" "^7.20.2" + "@babel/preset-react" "^7.18.6" + "@babel/preset-typescript" "^7.21.0" + "@svgr/core" "8.1.0" + "@svgr/plugin-jsx" "8.1.0" + "@svgr/plugin-svgo" "8.1.0" + +"@szmarczak/http-timer@^1.1.2": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@szmarczak/http-timer/-/http-timer-1.1.2.tgz#b1665e2c461a2cd92f4c1bbf50d5454de0d4b421" + integrity sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA== + dependencies: + defer-to-connect "^1.0.1" + +"@szmarczak/http-timer@^5.0.1": + version "5.0.1" + resolved "https://registry.yarnpkg.com/@szmarczak/http-timer/-/http-timer-5.0.1.tgz#c7c1bf1141cdd4751b0399c8fc7b8b664cd5be3a" + integrity sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw== + dependencies: + defer-to-connect "^2.0.1" + +"@trysound/sax@0.2.0": + version "0.2.0" + resolved "https://registry.yarnpkg.com/@trysound/sax/-/sax-0.2.0.tgz#cccaab758af56761eb7bf37af6f03f326dd798ad" + integrity sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA== + +"@types/acorn@^4.0.0": + version "4.0.6" + resolved "https://registry.yarnpkg.com/@types/acorn/-/acorn-4.0.6.tgz#d61ca5480300ac41a7d973dd5b84d0a591154a22" + integrity sha512-veQTnWP+1D/xbxVrPC3zHnCZRjSrKfhbMUlEA43iMZLu7EsnTtkJklIuwrCPbOi8YkvDQAiW05VQQFvvz9oieQ== + dependencies: + "@types/estree" "*" + +"@types/body-parser@*": + version "1.19.5" + resolved "https://registry.yarnpkg.com/@types/body-parser/-/body-parser-1.19.5.tgz#04ce9a3b677dc8bd681a17da1ab9835dc9d3ede4" + integrity sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg== + dependencies: + "@types/connect" "*" + "@types/node" "*" + +"@types/bonjour@^3.5.9": + version "3.5.13" + resolved "https://registry.yarnpkg.com/@types/bonjour/-/bonjour-3.5.13.tgz#adf90ce1a105e81dd1f9c61fdc5afda1bfb92956" + integrity sha512-z9fJ5Im06zvUL548KvYNecEVlA7cVDkGUi6kZusb04mpyEFKCIZJvloCcmpmLaIahDpOQGHaHmG6imtPMmPXGQ== + dependencies: + "@types/node" "*" + +"@types/connect-history-api-fallback@^1.3.5": + version "1.5.4" + resolved "https://registry.yarnpkg.com/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.5.4.tgz#7de71645a103056b48ac3ce07b3520b819c1d5b3" + integrity sha512-n6Cr2xS1h4uAulPRdlw6Jl6s1oG8KrVilPN2yUITEs+K48EzMJJ3W1xy8K5eWuFvjp3R74AOIGSmp2UfBJ8HFw== + dependencies: + "@types/express-serve-static-core" "*" + "@types/node" "*" + +"@types/connect@*": + version "3.4.38" + resolved "https://registry.yarnpkg.com/@types/connect/-/connect-3.4.38.tgz#5ba7f3bc4fbbdeaff8dded952e5ff2cc53f8d858" + integrity sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug== + dependencies: + "@types/node" "*" + +"@types/debug@^4.0.0": + version "4.1.12" + resolved "https://registry.yarnpkg.com/@types/debug/-/debug-4.1.12.tgz#a155f21690871953410df4b6b6f53187f0500917" + integrity sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ== + dependencies: + "@types/ms" "*" + +"@types/estree-jsx@^1.0.0": + version "1.0.3" + resolved "https://registry.yarnpkg.com/@types/estree-jsx/-/estree-jsx-1.0.3.tgz#f8aa833ec986d82b8271a294a92ed1565bf2c66a" + integrity sha512-pvQ+TKeRHeiUGRhvYwRrQ/ISnohKkSJR14fT2yqyZ4e9K5vqc7hrtY2Y1Dw0ZwAzQ6DQsxsaCUuSIIi8v0Cq6w== + dependencies: + "@types/estree" "*" + +"@types/estree@*", "@types/estree@^1.0.0", "@types/estree@^1.0.5": + version "1.0.5" + resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.5.tgz#a6ce3e556e00fd9895dd872dd172ad0d4bd687f4" + integrity sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw== + +"@types/express-serve-static-core@*", "@types/express-serve-static-core@^4.17.33": + version "4.17.41" + resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.17.41.tgz#5077defa630c2e8d28aa9ffc2c01c157c305bef6" + integrity sha512-OaJ7XLaelTgrvlZD8/aa0vvvxZdUmlCn6MtWeB7TkiKW70BQLc9XEPpDLPdbo52ZhXUCrznlWdCHWxJWtdyajA== + dependencies: + "@types/node" "*" + "@types/qs" "*" + "@types/range-parser" "*" + "@types/send" "*" + +"@types/express@*", "@types/express@^4.17.13": + version "4.17.21" + resolved "https://registry.yarnpkg.com/@types/express/-/express-4.17.21.tgz#c26d4a151e60efe0084b23dc3369ebc631ed192d" + integrity sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ== + dependencies: + "@types/body-parser" "*" + "@types/express-serve-static-core" "^4.17.33" + "@types/qs" "*" + "@types/serve-static" "*" + +"@types/hast@^2.0.0": + version "2.3.9" + resolved "https://registry.yarnpkg.com/@types/hast/-/hast-2.3.9.tgz#a9a1b5bbce46e8a1312e977364bacabc8e93d2cf" + integrity sha512-pTHyNlaMD/oKJmS+ZZUyFUcsZeBZpC0lmGquw98CqRVNgAdJZJeD7GoeLiT6Xbx5rU9VCjSt0RwEvDgzh4obFw== + dependencies: + "@types/unist" "^2" + +"@types/hast@^3.0.0": + version "3.0.3" + resolved "https://registry.yarnpkg.com/@types/hast/-/hast-3.0.3.tgz#7f75e6b43bc3f90316046a287d9ad3888309f7e1" + integrity sha512-2fYGlaDy/qyLlhidX42wAH0KBi2TCjKMH8CHmBXgRlJ3Y+OXTiqsPQ6IWarZKwF1JoUcAJdPogv1d4b0COTpmQ== + dependencies: + "@types/unist" "*" + +"@types/history@^4.7.11": + version "4.7.11" + resolved "https://registry.yarnpkg.com/@types/history/-/history-4.7.11.tgz#56588b17ae8f50c53983a524fc3cc47437969d64" + integrity sha512-qjDJRrmvBMiTx+jyLxvLfJU7UznFuokDv4f3WRuriHKERccVpFU+8XMQUAbDzoiJCsmexxRExQeMwwCdamSKDA== + +"@types/html-minifier-terser@^6.0.0": + version "6.1.0" + resolved "https://registry.yarnpkg.com/@types/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz#4fc33a00c1d0c16987b1a20cf92d20614c55ac35" + integrity sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg== + +"@types/http-cache-semantics@^4.0.2": + version "4.0.4" + resolved "https://registry.yarnpkg.com/@types/http-cache-semantics/-/http-cache-semantics-4.0.4.tgz#b979ebad3919799c979b17c72621c0bc0a31c6c4" + integrity sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA== + +"@types/http-errors@*": + version "2.0.4" + resolved "https://registry.yarnpkg.com/@types/http-errors/-/http-errors-2.0.4.tgz#7eb47726c391b7345a6ec35ad7f4de469cf5ba4f" + integrity sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA== + +"@types/http-proxy@^1.17.8": + version "1.17.14" + resolved "https://registry.yarnpkg.com/@types/http-proxy/-/http-proxy-1.17.14.tgz#57f8ccaa1c1c3780644f8a94f9c6b5000b5e2eec" + integrity sha512-SSrD0c1OQzlFX7pGu1eXxSEjemej64aaNPRhhVYUGqXh0BtldAAx37MG8btcumvpgKyZp1F5Gn3JkktdxiFv6w== + dependencies: + "@types/node" "*" + +"@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0": + version "2.0.6" + resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz#7739c232a1fee9b4d3ce8985f314c0c6d33549d7" + integrity sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w== + +"@types/istanbul-lib-report@*": + version "3.0.3" + resolved "https://registry.yarnpkg.com/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz#53047614ae72e19fc0401d872de3ae2b4ce350bf" + integrity sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA== + dependencies: + "@types/istanbul-lib-coverage" "*" + +"@types/istanbul-reports@^3.0.0": + version "3.0.4" + resolved "https://registry.yarnpkg.com/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz#0f03e3d2f670fbdac586e34b433783070cc16f54" + integrity sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ== + dependencies: + "@types/istanbul-lib-report" "*" + +"@types/json-schema@^7.0.4", "@types/json-schema@^7.0.5", "@types/json-schema@^7.0.7", "@types/json-schema@^7.0.8", "@types/json-schema@^7.0.9": + version "7.0.15" + resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.15.tgz#596a1747233694d50f6ad8a7869fcb6f56cf5841" + integrity sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA== + +"@types/mdast@^3.0.0": + version "3.0.15" + resolved "https://registry.yarnpkg.com/@types/mdast/-/mdast-3.0.15.tgz#49c524a263f30ffa28b71ae282f813ed000ab9f5" + integrity sha512-LnwD+mUEfxWMa1QpDraczIn6k0Ee3SMicuYSSzS6ZYl2gKS09EClnJYGd8Du6rfc5r/GZEk5o1mRb8TaTj03sQ== + dependencies: + "@types/unist" "^2" + +"@types/mdast@^4.0.0", "@types/mdast@^4.0.2": + version "4.0.3" + resolved "https://registry.yarnpkg.com/@types/mdast/-/mdast-4.0.3.tgz#1e011ff013566e919a4232d1701ad30d70cab333" + integrity sha512-LsjtqsyF+d2/yFOYaN22dHZI1Cpwkrj+g06G8+qtUKlhovPW89YhqSnfKtMbkgmEtYpH2gydRNULd6y8mciAFg== + dependencies: + "@types/unist" "*" + +"@types/mdx@^2.0.0": + version "2.0.10" + resolved "https://registry.yarnpkg.com/@types/mdx/-/mdx-2.0.10.tgz#0d7b57fb1d83e27656156e4ee0dfba96532930e4" + integrity sha512-Rllzc5KHk0Al5/WANwgSPl1/CwjqCy+AZrGd78zuK+jO9aDM6ffblZ+zIjgPNAaEBmlO0RYDvLNh7wD0zKVgEg== + +"@types/mime@*": + version "3.0.4" + resolved "https://registry.yarnpkg.com/@types/mime/-/mime-3.0.4.tgz#2198ac274de6017b44d941e00261d5bc6a0e0a45" + integrity sha512-iJt33IQnVRkqeqC7PzBHPTC6fDlRNRW8vjrgqtScAhrmMwe8c4Eo7+fUGTa+XdWrpEgpyKWMYmi2dIwMAYRzPw== + +"@types/mime@^1": + version "1.3.5" + resolved "https://registry.yarnpkg.com/@types/mime/-/mime-1.3.5.tgz#1ef302e01cf7d2b5a0fa526790c9123bf1d06690" + integrity sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w== + +"@types/ms@*": + version "0.7.34" + resolved "https://registry.yarnpkg.com/@types/ms/-/ms-0.7.34.tgz#10964ba0dee6ac4cd462e2795b6bebd407303433" + integrity sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g== + +"@types/node-forge@^1.3.0": + version "1.3.10" + resolved "https://registry.yarnpkg.com/@types/node-forge/-/node-forge-1.3.10.tgz#62a19d4f75a8b03290578c2b04f294b1a5a71b07" + integrity sha512-y6PJDYN4xYBxwd22l+OVH35N+1fCYWiuC3aiP2SlXVE6Lo7SS+rSx9r89hLxrP4pn6n1lBGhHJ12pj3F3Mpttw== + dependencies: + "@types/node" "*" + +"@types/node@*": + version "20.10.6" + resolved "https://registry.yarnpkg.com/@types/node/-/node-20.10.6.tgz#a3ec84c22965802bf763da55b2394424f22bfbb5" + integrity sha512-Vac8H+NlRNNlAmDfGUP7b5h/KA+AtWIzuXy0E6OyP8f1tCLYAtPvKRRDJjAPqhpCb0t6U2j7/xqAuLEebW2kiw== + dependencies: + undici-types "~5.26.4" + +"@types/node@^17.0.5": + version "17.0.45" + resolved "https://registry.yarnpkg.com/@types/node/-/node-17.0.45.tgz#2c0fafd78705e7a18b7906b5201a522719dc5190" + integrity sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw== + +"@types/parse-json@^4.0.0": + version "4.0.2" + resolved "https://registry.yarnpkg.com/@types/parse-json/-/parse-json-4.0.2.tgz#5950e50960793055845e956c427fc2b0d70c5239" + integrity sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw== + +"@types/parse5@^5.0.0": + version "5.0.3" + resolved "https://registry.yarnpkg.com/@types/parse5/-/parse5-5.0.3.tgz#e7b5aebbac150f8b5fdd4a46e7f0bd8e65e19109" + integrity sha512-kUNnecmtkunAoQ3CnjmMkzNU/gtxG8guhi+Fk2U/kOpIKjIMKnXGp4IJCgQJrXSgMsWYimYG4TGjz/UzbGEBTw== + +"@types/prop-types@*": + version "15.7.11" + resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.11.tgz#2596fb352ee96a1379c657734d4b913a613ad563" + integrity sha512-ga8y9v9uyeiLdpKddhxYQkxNDrfvuPrlFb0N1qnZZByvcElJaXthF1UhvCh9TLWJBEHeNtdnbysW7Y6Uq8CVng== + +"@types/qs@*": + version "6.9.11" + resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.11.tgz#208d8a30bc507bd82e03ada29e4732ea46a6bbda" + integrity sha512-oGk0gmhnEJK4Yyk+oI7EfXsLayXatCWPHary1MtcmbAifkobT9cM9yutG/hZKIseOU0MqbIwQ/u2nn/Gb+ltuQ== + +"@types/range-parser@*": + version "1.2.7" + resolved "https://registry.yarnpkg.com/@types/range-parser/-/range-parser-1.2.7.tgz#50ae4353eaaddc04044279812f52c8c65857dbcb" + integrity sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ== + +"@types/react-router-config@*", "@types/react-router-config@^5.0.6", "@types/react-router-config@^5.0.7": + version "5.0.11" + resolved "https://registry.yarnpkg.com/@types/react-router-config/-/react-router-config-5.0.11.tgz#2761a23acc7905a66a94419ee40294a65aaa483a" + integrity sha512-WmSAg7WgqW7m4x8Mt4N6ZyKz0BubSj/2tVUMsAHp+Yd2AMwcSbeFq9WympT19p5heCFmF97R9eD5uUR/t4HEqw== + dependencies: + "@types/history" "^4.7.11" + "@types/react" "*" + "@types/react-router" "^5.1.0" + +"@types/react-router-dom@*": + version "5.3.3" + resolved "https://registry.yarnpkg.com/@types/react-router-dom/-/react-router-dom-5.3.3.tgz#e9d6b4a66fcdbd651a5f106c2656a30088cc1e83" + integrity sha512-kpqnYK4wcdm5UaWI3fLcELopqLrHgLqNsdpHauzlQktfkHL3npOSwtj1Uz9oKBAzs7lFtVkV8j83voAz2D8fhw== + dependencies: + "@types/history" "^4.7.11" + "@types/react" "*" + "@types/react-router" "*" + +"@types/react-router@*", "@types/react-router@^5.1.0": + version "5.1.20" + resolved "https://registry.yarnpkg.com/@types/react-router/-/react-router-5.1.20.tgz#88eccaa122a82405ef3efbcaaa5dcdd9f021387c" + integrity sha512-jGjmu/ZqS7FjSH6owMcD5qpq19+1RS9DeVRqfl1FeBMxTDQAGwlMWOcs52NDoXaNKyG3d1cYQFMs9rCrb88o9Q== + dependencies: + "@types/history" "^4.7.11" + "@types/react" "*" + +"@types/react@*": + version "18.2.46" + resolved "https://registry.yarnpkg.com/@types/react/-/react-18.2.46.tgz#f04d6c528f8f136ea66333bc66abcae46e2680df" + integrity sha512-nNCvVBcZlvX4NU1nRRNV/mFl1nNRuTuslAJglQsq+8ldXe5Xv0Wd2f7WTE3jOxhLH2BFfiZGC6GCp+kHQbgG+w== + dependencies: + "@types/prop-types" "*" + "@types/scheduler" "*" + csstype "^3.0.2" + +"@types/retry@0.12.0": + version "0.12.0" + resolved "https://registry.yarnpkg.com/@types/retry/-/retry-0.12.0.tgz#2b35eccfcee7d38cd72ad99232fbd58bffb3c84d" + integrity sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA== + +"@types/sax@^1.2.1": + version "1.2.7" + resolved "https://registry.yarnpkg.com/@types/sax/-/sax-1.2.7.tgz#ba5fe7df9aa9c89b6dff7688a19023dd2963091d" + integrity sha512-rO73L89PJxeYM3s3pPPjiPgVVcymqU490g0YO5n5By0k2Erzj6tay/4lr1CHAAU4JyOWd1rpQ8bCf6cZfHU96A== + dependencies: + "@types/node" "*" + +"@types/scheduler@*": + version "0.16.8" + resolved "https://registry.yarnpkg.com/@types/scheduler/-/scheduler-0.16.8.tgz#ce5ace04cfeabe7ef87c0091e50752e36707deff" + integrity sha512-WZLiwShhwLRmeV6zH+GkbOFT6Z6VklCItrDioxUnv+u4Ll+8vKeFySoFyK/0ctcRpOmwAicELfmys1sDc/Rw+A== + +"@types/send@*": + version "0.17.4" + resolved "https://registry.yarnpkg.com/@types/send/-/send-0.17.4.tgz#6619cd24e7270793702e4e6a4b958a9010cfc57a" + integrity sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA== + dependencies: + "@types/mime" "^1" + "@types/node" "*" + +"@types/serve-index@^1.9.1": + version "1.9.4" + resolved "https://registry.yarnpkg.com/@types/serve-index/-/serve-index-1.9.4.tgz#e6ae13d5053cb06ed36392110b4f9a49ac4ec898" + integrity sha512-qLpGZ/c2fhSs5gnYsQxtDEq3Oy8SXPClIXkW5ghvAvsNuVSA8k+gCONcUCS/UjLEYvYps+e8uBtfgXgvhwfNug== + dependencies: + "@types/express" "*" + +"@types/serve-static@*", "@types/serve-static@^1.13.10": + version "1.15.5" + resolved "https://registry.yarnpkg.com/@types/serve-static/-/serve-static-1.15.5.tgz#15e67500ec40789a1e8c9defc2d32a896f05b033" + integrity sha512-PDRk21MnK70hja/YF8AHfC7yIsiQHn1rcXx7ijCFBX/k+XQJhQT/gw3xekXKJvx+5SXaMMS8oqQy09Mzvz2TuQ== + dependencies: + "@types/http-errors" "*" + "@types/mime" "*" + "@types/node" "*" + +"@types/sockjs@^0.3.33": + version "0.3.36" + resolved "https://registry.yarnpkg.com/@types/sockjs/-/sockjs-0.3.36.tgz#ce322cf07bcc119d4cbf7f88954f3a3bd0f67535" + integrity sha512-MK9V6NzAS1+Ud7JV9lJLFqW85VbC9dq3LmwZCuBe4wBDgKC0Kj/jd8Xl+nSviU+Qc3+m7umHHyHg//2KSa0a0Q== + dependencies: + "@types/node" "*" + +"@types/stylis@4.2.0": + version "4.2.0" + resolved "https://registry.yarnpkg.com/@types/stylis/-/stylis-4.2.0.tgz#199a3f473f0c3a6f6e4e1b17cdbc967f274bdc6b" + integrity sha512-n4sx2bqL0mW1tvDf/loQ+aMX7GQD3lc3fkCMC55VFNDu/vBOabO+LTIeXKM14xK0ppk5TUGcWRjiSpIlUpghKw== + +"@types/unist@*", "@types/unist@^3.0.0": + version "3.0.2" + resolved "https://registry.yarnpkg.com/@types/unist/-/unist-3.0.2.tgz#6dd61e43ef60b34086287f83683a5c1b2dc53d20" + integrity sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ== + +"@types/unist@^2", "@types/unist@^2.0.0", "@types/unist@^2.0.2", "@types/unist@^2.0.3": + version "2.0.10" + resolved "https://registry.yarnpkg.com/@types/unist/-/unist-2.0.10.tgz#04ffa7f406ab628f7f7e97ca23e290cd8ab15efc" + integrity sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA== + +"@types/ws@^8.5.5": + version "8.5.10" + resolved "https://registry.yarnpkg.com/@types/ws/-/ws-8.5.10.tgz#4acfb517970853fa6574a3a6886791d04a396787" + integrity sha512-vmQSUcfalpIq0R9q7uTo2lXs6eGIpt9wtnLdMv9LVpIjCA/+ufZRozlVoVelIYixx1ugCBKDhn89vnsEGOCx9A== + dependencies: + "@types/node" "*" + +"@types/yargs-parser@*": + version "21.0.3" + resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-21.0.3.tgz#815e30b786d2e8f0dcd85fd5bcf5e1a04d008f15" + integrity sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ== + +"@types/yargs@^17.0.8": + version "17.0.32" + resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-17.0.32.tgz#030774723a2f7faafebf645f4e5a48371dca6229" + integrity sha512-xQ67Yc/laOG5uMfX/093MRlGGCIBzZMarVa+gfNKJxWAIgykYpVGkBdbqEzGDDfCrVUj6Hiff4mTZ5BA6TmAog== + dependencies: + "@types/yargs-parser" "*" + +"@ungap/structured-clone@^1.0.0": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@ungap/structured-clone/-/structured-clone-1.2.0.tgz#756641adb587851b5ccb3e095daf27ae581c8406" + integrity sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ== + +"@webassemblyjs/ast@1.12.1", "@webassemblyjs/ast@^1.12.1": + version "1.12.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.12.1.tgz#bb16a0e8b1914f979f45864c23819cc3e3f0d4bb" + integrity sha512-EKfMUOPRRUTy5UII4qJDGPpqfwjOmZ5jeGFwid9mnoqIFK+e0vqoi1qH56JpmZSzEL53jKnNzScdmftJyG5xWg== + dependencies: + "@webassemblyjs/helper-numbers" "1.11.6" + "@webassemblyjs/helper-wasm-bytecode" "1.11.6" + +"@webassemblyjs/floating-point-hex-parser@1.11.6": + version "1.11.6" + resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz#dacbcb95aff135c8260f77fa3b4c5fea600a6431" + integrity sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw== + +"@webassemblyjs/helper-api-error@1.11.6": + version "1.11.6" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz#6132f68c4acd59dcd141c44b18cbebbd9f2fa768" + integrity sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q== + +"@webassemblyjs/helper-buffer@1.12.1": + version "1.12.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.12.1.tgz#6df20d272ea5439bf20ab3492b7fb70e9bfcb3f6" + integrity sha512-nzJwQw99DNDKr9BVCOZcLuJJUlqkJh+kVzVl6Fmq/tI5ZtEyWT1KZMyOXltXLZJmDtvLCDgwsyrkohEtopTXCw== + +"@webassemblyjs/helper-numbers@1.11.6": + version "1.11.6" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz#cbce5e7e0c1bd32cf4905ae444ef64cea919f1b5" + integrity sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g== + dependencies: + "@webassemblyjs/floating-point-hex-parser" "1.11.6" + "@webassemblyjs/helper-api-error" "1.11.6" + "@xtuc/long" "4.2.2" + +"@webassemblyjs/helper-wasm-bytecode@1.11.6": + version "1.11.6" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz#bb2ebdb3b83aa26d9baad4c46d4315283acd51e9" + integrity sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA== + +"@webassemblyjs/helper-wasm-section@1.12.1": + version "1.12.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.12.1.tgz#3da623233ae1a60409b509a52ade9bc22a37f7bf" + integrity sha512-Jif4vfB6FJlUlSbgEMHUyk1j234GTNG9dBJ4XJdOySoj518Xj0oGsNi59cUQF4RRMS9ouBUxDDdyBVfPTypa5g== + dependencies: + "@webassemblyjs/ast" "1.12.1" + "@webassemblyjs/helper-buffer" "1.12.1" + "@webassemblyjs/helper-wasm-bytecode" "1.11.6" + "@webassemblyjs/wasm-gen" "1.12.1" + +"@webassemblyjs/ieee754@1.11.6": + version "1.11.6" + resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz#bb665c91d0b14fffceb0e38298c329af043c6e3a" + integrity sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg== + dependencies: + "@xtuc/ieee754" "^1.2.0" + +"@webassemblyjs/leb128@1.11.6": + version "1.11.6" + resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.11.6.tgz#70e60e5e82f9ac81118bc25381a0b283893240d7" + integrity sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ== + dependencies: + "@xtuc/long" "4.2.2" + +"@webassemblyjs/utf8@1.11.6": + version "1.11.6" + resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.11.6.tgz#90f8bc34c561595fe156603be7253cdbcd0fab5a" + integrity sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA== + +"@webassemblyjs/wasm-edit@^1.12.1": + version "1.12.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.12.1.tgz#9f9f3ff52a14c980939be0ef9d5df9ebc678ae3b" + integrity sha512-1DuwbVvADvS5mGnXbE+c9NfA8QRcZ6iKquqjjmR10k6o+zzsRVesil54DKexiowcFCPdr/Q0qaMgB01+SQ1u6g== + dependencies: + "@webassemblyjs/ast" "1.12.1" + "@webassemblyjs/helper-buffer" "1.12.1" + "@webassemblyjs/helper-wasm-bytecode" "1.11.6" + "@webassemblyjs/helper-wasm-section" "1.12.1" + "@webassemblyjs/wasm-gen" "1.12.1" + "@webassemblyjs/wasm-opt" "1.12.1" + "@webassemblyjs/wasm-parser" "1.12.1" + "@webassemblyjs/wast-printer" "1.12.1" + +"@webassemblyjs/wasm-gen@1.12.1": + version "1.12.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.12.1.tgz#a6520601da1b5700448273666a71ad0a45d78547" + integrity sha512-TDq4Ojh9fcohAw6OIMXqiIcTq5KUXTGRkVxbSo1hQnSy6lAM5GSdfwWeSxpAo0YzgsgF182E/U0mDNhuA0tW7w== + dependencies: + "@webassemblyjs/ast" "1.12.1" + "@webassemblyjs/helper-wasm-bytecode" "1.11.6" + "@webassemblyjs/ieee754" "1.11.6" + "@webassemblyjs/leb128" "1.11.6" + "@webassemblyjs/utf8" "1.11.6" + +"@webassemblyjs/wasm-opt@1.12.1": + version "1.12.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.12.1.tgz#9e6e81475dfcfb62dab574ac2dda38226c232bc5" + integrity sha512-Jg99j/2gG2iaz3hijw857AVYekZe2SAskcqlWIZXjji5WStnOpVoat3gQfT/Q5tb2djnCjBtMocY/Su1GfxPBg== + dependencies: + "@webassemblyjs/ast" "1.12.1" + "@webassemblyjs/helper-buffer" "1.12.1" + "@webassemblyjs/wasm-gen" "1.12.1" + "@webassemblyjs/wasm-parser" "1.12.1" + +"@webassemblyjs/wasm-parser@1.12.1", "@webassemblyjs/wasm-parser@^1.12.1": + version "1.12.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.12.1.tgz#c47acb90e6f083391e3fa61d113650eea1e95937" + integrity sha512-xikIi7c2FHXysxXe3COrVUPSheuBtpcfhbpFj4gmu7KRLYOzANztwUU0IbsqvMqzuNK2+glRGWCEqZo1WCLyAQ== + dependencies: + "@webassemblyjs/ast" "1.12.1" + "@webassemblyjs/helper-api-error" "1.11.6" + "@webassemblyjs/helper-wasm-bytecode" "1.11.6" + "@webassemblyjs/ieee754" "1.11.6" + "@webassemblyjs/leb128" "1.11.6" + "@webassemblyjs/utf8" "1.11.6" + +"@webassemblyjs/wast-printer@1.12.1": + version "1.12.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.12.1.tgz#bcecf661d7d1abdaf989d8341a4833e33e2b31ac" + integrity sha512-+X4WAlOisVWQMikjbcvY2e0rwPsKQ9F688lksZhBcPycBBuii3O7m8FACbDMWDojpAqvjIncrG8J0XHKyQfVeA== + dependencies: + "@webassemblyjs/ast" "1.12.1" + "@xtuc/long" "4.2.2" + +"@xtuc/ieee754@^1.2.0": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@xtuc/ieee754/-/ieee754-1.2.0.tgz#eef014a3145ae477a1cbc00cd1e552336dceb790" + integrity sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA== + +"@xtuc/long@4.2.2": + version "4.2.2" + resolved "https://registry.yarnpkg.com/@xtuc/long/-/long-4.2.2.tgz#d291c6a4e97989b5c61d9acf396ae4fe133a718d" + integrity sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ== + +accepts@~1.3.4, accepts@~1.3.5, accepts@~1.3.8: + version "1.3.8" + resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.8.tgz#0bf0be125b67014adcb0b0921e62db7bffe16b2e" + integrity sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw== + dependencies: + mime-types "~2.1.34" + negotiator "0.6.3" + +acorn-import-attributes@^1.9.5: + version "1.9.5" + resolved "https://registry.yarnpkg.com/acorn-import-attributes/-/acorn-import-attributes-1.9.5.tgz#7eb1557b1ba05ef18b5ed0ec67591bfab04688ef" + integrity sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ== + +acorn-jsx@^5.0.0: + version "5.3.2" + resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" + integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== + +acorn-walk@^8.0.0: + version "8.3.1" + resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.3.1.tgz#2f10f5b69329d90ae18c58bf1fa8fccd8b959a43" + integrity sha512-TgUZgYvqZprrl7YldZNoa9OciCAyZR+Ejm9eXzKCmjsF5IKp/wgQ7Z/ZpjpGTIUPwrHQIcYeI8qDh4PsEwxMbw== + +acorn@^8.0.0, acorn@^8.0.4, acorn@^8.7.1, acorn@^8.8.2: + version "8.11.3" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.11.3.tgz#71e0b14e13a4ec160724b38fb7b0f233b1b81d7a" + integrity sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg== + +address@^1.0.1, address@^1.1.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/address/-/address-1.2.2.tgz#2b5248dac5485a6390532c6a517fda2e3faac89e" + integrity sha512-4B/qKCfeE/ODUaAUpSwfzazo5x29WD4r3vXiWsB7I2mSDAihwEqKO+g8GELZUQSSAo5e1XTYh3ZVfLyxBc12nA== + +aggregate-error@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-3.1.0.tgz#92670ff50f5359bdb7a3e0d40d0ec30c5737687a" + integrity sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA== + dependencies: + clean-stack "^2.0.0" + indent-string "^4.0.0" + +ajv-formats@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/ajv-formats/-/ajv-formats-2.1.1.tgz#6e669400659eb74973bbf2e33327180a0996b520" + integrity sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA== + dependencies: + ajv "^8.0.0" + +ajv-keywords@^3.4.1, ajv-keywords@^3.5.2: + version "3.5.2" + resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.5.2.tgz#31f29da5ab6e00d1c2d329acf7b5929614d5014d" + integrity sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ== + +ajv-keywords@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-5.1.0.tgz#69d4d385a4733cdbeab44964a1170a88f87f0e16" + integrity sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw== + dependencies: + fast-deep-equal "^3.1.3" + +ajv@^6.12.2, ajv@^6.12.4, ajv@^6.12.5: + version "6.12.6" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" + integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== + dependencies: + fast-deep-equal "^3.1.1" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.4.1" + uri-js "^4.2.2" + +ajv@^8.0.0, ajv@^8.9.0: + version "8.12.0" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.12.0.tgz#d1a0527323e22f53562c567c00991577dfbe19d1" + integrity sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA== + dependencies: + fast-deep-equal "^3.1.1" + json-schema-traverse "^1.0.0" + require-from-string "^2.0.2" + uri-js "^4.2.2" + +algoliasearch-helper@^3.10.0: + version "3.16.1" + resolved "https://registry.yarnpkg.com/algoliasearch-helper/-/algoliasearch-helper-3.16.1.tgz#421e3554ec86e14e60e7e0bf796aef61cf4a06ec" + integrity sha512-qxAHVjjmT7USVvrM8q6gZGaJlCK1fl4APfdAA7o8O6iXEc68G0xMNrzRkxoB/HmhhvyHnoteS/iMTiHiTcQQcg== + dependencies: + "@algolia/events" "^4.0.1" + +algoliasearch@^4.13.1, algoliasearch@^4.19.1: + version "4.22.0" + resolved "https://registry.yarnpkg.com/algoliasearch/-/algoliasearch-4.22.0.tgz#9ece4446b5ab0af941ef97553c18ddcd1b8040a5" + integrity sha512-gfceltjkwh7PxXwtkS8KVvdfK+TSNQAWUeNSxf4dA29qW5tf2EGwa8jkJujlT9jLm17cixMVoGNc+GJFO1Mxhg== + dependencies: + "@algolia/cache-browser-local-storage" "4.22.0" + "@algolia/cache-common" "4.22.0" + "@algolia/cache-in-memory" "4.22.0" + "@algolia/client-account" "4.22.0" + "@algolia/client-analytics" "4.22.0" + "@algolia/client-common" "4.22.0" + "@algolia/client-personalization" "4.22.0" + "@algolia/client-search" "4.22.0" + "@algolia/logger-common" "4.22.0" + "@algolia/logger-console" "4.22.0" + "@algolia/requester-browser-xhr" "4.22.0" + "@algolia/requester-common" "4.22.0" + "@algolia/requester-node-http" "4.22.0" + "@algolia/transporter" "4.22.0" + +ansi-align@^3.0.0, ansi-align@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/ansi-align/-/ansi-align-3.0.1.tgz#0cdf12e111ace773a86e9a1fad1225c43cb19a59" + integrity sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w== + dependencies: + string-width "^4.1.0" + +ansi-html-community@^0.0.8: + version "0.0.8" + resolved "https://registry.yarnpkg.com/ansi-html-community/-/ansi-html-community-0.0.8.tgz#69fbc4d6ccbe383f9736934ae34c3f8290f1bf41" + integrity sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw== + +ansi-regex@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" + integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== + +ansi-regex@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-6.0.1.tgz#3183e38fae9a65d7cb5e53945cd5897d0260a06a" + integrity sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA== + +ansi-styles@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" + integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== + dependencies: + color-convert "^1.9.0" + +ansi-styles@^4.0.0, ansi-styles@^4.1.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" + integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== + dependencies: + color-convert "^2.0.1" + +ansi-styles@^6.1.0: + version "6.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-6.2.1.tgz#0e62320cf99c21afff3b3012192546aacbfb05c5" + integrity sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug== + +anymatch@~3.1.2: + version "3.1.3" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" + integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== + dependencies: + normalize-path "^3.0.0" + picomatch "^2.0.4" + +arg@^5.0.0: + version "5.0.2" + resolved "https://registry.yarnpkg.com/arg/-/arg-5.0.2.tgz#c81433cc427c92c4dcf4865142dbca6f15acd59c" + integrity sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg== + +argparse@^1.0.7: + version "1.0.10" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" + integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== + dependencies: + sprintf-js "~1.0.2" + +argparse@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" + integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== + +array-flatten@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" + integrity sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg== + +array-flatten@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-2.1.2.tgz#24ef80a28c1a893617e2149b0c6d0d788293b099" + integrity sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ== + +array-union@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" + integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== + +asap@~2.0.3: + version "2.0.6" + resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46" + integrity sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA== + +astring@^1.8.0: + version "1.8.6" + resolved "https://registry.yarnpkg.com/astring/-/astring-1.8.6.tgz#2c9c157cf1739d67561c56ba896e6948f6b93731" + integrity sha512-ISvCdHdlTDlH5IpxQJIex7BWBywFWgjJSVdwst+/iQCoEYnyOaQ95+X1JGshuBjGp6nxKUy1jMgE3zPqN7fQdg== + +at-least-node@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/at-least-node/-/at-least-node-1.0.0.tgz#602cd4b46e844ad4effc92a8011a3c46e0238dc2" + integrity sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg== + +autoprefixer@^10.4.12, autoprefixer@^10.4.14, autoprefixer@^10.4.7: + version "10.4.16" + resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-10.4.16.tgz#fad1411024d8670880bdece3970aa72e3572feb8" + integrity sha512-7vd3UC6xKp0HLfua5IjZlcXvGAGy7cBAXTg2lyQ/8WpNhd6SiZ8Be+xm3FyBSYJx5GKcpRCzBh7RH4/0dnY+uQ== + dependencies: + browserslist "^4.21.10" + caniuse-lite "^1.0.30001538" + fraction.js "^4.3.6" + normalize-range "^0.1.2" + picocolors "^1.0.0" + postcss-value-parser "^4.2.0" + +axios@^0.25.0: + version "0.25.0" + resolved "https://registry.yarnpkg.com/axios/-/axios-0.25.0.tgz#349cfbb31331a9b4453190791760a8d35b093e0a" + integrity sha512-cD8FOb0tRH3uuEe6+evtAbgJtfxr7ly3fQjYcMcuPlgkwVS9xboaVIpcDV+cYQe+yGykgwZCs1pzjntcGa6l5g== + dependencies: + follow-redirects "^1.14.7" + +babel-loader@^8.2.5: + version "8.3.0" + resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-8.3.0.tgz#124936e841ba4fe8176786d6ff28add1f134d6a8" + integrity sha512-H8SvsMF+m9t15HNLMipppzkC+Y2Yq+v3SonZyU70RBL/h1gxPkH08Ot8pEE9Z4Kd+czyWJClmFS8qzIP9OZ04Q== + dependencies: + find-cache-dir "^3.3.1" + loader-utils "^2.0.0" + make-dir "^3.1.0" + schema-utils "^2.6.5" + +babel-loader@^9.1.3: + version "9.1.3" + resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-9.1.3.tgz#3d0e01b4e69760cc694ee306fe16d358aa1c6f9a" + integrity sha512-xG3ST4DglodGf8qSwv0MdeWLhrDsw/32QMdTO5T1ZIp9gQur0HkCyFs7Awskr10JKXFXwpAhiCuYX5oGXnRGbw== + dependencies: + find-cache-dir "^4.0.0" + schema-utils "^4.0.0" + +babel-plugin-apply-mdx-type-prop@1.6.22: + version "1.6.22" + resolved "https://registry.yarnpkg.com/babel-plugin-apply-mdx-type-prop/-/babel-plugin-apply-mdx-type-prop-1.6.22.tgz#d216e8fd0de91de3f1478ef3231e05446bc8705b" + integrity sha512-VefL+8o+F/DfK24lPZMtJctrCVOfgbqLAGZSkxwhazQv4VxPg3Za/i40fu22KR2m8eEda+IfSOlPLUSIiLcnCQ== + dependencies: + "@babel/helper-plugin-utils" "7.10.4" + "@mdx-js/util" "1.6.22" + +babel-plugin-dynamic-import-node@^2.3.3: + version "2.3.3" + resolved "https://registry.yarnpkg.com/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz#84fda19c976ec5c6defef57f9427b3def66e17a3" + integrity sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ== + dependencies: + object.assign "^4.1.0" + +babel-plugin-extract-import-names@1.6.22: + version "1.6.22" + resolved "https://registry.yarnpkg.com/babel-plugin-extract-import-names/-/babel-plugin-extract-import-names-1.6.22.tgz#de5f9a28eb12f3eb2578bf74472204e66d1a13dc" + integrity sha512-yJ9BsJaISua7d8zNT7oRG1ZLBJCIdZ4PZqmH8qa9N5AK01ifk3fnkc98AXhtzE7UkfCsEumvoQWgoYLhOnJ7jQ== + dependencies: + "@babel/helper-plugin-utils" "7.10.4" + +babel-plugin-polyfill-corejs2@^0.4.7: + version "0.4.7" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.7.tgz#679d1b94bf3360f7682e11f2cb2708828a24fe8c" + integrity sha512-LidDk/tEGDfuHW2DWh/Hgo4rmnw3cduK6ZkOI1NPFceSK3n/yAGeOsNT7FLnSGHkXj3RHGSEVkN3FsCTY6w2CQ== + dependencies: + "@babel/compat-data" "^7.22.6" + "@babel/helper-define-polyfill-provider" "^0.4.4" + semver "^6.3.1" + +babel-plugin-polyfill-corejs3@^0.8.7: + version "0.8.7" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.8.7.tgz#941855aa7fdaac06ed24c730a93450d2b2b76d04" + integrity sha512-KyDvZYxAzkC0Aj2dAPyDzi2Ym15e5JKZSK+maI7NAwSqofvuFglbSsxE7wUOvTg9oFVnHMzVzBKcqEb4PJgtOA== + dependencies: + "@babel/helper-define-polyfill-provider" "^0.4.4" + core-js-compat "^3.33.1" + +babel-plugin-polyfill-regenerator@^0.5.4: + version "0.5.4" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.5.4.tgz#c6fc8eab610d3a11eb475391e52584bacfc020f4" + integrity sha512-S/x2iOCvDaCASLYsOOgWOq4bCfKYVqvO/uxjkaYyZ3rVsVE3CeAI/c84NpyuBBymEgNvHgjEot3a9/Z/kXvqsg== + dependencies: + "@babel/helper-define-polyfill-provider" "^0.4.4" + +bail@^1.0.0: + version "1.0.5" + resolved "https://registry.yarnpkg.com/bail/-/bail-1.0.5.tgz#b6fa133404a392cbc1f8c4bf63f5953351e7a776" + integrity sha512-xFbRxM1tahm08yHBP16MMjVUAvDaBMD38zsM9EMAUN61omwLmKlOpB/Zku5QkjZ8TZ4vn53pj+t518cH0S03RQ== + +bail@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/bail/-/bail-2.0.2.tgz#d26f5cd8fe5d6f832a31517b9f7c356040ba6d5d" + integrity sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw== + +balanced-match@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" + integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== + +base16@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/base16/-/base16-1.0.0.tgz#e297f60d7ec1014a7a971a39ebc8a98c0b681e70" + integrity sha512-pNdYkNPiJUnEhnfXV56+sQy8+AaPcG3POZAUnwr4EeqCUZFz4u2PePbo3e5Gj4ziYPCWGUZT9RHisvJKnwFuBQ== + +batch@0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/batch/-/batch-0.6.1.tgz#dc34314f4e679318093fc760272525f94bf25c16" + integrity sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw== + +big.js@^5.2.2: + version "5.2.2" + resolved "https://registry.yarnpkg.com/big.js/-/big.js-5.2.2.tgz#65f0af382f578bcdc742bd9c281e9cb2d7768328" + integrity sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ== + +binary-extensions@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" + integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== + +body-parser@1.20.3: + version "1.20.3" + resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.20.3.tgz#1953431221c6fb5cd63c4b36d53fab0928e548c6" + integrity sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g== + dependencies: + bytes "3.1.2" + content-type "~1.0.5" + debug "2.6.9" + depd "2.0.0" + destroy "1.2.0" + http-errors "2.0.0" + iconv-lite "0.4.24" + on-finished "2.4.1" + qs "6.13.0" + raw-body "2.5.2" + type-is "~1.6.18" + unpipe "1.0.0" + +bonjour-service@^1.0.11: + version "1.1.1" + resolved "https://registry.yarnpkg.com/bonjour-service/-/bonjour-service-1.1.1.tgz#960948fa0e0153f5d26743ab15baf8e33752c135" + integrity sha512-Z/5lQRMOG9k7W+FkeGTNjh7htqn/2LMnfOvBZ8pynNZCM9MwkQkI3zeI4oz09uWdcgmgHugVvBqxGg4VQJ5PCg== + dependencies: + array-flatten "^2.1.2" + dns-equal "^1.0.0" + fast-deep-equal "^3.1.3" + multicast-dns "^7.2.5" + +boolbase@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e" + integrity sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww== + +boxen@^5.0.0: + version "5.1.2" + resolved "https://registry.yarnpkg.com/boxen/-/boxen-5.1.2.tgz#788cb686fc83c1f486dfa8a40c68fc2b831d2b50" + integrity sha512-9gYgQKXx+1nP8mP7CzFyaUARhg7D3n1dF/FnErWmu9l6JvGpNUN278h0aSb+QjoiKSWG+iZ3uHrcqk0qrY9RQQ== + dependencies: + ansi-align "^3.0.0" + camelcase "^6.2.0" + chalk "^4.1.0" + cli-boxes "^2.2.1" + string-width "^4.2.2" + type-fest "^0.20.2" + widest-line "^3.1.0" + wrap-ansi "^7.0.0" + +boxen@^6.2.1: + version "6.2.1" + resolved "https://registry.yarnpkg.com/boxen/-/boxen-6.2.1.tgz#b098a2278b2cd2845deef2dff2efc38d329b434d" + integrity sha512-H4PEsJXfFI/Pt8sjDWbHlQPx4zL/bvSQjcilJmaulGt5mLDorHOHpmdXAJcBcmru7PhYSp/cDMWRko4ZUMFkSw== + dependencies: + ansi-align "^3.0.1" + camelcase "^6.2.0" + chalk "^4.1.2" + cli-boxes "^3.0.0" + string-width "^5.0.1" + type-fest "^2.5.0" + widest-line "^4.0.1" + wrap-ansi "^8.0.1" + +boxen@^7.0.0: + version "7.1.1" + resolved "https://registry.yarnpkg.com/boxen/-/boxen-7.1.1.tgz#f9ba525413c2fec9cdb88987d835c4f7cad9c8f4" + integrity sha512-2hCgjEmP8YLWQ130n2FerGv7rYpfBmnmp9Uy2Le1vge6X3gZIfSmEzP5QTDElFxcvVcXlEn8Aq6MU/PZygIOog== + dependencies: + ansi-align "^3.0.1" + camelcase "^7.0.1" + chalk "^5.2.0" + cli-boxes "^3.0.0" + string-width "^5.1.2" + type-fest "^2.13.0" + widest-line "^4.0.1" + wrap-ansi "^8.1.0" + +brace-expansion@^1.1.7: + version "1.1.11" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" + integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + +brace-expansion@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.0.1.tgz#1edc459e0f0c548486ecf9fc99f2221364b9a0ae" + integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA== + dependencies: + balanced-match "^1.0.0" + +braces@^3.0.3, braces@~3.0.2: + version "3.0.3" + resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.3.tgz#490332f40919452272d55a8480adc0c441358789" + integrity sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA== + dependencies: + fill-range "^7.1.1" + +browserslist@^4.0.0, browserslist@^4.18.1, browserslist@^4.21.10, browserslist@^4.21.4, browserslist@^4.22.2: + version "4.22.2" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.22.2.tgz#704c4943072bd81ea18997f3bd2180e89c77874b" + integrity sha512-0UgcrvQmBDvZHFGdYUehrCNIazki7/lUP3kkoi/r3YB2amZbFM9J43ZRkJTXBUZK4gmx56+Sqk9+Vs9mwZx9+A== + dependencies: + caniuse-lite "^1.0.30001565" + electron-to-chromium "^1.4.601" + node-releases "^2.0.14" + update-browserslist-db "^1.0.13" + +buffer-from@^1.0.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" + integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== + +bytes@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048" + integrity sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw== + +bytes@3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.2.tgz#8b0beeb98605adf1b128fa4386403c009e0221a5" + integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg== + +cacheable-lookup@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/cacheable-lookup/-/cacheable-lookup-7.0.0.tgz#3476a8215d046e5a3202a9209dd13fec1f933a27" + integrity sha512-+qJyx4xiKra8mZrcwhjMRMUhD5NR1R8esPkzIYxX96JiecFoxAXFuz/GpR3+ev4PE1WamHip78wV0vcmPQtp8w== + +cacheable-request@^10.2.8: + version "10.2.14" + resolved "https://registry.yarnpkg.com/cacheable-request/-/cacheable-request-10.2.14.tgz#eb915b665fda41b79652782df3f553449c406b9d" + integrity sha512-zkDT5WAF4hSSoUgyfg5tFIxz8XQK+25W/TLVojJTMKBaxevLBBtLxgqguAuVQB8PVW79FVjHcU+GJ9tVbDZ9mQ== + dependencies: + "@types/http-cache-semantics" "^4.0.2" + get-stream "^6.0.1" + http-cache-semantics "^4.1.1" + keyv "^4.5.3" + mimic-response "^4.0.0" + normalize-url "^8.0.0" + responselike "^3.0.0" + +cacheable-request@^6.0.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/cacheable-request/-/cacheable-request-6.1.0.tgz#20ffb8bd162ba4be11e9567d823db651052ca912" + integrity sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg== + dependencies: + clone-response "^1.0.2" + get-stream "^5.1.0" + http-cache-semantics "^4.0.0" + keyv "^3.0.0" + lowercase-keys "^2.0.0" + normalize-url "^4.1.0" + responselike "^1.0.2" + +call-bind@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.5.tgz#6fa2b7845ce0ea49bf4d8b9ef64727a2c2e2e513" + integrity sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ== + dependencies: + function-bind "^1.1.2" + get-intrinsic "^1.2.1" + set-function-length "^1.1.1" + +call-bind@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.7.tgz#06016599c40c56498c18769d2730be242b6fa3b9" + integrity sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w== + dependencies: + es-define-property "^1.0.0" + es-errors "^1.3.0" + function-bind "^1.1.2" + get-intrinsic "^1.2.4" + set-function-length "^1.2.1" + +call-me-maybe@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/call-me-maybe/-/call-me-maybe-1.0.2.tgz#03f964f19522ba643b1b0693acb9152fe2074baa" + integrity sha512-HpX65o1Hnr9HH25ojC1YGs7HCQLq0GCOibSaWER0eNpgJ/Z1MZv2mTc7+xh6WOPxbRVcmgbv4hGU+uSQ/2xFZQ== + +callsites@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" + integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== + +camel-case@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/camel-case/-/camel-case-4.1.2.tgz#9728072a954f805228225a6deea6b38461e1bd5a" + integrity sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw== + dependencies: + pascal-case "^3.1.2" + tslib "^2.0.3" + +camelcase-css@2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/camelcase-css/-/camelcase-css-2.0.1.tgz#ee978f6947914cc30c6b44741b6ed1df7f043fd5" + integrity sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA== + +camelcase@^6.2.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" + integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== + +camelcase@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-7.0.1.tgz#f02e50af9fd7782bc8b88a3558c32fd3a388f048" + integrity sha512-xlx1yCK2Oc1APsPXDL2LdlNP6+uu8OCDdhOBSVT279M/S+y75O30C2VuD8T2ogdePBBl7PfPF4504tnLgX3zfw== + +camelize@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/camelize/-/camelize-1.0.1.tgz#89b7e16884056331a35d6b5ad064332c91daa6c3" + integrity sha512-dU+Tx2fsypxTgtLoE36npi3UqcjSSMNYfkqgmoEhtZrraP5VWq0K7FkWVTYa8eMPtnU/G2txVsfdCJTn9uzpuQ== + +caniuse-api@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/caniuse-api/-/caniuse-api-3.0.0.tgz#5e4d90e2274961d46291997df599e3ed008ee4c0" + integrity sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw== + dependencies: + browserslist "^4.0.0" + caniuse-lite "^1.0.0" + lodash.memoize "^4.1.2" + lodash.uniq "^4.5.0" + +caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001538, caniuse-lite@^1.0.30001565: + version "1.0.30001655" + resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001655.tgz" + integrity sha512-jRGVy3iSGO5Uutn2owlb5gR6qsGngTw9ZTb4ali9f3glshcNmJ2noam4Mo9zia5P9Dk3jNNydy7vQjuE5dQmfg== + +ccount@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/ccount/-/ccount-1.1.0.tgz#246687debb6014735131be8abab2d93898f8d043" + integrity sha512-vlNK021QdI7PNeiUh/lKkC/mNHHfV0m/Ad5JoI0TYtlBnJAslM/JIkm/tGC88bkLIwO6OQ5uV6ztS6kVAtCDlg== + +ccount@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/ccount/-/ccount-2.0.1.tgz#17a3bf82302e0870d6da43a01311a8bc02a3ecf5" + integrity sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg== + +chalk@^2.4.2: + version "2.4.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" + integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== + dependencies: + ansi-styles "^3.2.1" + escape-string-regexp "^1.0.5" + supports-color "^5.3.0" + +chalk@^4.0.0, chalk@^4.1.0, chalk@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" + integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +chalk@^5.0.1, chalk@^5.2.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-5.3.0.tgz#67c20a7ebef70e7f3970a01f90fa210cb6860385" + integrity sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w== + +char-regex@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/char-regex/-/char-regex-1.0.2.tgz#d744358226217f981ed58f479b1d6bcc29545dcf" + integrity sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw== + +character-entities-html4@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/character-entities-html4/-/character-entities-html4-2.1.0.tgz#1f1adb940c971a4b22ba39ddca6b618dc6e56b2b" + integrity sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA== + +character-entities-legacy@^1.0.0: + version "1.1.4" + resolved "https://registry.yarnpkg.com/character-entities-legacy/-/character-entities-legacy-1.1.4.tgz#94bc1845dce70a5bb9d2ecc748725661293d8fc1" + integrity sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA== + +character-entities-legacy@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz#76bc83a90738901d7bc223a9e93759fdd560125b" + integrity sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ== + +character-entities@^1.0.0: + version "1.2.4" + resolved "https://registry.yarnpkg.com/character-entities/-/character-entities-1.2.4.tgz#e12c3939b7eaf4e5b15e7ad4c5e28e1d48c5b16b" + integrity sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw== + +character-entities@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/character-entities/-/character-entities-2.0.2.tgz#2d09c2e72cd9523076ccb21157dff66ad43fcc22" + integrity sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ== + +character-reference-invalid@^1.0.0: + version "1.1.4" + resolved "https://registry.yarnpkg.com/character-reference-invalid/-/character-reference-invalid-1.1.4.tgz#083329cda0eae272ab3dbbf37e9a382c13af1560" + integrity sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg== + +character-reference-invalid@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/character-reference-invalid/-/character-reference-invalid-2.0.1.tgz#85c66b041e43b47210faf401278abf808ac45cb9" + integrity sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw== + +cheerio-select@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/cheerio-select/-/cheerio-select-2.1.0.tgz#4d8673286b8126ca2a8e42740d5e3c4884ae21b4" + integrity sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g== + dependencies: + boolbase "^1.0.0" + css-select "^5.1.0" + css-what "^6.1.0" + domelementtype "^2.3.0" + domhandler "^5.0.3" + domutils "^3.0.1" + +cheerio@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/cheerio/-/cheerio-1.0.0.tgz#1ede4895a82f26e8af71009f961a9b8cb60d6a81" + integrity sha512-quS9HgjQpdaXOvsZz82Oz7uxtXiy6UIsIQcpBj7HRw2M63Skasm9qlDocAM7jNuaxdhpPU7c4kJN+gA5MCu4ww== + dependencies: + cheerio-select "^2.1.0" + dom-serializer "^2.0.0" + domhandler "^5.0.3" + domutils "^3.1.0" + encoding-sniffer "^0.2.0" + htmlparser2 "^9.1.0" + parse5 "^7.1.2" + parse5-htmlparser2-tree-adapter "^7.0.0" + parse5-parser-stream "^7.1.2" + undici "^6.19.5" + whatwg-mimetype "^4.0.0" + +cheerio@^1.0.0-rc.12: + version "1.0.0-rc.12" + resolved "https://registry.yarnpkg.com/cheerio/-/cheerio-1.0.0-rc.12.tgz#788bf7466506b1c6bf5fae51d24a2c4d62e47683" + integrity sha512-VqR8m68vM46BNnuZ5NtnGBKIE/DfN0cRIzg9n40EIq9NOv90ayxLBXA8fXC5gquFRGJSTRqBq25Jt2ECLR431Q== + dependencies: + cheerio-select "^2.1.0" + dom-serializer "^2.0.0" + domhandler "^5.0.3" + domutils "^3.0.1" + htmlparser2 "^8.0.1" + parse5 "^7.0.0" + parse5-htmlparser2-tree-adapter "^7.0.0" + +chokidar@^3.4.2, chokidar@^3.5.3: + version "3.5.3" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.3.tgz#1cf37c8707b932bd1af1ae22c0432e2acd1903bd" + integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw== + dependencies: + anymatch "~3.1.2" + braces "~3.0.2" + glob-parent "~5.1.2" + is-binary-path "~2.1.0" + is-glob "~4.0.1" + normalize-path "~3.0.0" + readdirp "~3.6.0" + optionalDependencies: + fsevents "~2.3.2" + +chrome-trace-event@^1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz#1015eced4741e15d06664a957dbbf50d041e26ac" + integrity sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg== + +ci-info@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-2.0.0.tgz#67a9e964be31a51e15e5010d58e6f12834002f46" + integrity sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ== + +ci-info@^3.2.0: + version "3.9.0" + resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.9.0.tgz#4279a62028a7b1f262f3473fc9605f5e218c59b4" + integrity sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ== + +classnames@^2.3.1: + version "2.5.1" + resolved "https://registry.yarnpkg.com/classnames/-/classnames-2.5.1.tgz#ba774c614be0f016da105c858e7159eae8e7687b" + integrity sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow== + +clean-css@^5.2.2, clean-css@^5.3.0, clean-css@^5.3.2, clean-css@~5.3.2: + version "5.3.3" + resolved "https://registry.yarnpkg.com/clean-css/-/clean-css-5.3.3.tgz#b330653cd3bd6b75009cc25c714cae7b93351ccd" + integrity sha512-D5J+kHaVb/wKSFcyyV75uCn8fiY4sV38XJoe4CUyGQ+mOU/fMVYUdH1hJC+CJQ5uY3EnW27SbJYS4X8BiLrAFg== + dependencies: + source-map "~0.6.0" + +clean-stack@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b" + integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A== + +cli-boxes@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/cli-boxes/-/cli-boxes-2.2.1.tgz#ddd5035d25094fce220e9cab40a45840a440318f" + integrity sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw== + +cli-boxes@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/cli-boxes/-/cli-boxes-3.0.0.tgz#71a10c716feeba005e4504f36329ef0b17cf3145" + integrity sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g== + +cli-table3@^0.6.2, cli-table3@^0.6.3: + version "0.6.3" + resolved "https://registry.yarnpkg.com/cli-table3/-/cli-table3-0.6.3.tgz#61ab765aac156b52f222954ffc607a6f01dbeeb2" + integrity sha512-w5Jac5SykAeZJKntOxJCrm63Eg5/4dhMWIcuTbo9rpE+brgaSZo0RuNJZeOyMgsUdhDeojvgyQLmjI+K50ZGyg== + dependencies: + string-width "^4.2.0" + optionalDependencies: + "@colors/colors" "1.5.0" + +cliui@^8.0.1: + version "8.0.1" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-8.0.1.tgz#0c04b075db02cbfe60dc8e6cf2f5486b1a3608aa" + integrity sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ== + dependencies: + string-width "^4.2.0" + strip-ansi "^6.0.1" + wrap-ansi "^7.0.0" + +clone-deep@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/clone-deep/-/clone-deep-4.0.1.tgz#c19fd9bdbbf85942b4fd979c84dcf7d5f07c2387" + integrity sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ== + dependencies: + is-plain-object "^2.0.4" + kind-of "^6.0.2" + shallow-clone "^3.0.0" + +clone-response@^1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/clone-response/-/clone-response-1.0.3.tgz#af2032aa47816399cf5f0a1d0db902f517abb8c3" + integrity sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA== + dependencies: + mimic-response "^1.0.0" + +clsx@^1.1.0, clsx@^1.1.1, clsx@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/clsx/-/clsx-1.2.1.tgz#0ddc4a20a549b59c93a4116bb26f5294ca17dc12" + integrity sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg== + +clsx@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/clsx/-/clsx-2.1.1.tgz#eed397c9fd8bd882bfb18deab7102049a2f32999" + integrity sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA== + +collapse-white-space@^1.0.2: + version "1.0.6" + resolved "https://registry.yarnpkg.com/collapse-white-space/-/collapse-white-space-1.0.6.tgz#e63629c0016665792060dbbeb79c42239d2c5287" + integrity sha512-jEovNnrhMuqyCcjfEJA56v0Xq8SkIoPKDyaHahwo3POf4qcSXqMYuwNcOTzp74vTsR9Tn08z4MxWqAhcekogkQ== + +collapse-white-space@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/collapse-white-space/-/collapse-white-space-2.1.0.tgz#640257174f9f42c740b40f3b55ee752924feefca" + integrity sha512-loKTxY1zCOuG4j9f6EPnuyyYkf58RnhhWTvRoZEokgB+WbdXehfjFviyOVYkqzEWz1Q5kRiZdBYS5SwxbQYwzw== + +color-convert@^1.9.0: + version "1.9.3" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" + integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== + dependencies: + color-name "1.1.3" + +color-convert@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" + integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== + dependencies: + color-name "~1.1.4" + +color-name@1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" + integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== + +color-name@~1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" + integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== + +colord@^2.9.1: + version "2.9.3" + resolved "https://registry.yarnpkg.com/colord/-/colord-2.9.3.tgz#4f8ce919de456f1d5c1c368c307fe20f3e59fb43" + integrity sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw== + +colorette@^1.2.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/colorette/-/colorette-1.4.0.tgz#5190fbb87276259a86ad700bff2c6d6faa3fca40" + integrity sha512-Y2oEozpomLn7Q3HFP7dpww7AtMJplbM9lGZP6RDfHqmbeRjiwRg4n6VM6j4KLmRke85uWEI7JqF17f3pqdRA0g== + +colorette@^2.0.10: + version "2.0.20" + resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.20.tgz#9eb793e6833067f7235902fcd3b09917a000a95a" + integrity sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w== + +combine-promises@^1.1.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/combine-promises/-/combine-promises-1.2.0.tgz#5f2e68451862acf85761ded4d9e2af7769c2ca6a" + integrity sha512-VcQB1ziGD0NXrhKxiwyNbCDmRzs/OShMs2GqW2DlU2A/Sd0nQxE1oWDAE5O0ygSx5mgQOn9eIFh7yKPgFRVkPQ== + +comma-separated-tokens@^1.0.0: + version "1.0.8" + resolved "https://registry.yarnpkg.com/comma-separated-tokens/-/comma-separated-tokens-1.0.8.tgz#632b80b6117867a158f1080ad498b2fbe7e3f5ea" + integrity sha512-GHuDRO12Sypu2cV70d1dkA2EUmXHgntrzbpvOB+Qy+49ypNfGgFQIC2fhhXbnyrJRynDCAARsT7Ou0M6hirpfw== + +comma-separated-tokens@^2.0.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz#4e89c9458acb61bc8fef19f4529973b2392839ee" + integrity sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg== + +commander@^10.0.0: + version "10.0.1" + resolved "https://registry.yarnpkg.com/commander/-/commander-10.0.1.tgz#881ee46b4f77d1c1dccc5823433aa39b022cbe06" + integrity sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug== + +commander@^2.20.0: + version "2.20.3" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" + integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== + +commander@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-5.1.0.tgz#46abbd1652f8e059bddaef99bbdcb2ad9cf179ae" + integrity sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg== + +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" + integrity sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww== + +common-path-prefix@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/common-path-prefix/-/common-path-prefix-3.0.0.tgz#7d007a7e07c58c4b4d5f433131a19141b29f11e0" + integrity sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w== + +commondir@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" + integrity sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg== + +compressible@~2.0.16: + version "2.0.18" + resolved "https://registry.yarnpkg.com/compressible/-/compressible-2.0.18.tgz#af53cca6b070d4c3c0750fbd77286a6d7cc46fba" + integrity sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg== + dependencies: + mime-db ">= 1.43.0 < 2" + +compression@^1.7.4: + version "1.7.4" + resolved "https://registry.yarnpkg.com/compression/-/compression-1.7.4.tgz#95523eff170ca57c29a0ca41e6fe131f41e5bb8f" + integrity sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ== + dependencies: + accepts "~1.3.5" + bytes "3.0.0" + compressible "~2.0.16" + debug "2.6.9" + on-headers "~1.0.2" + safe-buffer "5.1.2" + vary "~1.1.2" + +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== + +config-chain@^1.1.11: + version "1.1.13" + resolved "https://registry.yarnpkg.com/config-chain/-/config-chain-1.1.13.tgz#fad0795aa6a6cdaff9ed1b68e9dff94372c232f4" + integrity sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ== + dependencies: + ini "^1.3.4" + proto-list "~1.2.1" + +configstore@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/configstore/-/configstore-5.0.1.tgz#d365021b5df4b98cdd187d6a3b0e3f6a7cc5ed96" + integrity sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA== + dependencies: + dot-prop "^5.2.0" + graceful-fs "^4.1.2" + make-dir "^3.0.0" + unique-string "^2.0.0" + write-file-atomic "^3.0.0" + xdg-basedir "^4.0.0" + +configstore@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/configstore/-/configstore-6.0.0.tgz#49eca2ebc80983f77e09394a1a56e0aca8235566" + integrity sha512-cD31W1v3GqUlQvbBCGcXmd2Nj9SvLDOP1oQ0YFuLETufzSPaKp11rYBsSOm7rCsW3OnIRAFM3OxRhceaXNYHkA== + dependencies: + dot-prop "^6.0.1" + graceful-fs "^4.2.6" + unique-string "^3.0.0" + write-file-atomic "^3.0.3" + xdg-basedir "^5.0.1" + +connect-history-api-fallback@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz#647264845251a0daf25b97ce87834cace0f5f1c8" + integrity sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA== + +consola@^2.15.3: + version "2.15.3" + resolved "https://registry.yarnpkg.com/consola/-/consola-2.15.3.tgz#2e11f98d6a4be71ff72e0bdf07bd23e12cb61550" + integrity sha512-9vAdYbHj6x2fLKC4+oPH0kFzY/orMZyG2Aj+kNylHxKGJ/Ed4dpNyAQYwJOdqO4zdM7XpVHmyejQDcQHrnuXbw== + +content-disposition@0.5.2: + version "0.5.2" + resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.2.tgz#0cf68bb9ddf5f2be7961c3a85178cb85dba78cb4" + integrity sha512-kRGRZw3bLlFISDBgwTSA1TMBFN6J6GWDeubmDE3AF+3+yXL8hTWv8r5rkLbqYXY4RjPk/EzHnClI3zQf1cFmHA== + +content-disposition@0.5.4: + version "0.5.4" + resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.4.tgz#8b82b4efac82512a02bb0b1dcec9d2c5e8eb5bfe" + integrity sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ== + dependencies: + safe-buffer "5.2.1" + +content-type@~1.0.4, content-type@~1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.5.tgz#8b773162656d1d1086784c8f23a54ce6d73d7918" + integrity sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA== + +convert-source-map@^1.7.0: + version "1.9.0" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.9.0.tgz#7faae62353fb4213366d0ca98358d22e8368b05f" + integrity sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A== + +convert-source-map@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-2.0.0.tgz#4b560f649fc4e918dd0ab75cf4961e8bc882d82a" + integrity sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg== + +cookie-signature@1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" + integrity sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ== + +cookie@0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.6.0.tgz#2798b04b071b0ecbff0dbb62a505a8efa4e19051" + integrity sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw== + +copy-text-to-clipboard@^3.0.1: + version "3.2.0" + resolved "https://registry.yarnpkg.com/copy-text-to-clipboard/-/copy-text-to-clipboard-3.2.0.tgz#0202b2d9bdae30a49a53f898626dcc3b49ad960b" + integrity sha512-RnJFp1XR/LOBDckxTib5Qjr/PMfkatD0MUCQgdpqS8MdKiNUzBjAQBEN6oUy+jW7LI93BBG3DtMB2KOOKpGs2Q== + +copy-webpack-plugin@^11.0.0: + version "11.0.0" + resolved "https://registry.yarnpkg.com/copy-webpack-plugin/-/copy-webpack-plugin-11.0.0.tgz#96d4dbdb5f73d02dd72d0528d1958721ab72e04a" + integrity sha512-fX2MWpamkW0hZxMEg0+mYnA40LTosOSa5TqZ9GYIBzyJa9C3QUaMPSE2xAi/buNr8u89SfD9wHSQVBzrRa/SOQ== + dependencies: + fast-glob "^3.2.11" + glob-parent "^6.0.1" + globby "^13.1.1" + normalize-path "^3.0.0" + schema-utils "^4.0.0" + serialize-javascript "^6.0.0" + +core-js-compat@^3.31.0, core-js-compat@^3.33.1: + version "3.35.0" + resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.35.0.tgz#c149a3d1ab51e743bc1da61e39cb51f461a41873" + integrity sha512-5blwFAddknKeNgsjBzilkdQ0+YK8L1PfqPYq40NOYMYFSS38qj+hpTcLLWwpIwA2A5bje/x5jmVn2tzUMg9IVw== + dependencies: + browserslist "^4.22.2" + +core-js-pure@^3.30.2: + version "3.35.0" + resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.35.0.tgz#4660033304a050215ae82e476bd2513a419fbb34" + integrity sha512-f+eRYmkou59uh7BPcyJ8MC76DiGhspj1KMxVIcF24tzP8NA9HVa1uC7BTW2tgx7E1QVCzDzsgp7kArrzhlz8Ew== + +core-js@^3.23.3, core-js@^3.31.1: + version "3.35.0" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.35.0.tgz#58e651688484f83c34196ca13f099574ee53d6b4" + integrity sha512-ntakECeqg81KqMueeGJ79Q5ZgQNR+6eaE8sxGCx62zMbAIj65q+uYvatToew3m6eAGdU4gNZwpZ34NMe4GYswg== + +core-util-is@~1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85" + integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== + +cosmiconfig@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-6.0.0.tgz#da4fee853c52f6b1e6935f41c1a2fc50bd4a9982" + integrity sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg== + dependencies: + "@types/parse-json" "^4.0.0" + import-fresh "^3.1.0" + parse-json "^5.0.0" + path-type "^4.0.0" + yaml "^1.7.2" + +cosmiconfig@^7.0.1: + version "7.1.0" + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-7.1.0.tgz#1443b9afa596b670082ea46cbd8f6a62b84635f6" + integrity sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA== + dependencies: + "@types/parse-json" "^4.0.0" + import-fresh "^3.2.1" + parse-json "^5.0.0" + path-type "^4.0.0" + yaml "^1.10.0" + +cosmiconfig@^8.1.3, cosmiconfig@^8.3.5: + version "8.3.6" + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-8.3.6.tgz#060a2b871d66dba6c8538ea1118ba1ac16f5fae3" + integrity sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA== + dependencies: + import-fresh "^3.3.0" + js-yaml "^4.1.0" + parse-json "^5.2.0" + path-type "^4.0.0" + +cross-fetch@^3.1.5: + version "3.1.8" + resolved "https://registry.yarnpkg.com/cross-fetch/-/cross-fetch-3.1.8.tgz#0327eba65fd68a7d119f8fb2bf9334a1a7956f82" + integrity sha512-cvA+JwZoU0Xq+h6WkMvAUqPEYy92Obet6UdKLfW60qn99ftItKjB5T+BkyWOFWe2pUyfQ+IJHmpOTznqk1M6Kg== + dependencies: + node-fetch "^2.6.12" + +cross-spawn@^7.0.3: + version "7.0.6" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.6.tgz#8a58fe78f00dcd70c370451759dfbfaf03e8ee9f" + integrity sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA== + dependencies: + path-key "^3.1.0" + shebang-command "^2.0.0" + which "^2.0.1" + +crypto-random-string@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-2.0.0.tgz#ef2a7a966ec11083388369baa02ebead229b30d5" + integrity sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA== + +crypto-random-string@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-4.0.0.tgz#5a3cc53d7dd86183df5da0312816ceeeb5bb1fc2" + integrity sha512-x8dy3RnvYdlUcPOjkEHqozhiwzKNSq7GcPuXFbnyMOCHxX8V3OgIg/pYuabl2sbUPfIJaeAQB7PMOK8DFIdoRA== + dependencies: + type-fest "^1.0.1" + +css-color-keywords@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/css-color-keywords/-/css-color-keywords-1.0.0.tgz#fea2616dc676b2962686b3af8dbdbe180b244e05" + integrity sha512-FyyrDHZKEjXDpNJYvVsV960FiqQyXc/LlYmsxl2BcdMb2WPx0OGRVgTg55rPSyLSNMqP52R9r8geSp7apN3Ofg== + +css-declaration-sorter@^6.3.1: + version "6.4.1" + resolved "https://registry.yarnpkg.com/css-declaration-sorter/-/css-declaration-sorter-6.4.1.tgz#28beac7c20bad7f1775be3a7129d7eae409a3a71" + integrity sha512-rtdthzxKuyq6IzqX6jEcIzQF/YqccluefyCYheovBOLhFT/drQA9zj/UbRAa9J7C0o6EG6u3E6g+vKkay7/k3g== + +css-loader@^6.7.1, css-loader@^6.8.1: + version "6.8.1" + resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-6.8.1.tgz#0f8f52699f60f5e679eab4ec0fcd68b8e8a50a88" + integrity sha512-xDAXtEVGlD0gJ07iclwWVkLoZOpEvAWaSyf6W18S2pOC//K8+qUDIx8IIT3D+HjnmkJPQeesOPv5aiUaJsCM2g== + dependencies: + icss-utils "^5.1.0" + postcss "^8.4.21" + postcss-modules-extract-imports "^3.0.0" + postcss-modules-local-by-default "^4.0.3" + postcss-modules-scope "^3.0.0" + postcss-modules-values "^4.0.0" + postcss-value-parser "^4.2.0" + semver "^7.3.8" + +css-minimizer-webpack-plugin@^4.0.0, css-minimizer-webpack-plugin@^4.2.2: + version "4.2.2" + resolved "https://registry.yarnpkg.com/css-minimizer-webpack-plugin/-/css-minimizer-webpack-plugin-4.2.2.tgz#79f6199eb5adf1ff7ba57f105e3752d15211eb35" + integrity sha512-s3Of/4jKfw1Hj9CxEO1E5oXhQAxlayuHO2y/ML+C6I9sQ7FdzfEV6QgMLN3vI+qFsjJGIAFLKtQK7t8BOXAIyA== + dependencies: + cssnano "^5.1.8" + jest-worker "^29.1.2" + postcss "^8.4.17" + schema-utils "^4.0.0" + serialize-javascript "^6.0.0" + source-map "^0.6.1" + +css-select@^4.1.3: + version "4.3.0" + resolved "https://registry.yarnpkg.com/css-select/-/css-select-4.3.0.tgz#db7129b2846662fd8628cfc496abb2b59e41529b" + integrity sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ== + dependencies: + boolbase "^1.0.0" + css-what "^6.0.1" + domhandler "^4.3.1" + domutils "^2.8.0" + nth-check "^2.0.1" + +css-select@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/css-select/-/css-select-5.1.0.tgz#b8ebd6554c3637ccc76688804ad3f6a6fdaea8a6" + integrity sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg== + dependencies: + boolbase "^1.0.0" + css-what "^6.1.0" + domhandler "^5.0.2" + domutils "^3.0.1" + nth-check "^2.0.1" + +css-to-react-native@3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/css-to-react-native/-/css-to-react-native-3.2.0.tgz#cdd8099f71024e149e4f6fe17a7d46ecd55f1e32" + integrity sha512-e8RKaLXMOFii+02mOlqwjbD00KSEKqblnpO9e++1aXS1fPQOpS1YoqdVHBqPjHNoxeF2mimzVqawm2KCbEdtHQ== + dependencies: + camelize "^1.0.0" + css-color-keywords "^1.0.0" + postcss-value-parser "^4.0.2" + +css-tree@^1.1.2, css-tree@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-1.1.3.tgz#eb4870fb6fd7707327ec95c2ff2ab09b5e8db91d" + integrity sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q== + dependencies: + mdn-data "2.0.14" + source-map "^0.6.1" + +css-tree@^2.3.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-2.3.1.tgz#10264ce1e5442e8572fc82fbe490644ff54b5c20" + integrity sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw== + dependencies: + mdn-data "2.0.30" + source-map-js "^1.0.1" + +css-tree@~2.2.0: + version "2.2.1" + resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-2.2.1.tgz#36115d382d60afd271e377f9c5f67d02bd48c032" + integrity sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA== + dependencies: + mdn-data "2.0.28" + source-map-js "^1.0.1" + +css-what@^6.0.1, css-what@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/css-what/-/css-what-6.1.0.tgz#fb5effcf76f1ddea2c81bdfaa4de44e79bac70f4" + integrity sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw== + +cssesc@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee" + integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== + +cssnano-preset-advanced@^5.3.10, cssnano-preset-advanced@^5.3.8: + version "5.3.10" + resolved "https://registry.yarnpkg.com/cssnano-preset-advanced/-/cssnano-preset-advanced-5.3.10.tgz#25558a1fbf3a871fb6429ce71e41be7f5aca6eef" + integrity sha512-fnYJyCS9jgMU+cmHO1rPSPf9axbQyD7iUhLO5Df6O4G+fKIOMps+ZbU0PdGFejFBBZ3Pftf18fn1eG7MAPUSWQ== + dependencies: + autoprefixer "^10.4.12" + cssnano-preset-default "^5.2.14" + postcss-discard-unused "^5.1.0" + postcss-merge-idents "^5.1.1" + postcss-reduce-idents "^5.2.0" + postcss-zindex "^5.1.0" + +cssnano-preset-default@^5.2.14: + version "5.2.14" + resolved "https://registry.yarnpkg.com/cssnano-preset-default/-/cssnano-preset-default-5.2.14.tgz#309def4f7b7e16d71ab2438052093330d9ab45d8" + integrity sha512-t0SFesj/ZV2OTylqQVOrFgEh5uanxbO6ZAdeCrNsUQ6fVuXwYTxJPNAGvGTxHbD68ldIJNec7PyYZDBrfDQ+6A== + dependencies: + css-declaration-sorter "^6.3.1" + cssnano-utils "^3.1.0" + postcss-calc "^8.2.3" + postcss-colormin "^5.3.1" + postcss-convert-values "^5.1.3" + postcss-discard-comments "^5.1.2" + postcss-discard-duplicates "^5.1.0" + postcss-discard-empty "^5.1.1" + postcss-discard-overridden "^5.1.0" + postcss-merge-longhand "^5.1.7" + postcss-merge-rules "^5.1.4" + postcss-minify-font-values "^5.1.0" + postcss-minify-gradients "^5.1.1" + postcss-minify-params "^5.1.4" + postcss-minify-selectors "^5.2.1" + postcss-normalize-charset "^5.1.0" + postcss-normalize-display-values "^5.1.0" + postcss-normalize-positions "^5.1.1" + postcss-normalize-repeat-style "^5.1.1" + postcss-normalize-string "^5.1.0" + postcss-normalize-timing-functions "^5.1.0" + postcss-normalize-unicode "^5.1.1" + postcss-normalize-url "^5.1.0" + postcss-normalize-whitespace "^5.1.1" + postcss-ordered-values "^5.1.3" + postcss-reduce-initial "^5.1.2" + postcss-reduce-transforms "^5.1.0" + postcss-svgo "^5.1.0" + postcss-unique-selectors "^5.1.1" + +cssnano-utils@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/cssnano-utils/-/cssnano-utils-3.1.0.tgz#95684d08c91511edfc70d2636338ca37ef3a6861" + integrity sha512-JQNR19/YZhz4psLX/rQ9M83e3z2Wf/HdJbryzte4a3NSuafyp9w/I4U+hx5C2S9g41qlstH7DEWnZaaj83OuEA== + +cssnano@^5.1.12, cssnano@^5.1.15, cssnano@^5.1.8: + version "5.1.15" + resolved "https://registry.yarnpkg.com/cssnano/-/cssnano-5.1.15.tgz#ded66b5480d5127fcb44dac12ea5a983755136bf" + integrity sha512-j+BKgDcLDQA+eDifLx0EO4XSA56b7uut3BQFH+wbSaSTuGLuiyTa/wbRYthUXX8LC9mLg+WWKe8h+qJuwTAbHw== + dependencies: + cssnano-preset-default "^5.2.14" + lilconfig "^2.0.3" + yaml "^1.10.2" + +csso@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/csso/-/csso-4.2.0.tgz#ea3a561346e8dc9f546d6febedd50187cf389529" + integrity sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA== + dependencies: + css-tree "^1.1.2" + +csso@^5.0.5: + version "5.0.5" + resolved "https://registry.yarnpkg.com/csso/-/csso-5.0.5.tgz#f9b7fe6cc6ac0b7d90781bb16d5e9874303e2ca6" + integrity sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ== + dependencies: + css-tree "~2.2.0" + +csstype@3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.2.tgz#1d4bf9d572f11c14031f0436e1c10bc1f571f50b" + integrity sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ== + +csstype@^3.0.2: + version "3.1.3" + resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.3.tgz#d80ff294d114fb0e6ac500fbf85b60137d7eff81" + integrity sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw== + +debounce@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/debounce/-/debounce-1.2.1.tgz#38881d8f4166a5c5848020c11827b834bcb3e0a5" + integrity sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug== + +debug@2.6.9, debug@^2.6.0: + version "2.6.9" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" + integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== + dependencies: + ms "2.0.0" + +debug@4, debug@^4.0.0, debug@^4.1.0, debug@^4.1.1, debug@^4.2.0, debug@^4.3.1: + version "4.3.4" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" + integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== + dependencies: + ms "2.1.2" + +decko@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/decko/-/decko-1.2.0.tgz#fd43c735e967b8013306884a56fbe665996b6817" + integrity sha512-m8FnyHXV1QX+S1cl+KPFDIl6NMkxtKsy6+U/aYyjrOqWMuwAwYWu7ePqrsUHtDR5Y8Yk2pi/KIDSgF+vT4cPOQ== + +decode-named-character-reference@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/decode-named-character-reference/-/decode-named-character-reference-1.0.2.tgz#daabac9690874c394c81e4162a0304b35d824f0e" + integrity sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg== + dependencies: + character-entities "^2.0.0" + +decompress-response@^3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-3.3.0.tgz#80a4dd323748384bfa248083622aedec982adff3" + integrity sha512-BzRPQuY1ip+qDonAOz42gRm/pg9F768C+npV/4JOsxRC2sq+Rlk+Q4ZCAsOhnIaMrgarILY+RMUIvMmmX1qAEA== + dependencies: + mimic-response "^1.0.0" + +decompress-response@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-6.0.0.tgz#ca387612ddb7e104bd16d85aab00d5ecf09c66fc" + integrity sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ== + dependencies: + mimic-response "^3.1.0" + +deep-extend@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" + integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== + +deepmerge@^4.2.2, deepmerge@^4.3.1: + version "4.3.1" + resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.3.1.tgz#44b5f2147cd3b00d4b56137685966f26fd25dd4a" + integrity sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A== + +default-gateway@^6.0.3: + version "6.0.3" + resolved "https://registry.yarnpkg.com/default-gateway/-/default-gateway-6.0.3.tgz#819494c888053bdb743edbf343d6cdf7f2943a71" + integrity sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg== + dependencies: + execa "^5.0.0" + +defer-to-connect@^1.0.1: + version "1.1.3" + resolved "https://registry.yarnpkg.com/defer-to-connect/-/defer-to-connect-1.1.3.tgz#331ae050c08dcf789f8c83a7b81f0ed94f4ac591" + integrity sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ== + +defer-to-connect@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/defer-to-connect/-/defer-to-connect-2.0.1.tgz#8016bdb4143e4632b77a3449c6236277de520587" + integrity sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg== + +define-data-property@^1.0.1, define-data-property@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/define-data-property/-/define-data-property-1.1.1.tgz#c35f7cd0ab09883480d12ac5cb213715587800b3" + integrity sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ== + dependencies: + get-intrinsic "^1.2.1" + gopd "^1.0.1" + has-property-descriptors "^1.0.0" + +define-data-property@^1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/define-data-property/-/define-data-property-1.1.4.tgz#894dc141bb7d3060ae4366f6a0107e68fbe48c5e" + integrity sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A== + dependencies: + es-define-property "^1.0.0" + es-errors "^1.3.0" + gopd "^1.0.1" + +define-lazy-prop@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz#3f7ae421129bcaaac9bc74905c98a0009ec9ee7f" + integrity sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og== + +define-properties@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.2.1.tgz#10781cc616eb951a80a034bafcaa7377f6af2b6c" + integrity sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg== + dependencies: + define-data-property "^1.0.1" + has-property-descriptors "^1.0.0" + object-keys "^1.1.1" + +del@^6.1.1: + version "6.1.1" + resolved "https://registry.yarnpkg.com/del/-/del-6.1.1.tgz#3b70314f1ec0aa325c6b14eb36b95786671edb7a" + integrity sha512-ua8BhapfP0JUJKC/zV9yHHDW/rDoDxP4Zhn3AkA6/xT6gY7jYXJiaeyBZznYVujhZZET+UgcbZiQ7sN3WqcImg== + dependencies: + globby "^11.0.1" + graceful-fs "^4.2.4" + is-glob "^4.0.1" + is-path-cwd "^2.2.0" + is-path-inside "^3.0.2" + p-map "^4.0.0" + rimraf "^3.0.2" + slash "^3.0.0" + +depd@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" + integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== + +depd@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" + integrity sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ== + +dequal@^2.0.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/dequal/-/dequal-2.0.3.tgz#2644214f1997d39ed0ee0ece72335490a7ac67be" + integrity sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA== + +destroy@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.2.0.tgz#4803735509ad8be552934c67df614f94e66fa015" + integrity sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg== + +detab@2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/detab/-/detab-2.0.4.tgz#b927892069aff405fbb9a186fe97a44a92a94b43" + integrity sha512-8zdsQA5bIkoRECvCrNKPla84lyoR7DSAyf7p0YgXzBO9PDJx8KntPUay7NS6yp+KdxdVtiE5SpHKtbp2ZQyA9g== + dependencies: + repeat-string "^1.5.4" + +detect-node@^2.0.4: + version "2.1.0" + resolved "https://registry.yarnpkg.com/detect-node/-/detect-node-2.1.0.tgz#c9c70775a49c3d03bc2c06d9a73be550f978f8b1" + integrity sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g== + +detect-port-alt@^1.1.6: + version "1.1.6" + resolved "https://registry.yarnpkg.com/detect-port-alt/-/detect-port-alt-1.1.6.tgz#24707deabe932d4a3cf621302027c2b266568275" + integrity sha512-5tQykt+LqfJFBEYaDITx7S7cR7mJ/zQmLXZ2qt5w04ainYZw6tBf9dBunMjVeVOdYVRUzUOE4HkY5J7+uttb5Q== + dependencies: + address "^1.0.1" + debug "^2.6.0" + +detect-port@^1.3.0, detect-port@^1.5.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/detect-port/-/detect-port-1.5.1.tgz#451ca9b6eaf20451acb0799b8ab40dff7718727b" + integrity sha512-aBzdj76lueB6uUst5iAs7+0H/oOjqI5D16XUWxlWMIMROhcM0rfsNVk93zTngq1dDNpoXRr++Sus7ETAExppAQ== + dependencies: + address "^1.0.1" + debug "4" + +devlop@^1.0.0, devlop@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/devlop/-/devlop-1.1.0.tgz#4db7c2ca4dc6e0e834c30be70c94bbc976dc7018" + integrity sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA== + dependencies: + dequal "^2.0.0" + +dir-glob@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" + integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== + dependencies: + path-type "^4.0.0" + +dns-equal@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/dns-equal/-/dns-equal-1.0.0.tgz#b39e7f1da6eb0a75ba9c17324b34753c47e0654d" + integrity sha512-z+paD6YUQsk+AbGCEM4PrOXSss5gd66QfcVBFTKR/HpFL9jCqikS94HYwKww6fQyO7IxrIIyUu+g0Ka9tUS2Cg== + +dns-packet@^5.2.2: + version "5.6.1" + resolved "https://registry.yarnpkg.com/dns-packet/-/dns-packet-5.6.1.tgz#ae888ad425a9d1478a0674256ab866de1012cf2f" + integrity sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw== + dependencies: + "@leichtgewicht/ip-codec" "^2.0.1" + +docusaurus-plugin-redoc@2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/docusaurus-plugin-redoc/-/docusaurus-plugin-redoc-2.0.2.tgz#d8feddf0626939363549d06145fc585e7f2583b5" + integrity sha512-J4pfu+dvwm1D4qWA6O8FT6EYSw9R1mv9fIXCqKh7aHYD+OU19hj/vQQUdjIbAwTcOkBg+eUYVXvdopwTvUXNcQ== + dependencies: + "@redocly/openapi-core" "1.10.3" + redoc "2.1.3" + +docusaurus-theme-redoc@2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/docusaurus-theme-redoc/-/docusaurus-theme-redoc-2.0.2.tgz#d56d3b5a5773f609f8d4d0e29ea3614952632554" + integrity sha512-qa8svxKCipIvokNGctoQRP3Vz+HTF2Mnwg6xzY/W/LR5TYEIu3nuSvouLLR58uBrHKGzGpto5CEPDq0SvVvDlA== + dependencies: + "@redocly/openapi-core" "1.10.3" + clsx "^1.2.1" + lodash "^4.17.21" + mobx "^6.0.4" + redoc "2.1.3" + styled-components "^6.0.5" + +dom-converter@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/dom-converter/-/dom-converter-0.2.0.tgz#6721a9daee2e293682955b6afe416771627bb768" + integrity sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA== + dependencies: + utila "~0.4" + +dom-serializer@^1.0.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-1.4.1.tgz#de5d41b1aea290215dc45a6dae8adcf1d32e2d30" + integrity sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag== + dependencies: + domelementtype "^2.0.1" + domhandler "^4.2.0" + entities "^2.0.0" + +dom-serializer@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-2.0.0.tgz#e41b802e1eedf9f6cae183ce5e622d789d7d8e53" + integrity sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg== + dependencies: + domelementtype "^2.3.0" + domhandler "^5.0.2" + entities "^4.2.0" + +domelementtype@^2.0.1, domelementtype@^2.2.0, domelementtype@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.3.0.tgz#5c45e8e869952626331d7aab326d01daf65d589d" + integrity sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw== + +domhandler@^4.0.0, domhandler@^4.2.0, domhandler@^4.3.1: + version "4.3.1" + resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-4.3.1.tgz#8d792033416f59d68bc03a5aa7b018c1ca89279c" + integrity sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ== + dependencies: + domelementtype "^2.2.0" + +domhandler@^5.0.2, domhandler@^5.0.3: + version "5.0.3" + resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-5.0.3.tgz#cc385f7f751f1d1fc650c21374804254538c7d31" + integrity sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w== + dependencies: + domelementtype "^2.3.0" + +dompurify@^2.2.8: + version "2.5.7" + resolved "https://registry.yarnpkg.com/dompurify/-/dompurify-2.5.7.tgz#6e0d36b9177db5a99f18ade1f28579db5ab839d7" + integrity sha512-2q4bEI+coQM8f5ez7kt2xclg1XsecaV9ASJk/54vwlfRRNQfDqJz2pzQ8t0Ix/ToBpXlVjrRIx7pFC/o8itG2Q== + +domutils@^2.5.2, domutils@^2.8.0: + version "2.8.0" + resolved "https://registry.yarnpkg.com/domutils/-/domutils-2.8.0.tgz#4437def5db6e2d1f5d6ee859bd95ca7d02048135" + integrity sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A== + dependencies: + dom-serializer "^1.0.1" + domelementtype "^2.2.0" + domhandler "^4.2.0" + +domutils@^3.0.1, domutils@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/domutils/-/domutils-3.1.0.tgz#c47f551278d3dc4b0b1ab8cbb42d751a6f0d824e" + integrity sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA== + dependencies: + dom-serializer "^2.0.0" + domelementtype "^2.3.0" + domhandler "^5.0.3" + +dot-case@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/dot-case/-/dot-case-3.0.4.tgz#9b2b670d00a431667a8a75ba29cd1b98809ce751" + integrity sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w== + dependencies: + no-case "^3.0.4" + tslib "^2.0.3" + +dot-prop@^5.2.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-5.3.0.tgz#90ccce708cd9cd82cc4dc8c3ddd9abdd55b20e88" + integrity sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q== + dependencies: + is-obj "^2.0.0" + +dot-prop@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-6.0.1.tgz#fc26b3cf142b9e59b74dbd39ed66ce620c681083" + integrity sha512-tE7ztYzXHIeyvc7N+hR3oi7FIbf/NIjVP9hmAt3yMXzrQ072/fpjGLx2GxNxGxUl5V73MEqYzioOMoVhGMJ5cA== + dependencies: + is-obj "^2.0.0" + +duplexer3@^0.1.4: + version "0.1.5" + resolved "https://registry.yarnpkg.com/duplexer3/-/duplexer3-0.1.5.tgz#0b5e4d7bad5de8901ea4440624c8e1d20099217e" + integrity sha512-1A8za6ws41LQgv9HrE/66jyC5yuSjQ3L/KOpFtoBilsAK2iA2wuS5rTt1OCzIvtS2V7nVmedsUU+DGRcjBmOYA== + +duplexer@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/duplexer/-/duplexer-0.1.2.tgz#3abe43aef3835f8ae077d136ddce0f276b0400e6" + integrity sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg== + +eastasianwidth@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/eastasianwidth/-/eastasianwidth-0.2.0.tgz#696ce2ec0aa0e6ea93a397ffcf24aa7840c827cb" + integrity sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA== + +ee-first@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" + integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow== + +electron-to-chromium@^1.4.601: + version "1.4.616" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.616.tgz#4bddbc2c76e1e9dbf449ecd5da3d8119826ea4fb" + integrity sha512-1n7zWYh8eS0L9Uy+GskE0lkBUNK83cXTVJI0pU3mGprFsbfSdAc15VTFbo+A+Bq4pwstmL30AVcEU3Fo463lNg== + +emoji-regex@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" + integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== + +emoji-regex@^9.2.2: + version "9.2.2" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-9.2.2.tgz#840c8803b0d8047f4ff0cf963176b32d4ef3ed72" + integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg== + +emojilib@^2.4.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/emojilib/-/emojilib-2.4.0.tgz#ac518a8bb0d5f76dda57289ccb2fdf9d39ae721e" + integrity sha512-5U0rVMU5Y2n2+ykNLQqMoqklN9ICBT/KsvC1Gz6vqHbz2AXXGkG+Pm5rMWk/8Vjrr/mY9985Hi8DYzn1F09Nyw== + +emojis-list@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-3.0.0.tgz#5570662046ad29e2e916e71aae260abdff4f6a78" + integrity sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q== + +emoticon@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/emoticon/-/emoticon-3.2.0.tgz#c008ca7d7620fac742fe1bf4af8ff8fed154ae7f" + integrity sha512-SNujglcLTTg+lDAcApPNgEdudaqQFiAbJCqzjNxJkvN9vAwCGi0uu8IUVvx+f16h+V44KCY6Y2yboroc9pilHg== + +emoticon@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/emoticon/-/emoticon-4.0.1.tgz#2d2bbbf231ce3a5909e185bbb64a9da703a1e749" + integrity sha512-dqx7eA9YaqyvYtUhJwT4rC1HIp82j5ybS1/vQ42ur+jBe17dJMwZE4+gvL1XadSFfxaPFFGt3Xsw+Y8akThDlw== + +encodeurl@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" + integrity sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w== + +encodeurl@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-2.0.0.tgz#7b8ea898077d7e409d3ac45474ea38eaf0857a58" + integrity sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg== + +encoding-sniffer@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/encoding-sniffer/-/encoding-sniffer-0.2.0.tgz#799569d66d443babe82af18c9f403498365ef1d5" + integrity sha512-ju7Wq1kg04I3HtiYIOrUrdfdDvkyO9s5XM8QAj/bN61Yo/Vb4vgJxy5vi4Yxk01gWHbrofpPtpxM8bKger9jhg== + dependencies: + iconv-lite "^0.6.3" + whatwg-encoding "^3.1.1" + +end-of-stream@^1.1.0: + version "1.4.4" + resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" + integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== + dependencies: + once "^1.4.0" + +enhanced-resolve@^5.17.1: + version "5.17.1" + resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.17.1.tgz#67bfbbcc2f81d511be77d686a90267ef7f898a15" + integrity sha512-LMHl3dXhTcfv8gM4kEzIUeTQ+7fpdA0l2tUf34BddXPkz2A5xJ5L/Pchd5BL6rdccM9QGvu0sWZzK1Z1t4wwyg== + dependencies: + graceful-fs "^4.2.4" + tapable "^2.2.0" + +entities@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/entities/-/entities-2.2.0.tgz#098dc90ebb83d8dffa089d55256b351d34c4da55" + integrity sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A== + +entities@^4.2.0, entities@^4.4.0, entities@^4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/entities/-/entities-4.5.0.tgz#5d268ea5e7113ec74c4d033b79ea5a35a488fb48" + integrity sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw== + +error-ex@^1.3.1: + version "1.3.2" + resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" + integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== + dependencies: + is-arrayish "^0.2.1" + +es-define-property@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/es-define-property/-/es-define-property-1.0.0.tgz#c7faefbdff8b2696cf5f46921edfb77cc4ba3845" + integrity sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ== + dependencies: + get-intrinsic "^1.2.4" + +es-errors@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/es-errors/-/es-errors-1.3.0.tgz#05f75a25dab98e4fb1dcd5e1472c0546d5057c8f" + integrity sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw== + +es-module-lexer@^1.2.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-1.4.1.tgz#41ea21b43908fe6a287ffcbe4300f790555331f5" + integrity sha512-cXLGjP0c4T3flZJKQSuziYoq7MlT+rnvfZjfp7h+I7K9BNX54kP9nyWvdbwjQ4u1iWbOL4u96fgeZLToQlZC7w== + +es6-promise@^3.2.1: + version "3.3.1" + resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-3.3.1.tgz#a08cdde84ccdbf34d027a1451bc91d4bcd28a613" + integrity sha512-SOp9Phqvqn7jtEUxPWdWfWoLmyt2VaJ6MpvP9Comy1MceMXqE6bxvaTu4iaxpYYPzhny28Lc+M87/c2cPK6lDg== + +escalade@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" + integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== + +escape-goat@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/escape-goat/-/escape-goat-2.1.1.tgz#1b2dc77003676c457ec760b2dc68edb648188675" + integrity sha512-8/uIhbG12Csjy2JEW7D9pHbreaVaS/OpN3ycnyvElTdwM5n6GY6W6e2IPemfvGZeUMqZ9A/3GqIZMgKnBhAw/Q== + +escape-goat@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/escape-goat/-/escape-goat-4.0.0.tgz#9424820331b510b0666b98f7873fe11ac4aa8081" + integrity sha512-2Sd4ShcWxbx6OY1IHyla/CVNwvg7XwZVoXZHcSu9w9SReNP1EzzD5T8NWKIR38fIqEns9kDWKUQTXXAmlDrdPg== + +escape-html@^1.0.3, escape-html@~1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" + integrity sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow== + +escape-string-regexp@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" + integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== + +escape-string-regexp@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" + integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== + +escape-string-regexp@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz#4683126b500b61762f2dbebace1806e8be31b1c8" + integrity sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw== + +eslint-scope@5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c" + integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== + dependencies: + esrecurse "^4.3.0" + estraverse "^4.1.1" + +esprima@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" + integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== + +esrecurse@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" + integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== + dependencies: + estraverse "^5.2.0" + +estraverse@^4.1.1: + version "4.3.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" + integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== + +estraverse@^5.2.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" + integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== + +estree-util-attach-comments@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/estree-util-attach-comments/-/estree-util-attach-comments-3.0.0.tgz#344bde6a64c8a31d15231e5ee9e297566a691c2d" + integrity sha512-cKUwm/HUcTDsYh/9FgnuFqpfquUbwIqwKM26BVCGDPVgvaCl/nDCCjUfiLlx6lsEZ3Z4RFxNbOQ60pkaEwFxGw== + dependencies: + "@types/estree" "^1.0.0" + +estree-util-build-jsx@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/estree-util-build-jsx/-/estree-util-build-jsx-3.0.1.tgz#b6d0bced1dcc4f06f25cf0ceda2b2dcaf98168f1" + integrity sha512-8U5eiL6BTrPxp/CHbs2yMgP8ftMhR5ww1eIKoWRMlqvltHF8fZn5LRDvTKuxD3DUn+shRbLGqXemcP51oFCsGQ== + dependencies: + "@types/estree-jsx" "^1.0.0" + devlop "^1.0.0" + estree-util-is-identifier-name "^3.0.0" + estree-walker "^3.0.0" + +estree-util-is-identifier-name@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/estree-util-is-identifier-name/-/estree-util-is-identifier-name-3.0.0.tgz#0b5ef4c4ff13508b34dcd01ecfa945f61fce5dbd" + integrity sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg== + +estree-util-to-js@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/estree-util-to-js/-/estree-util-to-js-2.0.0.tgz#10a6fb924814e6abb62becf0d2bc4dea51d04f17" + integrity sha512-WDF+xj5rRWmD5tj6bIqRi6CkLIXbbNQUcxQHzGysQzvHmdYG2G7p/Tf0J0gpxGgkeMZNTIjT/AoSvC9Xehcgdg== + dependencies: + "@types/estree-jsx" "^1.0.0" + astring "^1.8.0" + source-map "^0.7.0" + +estree-util-value-to-estree@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/estree-util-value-to-estree/-/estree-util-value-to-estree-3.0.1.tgz#0b7b5d6b6a4aaad5c60999ffbc265a985df98ac5" + integrity sha512-b2tdzTurEIbwRh+mKrEcaWfu1wgb8J1hVsgREg7FFiecWwK/PhO8X0kyc+0bIcKNtD4sqxIdNoRy6/p/TvECEA== + dependencies: + "@types/estree" "^1.0.0" + is-plain-obj "^4.0.0" + +estree-util-visit@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/estree-util-visit/-/estree-util-visit-2.0.0.tgz#13a9a9f40ff50ed0c022f831ddf4b58d05446feb" + integrity sha512-m5KgiH85xAhhW8Wta0vShLcUvOsh3LLPI2YVwcbio1l7E09NTLL1EyMZFM1OyWowoH0skScNbhOPl4kcBgzTww== + dependencies: + "@types/estree-jsx" "^1.0.0" + "@types/unist" "^3.0.0" + +estree-walker@^3.0.0: + version "3.0.3" + resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-3.0.3.tgz#67c3e549ec402a487b4fc193d1953a524752340d" + integrity sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g== + dependencies: + "@types/estree" "^1.0.0" + +esutils@^2.0.2: + version "2.0.3" + resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" + integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== + +eta@^2.0.0, eta@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/eta/-/eta-2.2.0.tgz#eb8b5f8c4e8b6306561a455e62cd7492fe3a9b8a" + integrity sha512-UVQ72Rqjy/ZKQalzV5dCCJP80GrmPrMxh6NlNf+erV6ObL0ZFkhCstWRawS85z3smdr3d2wXPsZEY7rDPfGd2g== + +etag@~1.8.1: + version "1.8.1" + resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" + integrity sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg== + +eval@^0.1.8: + version "0.1.8" + resolved "https://registry.yarnpkg.com/eval/-/eval-0.1.8.tgz#2b903473b8cc1d1989b83a1e7923f883eb357f85" + integrity sha512-EzV94NYKoO09GLXGjXj9JIlXijVck4ONSr5wiCWDvhsvj5jxSrzTmRU/9C1DyB6uToszLs8aifA6NQ7lEQdvFw== + dependencies: + "@types/node" "*" + require-like ">= 0.1.1" + +eventemitter3@^4.0.0, eventemitter3@^4.0.7: + version "4.0.7" + resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.7.tgz#2de9b68f6528d5644ef5c59526a1b4a07306169f" + integrity sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw== + +events@^3.2.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400" + integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== + +execa@^5.0.0: + version "5.1.1" + resolved "https://registry.yarnpkg.com/execa/-/execa-5.1.1.tgz#f80ad9cbf4298f7bd1d4c9555c21e93741c411dd" + integrity sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg== + dependencies: + cross-spawn "^7.0.3" + get-stream "^6.0.0" + human-signals "^2.1.0" + is-stream "^2.0.0" + merge-stream "^2.0.0" + npm-run-path "^4.0.1" + onetime "^5.1.2" + signal-exit "^3.0.3" + strip-final-newline "^2.0.0" + +express@^4.17.3: + version "4.21.0" + resolved "https://registry.yarnpkg.com/express/-/express-4.21.0.tgz#d57cb706d49623d4ac27833f1cbc466b668eb915" + integrity sha512-VqcNGcj/Id5ZT1LZ/cfihi3ttTn+NJmkli2eZADigjq29qTlWi/hAQ43t/VLPq8+UX06FCEx3ByOYet6ZFblng== + dependencies: + accepts "~1.3.8" + array-flatten "1.1.1" + body-parser "1.20.3" + content-disposition "0.5.4" + content-type "~1.0.4" + cookie "0.6.0" + cookie-signature "1.0.6" + debug "2.6.9" + depd "2.0.0" + encodeurl "~2.0.0" + escape-html "~1.0.3" + etag "~1.8.1" + finalhandler "1.3.1" + fresh "0.5.2" + http-errors "2.0.0" + merge-descriptors "1.0.3" + methods "~1.1.2" + on-finished "2.4.1" + parseurl "~1.3.3" + path-to-regexp "0.1.10" + proxy-addr "~2.0.7" + qs "6.13.0" + range-parser "~1.2.1" + safe-buffer "5.2.1" + send "0.19.0" + serve-static "1.16.2" + setprototypeof "1.2.0" + statuses "2.0.1" + type-is "~1.6.18" + utils-merge "1.0.1" + vary "~1.1.2" + +extend-shallow@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" + integrity sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug== + dependencies: + is-extendable "^0.1.0" + +extend@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" + integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== + +fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" + integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== + +fast-glob@^3.2.11, fast-glob@^3.2.9, fast-glob@^3.3.0: + version "3.3.2" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.2.tgz#a904501e57cfdd2ffcded45e99a54fef55e46129" + integrity sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow== + dependencies: + "@nodelib/fs.stat" "^2.0.2" + "@nodelib/fs.walk" "^1.2.3" + glob-parent "^5.1.2" + merge2 "^1.3.0" + micromatch "^4.0.4" + +fast-json-stable-stringify@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" + integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== + +fast-safe-stringify@^2.0.7: + version "2.1.1" + resolved "https://registry.yarnpkg.com/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz#c406a83b6e70d9e35ce3b30a81141df30aeba884" + integrity sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA== + +fast-url-parser@1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/fast-url-parser/-/fast-url-parser-1.1.3.tgz#f4af3ea9f34d8a271cf58ad2b3759f431f0b318d" + integrity sha512-5jOCVXADYNuRkKFzNJ0dCCewsZiYo0dz8QNYljkOpFC6r2U4OBmKtvm/Tsuh4w1YYdDqDb31a8TVhBJ2OJKdqQ== + dependencies: + punycode "^1.3.2" + +fastq@^1.6.0: + version "1.16.0" + resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.16.0.tgz#83b9a9375692db77a822df081edb6a9cf6839320" + integrity sha512-ifCoaXsDrsdkWTtiNJX5uzHDsrck5TzfKKDcuFFTIrrc/BS076qgEIfoIy1VeZqViznfKiysPYTh/QeHtnIsYA== + dependencies: + reusify "^1.0.4" + +fault@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/fault/-/fault-2.0.1.tgz#d47ca9f37ca26e4bd38374a7c500b5a384755b6c" + integrity sha512-WtySTkS4OKev5JtpHXnib4Gxiurzh5NCGvWrFaZ34m6JehfTUhKZvn9njTfw48t6JumVQOmrKqpmGcdwxnhqBQ== + dependencies: + format "^0.2.0" + +faye-websocket@^0.11.3: + version "0.11.4" + resolved "https://registry.yarnpkg.com/faye-websocket/-/faye-websocket-0.11.4.tgz#7f0d9275cfdd86a1c963dc8b65fcc451edcbb1da" + integrity sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g== + dependencies: + websocket-driver ">=0.5.1" + +fbemitter@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/fbemitter/-/fbemitter-3.0.0.tgz#00b2a1af5411254aab416cd75f9e6289bee4bff3" + integrity sha512-KWKaceCwKQU0+HPoop6gn4eOHk50bBv/VxjJtGMfwmJt3D29JpN4H4eisCtIPA+a8GVBam+ldMMpMjJUvpDyHw== + dependencies: + fbjs "^3.0.0" + +fbjs-css-vars@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/fbjs-css-vars/-/fbjs-css-vars-1.0.2.tgz#216551136ae02fe255932c3ec8775f18e2c078b8" + integrity sha512-b2XGFAFdWZWg0phtAWLHCk836A1Xann+I+Dgd3Gk64MHKZO44FfoD1KxyvbSh0qZsIoXQGGlVztIY+oitJPpRQ== + +fbjs@^3.0.0, fbjs@^3.0.1: + version "3.0.5" + resolved "https://registry.yarnpkg.com/fbjs/-/fbjs-3.0.5.tgz#aa0edb7d5caa6340011790bd9249dbef8a81128d" + integrity sha512-ztsSx77JBtkuMrEypfhgc3cI0+0h+svqeie7xHbh1k/IKdcydnvadp/mUaGgjAOXQmQSxsqgaRhS3q9fy+1kxg== + dependencies: + cross-fetch "^3.1.5" + fbjs-css-vars "^1.0.0" + loose-envify "^1.0.0" + object-assign "^4.1.0" + promise "^7.1.1" + setimmediate "^1.0.5" + ua-parser-js "^1.0.35" + +feed@^4.2.2: + version "4.2.2" + resolved "https://registry.yarnpkg.com/feed/-/feed-4.2.2.tgz#865783ef6ed12579e2c44bbef3c9113bc4956a7e" + integrity sha512-u5/sxGfiMfZNtJ3OvQpXcvotFpYkL0n9u9mM2vkui2nGo8b4wvDkJ8gAkYqbA8QpGyFCv3RK0Z+Iv+9veCS9bQ== + dependencies: + xml-js "^1.6.11" + +file-loader@^6.2.0: + version "6.2.0" + resolved "https://registry.yarnpkg.com/file-loader/-/file-loader-6.2.0.tgz#baef7cf8e1840df325e4390b4484879480eebe4d" + integrity sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw== + dependencies: + loader-utils "^2.0.0" + schema-utils "^3.0.0" + +filesize@^8.0.6: + version "8.0.7" + resolved "https://registry.yarnpkg.com/filesize/-/filesize-8.0.7.tgz#695e70d80f4e47012c132d57a059e80c6b580bd8" + integrity sha512-pjmC+bkIF8XI7fWaH8KxHcZL3DPybs1roSKP4rKDvy20tAWwIObE4+JIseG2byfGKhud5ZnM4YSGKBz7Sh0ndQ== + +fill-range@^7.1.1: + version "7.1.1" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.1.1.tgz#44265d3cac07e3ea7dc247516380643754a05292" + integrity sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg== + dependencies: + to-regex-range "^5.0.1" + +finalhandler@1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.3.1.tgz#0c575f1d1d324ddd1da35ad7ece3df7d19088019" + integrity sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ== + dependencies: + debug "2.6.9" + encodeurl "~2.0.0" + escape-html "~1.0.3" + on-finished "2.4.1" + parseurl "~1.3.3" + statuses "2.0.1" + unpipe "~1.0.0" + +find-cache-dir@^3.3.1: + version "3.3.2" + resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-3.3.2.tgz#b30c5b6eff0730731aea9bbd9dbecbd80256d64b" + integrity sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig== + dependencies: + commondir "^1.0.1" + make-dir "^3.0.2" + pkg-dir "^4.1.0" + +find-cache-dir@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-4.0.0.tgz#a30ee0448f81a3990708f6453633c733e2f6eec2" + integrity sha512-9ZonPT4ZAK4a+1pUPVPZJapbi7O5qbbJPdYw/NOQWZZbVLdDTYM3A4R9z/DpAM08IDaFGsvPgiGZ82WEwUDWjg== + dependencies: + common-path-prefix "^3.0.0" + pkg-dir "^7.0.0" + +find-up@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73" + integrity sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg== + dependencies: + locate-path "^3.0.0" + +find-up@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" + integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== + dependencies: + locate-path "^5.0.0" + path-exists "^4.0.0" + +find-up@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" + integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== + dependencies: + locate-path "^6.0.0" + path-exists "^4.0.0" + +find-up@^6.3.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-6.3.0.tgz#2abab3d3280b2dc7ac10199ef324c4e002c8c790" + integrity sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw== + dependencies: + locate-path "^7.1.0" + path-exists "^5.0.0" + +flat@^5.0.2: + version "5.0.2" + resolved "https://registry.yarnpkg.com/flat/-/flat-5.0.2.tgz#8ca6fe332069ffa9d324c327198c598259ceb241" + integrity sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ== + +flux@^4.0.1: + version "4.0.4" + resolved "https://registry.yarnpkg.com/flux/-/flux-4.0.4.tgz#9661182ea81d161ee1a6a6af10d20485ef2ac572" + integrity sha512-NCj3XlayA2UsapRpM7va6wU1+9rE5FIL7qoMcmxWHRzbp0yujihMBm9BBHZ1MDIk5h5o2Bl6eGiCe8rYELAmYw== + dependencies: + fbemitter "^3.0.0" + fbjs "^3.0.1" + +follow-redirects@^1.0.0, follow-redirects@^1.14.7: + version "1.15.6" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.6.tgz#7f815c0cda4249c74ff09e95ef97c23b5fd0399b" + integrity sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA== + +foreach@^2.0.4: + version "2.0.6" + resolved "https://registry.yarnpkg.com/foreach/-/foreach-2.0.6.tgz#87bcc8a1a0e74000ff2bf9802110708cfb02eb6e" + integrity sha512-k6GAGDyqLe9JaebCsFCoudPPWfihKu8pylYXRlqP1J7ms39iPoTtk2fviNglIeQEwdh0bQeKJ01ZPyuyQvKzwg== + +fork-ts-checker-webpack-plugin@^6.5.0: + version "6.5.3" + resolved "https://registry.yarnpkg.com/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-6.5.3.tgz#eda2eff6e22476a2688d10661688c47f611b37f3" + integrity sha512-SbH/l9ikmMWycd5puHJKTkZJKddF4iRLyW3DeZ08HTI7NGyLS38MXd/KGgeWumQO7YNQbW2u/NtPT2YowbPaGQ== + dependencies: + "@babel/code-frame" "^7.8.3" + "@types/json-schema" "^7.0.5" + chalk "^4.1.0" + chokidar "^3.4.2" + cosmiconfig "^6.0.0" + deepmerge "^4.2.2" + fs-extra "^9.0.0" + glob "^7.1.6" + memfs "^3.1.2" + minimatch "^3.0.4" + schema-utils "2.7.0" + semver "^7.3.2" + tapable "^1.0.0" + +form-data-encoder@^2.1.2: + version "2.1.4" + resolved "https://registry.yarnpkg.com/form-data-encoder/-/form-data-encoder-2.1.4.tgz#261ea35d2a70d48d30ec7a9603130fa5515e9cd5" + integrity sha512-yDYSgNMraqvnxiEXO4hi88+YZxaHC6QKzb5N84iRCTDeRO7ZALpir/lVmf/uXUhnwUr2O4HU8s/n6x+yNjQkHw== + +format@^0.2.0: + version "0.2.2" + resolved "https://registry.yarnpkg.com/format/-/format-0.2.2.tgz#d6170107e9efdc4ed30c9dc39016df942b5cb58b" + integrity sha512-wzsgA6WOq+09wrU1tsJ09udeR/YZRaeArL9e1wPbFg3GG2yDnC2ldKpxs4xunpFF9DgqCqOIra3bc1HWrJ37Ww== + +forwarded@0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811" + integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow== + +fraction.js@^4.3.6: + version "4.3.7" + resolved "https://registry.yarnpkg.com/fraction.js/-/fraction.js-4.3.7.tgz#06ca0085157e42fda7f9e726e79fefc4068840f7" + integrity sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew== + +fresh@0.5.2: + version "0.5.2" + resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" + integrity sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q== + +fs-extra@^10.0.0, fs-extra@^10.1.0: + version "10.1.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-10.1.0.tgz#02873cfbc4084dde127eaa5f9905eef2325d1abf" + integrity sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ== + dependencies: + graceful-fs "^4.2.0" + jsonfile "^6.0.1" + universalify "^2.0.0" + +fs-extra@^11.1.1: + version "11.2.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-11.2.0.tgz#e70e17dfad64232287d01929399e0ea7c86b0e5b" + integrity sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw== + dependencies: + graceful-fs "^4.2.0" + jsonfile "^6.0.1" + universalify "^2.0.0" + +fs-extra@^9.0.0: + version "9.1.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-9.1.0.tgz#5954460c764a8da2094ba3554bf839e6b9a7c86d" + integrity sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ== + dependencies: + at-least-node "^1.0.0" + graceful-fs "^4.2.0" + jsonfile "^6.0.1" + universalify "^2.0.0" + +fs-monkey@^1.0.4: + version "1.0.5" + resolved "https://registry.yarnpkg.com/fs-monkey/-/fs-monkey-1.0.5.tgz#fe450175f0db0d7ea758102e1d84096acb925788" + integrity sha512-8uMbBjrhzW76TYgEV27Y5E//W2f/lTFmx78P2w19FZSxarhI/798APGQyuGCwmkNxgwGRhrLfvWyLBvNtuOmew== + +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== + +fsevents@~2.3.2: + version "2.3.3" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" + integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== + +function-bind@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c" + integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== + +gensync@^1.0.0-beta.1, gensync@^1.0.0-beta.2: + version "1.0.0-beta.2" + resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" + integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== + +get-caller-file@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" + integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== + +get-intrinsic@^1.1.3, get-intrinsic@^1.2.1, get-intrinsic@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.2.tgz#281b7622971123e1ef4b3c90fd7539306da93f3b" + integrity sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA== + dependencies: + function-bind "^1.1.2" + has-proto "^1.0.1" + has-symbols "^1.0.3" + hasown "^2.0.0" + +get-intrinsic@^1.2.4: + version "1.2.4" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.4.tgz#e385f5a4b5227d449c3eabbad05494ef0abbeadd" + integrity sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ== + dependencies: + es-errors "^1.3.0" + function-bind "^1.1.2" + has-proto "^1.0.1" + has-symbols "^1.0.3" + hasown "^2.0.0" + +get-own-enumerable-property-symbols@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz#b5fde77f22cbe35f390b4e089922c50bce6ef664" + integrity sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g== + +get-stream@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5" + integrity sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w== + dependencies: + pump "^3.0.0" + +get-stream@^5.1.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-5.2.0.tgz#4966a1795ee5ace65e706c4b7beb71257d6e22d3" + integrity sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA== + dependencies: + pump "^3.0.0" + +get-stream@^6.0.0, get-stream@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7" + integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== + +github-slugger@^1.4.0, github-slugger@^1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/github-slugger/-/github-slugger-1.5.0.tgz#17891bbc73232051474d68bd867a34625c955f7d" + integrity sha512-wIh+gKBI9Nshz2o46B0B3f5k/W+WI9ZAv6y5Dn5WJ5SK1t0TnDimB4WE5rmTD05ZAIn8HALCZVmCsvj0w0v0lw== + +glob-parent@^5.1.2, glob-parent@~5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" + integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== + dependencies: + is-glob "^4.0.1" + +glob-parent@^6.0.1: + version "6.0.2" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3" + integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== + dependencies: + is-glob "^4.0.3" + +glob-to-regexp@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz#c75297087c851b9a578bd217dd59a92f59fe546e" + integrity sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw== + +glob@^7.0.0, glob@^7.1.3, glob@^7.1.6: + version "7.2.3" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" + integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.1.1" + once "^1.3.0" + path-is-absolute "^1.0.0" + +global-dirs@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/global-dirs/-/global-dirs-3.0.1.tgz#0c488971f066baceda21447aecb1a8b911d22485" + integrity sha512-NBcGGFbBA9s1VzD41QXDG+3++t9Mn5t1FpLdhESY6oKY4gYTFpX4wO3sqGUa0Srjtbfj3szX0RnemmrVRUdULA== + dependencies: + ini "2.0.0" + +global-modules@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-2.0.0.tgz#997605ad2345f27f51539bea26574421215c7780" + integrity sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A== + dependencies: + global-prefix "^3.0.0" + +global-prefix@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/global-prefix/-/global-prefix-3.0.0.tgz#fc85f73064df69f50421f47f883fe5b913ba9b97" + integrity sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg== + dependencies: + ini "^1.3.5" + kind-of "^6.0.2" + which "^1.3.1" + +globals@^11.1.0: + version "11.12.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" + integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== + +globby@^11.0.1, globby@^11.0.4, globby@^11.1.0: + version "11.1.0" + resolved "https://registry.yarnpkg.com/globby/-/globby-11.1.0.tgz#bd4be98bb042f83d796f7e3811991fbe82a0d34b" + integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g== + dependencies: + array-union "^2.1.0" + dir-glob "^3.0.1" + fast-glob "^3.2.9" + ignore "^5.2.0" + merge2 "^1.4.1" + slash "^3.0.0" + +globby@^13.1.1: + version "13.2.2" + resolved "https://registry.yarnpkg.com/globby/-/globby-13.2.2.tgz#63b90b1bf68619c2135475cbd4e71e66aa090592" + integrity sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w== + dependencies: + dir-glob "^3.0.1" + fast-glob "^3.3.0" + ignore "^5.2.4" + merge2 "^1.4.1" + slash "^4.0.0" + +gopd@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.0.1.tgz#29ff76de69dac7489b7c0918a5788e56477c332c" + integrity sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA== + dependencies: + get-intrinsic "^1.1.3" + +got@^12.1.0: + version "12.6.1" + resolved "https://registry.yarnpkg.com/got/-/got-12.6.1.tgz#8869560d1383353204b5a9435f782df9c091f549" + integrity sha512-mThBblvlAF1d4O5oqyvN+ZxLAYwIJK7bpMxgYqPD9okW0C3qm5FFn7k811QrcuEBwaogR3ngOFoCfs6mRv7teQ== + dependencies: + "@sindresorhus/is" "^5.2.0" + "@szmarczak/http-timer" "^5.0.1" + cacheable-lookup "^7.0.0" + cacheable-request "^10.2.8" + decompress-response "^6.0.0" + form-data-encoder "^2.1.2" + get-stream "^6.0.1" + http2-wrapper "^2.1.10" + lowercase-keys "^3.0.0" + p-cancelable "^3.0.0" + responselike "^3.0.0" + +got@^9.6.0: + version "9.6.0" + resolved "https://registry.yarnpkg.com/got/-/got-9.6.0.tgz#edf45e7d67f99545705de1f7bbeeeb121765ed85" + integrity sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q== + dependencies: + "@sindresorhus/is" "^0.14.0" + "@szmarczak/http-timer" "^1.1.2" + cacheable-request "^6.0.0" + decompress-response "^3.3.0" + duplexer3 "^0.1.4" + get-stream "^4.1.0" + lowercase-keys "^1.0.1" + mimic-response "^1.0.1" + p-cancelable "^1.0.0" + to-readable-stream "^1.0.0" + url-parse-lax "^3.0.0" + +graceful-fs@4.2.10: + version "4.2.10" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.10.tgz#147d3a006da4ca3ce14728c7aefc287c367d7a6c" + integrity sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA== + +graceful-fs@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.11, graceful-fs@^4.2.4, graceful-fs@^4.2.6, graceful-fs@^4.2.9: + version "4.2.11" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" + integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== + +gray-matter@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/gray-matter/-/gray-matter-4.0.3.tgz#e893c064825de73ea1f5f7d88c7a9f7274288798" + integrity sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q== + dependencies: + js-yaml "^3.13.1" + kind-of "^6.0.2" + section-matter "^1.0.0" + strip-bom-string "^1.0.0" + +gzip-size@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/gzip-size/-/gzip-size-6.0.0.tgz#065367fd50c239c0671cbcbad5be3e2eeb10e462" + integrity sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q== + dependencies: + duplexer "^0.1.2" + +handle-thing@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/handle-thing/-/handle-thing-2.0.1.tgz#857f79ce359580c340d43081cc648970d0bb234e" + integrity sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg== + +has-flag@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" + integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw== + +has-flag@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" + integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== + +has-property-descriptors@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.1.tgz#52ba30b6c5ec87fd89fa574bc1c39125c6f65340" + integrity sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg== + dependencies: + get-intrinsic "^1.2.2" + +has-property-descriptors@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz#963ed7d071dc7bf5f084c5bfbe0d1b6222586854" + integrity sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg== + dependencies: + es-define-property "^1.0.0" + +has-proto@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/has-proto/-/has-proto-1.0.1.tgz#1885c1305538958aff469fef37937c22795408e0" + integrity sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg== + +has-symbols@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" + integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== + +has-yarn@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/has-yarn/-/has-yarn-2.1.0.tgz#137e11354a7b5bf11aa5cb649cf0c6f3ff2b2e77" + integrity sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw== + +has-yarn@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/has-yarn/-/has-yarn-3.0.0.tgz#c3c21e559730d1d3b57e28af1f30d06fac38147d" + integrity sha512-IrsVwUHhEULx3R8f/aA8AHuEzAorplsab/v8HBzEiIukwq5i/EC+xmOW+HfP1OaDP+2JkgT1yILHN2O3UFIbcA== + +hasown@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.0.tgz#f4c513d454a57b7c7e1650778de226b11700546c" + integrity sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA== + dependencies: + function-bind "^1.1.2" + +hast-to-hyperscript@^9.0.0: + version "9.0.1" + resolved "https://registry.yarnpkg.com/hast-to-hyperscript/-/hast-to-hyperscript-9.0.1.tgz#9b67fd188e4c81e8ad66f803855334173920218d" + integrity sha512-zQgLKqF+O2F72S1aa4y2ivxzSlko3MAvxkwG8ehGmNiqd98BIN3JM1rAJPmplEyLmGLO2QZYJtIneOSZ2YbJuA== + dependencies: + "@types/unist" "^2.0.3" + comma-separated-tokens "^1.0.0" + property-information "^5.3.0" + space-separated-tokens "^1.0.0" + style-to-object "^0.3.0" + unist-util-is "^4.0.0" + web-namespaces "^1.0.0" + +hast-util-from-parse5@^6.0.0: + version "6.0.1" + resolved "https://registry.yarnpkg.com/hast-util-from-parse5/-/hast-util-from-parse5-6.0.1.tgz#554e34abdeea25ac76f5bd950a1f0180e0b3bc2a" + integrity sha512-jeJUWiN5pSxW12Rh01smtVkZgZr33wBokLzKLwinYOUfSzm1Nl/c3GUGebDyOKjdsRgMvoVbV0VpAcpjF4NrJA== + dependencies: + "@types/parse5" "^5.0.0" + hastscript "^6.0.0" + property-information "^5.0.0" + vfile "^4.0.0" + vfile-location "^3.2.0" + web-namespaces "^1.0.0" + +hast-util-from-parse5@^8.0.0: + version "8.0.1" + resolved "https://registry.yarnpkg.com/hast-util-from-parse5/-/hast-util-from-parse5-8.0.1.tgz#654a5676a41211e14ee80d1b1758c399a0327651" + integrity sha512-Er/Iixbc7IEa7r/XLtuG52zoqn/b3Xng/w6aZQ0xGVxzhw5xUFxcRqdPzP6yFi/4HBYRaifaI5fQ1RH8n0ZeOQ== + dependencies: + "@types/hast" "^3.0.0" + "@types/unist" "^3.0.0" + devlop "^1.0.0" + hastscript "^8.0.0" + property-information "^6.0.0" + vfile "^6.0.0" + vfile-location "^5.0.0" + web-namespaces "^2.0.0" + +hast-util-parse-selector@^2.0.0: + version "2.2.5" + resolved "https://registry.yarnpkg.com/hast-util-parse-selector/-/hast-util-parse-selector-2.2.5.tgz#d57c23f4da16ae3c63b3b6ca4616683313499c3a" + integrity sha512-7j6mrk/qqkSehsM92wQjdIgWM2/BW61u/53G6xmC8i1OmEdKLHbk419QKQUjz6LglWsfqoiHmyMRkP1BGjecNQ== + +hast-util-parse-selector@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/hast-util-parse-selector/-/hast-util-parse-selector-4.0.0.tgz#352879fa86e25616036037dd8931fb5f34cb4a27" + integrity sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A== + dependencies: + "@types/hast" "^3.0.0" + +hast-util-raw@6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/hast-util-raw/-/hast-util-raw-6.0.1.tgz#973b15930b7529a7b66984c98148b46526885977" + integrity sha512-ZMuiYA+UF7BXBtsTBNcLBF5HzXzkyE6MLzJnL605LKE8GJylNjGc4jjxazAHUtcwT5/CEt6afRKViYB4X66dig== + dependencies: + "@types/hast" "^2.0.0" + hast-util-from-parse5 "^6.0.0" + hast-util-to-parse5 "^6.0.0" + html-void-elements "^1.0.0" + parse5 "^6.0.0" + unist-util-position "^3.0.0" + vfile "^4.0.0" + web-namespaces "^1.0.0" + xtend "^4.0.0" + zwitch "^1.0.0" + +hast-util-raw@^9.0.0: + version "9.0.1" + resolved "https://registry.yarnpkg.com/hast-util-raw/-/hast-util-raw-9.0.1.tgz#2ba8510e4ed2a1e541cde2a4ebb5c38ab4c82c2d" + integrity sha512-5m1gmba658Q+lO5uqL5YNGQWeh1MYWZbZmWrM5lncdcuiXuo5E2HT/CIOp0rLF8ksfSwiCVJ3twlgVRyTGThGA== + dependencies: + "@types/hast" "^3.0.0" + "@types/unist" "^3.0.0" + "@ungap/structured-clone" "^1.0.0" + hast-util-from-parse5 "^8.0.0" + hast-util-to-parse5 "^8.0.0" + html-void-elements "^3.0.0" + mdast-util-to-hast "^13.0.0" + parse5 "^7.0.0" + unist-util-position "^5.0.0" + unist-util-visit "^5.0.0" + vfile "^6.0.0" + web-namespaces "^2.0.0" + zwitch "^2.0.0" + +hast-util-to-estree@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/hast-util-to-estree/-/hast-util-to-estree-3.1.0.tgz#f2afe5e869ddf0cf690c75f9fc699f3180b51b19" + integrity sha512-lfX5g6hqVh9kjS/B9E2gSkvHH4SZNiQFiqWS0x9fENzEl+8W12RqdRxX6d/Cwxi30tPQs3bIO+aolQJNp1bIyw== + dependencies: + "@types/estree" "^1.0.0" + "@types/estree-jsx" "^1.0.0" + "@types/hast" "^3.0.0" + comma-separated-tokens "^2.0.0" + devlop "^1.0.0" + estree-util-attach-comments "^3.0.0" + estree-util-is-identifier-name "^3.0.0" + hast-util-whitespace "^3.0.0" + mdast-util-mdx-expression "^2.0.0" + mdast-util-mdx-jsx "^3.0.0" + mdast-util-mdxjs-esm "^2.0.0" + property-information "^6.0.0" + space-separated-tokens "^2.0.0" + style-to-object "^0.4.0" + unist-util-position "^5.0.0" + zwitch "^2.0.0" + +hast-util-to-jsx-runtime@^2.0.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/hast-util-to-jsx-runtime/-/hast-util-to-jsx-runtime-2.3.0.tgz#3ed27caf8dc175080117706bf7269404a0aa4f7c" + integrity sha512-H/y0+IWPdsLLS738P8tDnrQ8Z+dj12zQQ6WC11TIM21C8WFVoIxcqWXf2H3hiTVZjF1AWqoimGwrTWecWrnmRQ== + dependencies: + "@types/estree" "^1.0.0" + "@types/hast" "^3.0.0" + "@types/unist" "^3.0.0" + comma-separated-tokens "^2.0.0" + devlop "^1.0.0" + estree-util-is-identifier-name "^3.0.0" + hast-util-whitespace "^3.0.0" + mdast-util-mdx-expression "^2.0.0" + mdast-util-mdx-jsx "^3.0.0" + mdast-util-mdxjs-esm "^2.0.0" + property-information "^6.0.0" + space-separated-tokens "^2.0.0" + style-to-object "^1.0.0" + unist-util-position "^5.0.0" + vfile-message "^4.0.0" + +hast-util-to-parse5@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/hast-util-to-parse5/-/hast-util-to-parse5-6.0.0.tgz#1ec44650b631d72952066cea9b1445df699f8479" + integrity sha512-Lu5m6Lgm/fWuz8eWnrKezHtVY83JeRGaNQ2kn9aJgqaxvVkFCZQBEhgodZUDUvoodgyROHDb3r5IxAEdl6suJQ== + dependencies: + hast-to-hyperscript "^9.0.0" + property-information "^5.0.0" + web-namespaces "^1.0.0" + xtend "^4.0.0" + zwitch "^1.0.0" + +hast-util-to-parse5@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/hast-util-to-parse5/-/hast-util-to-parse5-8.0.0.tgz#477cd42d278d4f036bc2ea58586130f6f39ee6ed" + integrity sha512-3KKrV5ZVI8if87DVSi1vDeByYrkGzg4mEfeu4alwgmmIeARiBLKCZS2uw5Gb6nU9x9Yufyj3iudm6i7nl52PFw== + dependencies: + "@types/hast" "^3.0.0" + comma-separated-tokens "^2.0.0" + devlop "^1.0.0" + property-information "^6.0.0" + space-separated-tokens "^2.0.0" + web-namespaces "^2.0.0" + zwitch "^2.0.0" + +hast-util-whitespace@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/hast-util-whitespace/-/hast-util-whitespace-3.0.0.tgz#7778ed9d3c92dd9e8c5c8f648a49c21fc51cb621" + integrity sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw== + dependencies: + "@types/hast" "^3.0.0" + +hastscript@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/hastscript/-/hastscript-6.0.0.tgz#e8768d7eac56c3fdeac8a92830d58e811e5bf640" + integrity sha512-nDM6bvd7lIqDUiYEiu5Sl/+6ReP0BMk/2f4U/Rooccxkj0P5nm+acM5PrGJ/t5I8qPGiqZSE6hVAwZEdZIvP4w== + dependencies: + "@types/hast" "^2.0.0" + comma-separated-tokens "^1.0.0" + hast-util-parse-selector "^2.0.0" + property-information "^5.0.0" + space-separated-tokens "^1.0.0" + +hastscript@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/hastscript/-/hastscript-8.0.0.tgz#4ef795ec8dee867101b9f23cc830d4baf4fd781a" + integrity sha512-dMOtzCEd3ABUeSIISmrETiKuyydk1w0pa+gE/uormcTpSYuaNJPbX1NU3JLyscSLjwAQM8bWMhhIlnCqnRvDTw== + dependencies: + "@types/hast" "^3.0.0" + comma-separated-tokens "^2.0.0" + hast-util-parse-selector "^4.0.0" + property-information "^6.0.0" + space-separated-tokens "^2.0.0" + +he@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" + integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== + +history@^4.9.0: + version "4.10.1" + resolved "https://registry.yarnpkg.com/history/-/history-4.10.1.tgz#33371a65e3a83b267434e2b3f3b1b4c58aad4cf3" + integrity sha512-36nwAD620w12kuzPAsyINPWJqlNbij+hpK1k9XRloDtym8mxzGYl2c17LnV6IAGB2Dmg4tEa7G7DlawS0+qjew== + dependencies: + "@babel/runtime" "^7.1.2" + loose-envify "^1.2.0" + resolve-pathname "^3.0.0" + tiny-invariant "^1.0.2" + tiny-warning "^1.0.0" + value-equal "^1.0.1" + +hoist-non-react-statics@^3.1.0: + version "3.3.2" + resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz#ece0acaf71d62c2969c2ec59feff42a4b1a85b45" + integrity sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw== + dependencies: + react-is "^16.7.0" + +hpack.js@^2.1.6: + version "2.1.6" + resolved "https://registry.yarnpkg.com/hpack.js/-/hpack.js-2.1.6.tgz#87774c0949e513f42e84575b3c45681fade2a0b2" + integrity sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ== + dependencies: + inherits "^2.0.1" + obuf "^1.0.0" + readable-stream "^2.0.1" + wbuf "^1.1.0" + +html-entities@^2.3.2: + version "2.4.0" + resolved "https://registry.yarnpkg.com/html-entities/-/html-entities-2.4.0.tgz#edd0cee70402584c8c76cc2c0556db09d1f45061" + integrity sha512-igBTJcNNNhvZFRtm8uA6xMY6xYleeDwn3PeBCkDz7tHttv4F2hsDI2aPgNERWzvRcNYHNT3ymRaQzllmXj4YsQ== + +html-escaper@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/html-escaper/-/html-escaper-2.0.2.tgz#dfd60027da36a36dfcbe236262c00a5822681453" + integrity sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg== + +html-minifier-terser@^6.0.2, html-minifier-terser@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz#bfc818934cc07918f6b3669f5774ecdfd48f32ab" + integrity sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw== + dependencies: + camel-case "^4.1.2" + clean-css "^5.2.2" + commander "^8.3.0" + he "^1.2.0" + param-case "^3.0.4" + relateurl "^0.2.7" + terser "^5.10.0" + +html-minifier-terser@^7.2.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/html-minifier-terser/-/html-minifier-terser-7.2.0.tgz#18752e23a2f0ed4b0f550f217bb41693e975b942" + integrity sha512-tXgn3QfqPIpGl9o+K5tpcj3/MN4SfLtsx2GWwBC3SSd0tXQGyF3gsSqad8loJgKZGM3ZxbYDd5yhiBIdWpmvLA== + dependencies: + camel-case "^4.1.2" + clean-css "~5.3.2" + commander "^10.0.0" + entities "^4.4.0" + param-case "^3.0.4" + relateurl "^0.2.7" + terser "^5.15.1" + +html-tags@^3.2.0, html-tags@^3.3.1: + version "3.3.1" + resolved "https://registry.yarnpkg.com/html-tags/-/html-tags-3.3.1.tgz#a04026a18c882e4bba8a01a3d39cfe465d40b5ce" + integrity sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ== + +html-void-elements@^1.0.0: + version "1.0.5" + resolved "https://registry.yarnpkg.com/html-void-elements/-/html-void-elements-1.0.5.tgz#ce9159494e86d95e45795b166c2021c2cfca4483" + integrity sha512-uE/TxKuyNIcx44cIWnjr/rfIATDH7ZaOMmstu0CwhFG1Dunhlp4OC6/NMbhiwoq5BpW0ubi303qnEk/PZj614w== + +html-void-elements@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/html-void-elements/-/html-void-elements-3.0.0.tgz#fc9dbd84af9e747249034d4d62602def6517f1d7" + integrity sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg== + +html-webpack-plugin@^5.5.0, html-webpack-plugin@^5.5.3: + version "5.6.0" + resolved "https://registry.yarnpkg.com/html-webpack-plugin/-/html-webpack-plugin-5.6.0.tgz#50a8fa6709245608cb00e811eacecb8e0d7b7ea0" + integrity sha512-iwaY4wzbe48AfKLZ/Cc8k0L+FKG6oSNRaZ8x5A/T/IVDGyXcbHncM9TdDa93wn0FsSm82FhTKW7f3vS61thXAw== + dependencies: + "@types/html-minifier-terser" "^6.0.0" + html-minifier-terser "^6.0.2" + lodash "^4.17.21" + pretty-error "^4.0.0" + tapable "^2.0.0" + +htmlparser2@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-6.1.0.tgz#c4d762b6c3371a05dbe65e94ae43a9f845fb8fb7" + integrity sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A== + dependencies: + domelementtype "^2.0.1" + domhandler "^4.0.0" + domutils "^2.5.2" + entities "^2.0.0" + +htmlparser2@^8.0.1: + version "8.0.2" + resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-8.0.2.tgz#f002151705b383e62433b5cf466f5b716edaec21" + integrity sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA== + dependencies: + domelementtype "^2.3.0" + domhandler "^5.0.3" + domutils "^3.0.1" + entities "^4.4.0" + +htmlparser2@^9.1.0: + version "9.1.0" + resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-9.1.0.tgz#cdb498d8a75a51f739b61d3f718136c369bc8c23" + integrity sha512-5zfg6mHUoaer/97TxnGpxmbR7zJtPwIYFMZ/H5ucTlPZhKvtum05yiPK3Mgai3a0DyVxv7qYqoweaEd2nrYQzQ== + dependencies: + domelementtype "^2.3.0" + domhandler "^5.0.3" + domutils "^3.1.0" + entities "^4.5.0" + +http-cache-semantics@^4.0.0, http-cache-semantics@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz#abe02fcb2985460bf0323be664436ec3476a6d5a" + integrity sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ== + +http-deceiver@^1.2.7: + version "1.2.7" + resolved "https://registry.yarnpkg.com/http-deceiver/-/http-deceiver-1.2.7.tgz#fa7168944ab9a519d337cb0bec7284dc3e723d87" + integrity sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw== + +http-errors@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-2.0.0.tgz#b7774a1486ef73cf7667ac9ae0858c012c57b9d3" + integrity sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ== + dependencies: + depd "2.0.0" + inherits "2.0.4" + setprototypeof "1.2.0" + statuses "2.0.1" + toidentifier "1.0.1" + +http-errors@~1.6.2: + version "1.6.3" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.3.tgz#8b55680bb4be283a0b5bf4ea2e38580be1d9320d" + integrity sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A== + dependencies: + depd "~1.1.2" + inherits "2.0.3" + setprototypeof "1.1.0" + statuses ">= 1.4.0 < 2" + +http-parser-js@>=0.5.1: + version "0.5.8" + resolved "https://registry.yarnpkg.com/http-parser-js/-/http-parser-js-0.5.8.tgz#af23090d9ac4e24573de6f6aecc9d84a48bf20e3" + integrity sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q== + +http-proxy-middleware@^2.0.3: + version "2.0.7" + resolved "https://registry.yarnpkg.com/http-proxy-middleware/-/http-proxy-middleware-2.0.7.tgz#915f236d92ae98ef48278a95dedf17e991936ec6" + integrity sha512-fgVY8AV7qU7z/MmXJ/rxwbrtQH4jBQ9m7kp3llF0liB7glmFeVZFBepQb32T3y8n8k2+AEYuMPCpinYW+/CuRA== + dependencies: + "@types/http-proxy" "^1.17.8" + http-proxy "^1.18.1" + is-glob "^4.0.1" + is-plain-obj "^3.0.0" + micromatch "^4.0.2" + +http-proxy@^1.18.1: + version "1.18.1" + resolved "https://registry.yarnpkg.com/http-proxy/-/http-proxy-1.18.1.tgz#401541f0534884bbf95260334e72f88ee3976549" + integrity sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ== + dependencies: + eventemitter3 "^4.0.0" + follow-redirects "^1.0.0" + requires-port "^1.0.0" + +http2-client@^1.2.5: + version "1.3.5" + resolved "https://registry.yarnpkg.com/http2-client/-/http2-client-1.3.5.tgz#20c9dc909e3cc98284dd20af2432c524086df181" + integrity sha512-EC2utToWl4RKfs5zd36Mxq7nzHHBuomZboI0yYL6Y0RmBgT7Sgkq4rQ0ezFTYoIsSs7Tm9SJe+o2FcAg6GBhGA== + +http2-wrapper@^2.1.10: + version "2.2.1" + resolved "https://registry.yarnpkg.com/http2-wrapper/-/http2-wrapper-2.2.1.tgz#310968153dcdedb160d8b72114363ef5fce1f64a" + integrity sha512-V5nVw1PAOgfI3Lmeaj2Exmeg7fenjhRUgz1lPSezy1CuhPYbgQtbQj4jZfEAEMlaL+vupsvhjqCyjzob0yxsmQ== + dependencies: + quick-lru "^5.1.1" + resolve-alpn "^1.2.0" + +human-signals@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0" + integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== + +iconv-lite@0.4.24: + version "0.4.24" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" + integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== + dependencies: + safer-buffer ">= 2.1.2 < 3" + +iconv-lite@0.6.3, 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== + dependencies: + safer-buffer ">= 2.1.2 < 3.0.0" + +icss-utils@^5.0.0, icss-utils@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/icss-utils/-/icss-utils-5.1.0.tgz#c6be6858abd013d768e98366ae47e25d5887b1ae" + integrity sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA== + +ignore@^5.2.0, ignore@^5.2.4: + version "5.3.0" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.0.tgz#67418ae40d34d6999c95ff56016759c718c82f78" + integrity sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg== + +image-size@^1.0.1, image-size@^1.0.2: + version "1.1.1" + resolved "https://registry.yarnpkg.com/image-size/-/image-size-1.1.1.tgz#ddd67d4dc340e52ac29ce5f546a09f4e29e840ac" + integrity sha512-541xKlUw6jr/6gGuk92F+mYM5zaFAc5ahphvkqvNe2bQ6gVBkd6bfrmVJ2t4KDAfikAYZyIqTnktX3i6/aQDrQ== + dependencies: + queue "6.0.2" + +immediate@^3.2.3: + version "3.3.0" + resolved "https://registry.yarnpkg.com/immediate/-/immediate-3.3.0.tgz#1aef225517836bcdf7f2a2de2600c79ff0269266" + integrity sha512-HR7EVodfFUdQCTIeySw+WDRFJlPcLOJbXfwwZ7Oom6tjsvZ3bOkCDJHehQC3nxJrv7+f9XecwazynjU8e4Vw3Q== + +immer@^9.0.7: + version "9.0.21" + resolved "https://registry.yarnpkg.com/immer/-/immer-9.0.21.tgz#1e025ea31a40f24fb064f1fef23e931496330176" + integrity sha512-bc4NBHqOqSfRW7POMkHd51LvClaeMXpm8dx0e8oE2GORbq5aRK7Bxl4FyzVLdGtLmvLKL7BTDBG5ACQm4HWjTA== + +import-fresh@^3.1.0, import-fresh@^3.2.1, import-fresh@^3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" + integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== + dependencies: + parent-module "^1.0.0" + resolve-from "^4.0.0" + +import-lazy@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/import-lazy/-/import-lazy-2.1.0.tgz#05698e3d45c88e8d7e9d92cb0584e77f096f3e43" + integrity sha512-m7ZEHgtw69qOGw+jwxXkHlrlIPdTGkyh66zXZ1ajZbxkDBNjSY/LGbmjc7h0s2ELsUDTAhFr55TrPSSqJGPG0A== + +import-lazy@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/import-lazy/-/import-lazy-4.0.0.tgz#e8eb627483a0a43da3c03f3e35548be5cb0cc153" + integrity sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw== + +imurmurhash@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" + integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== + +indent-string@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251" + integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== + +infima@0.2.0-alpha.43: + version "0.2.0-alpha.43" + resolved "https://registry.yarnpkg.com/infima/-/infima-0.2.0-alpha.43.tgz#f7aa1d7b30b6c08afef441c726bac6150228cbe0" + integrity sha512-2uw57LvUqW0rK/SWYnd/2rRfxNA5DDNOh33jxF7fy46VWoNhGxiUQyVZHbBMjQ33mQem0cjdDVwgWVAmlRfgyQ== + +inflight@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== + dependencies: + once "^1.3.0" + wrappy "1" + +inherits@2, inherits@2.0.4, inherits@^2.0.0, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.3: + version "2.0.4" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== + +inherits@2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" + integrity sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw== + +ini@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ini/-/ini-2.0.0.tgz#e5fd556ecdd5726be978fa1001862eacb0a94bc5" + integrity sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA== + +ini@^1.3.4, ini@^1.3.5, ini@~1.3.0: + version "1.3.8" + resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" + integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== + +inline-style-parser@0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/inline-style-parser/-/inline-style-parser-0.1.1.tgz#ec8a3b429274e9c0a1f1c4ffa9453a7fef72cea1" + integrity sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q== + +inline-style-parser@0.2.2: + version "0.2.2" + resolved "https://registry.yarnpkg.com/inline-style-parser/-/inline-style-parser-0.2.2.tgz#d498b4e6de0373458fc610ff793f6b14ebf45633" + integrity sha512-EcKzdTHVe8wFVOGEYXiW9WmJXPjqi1T+234YpJr98RiFYKHV3cdy1+3mkTE+KHTHxFFLH51SfaGOoUdW+v7ViQ== + +interpret@^1.0.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.4.0.tgz#665ab8bc4da27a774a40584e812e3e0fa45b1a1e" + integrity sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA== + +invariant@^2.2.4: + version "2.2.4" + resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6" + integrity sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA== + dependencies: + loose-envify "^1.0.0" + +ipaddr.js@1.9.1: + version "1.9.1" + resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" + integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== + +ipaddr.js@^2.0.1: + version "2.1.0" + resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-2.1.0.tgz#2119bc447ff8c257753b196fc5f1ce08a4cdf39f" + integrity sha512-LlbxQ7xKzfBusov6UMi4MFpEg0m+mAm9xyNGEduwXMEDuf4WfzB/RZwMVYEd7IKGvh4IUkEXYxtAVu9T3OelJQ== + +is-alphabetical@1.0.4, is-alphabetical@^1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-alphabetical/-/is-alphabetical-1.0.4.tgz#9e7d6b94916be22153745d184c298cbf986a686d" + integrity sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg== + +is-alphabetical@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-alphabetical/-/is-alphabetical-2.0.1.tgz#01072053ea7c1036df3c7d19a6daaec7f19e789b" + integrity sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ== + +is-alphanumerical@^1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-alphanumerical/-/is-alphanumerical-1.0.4.tgz#7eb9a2431f855f6b1ef1a78e326df515696c4dbf" + integrity sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A== + dependencies: + is-alphabetical "^1.0.0" + is-decimal "^1.0.0" + +is-alphanumerical@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-alphanumerical/-/is-alphanumerical-2.0.1.tgz#7c03fbe96e3e931113e57f964b0a368cc2dfd875" + integrity sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw== + dependencies: + is-alphabetical "^2.0.0" + is-decimal "^2.0.0" + +is-arrayish@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" + integrity sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg== + +is-binary-path@~2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" + integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== + dependencies: + binary-extensions "^2.0.0" + +is-buffer@^2.0.0: + version "2.0.5" + resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-2.0.5.tgz#ebc252e400d22ff8d77fa09888821a24a658c191" + integrity sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ== + +is-ci@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-2.0.0.tgz#6bc6334181810e04b5c22b3d589fdca55026404c" + integrity sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w== + dependencies: + ci-info "^2.0.0" + +is-ci@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-3.0.1.tgz#db6ecbed1bd659c43dac0f45661e7674103d1867" + integrity sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ== + dependencies: + ci-info "^3.2.0" + +is-core-module@^2.13.0: + version "2.13.1" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.13.1.tgz#ad0d7532c6fea9da1ebdc82742d74525c6273384" + integrity sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw== + dependencies: + hasown "^2.0.0" + +is-decimal@^1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-decimal/-/is-decimal-1.0.4.tgz#65a3a5958a1c5b63a706e1b333d7cd9f630d3fa5" + integrity sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw== + +is-decimal@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-decimal/-/is-decimal-2.0.1.tgz#9469d2dc190d0214fd87d78b78caecc0cc14eef7" + integrity sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A== + +is-docker@^2.0.0, is-docker@^2.1.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-2.2.1.tgz#33eeabe23cfe86f14bde4408a02c0cfb853acdaa" + integrity sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ== + +is-extendable@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" + integrity sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw== + +is-extglob@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" + integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== + +is-fullwidth-code-point@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" + integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== + +is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: + version "4.0.3" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" + integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== + dependencies: + is-extglob "^2.1.1" + +is-hexadecimal@^1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-hexadecimal/-/is-hexadecimal-1.0.4.tgz#cc35c97588da4bd49a8eedd6bc4082d44dcb23a7" + integrity sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw== + +is-hexadecimal@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-hexadecimal/-/is-hexadecimal-2.0.1.tgz#86b5bf668fca307498d319dfc03289d781a90027" + integrity sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg== + +is-installed-globally@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/is-installed-globally/-/is-installed-globally-0.4.0.tgz#9a0fd407949c30f86eb6959ef1b7994ed0b7b520" + integrity sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ== + dependencies: + global-dirs "^3.0.0" + is-path-inside "^3.0.2" + +is-npm@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/is-npm/-/is-npm-5.0.0.tgz#43e8d65cc56e1b67f8d47262cf667099193f45a8" + integrity sha512-WW/rQLOazUq+ST/bCAVBp/2oMERWLsR7OrKyt052dNDk4DHcDE0/7QSXITlmi+VBcV13DfIbysG3tZJm5RfdBA== + +is-npm@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/is-npm/-/is-npm-6.0.0.tgz#b59e75e8915543ca5d881ecff864077cba095261" + integrity sha512-JEjxbSmtPSt1c8XTkVrlujcXdKV1/tvuQ7GwKcAlyiVLeYFQ2VHat8xfrDJsIkhCdF/tZ7CiIR3sy141c6+gPQ== + +is-number@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" + integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== + +is-obj@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f" + integrity sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg== + +is-obj@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-2.0.0.tgz#473fb05d973705e3fd9620545018ca8e22ef4982" + integrity sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w== + +is-path-cwd@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-2.2.0.tgz#67d43b82664a7b5191fd9119127eb300048a9fdb" + integrity sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ== + +is-path-inside@^3.0.2: + version "3.0.3" + resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283" + integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== + +is-plain-obj@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-2.1.0.tgz#45e42e37fccf1f40da8e5f76ee21515840c09287" + integrity sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA== + +is-plain-obj@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-3.0.0.tgz#af6f2ea14ac5a646183a5bbdb5baabbc156ad9d7" + integrity sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA== + +is-plain-obj@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-4.1.0.tgz#d65025edec3657ce032fd7db63c97883eaed71f0" + integrity sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg== + +is-plain-object@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" + integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== + dependencies: + isobject "^3.0.1" + +is-plain-object@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-5.0.0.tgz#4427f50ab3429e9025ea7d52e9043a9ef4159344" + integrity sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q== + +is-reference@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/is-reference/-/is-reference-3.0.2.tgz#154747a01f45cd962404ee89d43837af2cba247c" + integrity sha512-v3rht/LgVcsdZa3O2Nqs+NMowLOxeOm7Ay9+/ARQ2F+qEoANRcqrjAZKGN0v8ymUetZGgkp26LTnGT7H0Qo9Pg== + dependencies: + "@types/estree" "*" + +is-regexp@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-regexp/-/is-regexp-1.0.0.tgz#fd2d883545c46bac5a633e7b9a09e87fa2cb5069" + integrity sha512-7zjFAPO4/gwyQAAgRRmqeEeyIICSdmCqa3tsVHMdBzaXXRiqopZL4Cyghg/XulGWrtABTpbnYYzzIRffLkP4oA== + +is-root@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-root/-/is-root-2.1.0.tgz#809e18129cf1129644302a4f8544035d51984a9c" + integrity sha512-AGOriNp96vNBd3HtU+RzFEc75FfR5ymiYv8E553I71SCeXBiMsVDUtdio1OEFvrPyLIQ9tVR5RxXIFe5PUFjMg== + +is-stream@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" + integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== + +is-typedarray@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" + integrity sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA== + +is-whitespace-character@^1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-whitespace-character/-/is-whitespace-character-1.0.4.tgz#0858edd94a95594c7c9dd0b5c174ec6e45ee4aa7" + integrity sha512-SDweEzfIZM0SJV0EUga669UTKlmL0Pq8Lno0QDQsPnvECB3IM2aP0gdx5TrU0A01MAPfViaZiI2V1QMZLaKK5w== + +is-word-character@^1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-word-character/-/is-word-character-1.0.4.tgz#ce0e73216f98599060592f62ff31354ddbeb0230" + integrity sha512-5SMO8RVennx3nZrqtKwCGyyetPE9VDba5ugvKLaD4KopPG5kR4mQ7tNt/r7feL5yt5h3lpuBbIUmCOG2eSzXHA== + +is-wsl@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-2.2.0.tgz#74a4c76e77ca9fd3f932f290c17ea326cd157271" + integrity sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww== + dependencies: + is-docker "^2.0.0" + +is-yarn-global@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/is-yarn-global/-/is-yarn-global-0.3.0.tgz#d502d3382590ea3004893746754c89139973e232" + integrity sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw== + +is-yarn-global@^0.4.0: + version "0.4.1" + resolved "https://registry.yarnpkg.com/is-yarn-global/-/is-yarn-global-0.4.1.tgz#b312d902b313f81e4eaf98b6361ba2b45cd694bb" + integrity sha512-/kppl+R+LO5VmhYSEWARUFjodS25D68gvj8W7z0I7OWhUla5xWu8KL6CtB2V0R6yqhnRgbcaREMr4EEM6htLPQ== + +isarray@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" + integrity sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ== + +isarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" + integrity sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ== + +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== + +isobject@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" + integrity sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg== + +jest-util@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-29.7.0.tgz#23c2b62bfb22be82b44de98055802ff3710fc0bc" + integrity sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA== + dependencies: + "@jest/types" "^29.6.3" + "@types/node" "*" + chalk "^4.0.0" + ci-info "^3.2.0" + graceful-fs "^4.2.9" + picomatch "^2.2.3" + +jest-worker@^27.4.5: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-27.5.1.tgz#8d146f0900e8973b106b6f73cc1e9a8cb86f8db0" + integrity sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg== + dependencies: + "@types/node" "*" + merge-stream "^2.0.0" + supports-color "^8.0.0" + +jest-worker@^29.1.2: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-29.7.0.tgz#acad073acbbaeb7262bd5389e1bcf43e10058d4a" + integrity sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw== + dependencies: + "@types/node" "*" + jest-util "^29.7.0" + merge-stream "^2.0.0" + supports-color "^8.0.0" + +jiti@^1.20.0: + version "1.21.0" + resolved "https://registry.yarnpkg.com/jiti/-/jiti-1.21.0.tgz#7c97f8fe045724e136a397f7340475244156105d" + integrity sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q== + +joi@^17.6.0, joi@^17.9.2: + version "17.11.0" + resolved "https://registry.yarnpkg.com/joi/-/joi-17.11.0.tgz#aa9da753578ec7720e6f0ca2c7046996ed04fc1a" + integrity sha512-NgB+lZLNoqISVy1rZocE9PZI36bL/77ie924Ri43yEvi9GUUMPeyVIr8KdFTMUlby1p0PBYMk9spIxEUQYqrJQ== + dependencies: + "@hapi/hoek" "^9.0.0" + "@hapi/topo" "^5.0.0" + "@sideway/address" "^4.1.3" + "@sideway/formula" "^3.0.1" + "@sideway/pinpoint" "^2.0.0" + +js-levenshtein@^1.1.6: + version "1.1.6" + resolved "https://registry.yarnpkg.com/js-levenshtein/-/js-levenshtein-1.1.6.tgz#c6cee58eb3550372df8deb85fad5ce66ce01d59d" + integrity sha512-X2BB11YZtrRqY4EnQcLX5Rh373zbK4alC1FW7D7MBhL2gtcC17cTnr6DmfHZeS0s2rTHjUTMMHfG7gO8SSdw+g== + +"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" + integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== + +js-yaml@^3.13.1: + version "3.14.1" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537" + integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== + dependencies: + argparse "^1.0.7" + esprima "^4.0.0" + +js-yaml@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" + integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== + dependencies: + argparse "^2.0.1" + +jsesc@^2.5.1: + version "2.5.2" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" + integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== + +jsesc@~0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" + integrity sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA== + +json-buffer@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.0.tgz#5b1f397afc75d677bde8bcfc0e47e1f9a3d9a898" + integrity sha512-CuUqjv0FUZIdXkHPI8MezCnFCdaTAacej1TZYulLoAg1h/PhwkdXFN4V/gzY4g+fMBCOV2xF+rp7t2XD2ns/NQ== + +json-buffer@3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.1.tgz#9338802a30d3b6605fbe0613e094008ca8c05a13" + integrity sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ== + +json-parse-even-better-errors@^2.3.0, json-parse-even-better-errors@^2.3.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" + integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== + +json-pointer@0.6.2, json-pointer@^0.6.2: + version "0.6.2" + resolved "https://registry.yarnpkg.com/json-pointer/-/json-pointer-0.6.2.tgz#f97bd7550be5e9ea901f8c9264c9d436a22a93cd" + integrity sha512-vLWcKbOaXlO+jvRy4qNd+TI1QUPZzfJj1tpJ3vAXDych5XJf93ftpUKe5pKCrzyIIwgBJcOcCVRUfqQP25afBw== + dependencies: + foreach "^2.0.4" + +json-schema-traverse@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" + integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== + +json-schema-traverse@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz#ae7bcb3656ab77a73ba5c49bf654f38e6b6860e2" + integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug== + +json5@^2.1.2, json5@^2.2.3: + version "2.2.3" + resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283" + integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== + +jsonfile@^6.0.1: + version "6.1.0" + resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.1.0.tgz#bc55b2634793c679ec6403094eb13698a6ec0aae" + integrity sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ== + dependencies: + universalify "^2.0.0" + optionalDependencies: + graceful-fs "^4.1.6" + +keyv@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/keyv/-/keyv-3.1.0.tgz#ecc228486f69991e49e9476485a5be1e8fc5c4d9" + integrity sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA== + dependencies: + json-buffer "3.0.0" + +keyv@^4.5.3: + version "4.5.4" + resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.5.4.tgz#a879a99e29452f942439f2a405e3af8b31d4de93" + integrity sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw== + dependencies: + json-buffer "3.0.1" + +kind-of@^6.0.0, kind-of@^6.0.2: + version "6.0.3" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" + integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== + +klaw-sync@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/klaw-sync/-/klaw-sync-6.0.0.tgz#1fd2cfd56ebb6250181114f0a581167099c2b28c" + integrity sha512-nIeuVSzdCCs6TDPTqI8w1Yre34sSq7AkZ4B3sfOBbI2CgVSB4Du4aLQijFU2+lhAFCwt9+42Hel6lQNIv6AntQ== + dependencies: + graceful-fs "^4.1.11" + +kleur@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/kleur/-/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e" + integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w== + +latest-version@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/latest-version/-/latest-version-5.1.0.tgz#119dfe908fe38d15dfa43ecd13fa12ec8832face" + integrity sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA== + dependencies: + package-json "^6.3.0" + +latest-version@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/latest-version/-/latest-version-7.0.0.tgz#843201591ea81a4d404932eeb61240fe04e9e5da" + integrity sha512-KvNT4XqAMzdcL6ka6Tl3i2lYeFDgXNCuIX+xNx6ZMVR1dFq+idXd9FLKNMOIx0t9mJ9/HudyX4oZWXZQ0UJHeg== + dependencies: + package-json "^8.1.0" + +launch-editor@^2.6.0: + version "2.6.1" + resolved "https://registry.yarnpkg.com/launch-editor/-/launch-editor-2.6.1.tgz#f259c9ef95cbc9425620bbbd14b468fcdb4ffe3c" + integrity sha512-eB/uXmFVpY4zezmGp5XtU21kwo7GBbKB+EQ+UZeWtGb9yAM5xt/Evk+lYH3eRNAtId+ej4u7TYPFZ07w4s7rRw== + dependencies: + picocolors "^1.0.0" + shell-quote "^1.8.1" + +leven@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/leven/-/leven-3.1.0.tgz#77891de834064cccba82ae7842bb6b14a13ed7f2" + integrity sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A== + +lilconfig@^2.0.3: + version "2.1.0" + resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-2.1.0.tgz#78e23ac89ebb7e1bfbf25b18043de756548e7f52" + integrity sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ== + +lines-and-columns@^1.1.6: + version "1.2.4" + resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632" + integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== + +loader-runner@^4.2.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-4.3.0.tgz#c1b4a163b99f614830353b16755e7149ac2314e1" + integrity sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg== + +loader-utils@^2.0.0: + version "2.0.4" + resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-2.0.4.tgz#8b5cb38b5c34a9a018ee1fc0e6a066d1dfcc528c" + integrity sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw== + dependencies: + big.js "^5.2.2" + emojis-list "^3.0.0" + json5 "^2.1.2" + +loader-utils@^3.2.0: + version "3.2.1" + resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-3.2.1.tgz#4fb104b599daafd82ef3e1a41fb9265f87e1f576" + integrity sha512-ZvFw1KWS3GVyYBYb7qkmRM/WwL2TQQBxgCK62rlvm4WpVQ23Nb4tYjApUlfjrEGvOs7KHEsmyUn75OHZrJMWPw== + +locate-path@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e" + integrity sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A== + dependencies: + p-locate "^3.0.0" + path-exists "^3.0.0" + +locate-path@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" + integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== + dependencies: + p-locate "^4.1.0" + +locate-path@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" + integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== + dependencies: + p-locate "^5.0.0" + +locate-path@^7.1.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-7.2.0.tgz#69cb1779bd90b35ab1e771e1f2f89a202c2a8a8a" + integrity sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA== + dependencies: + p-locate "^6.0.0" + +lodash.curry@^4.0.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/lodash.curry/-/lodash.curry-4.1.1.tgz#248e36072ede906501d75966200a86dab8b23170" + integrity sha512-/u14pXGviLaweY5JI0IUzgzF2J6Ne8INyzAZjImcryjgkZ+ebruBxy2/JaOOkTqScddcYtakjhSaeemV8lR0tA== + +lodash.debounce@^4.0.8: + version "4.0.8" + resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" + integrity sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow== + +lodash.flow@^3.3.0: + version "3.5.0" + resolved "https://registry.yarnpkg.com/lodash.flow/-/lodash.flow-3.5.0.tgz#87bf40292b8cf83e4e8ce1a3ae4209e20071675a" + integrity sha512-ff3BX/tSioo+XojX4MOsOMhJw0nZoUEF011LX8g8d3gvjVbxd89cCio4BCXronjxcTUIJUoqKEUA+n4CqvvRPw== + +lodash.isequal@^4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.isequal/-/lodash.isequal-4.5.0.tgz#415c4478f2bcc30120c22ce10ed3226f7d3e18e0" + integrity sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ== + +lodash.memoize@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe" + integrity sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag== + +lodash.uniq@4.5.0, lodash.uniq@^4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" + integrity sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ== + +lodash@^4.17.19, lodash@^4.17.20, lodash@^4.17.21: + version "4.17.21" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" + integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== + +longest-streak@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/longest-streak/-/longest-streak-3.1.0.tgz#62fa67cd958742a1574af9f39866364102d90cd4" + integrity sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g== + +loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.2.0, loose-envify@^1.3.1, loose-envify@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" + integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== + dependencies: + js-tokens "^3.0.0 || ^4.0.0" + +lower-case@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/lower-case/-/lower-case-2.0.2.tgz#6fa237c63dbdc4a82ca0fd882e4722dc5e634e28" + integrity sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg== + dependencies: + tslib "^2.0.3" + +lowercase-keys@^1.0.0, lowercase-keys@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.1.tgz#6f9e30b47084d971a7c820ff15a6c5167b74c26f" + integrity sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA== + +lowercase-keys@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-2.0.0.tgz#2603e78b7b4b0006cbca2fbcc8a3202558ac9479" + integrity sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA== + +lowercase-keys@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-3.0.0.tgz#c5e7d442e37ead247ae9db117a9d0a467c89d4f2" + integrity sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ== + +lru-cache@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" + integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== + dependencies: + yallist "^3.0.2" + +lru-cache@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" + integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== + dependencies: + yallist "^4.0.0" + +lunr-languages@^1.4.0: + version "1.14.0" + resolved "https://registry.yarnpkg.com/lunr-languages/-/lunr-languages-1.14.0.tgz#6e97635f434631729dd0e5654daedd291cd6f2d0" + integrity sha512-hWUAb2KqM3L7J5bcrngszzISY4BxrXn/Xhbb9TTCJYEGqlR1nG67/M14sp09+PTIRklobrn57IAxcdcO/ZFyNA== + +lunr@^2.3.9: + version "2.3.9" + resolved "https://registry.yarnpkg.com/lunr/-/lunr-2.3.9.tgz#18b123142832337dd6e964df1a5a7707b25d35e1" + integrity sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow== + +make-dir@^3.0.0, make-dir@^3.0.2, make-dir@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f" + integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw== + dependencies: + semver "^6.0.0" + +mark.js@^8.11.1: + version "8.11.1" + resolved "https://registry.yarnpkg.com/mark.js/-/mark.js-8.11.1.tgz#180f1f9ebef8b0e638e4166ad52db879beb2ffc5" + integrity sha512-1I+1qpDt4idfgLQG+BNWmrqku+7/2bi5nLf4YwF8y8zXvmfiTBY3PV3ZibfrjBueCByROpuBjLLFCajqkgYoLQ== + +markdown-escapes@^1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/markdown-escapes/-/markdown-escapes-1.0.4.tgz#c95415ef451499d7602b91095f3c8e8975f78535" + integrity sha512-8z4efJYk43E0upd0NbVXwgSTQs6cT3T06etieCMEg7dRbzCbxUCK/GHlX8mhHRDcp+OLlHkPKsvqQTCvsRl2cg== + +markdown-extensions@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/markdown-extensions/-/markdown-extensions-2.0.0.tgz#34bebc83e9938cae16e0e017e4a9814a8330d3c4" + integrity sha512-o5vL7aDWatOTX8LzaS1WMoaoxIiLRQJuIKKe2wAw6IeULDHaqbiqiggmx+pKvZDb1Sj+pE46Sn1T7lCqfFtg1Q== + +markdown-table@^3.0.0: + version "3.0.3" + resolved "https://registry.yarnpkg.com/markdown-table/-/markdown-table-3.0.3.tgz#e6331d30e493127e031dd385488b5bd326e4a6bd" + integrity sha512-Z1NL3Tb1M9wH4XESsCDEksWoKTdlUafKc4pt0GRwjUyXaCFZ+dc3g2erqB6zm3szA2IUSi7VnPI+o/9jnxh9hw== + +marked@^4.0.15: + version "4.3.0" + resolved "https://registry.yarnpkg.com/marked/-/marked-4.3.0.tgz#796362821b019f734054582038b116481b456cf3" + integrity sha512-PRsaiG84bK+AMvxziE/lCFss8juXjNaWzVbN5tXAm4XjeaS9NAHhop+PjQxz2A9h8Q4M/xGmzP8vqNwy6JeK0A== + +mdast-squeeze-paragraphs@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/mdast-squeeze-paragraphs/-/mdast-squeeze-paragraphs-4.0.0.tgz#7c4c114679c3bee27ef10b58e2e015be79f1ef97" + integrity sha512-zxdPn69hkQ1rm4J+2Cs2j6wDEv7O17TfXTJ33tl/+JPIoEmtV9t2ZzBM5LPHE8QlHsmVD8t3vPKCyY3oH+H8MQ== + dependencies: + unist-util-remove "^2.0.0" + +mdast-util-definitions@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/mdast-util-definitions/-/mdast-util-definitions-4.0.0.tgz#c5c1a84db799173b4dcf7643cda999e440c24db2" + integrity sha512-k8AJ6aNnUkB7IE+5azR9h81O5EQ/cTDXtWdMq9Kk5KcEW/8ritU5CeLg/9HhOC++nALHBlaogJ5jz0Ybk3kPMQ== + dependencies: + unist-util-visit "^2.0.0" + +mdast-util-directive@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/mdast-util-directive/-/mdast-util-directive-3.0.0.tgz#3fb1764e705bbdf0afb0d3f889e4404c3e82561f" + integrity sha512-JUpYOqKI4mM3sZcNxmF/ox04XYFFkNwr0CFlrQIkCwbvH0xzMCqkMqAde9wRd80VAhaUrwFwKm2nxretdT1h7Q== + dependencies: + "@types/mdast" "^4.0.0" + "@types/unist" "^3.0.0" + devlop "^1.0.0" + mdast-util-from-markdown "^2.0.0" + mdast-util-to-markdown "^2.0.0" + parse-entities "^4.0.0" + stringify-entities "^4.0.0" + unist-util-visit-parents "^6.0.0" + +mdast-util-find-and-replace@^3.0.0, mdast-util-find-and-replace@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/mdast-util-find-and-replace/-/mdast-util-find-and-replace-3.0.1.tgz#a6fc7b62f0994e973490e45262e4bc07607b04e0" + integrity sha512-SG21kZHGC3XRTSUhtofZkBzZTJNM5ecCi0SK2IMKmSXR8vO3peL+kb1O0z7Zl83jKtutG4k5Wv/W7V3/YHvzPA== + dependencies: + "@types/mdast" "^4.0.0" + escape-string-regexp "^5.0.0" + unist-util-is "^6.0.0" + unist-util-visit-parents "^6.0.0" + +mdast-util-from-markdown@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.0.tgz#52f14815ec291ed061f2922fd14d6689c810cb88" + integrity sha512-n7MTOr/z+8NAX/wmhhDji8O3bRvPTV/U0oTCaZJkjhPSKTPhS3xufVhKGF8s1pJ7Ox4QgoIU7KHseh09S+9rTA== + dependencies: + "@types/mdast" "^4.0.0" + "@types/unist" "^3.0.0" + decode-named-character-reference "^1.0.0" + devlop "^1.0.0" + mdast-util-to-string "^4.0.0" + micromark "^4.0.0" + micromark-util-decode-numeric-character-reference "^2.0.0" + micromark-util-decode-string "^2.0.0" + micromark-util-normalize-identifier "^2.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" + unist-util-stringify-position "^4.0.0" + +mdast-util-frontmatter@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/mdast-util-frontmatter/-/mdast-util-frontmatter-2.0.1.tgz#f5f929eb1eb36c8a7737475c7eb438261f964ee8" + integrity sha512-LRqI9+wdgC25P0URIJY9vwocIzCcksduHQ9OF2joxQoyTNVduwLAFUzjoopuRJbJAReaKrNQKAZKL3uCMugWJA== + dependencies: + "@types/mdast" "^4.0.0" + devlop "^1.0.0" + escape-string-regexp "^5.0.0" + mdast-util-from-markdown "^2.0.0" + mdast-util-to-markdown "^2.0.0" + micromark-extension-frontmatter "^2.0.0" + +mdast-util-gfm-autolink-literal@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/mdast-util-gfm-autolink-literal/-/mdast-util-gfm-autolink-literal-2.0.0.tgz#5baf35407421310a08e68c15e5d8821e8898ba2a" + integrity sha512-FyzMsduZZHSc3i0Px3PQcBT4WJY/X/RCtEJKuybiC6sjPqLv7h1yqAkmILZtuxMSsUyaLUWNp71+vQH2zqp5cg== + dependencies: + "@types/mdast" "^4.0.0" + ccount "^2.0.0" + devlop "^1.0.0" + mdast-util-find-and-replace "^3.0.0" + micromark-util-character "^2.0.0" + +mdast-util-gfm-footnote@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/mdast-util-gfm-footnote/-/mdast-util-gfm-footnote-2.0.0.tgz#25a1753c7d16db8bfd53cd84fe50562bd1e6d6a9" + integrity sha512-5jOT2boTSVkMnQ7LTrd6n/18kqwjmuYqo7JUPe+tRCY6O7dAuTFMtTPauYYrMPpox9hlN0uOx/FL8XvEfG9/mQ== + dependencies: + "@types/mdast" "^4.0.0" + devlop "^1.1.0" + mdast-util-from-markdown "^2.0.0" + mdast-util-to-markdown "^2.0.0" + micromark-util-normalize-identifier "^2.0.0" + +mdast-util-gfm-strikethrough@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/mdast-util-gfm-strikethrough/-/mdast-util-gfm-strikethrough-2.0.0.tgz#d44ef9e8ed283ac8c1165ab0d0dfd058c2764c16" + integrity sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg== + dependencies: + "@types/mdast" "^4.0.0" + mdast-util-from-markdown "^2.0.0" + mdast-util-to-markdown "^2.0.0" + +mdast-util-gfm-table@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/mdast-util-gfm-table/-/mdast-util-gfm-table-2.0.0.tgz#7a435fb6223a72b0862b33afbd712b6dae878d38" + integrity sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg== + dependencies: + "@types/mdast" "^4.0.0" + devlop "^1.0.0" + markdown-table "^3.0.0" + mdast-util-from-markdown "^2.0.0" + mdast-util-to-markdown "^2.0.0" + +mdast-util-gfm-task-list-item@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/mdast-util-gfm-task-list-item/-/mdast-util-gfm-task-list-item-2.0.0.tgz#e68095d2f8a4303ef24094ab642e1047b991a936" + integrity sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ== + dependencies: + "@types/mdast" "^4.0.0" + devlop "^1.0.0" + mdast-util-from-markdown "^2.0.0" + mdast-util-to-markdown "^2.0.0" + +mdast-util-gfm@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/mdast-util-gfm/-/mdast-util-gfm-3.0.0.tgz#3f2aecc879785c3cb6a81ff3a243dc11eca61095" + integrity sha512-dgQEX5Amaq+DuUqf26jJqSK9qgixgd6rYDHAv4aTBuA92cTknZlKpPfa86Z/s8Dj8xsAQpFfBmPUHWJBWqS4Bw== + dependencies: + mdast-util-from-markdown "^2.0.0" + mdast-util-gfm-autolink-literal "^2.0.0" + mdast-util-gfm-footnote "^2.0.0" + mdast-util-gfm-strikethrough "^2.0.0" + mdast-util-gfm-table "^2.0.0" + mdast-util-gfm-task-list-item "^2.0.0" + mdast-util-to-markdown "^2.0.0" + +mdast-util-mdx-expression@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/mdast-util-mdx-expression/-/mdast-util-mdx-expression-2.0.0.tgz#4968b73724d320a379110d853e943a501bfd9d87" + integrity sha512-fGCu8eWdKUKNu5mohVGkhBXCXGnOTLuFqOvGMvdikr+J1w7lDJgxThOKpwRWzzbyXAU2hhSwsmssOY4yTokluw== + dependencies: + "@types/estree-jsx" "^1.0.0" + "@types/hast" "^3.0.0" + "@types/mdast" "^4.0.0" + devlop "^1.0.0" + mdast-util-from-markdown "^2.0.0" + mdast-util-to-markdown "^2.0.0" + +mdast-util-mdx-jsx@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/mdast-util-mdx-jsx/-/mdast-util-mdx-jsx-3.0.0.tgz#f73631fa5bb7a36712ff1e9cedec0cafed03401c" + integrity sha512-XZuPPzQNBPAlaqsTTgRrcJnyFbSOBovSadFgbFu8SnuNgm+6Bdx1K+IWoitsmj6Lq6MNtI+ytOqwN70n//NaBA== + dependencies: + "@types/estree-jsx" "^1.0.0" + "@types/hast" "^3.0.0" + "@types/mdast" "^4.0.0" + "@types/unist" "^3.0.0" + ccount "^2.0.0" + devlop "^1.1.0" + mdast-util-from-markdown "^2.0.0" + mdast-util-to-markdown "^2.0.0" + parse-entities "^4.0.0" + stringify-entities "^4.0.0" + unist-util-remove-position "^5.0.0" + unist-util-stringify-position "^4.0.0" + vfile-message "^4.0.0" + +mdast-util-mdx@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/mdast-util-mdx/-/mdast-util-mdx-3.0.0.tgz#792f9cf0361b46bee1fdf1ef36beac424a099c41" + integrity sha512-JfbYLAW7XnYTTbUsmpu0kdBUVe+yKVJZBItEjwyYJiDJuZ9w4eeaqks4HQO+R7objWgS2ymV60GYpI14Ug554w== + dependencies: + mdast-util-from-markdown "^2.0.0" + mdast-util-mdx-expression "^2.0.0" + mdast-util-mdx-jsx "^3.0.0" + mdast-util-mdxjs-esm "^2.0.0" + mdast-util-to-markdown "^2.0.0" + +mdast-util-mdxjs-esm@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/mdast-util-mdxjs-esm/-/mdast-util-mdxjs-esm-2.0.1.tgz#019cfbe757ad62dd557db35a695e7314bcc9fa97" + integrity sha512-EcmOpxsZ96CvlP03NghtH1EsLtr0n9Tm4lPUJUBccV9RwUOneqSycg19n5HGzCf+10LozMRSObtVr3ee1WoHtg== + dependencies: + "@types/estree-jsx" "^1.0.0" + "@types/hast" "^3.0.0" + "@types/mdast" "^4.0.0" + devlop "^1.0.0" + mdast-util-from-markdown "^2.0.0" + mdast-util-to-markdown "^2.0.0" + +mdast-util-phrasing@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/mdast-util-phrasing/-/mdast-util-phrasing-4.0.0.tgz#468cbbb277375523de807248b8ad969feb02a5c7" + integrity sha512-xadSsJayQIucJ9n053dfQwVu1kuXg7jCTdYsMK8rqzKZh52nLfSH/k0sAxE0u+pj/zKZX+o5wB+ML5mRayOxFA== + dependencies: + "@types/mdast" "^4.0.0" + unist-util-is "^6.0.0" + +mdast-util-to-hast@10.0.1: + version "10.0.1" + resolved "https://registry.yarnpkg.com/mdast-util-to-hast/-/mdast-util-to-hast-10.0.1.tgz#0cfc82089494c52d46eb0e3edb7a4eb2aea021eb" + integrity sha512-BW3LM9SEMnjf4HXXVApZMt8gLQWVNXc3jryK0nJu/rOXPOnlkUjmdkDlmxMirpbU9ILncGFIwLH/ubnWBbcdgA== + dependencies: + "@types/mdast" "^3.0.0" + "@types/unist" "^2.0.0" + mdast-util-definitions "^4.0.0" + mdurl "^1.0.0" + unist-builder "^2.0.0" + unist-util-generated "^1.0.0" + unist-util-position "^3.0.0" + unist-util-visit "^2.0.0" + +mdast-util-to-hast@^13.0.0: + version "13.0.2" + resolved "https://registry.yarnpkg.com/mdast-util-to-hast/-/mdast-util-to-hast-13.0.2.tgz#74c0a9f014bb2340cae6118f6fccd75467792be7" + integrity sha512-U5I+500EOOw9e3ZrclN3Is3fRpw8c19SMyNZlZ2IS+7vLsNzb2Om11VpIVOR+/0137GhZsFEF6YiKD5+0Hr2Og== + dependencies: + "@types/hast" "^3.0.0" + "@types/mdast" "^4.0.0" + "@ungap/structured-clone" "^1.0.0" + devlop "^1.0.0" + micromark-util-sanitize-uri "^2.0.0" + trim-lines "^3.0.0" + unist-util-position "^5.0.0" + unist-util-visit "^5.0.0" + +mdast-util-to-markdown@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/mdast-util-to-markdown/-/mdast-util-to-markdown-2.1.0.tgz#9813f1d6e0cdaac7c244ec8c6dabfdb2102ea2b4" + integrity sha512-SR2VnIEdVNCJbP6y7kVTJgPLifdr8WEU440fQec7qHoHOUz/oJ2jmNRqdDQ3rbiStOXb2mCDGTuwsK5OPUgYlQ== + dependencies: + "@types/mdast" "^4.0.0" + "@types/unist" "^3.0.0" + longest-streak "^3.0.0" + mdast-util-phrasing "^4.0.0" + mdast-util-to-string "^4.0.0" + micromark-util-decode-string "^2.0.0" + unist-util-visit "^5.0.0" + zwitch "^2.0.0" + +mdast-util-to-string@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/mdast-util-to-string/-/mdast-util-to-string-2.0.0.tgz#b8cfe6a713e1091cb5b728fc48885a4767f8b97b" + integrity sha512-AW4DRS3QbBayY/jJmD8437V1Gombjf8RSOUCMFBuo5iHi58AGEgVCKQ+ezHkZZDpAQS75hcBMpLqjpJTjtUL7w== + +mdast-util-to-string@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/mdast-util-to-string/-/mdast-util-to-string-4.0.0.tgz#7a5121475556a04e7eddeb67b264aae79d312814" + integrity sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg== + dependencies: + "@types/mdast" "^4.0.0" + +mdn-data@2.0.14: + version "2.0.14" + resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.14.tgz#7113fc4281917d63ce29b43446f701e68c25ba50" + integrity sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow== + +mdn-data@2.0.28: + version "2.0.28" + resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.28.tgz#5ec48e7bef120654539069e1ae4ddc81ca490eba" + integrity sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g== + +mdn-data@2.0.30: + version "2.0.30" + resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.30.tgz#ce4df6f80af6cfbe218ecd5c552ba13c4dfa08cc" + integrity sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA== + +mdurl@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/mdurl/-/mdurl-1.0.1.tgz#fe85b2ec75a59037f2adfec100fd6c601761152e" + integrity sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g== + +media-typer@0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" + integrity sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ== + +memfs@^3.1.2, memfs@^3.4.3: + version "3.6.0" + resolved "https://registry.yarnpkg.com/memfs/-/memfs-3.6.0.tgz#d7a2110f86f79dd950a8b6df6d57bc984aa185f6" + integrity sha512-EGowvkkgbMcIChjMTMkESFDbZeSh8xZ7kNSF0hAiAN4Jh6jgHCRS0Ga/+C8y6Au+oqpezRHCfPsmJ2+DwAgiwQ== + dependencies: + fs-monkey "^1.0.4" + +merge-descriptors@1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.3.tgz#d80319a65f3c7935351e5cfdac8f9318504dbed5" + integrity sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ== + +merge-stream@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" + integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== + +merge2@^1.3.0, merge2@^1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" + integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== + +methods@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" + integrity sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w== + +micromark-core-commonmark@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/micromark-core-commonmark/-/micromark-core-commonmark-2.0.0.tgz#50740201f0ee78c12a675bf3e68ffebc0bf931a3" + integrity sha512-jThOz/pVmAYUtkroV3D5c1osFXAMv9e0ypGDOIZuCeAe91/sD6BoE2Sjzt30yuXtwOYUmySOhMas/PVyh02itA== + dependencies: + decode-named-character-reference "^1.0.0" + devlop "^1.0.0" + micromark-factory-destination "^2.0.0" + micromark-factory-label "^2.0.0" + micromark-factory-space "^2.0.0" + micromark-factory-title "^2.0.0" + micromark-factory-whitespace "^2.0.0" + micromark-util-character "^2.0.0" + micromark-util-chunked "^2.0.0" + micromark-util-classify-character "^2.0.0" + micromark-util-html-tag-name "^2.0.0" + micromark-util-normalize-identifier "^2.0.0" + micromark-util-resolve-all "^2.0.0" + micromark-util-subtokenize "^2.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" + +micromark-extension-directive@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/micromark-extension-directive/-/micromark-extension-directive-3.0.0.tgz#527869de497a6de9024138479091bc885dae076b" + integrity sha512-61OI07qpQrERc+0wEysLHMvoiO3s2R56x5u7glHq2Yqq6EHbH4dW25G9GfDdGCDYqA21KE6DWgNSzxSwHc2hSg== + dependencies: + devlop "^1.0.0" + micromark-factory-space "^2.0.0" + micromark-factory-whitespace "^2.0.0" + micromark-util-character "^2.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" + parse-entities "^4.0.0" + +micromark-extension-frontmatter@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/micromark-extension-frontmatter/-/micromark-extension-frontmatter-2.0.0.tgz#651c52ffa5d7a8eeed687c513cd869885882d67a" + integrity sha512-C4AkuM3dA58cgZha7zVnuVxBhDsbttIMiytjgsM2XbHAB2faRVaHRle40558FBN+DJcrLNCoqG5mlrpdU4cRtg== + dependencies: + fault "^2.0.0" + micromark-util-character "^2.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" + +micromark-extension-gfm-autolink-literal@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/micromark-extension-gfm-autolink-literal/-/micromark-extension-gfm-autolink-literal-2.0.0.tgz#f1e50b42e67d441528f39a67133eddde2bbabfd9" + integrity sha512-rTHfnpt/Q7dEAK1Y5ii0W8bhfJlVJFnJMHIPisfPK3gpVNuOP0VnRl96+YJ3RYWV/P4gFeQoGKNlT3RhuvpqAg== + dependencies: + micromark-util-character "^2.0.0" + micromark-util-sanitize-uri "^2.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" + +micromark-extension-gfm-footnote@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/micromark-extension-gfm-footnote/-/micromark-extension-gfm-footnote-2.0.0.tgz#91afad310065a94b636ab1e9dab2c60d1aab953c" + integrity sha512-6Rzu0CYRKDv3BfLAUnZsSlzx3ak6HAoI85KTiijuKIz5UxZxbUI+pD6oHgw+6UtQuiRwnGRhzMmPRv4smcz0fg== + dependencies: + devlop "^1.0.0" + micromark-core-commonmark "^2.0.0" + micromark-factory-space "^2.0.0" + micromark-util-character "^2.0.0" + micromark-util-normalize-identifier "^2.0.0" + micromark-util-sanitize-uri "^2.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" + +micromark-extension-gfm-strikethrough@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/micromark-extension-gfm-strikethrough/-/micromark-extension-gfm-strikethrough-2.0.0.tgz#6917db8e320da70e39ffbf97abdbff83e6783e61" + integrity sha512-c3BR1ClMp5fxxmwP6AoOY2fXO9U8uFMKs4ADD66ahLTNcwzSCyRVU4k7LPV5Nxo/VJiR4TdzxRQY2v3qIUceCw== + dependencies: + devlop "^1.0.0" + micromark-util-chunked "^2.0.0" + micromark-util-classify-character "^2.0.0" + micromark-util-resolve-all "^2.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" + +micromark-extension-gfm-table@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/micromark-extension-gfm-table/-/micromark-extension-gfm-table-2.0.0.tgz#2cf3fe352d9e089b7ef5fff003bdfe0da29649b7" + integrity sha512-PoHlhypg1ItIucOaHmKE8fbin3vTLpDOUg8KAr8gRCF1MOZI9Nquq2i/44wFvviM4WuxJzc3demT8Y3dkfvYrw== + dependencies: + devlop "^1.0.0" + micromark-factory-space "^2.0.0" + micromark-util-character "^2.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" + +micromark-extension-gfm-tagfilter@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/micromark-extension-gfm-tagfilter/-/micromark-extension-gfm-tagfilter-2.0.0.tgz#f26d8a7807b5985fba13cf61465b58ca5ff7dc57" + integrity sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg== + dependencies: + micromark-util-types "^2.0.0" + +micromark-extension-gfm-task-list-item@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/micromark-extension-gfm-task-list-item/-/micromark-extension-gfm-task-list-item-2.0.1.tgz#ee8b208f1ced1eb9fb11c19a23666e59d86d4838" + integrity sha512-cY5PzGcnULaN5O7T+cOzfMoHjBW7j+T9D2sucA5d/KbsBTPcYdebm9zUd9zzdgJGCwahV+/W78Z3nbulBYVbTw== + dependencies: + devlop "^1.0.0" + micromark-factory-space "^2.0.0" + micromark-util-character "^2.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" + +micromark-extension-gfm@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/micromark-extension-gfm/-/micromark-extension-gfm-3.0.0.tgz#3e13376ab95dd7a5cfd0e29560dfe999657b3c5b" + integrity sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w== + dependencies: + micromark-extension-gfm-autolink-literal "^2.0.0" + micromark-extension-gfm-footnote "^2.0.0" + micromark-extension-gfm-strikethrough "^2.0.0" + micromark-extension-gfm-table "^2.0.0" + micromark-extension-gfm-tagfilter "^2.0.0" + micromark-extension-gfm-task-list-item "^2.0.0" + micromark-util-combine-extensions "^2.0.0" + micromark-util-types "^2.0.0" + +micromark-extension-mdx-expression@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/micromark-extension-mdx-expression/-/micromark-extension-mdx-expression-3.0.0.tgz#1407b9ce69916cf5e03a196ad9586889df25302a" + integrity sha512-sI0nwhUDz97xyzqJAbHQhp5TfaxEvZZZ2JDqUo+7NvyIYG6BZ5CPPqj2ogUoPJlmXHBnyZUzISg9+oUmU6tUjQ== + dependencies: + "@types/estree" "^1.0.0" + devlop "^1.0.0" + micromark-factory-mdx-expression "^2.0.0" + micromark-factory-space "^2.0.0" + micromark-util-character "^2.0.0" + micromark-util-events-to-acorn "^2.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" + +micromark-extension-mdx-jsx@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/micromark-extension-mdx-jsx/-/micromark-extension-mdx-jsx-3.0.0.tgz#4aba0797c25efb2366a3fd2d367c6b1c1159f4f5" + integrity sha512-uvhhss8OGuzR4/N17L1JwvmJIpPhAd8oByMawEKx6NVdBCbesjH4t+vjEp3ZXft9DwvlKSD07fCeI44/N0Vf2w== + dependencies: + "@types/acorn" "^4.0.0" + "@types/estree" "^1.0.0" + devlop "^1.0.0" + estree-util-is-identifier-name "^3.0.0" + micromark-factory-mdx-expression "^2.0.0" + micromark-factory-space "^2.0.0" + micromark-util-character "^2.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" + vfile-message "^4.0.0" + +micromark-extension-mdx-md@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/micromark-extension-mdx-md/-/micromark-extension-mdx-md-2.0.0.tgz#1d252881ea35d74698423ab44917e1f5b197b92d" + integrity sha512-EpAiszsB3blw4Rpba7xTOUptcFeBFi+6PY8VnJ2hhimH+vCQDirWgsMpz7w1XcZE7LVrSAUGb9VJpG9ghlYvYQ== + dependencies: + micromark-util-types "^2.0.0" + +micromark-extension-mdxjs-esm@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/micromark-extension-mdxjs-esm/-/micromark-extension-mdxjs-esm-3.0.0.tgz#de21b2b045fd2059bd00d36746081de38390d54a" + integrity sha512-DJFl4ZqkErRpq/dAPyeWp15tGrcrrJho1hKK5uBS70BCtfrIFg81sqcTVu3Ta+KD1Tk5vAtBNElWxtAa+m8K9A== + dependencies: + "@types/estree" "^1.0.0" + devlop "^1.0.0" + micromark-core-commonmark "^2.0.0" + micromark-util-character "^2.0.0" + micromark-util-events-to-acorn "^2.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" + unist-util-position-from-estree "^2.0.0" + vfile-message "^4.0.0" + +micromark-extension-mdxjs@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/micromark-extension-mdxjs/-/micromark-extension-mdxjs-3.0.0.tgz#b5a2e0ed449288f3f6f6c544358159557549de18" + integrity sha512-A873fJfhnJ2siZyUrJ31l34Uqwy4xIFmvPY1oj+Ean5PHcPBYzEsvqvWGaWcfEIr11O5Dlw3p2y0tZWpKHDejQ== + dependencies: + acorn "^8.0.0" + acorn-jsx "^5.0.0" + micromark-extension-mdx-expression "^3.0.0" + micromark-extension-mdx-jsx "^3.0.0" + micromark-extension-mdx-md "^2.0.0" + micromark-extension-mdxjs-esm "^3.0.0" + micromark-util-combine-extensions "^2.0.0" + micromark-util-types "^2.0.0" + +micromark-factory-destination@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/micromark-factory-destination/-/micromark-factory-destination-2.0.0.tgz#857c94debd2c873cba34e0445ab26b74f6a6ec07" + integrity sha512-j9DGrQLm/Uhl2tCzcbLhy5kXsgkHUrjJHg4fFAeoMRwJmJerT9aw4FEhIbZStWN8A3qMwOp1uzHr4UL8AInxtA== + dependencies: + micromark-util-character "^2.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" + +micromark-factory-label@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/micromark-factory-label/-/micromark-factory-label-2.0.0.tgz#17c5c2e66ce39ad6f4fc4cbf40d972f9096f726a" + integrity sha512-RR3i96ohZGde//4WSe/dJsxOX6vxIg9TimLAS3i4EhBAFx8Sm5SmqVfR8E87DPSR31nEAjZfbt91OMZWcNgdZw== + dependencies: + devlop "^1.0.0" + micromark-util-character "^2.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" + +micromark-factory-mdx-expression@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/micromark-factory-mdx-expression/-/micromark-factory-mdx-expression-2.0.1.tgz#f2a9724ce174f1751173beb2c1f88062d3373b1b" + integrity sha512-F0ccWIUHRLRrYp5TC9ZYXmZo+p2AM13ggbsW4T0b5CRKP8KHVRB8t4pwtBgTxtjRmwrK0Irwm7vs2JOZabHZfg== + dependencies: + "@types/estree" "^1.0.0" + devlop "^1.0.0" + micromark-util-character "^2.0.0" + micromark-util-events-to-acorn "^2.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" + unist-util-position-from-estree "^2.0.0" + vfile-message "^4.0.0" + +micromark-factory-space@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/micromark-factory-space/-/micromark-factory-space-1.1.0.tgz#c8f40b0640a0150751d3345ed885a080b0d15faf" + integrity sha512-cRzEj7c0OL4Mw2v6nwzttyOZe8XY/Z8G0rzmWQZTBi/jjwyw/U4uqKtUORXQrR5bAZZnbTI/feRV/R7hc4jQYQ== + dependencies: + micromark-util-character "^1.0.0" + micromark-util-types "^1.0.0" + +micromark-factory-space@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/micromark-factory-space/-/micromark-factory-space-2.0.0.tgz#5e7afd5929c23b96566d0e1ae018ae4fcf81d030" + integrity sha512-TKr+LIDX2pkBJXFLzpyPyljzYK3MtmllMUMODTQJIUfDGncESaqB90db9IAUcz4AZAJFdd8U9zOp9ty1458rxg== + dependencies: + micromark-util-character "^2.0.0" + micromark-util-types "^2.0.0" + +micromark-factory-title@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/micromark-factory-title/-/micromark-factory-title-2.0.0.tgz#726140fc77892af524705d689e1cf06c8a83ea95" + integrity sha512-jY8CSxmpWLOxS+t8W+FG3Xigc0RDQA9bKMY/EwILvsesiRniiVMejYTE4wumNc2f4UbAa4WsHqe3J1QS1sli+A== + dependencies: + micromark-factory-space "^2.0.0" + micromark-util-character "^2.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" + +micromark-factory-whitespace@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/micromark-factory-whitespace/-/micromark-factory-whitespace-2.0.0.tgz#9e92eb0f5468083381f923d9653632b3cfb5f763" + integrity sha512-28kbwaBjc5yAI1XadbdPYHX/eDnqaUFVikLwrO7FDnKG7lpgxnvk/XGRhX/PN0mOZ+dBSZ+LgunHS+6tYQAzhA== + dependencies: + micromark-factory-space "^2.0.0" + micromark-util-character "^2.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" + +micromark-util-character@^1.0.0, micromark-util-character@^1.1.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/micromark-util-character/-/micromark-util-character-1.2.0.tgz#4fedaa3646db249bc58caeb000eb3549a8ca5dcc" + integrity sha512-lXraTwcX3yH/vMDaFWCQJP1uIszLVebzUa3ZHdrgxr7KEU/9mL4mVgCpGbyhvNLNlauROiNUq7WN5u7ndbY6xg== + dependencies: + micromark-util-symbol "^1.0.0" + micromark-util-types "^1.0.0" + +micromark-util-character@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/micromark-util-character/-/micromark-util-character-2.0.1.tgz#52b824c2e2633b6fb33399d2ec78ee2a90d6b298" + integrity sha512-3wgnrmEAJ4T+mGXAUfMvMAbxU9RDG43XmGce4j6CwPtVxB3vfwXSZ6KhFwDzZ3mZHhmPimMAXg71veiBGzeAZw== + dependencies: + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" + +micromark-util-chunked@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/micromark-util-chunked/-/micromark-util-chunked-2.0.0.tgz#e51f4db85fb203a79dbfef23fd41b2f03dc2ef89" + integrity sha512-anK8SWmNphkXdaKgz5hJvGa7l00qmcaUQoMYsBwDlSKFKjc6gjGXPDw3FNL3Nbwq5L8gE+RCbGqTw49FK5Qyvg== + dependencies: + micromark-util-symbol "^2.0.0" + +micromark-util-classify-character@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/micromark-util-classify-character/-/micromark-util-classify-character-2.0.0.tgz#8c7537c20d0750b12df31f86e976d1d951165f34" + integrity sha512-S0ze2R9GH+fu41FA7pbSqNWObo/kzwf8rN/+IGlW/4tC6oACOs8B++bh+i9bVyNnwCcuksbFwsBme5OCKXCwIw== + dependencies: + micromark-util-character "^2.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" + +micromark-util-combine-extensions@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/micromark-util-combine-extensions/-/micromark-util-combine-extensions-2.0.0.tgz#75d6ab65c58b7403616db8d6b31315013bfb7ee5" + integrity sha512-vZZio48k7ON0fVS3CUgFatWHoKbbLTK/rT7pzpJ4Bjp5JjkZeasRfrS9wsBdDJK2cJLHMckXZdzPSSr1B8a4oQ== + dependencies: + micromark-util-chunked "^2.0.0" + micromark-util-types "^2.0.0" + +micromark-util-decode-numeric-character-reference@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-2.0.1.tgz#2698bbb38f2a9ba6310e359f99fcb2b35a0d2bd5" + integrity sha512-bmkNc7z8Wn6kgjZmVHOX3SowGmVdhYS7yBpMnuMnPzDq/6xwVA604DuOXMZTO1lvq01g+Adfa0pE2UKGlxL1XQ== + dependencies: + micromark-util-symbol "^2.0.0" + +micromark-util-decode-string@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/micromark-util-decode-string/-/micromark-util-decode-string-2.0.0.tgz#7dfa3a63c45aecaa17824e656bcdb01f9737154a" + integrity sha512-r4Sc6leeUTn3P6gk20aFMj2ntPwn6qpDZqWvYmAG6NgvFTIlj4WtrAudLi65qYoaGdXYViXYw2pkmn7QnIFasA== + dependencies: + decode-named-character-reference "^1.0.0" + micromark-util-character "^2.0.0" + micromark-util-decode-numeric-character-reference "^2.0.0" + micromark-util-symbol "^2.0.0" + +micromark-util-encode@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/micromark-util-encode/-/micromark-util-encode-2.0.0.tgz#0921ac7953dc3f1fd281e3d1932decfdb9382ab1" + integrity sha512-pS+ROfCXAGLWCOc8egcBvT0kf27GoWMqtdarNfDcjb6YLuV5cM3ioG45Ys2qOVqeqSbjaKg72vU+Wby3eddPsA== + +micromark-util-events-to-acorn@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/micromark-util-events-to-acorn/-/micromark-util-events-to-acorn-2.0.2.tgz#4275834f5453c088bd29cd72dfbf80e3327cec07" + integrity sha512-Fk+xmBrOv9QZnEDguL9OI9/NQQp6Hz4FuQ4YmCb/5V7+9eAh1s6AYSvL20kHkD67YIg7EpE54TiSlcsf3vyZgA== + dependencies: + "@types/acorn" "^4.0.0" + "@types/estree" "^1.0.0" + "@types/unist" "^3.0.0" + devlop "^1.0.0" + estree-util-visit "^2.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" + vfile-message "^4.0.0" + +micromark-util-html-tag-name@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/micromark-util-html-tag-name/-/micromark-util-html-tag-name-2.0.0.tgz#ae34b01cbe063363847670284c6255bb12138ec4" + integrity sha512-xNn4Pqkj2puRhKdKTm8t1YHC/BAjx6CEwRFXntTaRf/x16aqka6ouVoutm+QdkISTlT7e2zU7U4ZdlDLJd2Mcw== + +micromark-util-normalize-identifier@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-2.0.0.tgz#91f9a4e65fe66cc80c53b35b0254ad67aa431d8b" + integrity sha512-2xhYT0sfo85FMrUPtHcPo2rrp1lwbDEEzpx7jiH2xXJLqBuy4H0GgXk5ToU8IEwoROtXuL8ND0ttVa4rNqYK3w== + dependencies: + micromark-util-symbol "^2.0.0" + +micromark-util-resolve-all@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/micromark-util-resolve-all/-/micromark-util-resolve-all-2.0.0.tgz#189656e7e1a53d0c86a38a652b284a252389f364" + integrity sha512-6KU6qO7DZ7GJkaCgwBNtplXCvGkJToU86ybBAUdavvgsCiG8lSSvYxr9MhwmQ+udpzywHsl4RpGJsYWG1pDOcA== + dependencies: + micromark-util-types "^2.0.0" + +micromark-util-sanitize-uri@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.0.tgz#ec8fbf0258e9e6d8f13d9e4770f9be64342673de" + integrity sha512-WhYv5UEcZrbAtlsnPuChHUAsu/iBPOVaEVsntLBIdpibO0ddy8OzavZz3iL2xVvBZOpolujSliP65Kq0/7KIYw== + dependencies: + micromark-util-character "^2.0.0" + micromark-util-encode "^2.0.0" + micromark-util-symbol "^2.0.0" + +micromark-util-subtokenize@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/micromark-util-subtokenize/-/micromark-util-subtokenize-2.0.0.tgz#9f412442d77e0c5789ffdf42377fa8a2bcbdf581" + integrity sha512-vc93L1t+gpR3p8jxeVdaYlbV2jTYteDje19rNSS/H5dlhxUYll5Fy6vJ2cDwP8RnsXi818yGty1ayP55y3W6fg== + dependencies: + devlop "^1.0.0" + micromark-util-chunked "^2.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" + +micromark-util-symbol@^1.0.0, micromark-util-symbol@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/micromark-util-symbol/-/micromark-util-symbol-1.1.0.tgz#813cd17837bdb912d069a12ebe3a44b6f7063142" + integrity sha512-uEjpEYY6KMs1g7QfJ2eX1SQEV+ZT4rUD3UcF6l57acZvLNK7PBZL+ty82Z1qhK1/yXIY4bdx04FKMgR0g4IAag== + +micromark-util-symbol@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz#12225c8f95edf8b17254e47080ce0862d5db8044" + integrity sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw== + +micromark-util-types@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/micromark-util-types/-/micromark-util-types-1.1.0.tgz#e6676a8cae0bb86a2171c498167971886cb7e283" + integrity sha512-ukRBgie8TIAcacscVHSiddHjO4k/q3pnedmzMQ4iwDcK0FtFCohKOlFbaOL/mPgfnPsL3C1ZyxJa4sbWrBl3jg== + +micromark-util-types@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/micromark-util-types/-/micromark-util-types-2.0.0.tgz#63b4b7ffeb35d3ecf50d1ca20e68fc7caa36d95e" + integrity sha512-oNh6S2WMHWRZrmutsRmDDfkzKtxF+bc2VxLC9dvtrDIRFln627VsFP6fLMgTryGDljgLPjkrzQSDcPrjPyDJ5w== + +micromark@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/micromark/-/micromark-4.0.0.tgz#84746a249ebd904d9658cfabc1e8e5f32cbc6249" + integrity sha512-o/sd0nMof8kYff+TqcDx3VSrgBTcZpSvYcAHIfHhv5VAuNmisCxjhx6YmxS8PFEpb9z5WKWKPdzf0jM23ro3RQ== + dependencies: + "@types/debug" "^4.0.0" + debug "^4.0.0" + decode-named-character-reference "^1.0.0" + devlop "^1.0.0" + micromark-core-commonmark "^2.0.0" + micromark-factory-space "^2.0.0" + micromark-util-character "^2.0.0" + micromark-util-chunked "^2.0.0" + micromark-util-combine-extensions "^2.0.0" + micromark-util-decode-numeric-character-reference "^2.0.0" + micromark-util-encode "^2.0.0" + micromark-util-normalize-identifier "^2.0.0" + micromark-util-resolve-all "^2.0.0" + micromark-util-sanitize-uri "^2.0.0" + micromark-util-subtokenize "^2.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" + +micromatch@^4.0.2, micromatch@^4.0.4, micromatch@^4.0.5: + version "4.0.8" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.8.tgz#d66fa18f3a47076789320b9b1af32bd86d9fa202" + integrity sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA== + dependencies: + braces "^3.0.3" + picomatch "^2.3.1" + +mime-db@1.52.0, "mime-db@>= 1.43.0 < 2": + version "1.52.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" + integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== + +mime-db@~1.33.0: + version "1.33.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.33.0.tgz#a3492050a5cb9b63450541e39d9788d2272783db" + integrity sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ== + +mime-types@2.1.18: + version "2.1.18" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.18.tgz#6f323f60a83d11146f831ff11fd66e2fe5503bb8" + integrity sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ== + dependencies: + mime-db "~1.33.0" + +mime-types@^2.1.27, mime-types@^2.1.31, mime-types@~2.1.17, mime-types@~2.1.24, mime-types@~2.1.34: + version "2.1.35" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" + integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== + dependencies: + mime-db "1.52.0" + +mime@1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" + integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== + +mimic-fn@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" + integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== + +mimic-response@^1.0.0, mimic-response@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-1.0.1.tgz#4923538878eef42063cb8a3e3b0798781487ab1b" + integrity sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ== + +mimic-response@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-3.1.0.tgz#2d1d59af9c1b129815accc2c46a022a5ce1fa3c9" + integrity sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ== + +mimic-response@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-4.0.0.tgz#35468b19e7c75d10f5165ea25e75a5ceea7cf70f" + integrity sha512-e5ISH9xMYU0DzrT+jl8q2ze9D6eWBto+I8CNpe+VI+K2J/F/k3PdkdTdz4wvGVH4NTpo+NRYTVIuMQEMMcsLqg== + +mini-css-extract-plugin@^2.6.1, mini-css-extract-plugin@^2.7.6: + version "2.7.6" + resolved "https://registry.yarnpkg.com/mini-css-extract-plugin/-/mini-css-extract-plugin-2.7.6.tgz#282a3d38863fddcd2e0c220aaed5b90bc156564d" + integrity sha512-Qk7HcgaPkGG6eD77mLvZS1nmxlao3j+9PkrT9Uc7HAE1id3F41+DdBRYRYkbyfNRGzm8/YWtzhw7nVPmwhqTQw== + dependencies: + schema-utils "^4.0.0" + +minimalistic-assert@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" + integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== + +minimatch@3.1.2, minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.1: + version "3.1.2" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" + integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== + dependencies: + brace-expansion "^1.1.7" + +minimatch@^5.0.1: + version "5.1.6" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-5.1.6.tgz#1cfcb8cf5522ea69952cd2af95ae09477f122a96" + integrity sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g== + dependencies: + brace-expansion "^2.0.1" + +minimist@^1.2.0, minimist@^1.2.5: + version "1.2.8" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" + integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== + +mobx-react-lite@^3.4.0: + version "3.4.3" + resolved "https://registry.yarnpkg.com/mobx-react-lite/-/mobx-react-lite-3.4.3.tgz#3a4c22c30bfaa8b1b2aa48d12b2ba811c0947ab7" + integrity sha512-NkJREyFTSUXR772Qaai51BnE1voWx56LOL80xG7qkZr6vo8vEaLF3sz1JNUVh+rxmUzxYaqOhfuxTfqUh0FXUg== + +mobx-react@^7.2.0: + version "7.6.0" + resolved "https://registry.yarnpkg.com/mobx-react/-/mobx-react-7.6.0.tgz#ebf0456728a9bd2e5c24fdcf9b36e285a222a7d6" + integrity sha512-+HQUNuh7AoQ9ZnU6c4rvbiVVl+wEkb9WqYsVDzGLng+Dqj1XntHu79PvEWKtSMoMj67vFp/ZPXcElosuJO8ckA== + dependencies: + mobx-react-lite "^3.4.0" + +mobx@^6.0.4: + version "6.12.0" + resolved "https://registry.yarnpkg.com/mobx/-/mobx-6.12.0.tgz#72b2685ca5af031aaa49e77a4d76ed67fcbf9135" + integrity sha512-Mn6CN6meXEnMa0a5u6a5+RKrqRedHBhZGd15AWLk9O6uFY4KYHzImdt8JI8WODo1bjTSRnwXhJox+FCUZhCKCQ== + +mrmime@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/mrmime/-/mrmime-2.0.0.tgz#151082a6e06e59a9a39b46b3e14d5cfe92b3abb4" + integrity sha512-eu38+hdgojoyq63s+yTpN4XMBdt5l8HhMhc4VKLO9KM5caLIBvUm4thi7fFaxyTmCKeNnXZ5pAlBwCUnhA09uw== + +ms@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" + integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A== + +ms@2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" + integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== + +ms@2.1.3: + version "2.1.3" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" + integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== + +multicast-dns@^7.2.5: + version "7.2.5" + resolved "https://registry.yarnpkg.com/multicast-dns/-/multicast-dns-7.2.5.tgz#77eb46057f4d7adbd16d9290fa7299f6fa64cced" + integrity sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg== + dependencies: + dns-packet "^5.2.2" + thunky "^1.0.2" + +nanoid@^3.3.6, nanoid@^3.3.7: + version "3.3.7" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.7.tgz#d0c301a691bc8d54efa0a2226ccf3fe2fd656bd8" + integrity sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g== + +negotiator@0.6.3: + version "0.6.3" + resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd" + integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg== + +neo-async@^2.6.2: + version "2.6.2" + resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f" + integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== + +no-case@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/no-case/-/no-case-3.0.4.tgz#d361fd5c9800f558551a8369fc0dcd4662b6124d" + integrity sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg== + dependencies: + lower-case "^2.0.2" + tslib "^2.0.3" + +node-emoji@^1.10.0: + version "1.11.0" + resolved "https://registry.yarnpkg.com/node-emoji/-/node-emoji-1.11.0.tgz#69a0150e6946e2f115e9d7ea4df7971e2628301c" + integrity sha512-wo2DpQkQp7Sjm2A0cq+sN7EHKO6Sl0ctXeBdFZrL9T9+UywORbufTcTZxom8YqpLQt/FqNMUkOpkZrJVYSKD3A== + dependencies: + lodash "^4.17.21" + +node-emoji@^2.1.0: + version "2.1.3" + resolved "https://registry.yarnpkg.com/node-emoji/-/node-emoji-2.1.3.tgz#93cfabb5cc7c3653aa52f29d6ffb7927d8047c06" + integrity sha512-E2WEOVsgs7O16zsURJ/eH8BqhF029wGpEOnv7Urwdo2wmQanOACwJQh0devF9D9RhoZru0+9JXIS0dBXIAz+lA== + dependencies: + "@sindresorhus/is" "^4.6.0" + char-regex "^1.0.2" + emojilib "^2.4.0" + skin-tone "^2.0.0" + +node-fetch-h2@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/node-fetch-h2/-/node-fetch-h2-2.3.0.tgz#c6188325f9bd3d834020bf0f2d6dc17ced2241ac" + integrity sha512-ofRW94Ab0T4AOh5Fk8t0h8OBWrmjb0SSB20xh1H8YnPV9EJ+f5AMoYSUQ2zgJ4Iq2HAK0I2l5/Nequ8YzFS3Hg== + dependencies: + http2-client "^1.2.5" + +node-fetch@^2.6.1, node-fetch@^2.6.12: + version "2.7.0" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.7.0.tgz#d0f0fa6e3e2dc1d27efcd8ad99d550bda94d187d" + integrity sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A== + dependencies: + whatwg-url "^5.0.0" + +node-forge@^1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-1.3.1.tgz#be8da2af243b2417d5f646a770663a92b7e9ded3" + integrity sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA== + +node-readfiles@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/node-readfiles/-/node-readfiles-0.2.0.tgz#dbbd4af12134e2e635c245ef93ffcf6f60673a5d" + integrity sha512-SU00ZarexNlE4Rjdm83vglt5Y9yiQ+XI1XpflWlb7q7UTN1JUItm69xMeiQCTxtTfnzt+83T8Cx+vI2ED++VDA== + dependencies: + es6-promise "^3.2.1" + +node-releases@^2.0.14: + version "2.0.14" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.14.tgz#2ffb053bceb8b2be8495ece1ab6ce600c4461b0b" + integrity sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw== + +normalize-path@^3.0.0, normalize-path@~3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" + integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== + +normalize-range@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/normalize-range/-/normalize-range-0.1.2.tgz#2d10c06bdfd312ea9777695a4d28439456b75942" + integrity sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA== + +normalize-url@^4.1.0: + version "4.5.1" + resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-4.5.1.tgz#0dd90cf1288ee1d1313b87081c9a5932ee48518a" + integrity sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA== + +normalize-url@^6.0.1: + version "6.1.0" + resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-6.1.0.tgz#40d0885b535deffe3f3147bec877d05fe4c5668a" + integrity sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A== + +normalize-url@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-8.0.0.tgz#593dbd284f743e8dcf6a5ddf8fadff149c82701a" + integrity sha512-uVFpKhj5MheNBJRTiMZ9pE/7hD1QTeEvugSJW/OmLzAp78PB5O6adfMNTvmfKhXBkvCzC+rqifWcVYpGFwTjnw== + +npm-run-path@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea" + integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== + dependencies: + path-key "^3.0.0" + +nprogress@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/nprogress/-/nprogress-0.2.0.tgz#cb8f34c53213d895723fcbab907e9422adbcafb1" + integrity sha512-I19aIingLgR1fmhftnbWWO3dXc0hSxqHQHQb3H8m+K3TnEn/iSeTZZOyvKXWqQESMwuUVnatlCnZdLBZZt2VSA== + +nth-check@^2.0.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-2.1.1.tgz#c9eab428effce36cd6b92c924bdb000ef1f1ed1d" + integrity sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w== + dependencies: + boolbase "^1.0.0" + +oas-kit-common@^1.0.8: + version "1.0.8" + resolved "https://registry.yarnpkg.com/oas-kit-common/-/oas-kit-common-1.0.8.tgz#6d8cacf6e9097967a4c7ea8bcbcbd77018e1f535" + integrity sha512-pJTS2+T0oGIwgjGpw7sIRU8RQMcUoKCDWFLdBqKB2BNmGpbBMH2sdqAaOXUg8OzonZHU0L7vfJu1mJFEiYDWOQ== + dependencies: + fast-safe-stringify "^2.0.7" + +oas-linter@^3.2.2: + version "3.2.2" + resolved "https://registry.yarnpkg.com/oas-linter/-/oas-linter-3.2.2.tgz#ab6a33736313490659035ca6802dc4b35d48aa1e" + integrity sha512-KEGjPDVoU5K6swgo9hJVA/qYGlwfbFx+Kg2QB/kd7rzV5N8N5Mg6PlsoCMohVnQmo+pzJap/F610qTodKzecGQ== + dependencies: + "@exodus/schemasafe" "^1.0.0-rc.2" + should "^13.2.1" + yaml "^1.10.0" + +oas-resolver@^2.5.6: + version "2.5.6" + resolved "https://registry.yarnpkg.com/oas-resolver/-/oas-resolver-2.5.6.tgz#10430569cb7daca56115c915e611ebc5515c561b" + integrity sha512-Yx5PWQNZomfEhPPOphFbZKi9W93CocQj18NlD2Pa4GWZzdZpSJvYwoiuurRI7m3SpcChrnO08hkuQDL3FGsVFQ== + dependencies: + node-fetch-h2 "^2.3.0" + oas-kit-common "^1.0.8" + reftools "^1.1.9" + yaml "^1.10.0" + yargs "^17.0.1" + +oas-schema-walker@^1.1.5: + version "1.1.5" + resolved "https://registry.yarnpkg.com/oas-schema-walker/-/oas-schema-walker-1.1.5.tgz#74c3cd47b70ff8e0b19adada14455b5d3ac38a22" + integrity sha512-2yucenq1a9YPmeNExoUa9Qwrt9RFkjqaMAA1X+U7sbb0AqBeTIdMHky9SQQ6iN94bO5NW0W4TRYXerG+BdAvAQ== + +oas-validator@^5.0.8: + version "5.0.8" + resolved "https://registry.yarnpkg.com/oas-validator/-/oas-validator-5.0.8.tgz#387e90df7cafa2d3ffc83b5fb976052b87e73c28" + integrity sha512-cu20/HE5N5HKqVygs3dt94eYJfBi0TsZvPVXDhbXQHiEityDN+RROTleefoKRKKJ9dFAF2JBkDHgvWj0sjKGmw== + dependencies: + call-me-maybe "^1.0.1" + oas-kit-common "^1.0.8" + oas-linter "^3.2.2" + oas-resolver "^2.5.6" + oas-schema-walker "^1.1.5" + reftools "^1.1.9" + should "^13.2.1" + yaml "^1.10.0" + +object-assign@^4.1.0, object-assign@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" + integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== + +object-inspect@^1.13.1: + version "1.13.2" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.2.tgz#dea0088467fb991e67af4058147a24824a3043ff" + integrity sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g== + +object-keys@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" + integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== + +object.assign@^4.1.0: + version "4.1.5" + resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.5.tgz#3a833f9ab7fdb80fc9e8d2300c803d216d8fdbb0" + integrity sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ== + dependencies: + call-bind "^1.0.5" + define-properties "^1.2.1" + has-symbols "^1.0.3" + object-keys "^1.1.1" + +obuf@^1.0.0, obuf@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/obuf/-/obuf-1.1.2.tgz#09bea3343d41859ebd446292d11c9d4db619084e" + integrity sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg== + +on-finished@2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.4.1.tgz#58c8c44116e54845ad57f14ab10b03533184ac3f" + integrity sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg== + dependencies: + ee-first "1.1.1" + +on-headers@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/on-headers/-/on-headers-1.0.2.tgz#772b0ae6aaa525c399e489adfad90c403eb3c28f" + integrity sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA== + +once@^1.3.0, once@^1.3.1, once@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== + dependencies: + wrappy "1" + +onetime@^5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" + integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== + dependencies: + mimic-fn "^2.1.0" + +open@^8.0.9, open@^8.4.0: + version "8.4.2" + resolved "https://registry.yarnpkg.com/open/-/open-8.4.2.tgz#5b5ffe2a8f793dcd2aad73e550cb87b59cb084f9" + integrity sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ== + dependencies: + define-lazy-prop "^2.0.0" + is-docker "^2.1.1" + is-wsl "^2.2.0" + +openapi-sampler@^1.3.1: + version "1.4.0" + resolved "https://registry.yarnpkg.com/openapi-sampler/-/openapi-sampler-1.4.0.tgz#c133cad6250481f2ec7e48b16eb70062adb514c0" + integrity sha512-3FKJQCHAMG9T7RsRy9u5Ft4ERPq1QQmn77C8T3OSofYL9uur59AqychvQ0YQKijrqRwIkAbzkh+nQnAE3gjMVA== + dependencies: + "@types/json-schema" "^7.0.7" + json-pointer "0.6.2" + +opener@^1.5.2: + version "1.5.2" + resolved "https://registry.yarnpkg.com/opener/-/opener-1.5.2.tgz#5d37e1f35077b9dcac4301372271afdeb2a13598" + integrity sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A== + +p-cancelable@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-1.1.0.tgz#d078d15a3af409220c886f1d9a0ca2e441ab26cc" + integrity sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw== + +p-cancelable@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-3.0.0.tgz#63826694b54d61ca1c20ebcb6d3ecf5e14cd8050" + integrity sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw== + +p-limit@^2.0.0, p-limit@^2.2.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" + integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== + dependencies: + p-try "^2.0.0" + +p-limit@^3.0.2: + version "3.1.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" + integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== + dependencies: + yocto-queue "^0.1.0" + +p-limit@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-4.0.0.tgz#914af6544ed32bfa54670b061cafcbd04984b644" + integrity sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ== + dependencies: + yocto-queue "^1.0.0" + +p-locate@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-3.0.0.tgz#322d69a05c0264b25997d9f40cd8a891ab0064a4" + integrity sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ== + dependencies: + p-limit "^2.0.0" + +p-locate@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07" + integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== + dependencies: + p-limit "^2.2.0" + +p-locate@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" + integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== + dependencies: + p-limit "^3.0.2" + +p-locate@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-6.0.0.tgz#3da9a49d4934b901089dca3302fa65dc5a05c04f" + integrity sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw== + dependencies: + p-limit "^4.0.0" + +p-map@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/p-map/-/p-map-4.0.0.tgz#bb2f95a5eda2ec168ec9274e06a747c3e2904d2b" + integrity sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ== + dependencies: + aggregate-error "^3.0.0" + +p-retry@^4.5.0: + version "4.6.2" + resolved "https://registry.yarnpkg.com/p-retry/-/p-retry-4.6.2.tgz#9baae7184057edd4e17231cee04264106e092a16" + integrity sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ== + dependencies: + "@types/retry" "0.12.0" + retry "^0.13.1" + +p-try@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" + integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== + +package-json@^6.3.0: + version "6.5.0" + resolved "https://registry.yarnpkg.com/package-json/-/package-json-6.5.0.tgz#6feedaca35e75725876d0b0e64974697fed145b0" + integrity sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ== + dependencies: + got "^9.6.0" + registry-auth-token "^4.0.0" + registry-url "^5.0.0" + semver "^6.2.0" + +package-json@^8.1.0: + version "8.1.1" + resolved "https://registry.yarnpkg.com/package-json/-/package-json-8.1.1.tgz#3e9948e43df40d1e8e78a85485f1070bf8f03dc8" + integrity sha512-cbH9IAIJHNj9uXi196JVsRlt7cHKak6u/e6AkL/bkRelZ7rlL3X1YKxsZwa36xipOEKAsdtmaG6aAJoM1fx2zA== + dependencies: + got "^12.1.0" + registry-auth-token "^5.0.1" + registry-url "^6.0.0" + semver "^7.3.7" + +param-case@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/param-case/-/param-case-3.0.4.tgz#7d17fe4aa12bde34d4a77d91acfb6219caad01c5" + integrity sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A== + dependencies: + dot-case "^3.0.4" + tslib "^2.0.3" + +parent-module@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" + integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== + dependencies: + callsites "^3.0.0" + +parse-entities@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/parse-entities/-/parse-entities-2.0.0.tgz#53c6eb5b9314a1f4ec99fa0fdf7ce01ecda0cbe8" + integrity sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ== + dependencies: + character-entities "^1.0.0" + character-entities-legacy "^1.0.0" + character-reference-invalid "^1.0.0" + is-alphanumerical "^1.0.0" + is-decimal "^1.0.0" + is-hexadecimal "^1.0.0" + +parse-entities@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/parse-entities/-/parse-entities-4.0.1.tgz#4e2a01111fb1c986549b944af39eeda258fc9e4e" + integrity sha512-SWzvYcSJh4d/SGLIOQfZ/CoNv6BTlI6YEQ7Nj82oDVnRpwe/Z/F1EMx42x3JAOwGBlCjeCH0BRJQbQ/opHL17w== + dependencies: + "@types/unist" "^2.0.0" + character-entities "^2.0.0" + character-entities-legacy "^3.0.0" + character-reference-invalid "^2.0.0" + decode-named-character-reference "^1.0.0" + is-alphanumerical "^2.0.0" + is-decimal "^2.0.0" + is-hexadecimal "^2.0.0" + +parse-json@^5.0.0, parse-json@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd" + integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg== + dependencies: + "@babel/code-frame" "^7.0.0" + error-ex "^1.3.1" + json-parse-even-better-errors "^2.3.0" + lines-and-columns "^1.1.6" + +parse-numeric-range@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/parse-numeric-range/-/parse-numeric-range-1.3.0.tgz#7c63b61190d61e4d53a1197f0c83c47bb670ffa3" + integrity sha512-twN+njEipszzlMJd4ONUYgSfZPDxgHhT9Ahed5uTigpQn90FggW4SA/AIPq/6a149fTbE9qBEcSwE3FAEp6wQQ== + +parse5-htmlparser2-tree-adapter@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.0.0.tgz#23c2cc233bcf09bb7beba8b8a69d46b08c62c2f1" + integrity sha512-B77tOZrqqfUfnVcOrUvfdLbz4pu4RopLD/4vmu3HUPswwTA8OH0EMW9BlWR2B0RCoiZRAHEUu7IxeP1Pd1UU+g== + dependencies: + domhandler "^5.0.2" + parse5 "^7.0.0" + +parse5-parser-stream@^7.1.2: + version "7.1.2" + resolved "https://registry.yarnpkg.com/parse5-parser-stream/-/parse5-parser-stream-7.1.2.tgz#d7c20eadc37968d272e2c02660fff92dd27e60e1" + integrity sha512-JyeQc9iwFLn5TbvvqACIF/VXG6abODeB3Fwmv/TGdLk2LfbWkaySGY72at4+Ty7EkPZj854u4CrICqNk2qIbow== + dependencies: + parse5 "^7.0.0" + +parse5@^6.0.0: + version "6.0.1" + resolved "https://registry.yarnpkg.com/parse5/-/parse5-6.0.1.tgz#e1a1c085c569b3dc08321184f19a39cc27f7c30b" + integrity sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw== + +parse5@^7.0.0, parse5@^7.1.2: + version "7.1.2" + resolved "https://registry.yarnpkg.com/parse5/-/parse5-7.1.2.tgz#0736bebbfd77793823240a23b7fc5e010b7f8e32" + integrity sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw== + dependencies: + entities "^4.4.0" + +parseurl@~1.3.2, parseurl@~1.3.3: + version "1.3.3" + resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" + integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== + +pascal-case@^3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/pascal-case/-/pascal-case-3.1.2.tgz#b48e0ef2b98e205e7c1dae747d0b1508237660eb" + integrity sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g== + dependencies: + no-case "^3.0.4" + tslib "^2.0.3" + +path-browserify@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-1.0.1.tgz#d98454a9c3753d5790860f16f68867b9e46be1fd" + integrity sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g== + +path-exists@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" + integrity sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ== + +path-exists@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" + integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== + +path-exists@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-5.0.0.tgz#a6aad9489200b21fab31e49cf09277e5116fb9e7" + integrity sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ== + +path-is-absolute@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" + integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== + +path-is-inside@1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" + integrity sha512-DUWJr3+ULp4zXmol/SZkFf3JGsS9/SIv+Y3Rt93/UjPpDpklB5f1er4O3POIbUuUJ3FXgqte2Q7SrU6zAqwk8w== + +path-key@^3.0.0, path-key@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" + integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== + +path-parse@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" + integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== + +path-to-regexp@0.1.10: + version "0.1.10" + resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.10.tgz#67e9108c5c0551b9e5326064387de4763c4d5f8b" + integrity sha512-7lf7qcQidTku0Gu3YDPc8DJ1q7OOucfa/BSsIwjuh56VU7katFvuM8hULfkwB3Fns/rsVF7PwPKVw1sl5KQS9w== + +path-to-regexp@2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-2.2.1.tgz#90b617025a16381a879bc82a38d4e8bdeb2bcf45" + integrity sha512-gu9bD6Ta5bwGrrU8muHzVOBFFREpp2iRkVfhBJahwJ6p6Xw20SjT0MxLnwkjOibQmGSYhiUnf2FLe7k+jcFmGQ== + +path-to-regexp@^1.7.0: + version "1.8.0" + resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-1.8.0.tgz#887b3ba9d84393e87a0a0b9f4cb756198b53548a" + integrity sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA== + dependencies: + isarray "0.0.1" + +path-type@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" + integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== + +perfect-scrollbar@^1.5.5: + version "1.5.5" + resolved "https://registry.yarnpkg.com/perfect-scrollbar/-/perfect-scrollbar-1.5.5.tgz#41a211a2fb52a7191eff301432134ea47052b27f" + integrity sha512-dzalfutyP3e/FOpdlhVryN4AJ5XDVauVWxybSkLZmakFE2sS3y3pc4JnSprw8tGmHvkaG5Edr5T7LBTZ+WWU2g== + +periscopic@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/periscopic/-/periscopic-3.1.0.tgz#7e9037bf51c5855bd33b48928828db4afa79d97a" + integrity sha512-vKiQ8RRtkl9P+r/+oefh25C3fhybptkHKCZSPlcXiJux2tJF55GnEj3BVn4A5gKfq9NWWXXrxkHBwVPUfH0opw== + dependencies: + "@types/estree" "^1.0.0" + estree-walker "^3.0.0" + is-reference "^3.0.0" + +picocolors@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" + integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== + +picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.3, picomatch@^2.3.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" + integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== + +pkg-dir@^4.1.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3" + integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ== + dependencies: + find-up "^4.0.0" + +pkg-dir@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-7.0.0.tgz#8f0c08d6df4476756c5ff29b3282d0bab7517d11" + integrity sha512-Ie9z/WINcxxLp27BKOCHGde4ITq9UklYKDzVo1nhk5sqGEXU3FpkwP5GM2voTGJkGd9B3Otl+Q4uwSOeSUtOBA== + dependencies: + find-up "^6.3.0" + +pkg-up@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/pkg-up/-/pkg-up-3.1.0.tgz#100ec235cc150e4fd42519412596a28512a0def5" + integrity sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA== + dependencies: + find-up "^3.0.0" + +pluralize@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-8.0.0.tgz#1a6fa16a38d12a1901e0320fa017051c539ce3b1" + integrity sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA== + +polished@^4.1.3: + version "4.2.2" + resolved "https://registry.yarnpkg.com/polished/-/polished-4.2.2.tgz#2529bb7c3198945373c52e34618c8fe7b1aa84d1" + integrity sha512-Sz2Lkdxz6F2Pgnpi9U5Ng/WdWAUZxmHrNPoVlm3aAemxoy2Qy7LGjQg4uf8qKelDAUW94F4np3iH2YPf2qefcQ== + dependencies: + "@babel/runtime" "^7.17.8" + +postcss-calc@^8.2.3: + version "8.2.4" + resolved "https://registry.yarnpkg.com/postcss-calc/-/postcss-calc-8.2.4.tgz#77b9c29bfcbe8a07ff6693dc87050828889739a5" + integrity sha512-SmWMSJmB8MRnnULldx0lQIyhSNvuDl9HfrZkaqqE/WHAhToYsAvDq+yAsA/kIyINDszOp3Rh0GFoNuH5Ypsm3Q== + dependencies: + postcss-selector-parser "^6.0.9" + postcss-value-parser "^4.2.0" + +postcss-colormin@^5.3.1: + version "5.3.1" + resolved "https://registry.yarnpkg.com/postcss-colormin/-/postcss-colormin-5.3.1.tgz#86c27c26ed6ba00d96c79e08f3ffb418d1d1988f" + integrity sha512-UsWQG0AqTFQmpBegeLLc1+c3jIqBNB0zlDGRWR+dQ3pRKJL1oeMzyqmH3o2PIfn9MBdNrVPWhDbT769LxCTLJQ== + dependencies: + browserslist "^4.21.4" + caniuse-api "^3.0.0" + colord "^2.9.1" + postcss-value-parser "^4.2.0" + +postcss-convert-values@^5.1.3: + version "5.1.3" + resolved "https://registry.yarnpkg.com/postcss-convert-values/-/postcss-convert-values-5.1.3.tgz#04998bb9ba6b65aa31035d669a6af342c5f9d393" + integrity sha512-82pC1xkJZtcJEfiLw6UXnXVXScgtBrjlO5CBmuDQc+dlb88ZYheFsjTn40+zBVi3DkfF7iezO0nJUPLcJK3pvA== + dependencies: + browserslist "^4.21.4" + postcss-value-parser "^4.2.0" + +postcss-discard-comments@^5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/postcss-discard-comments/-/postcss-discard-comments-5.1.2.tgz#8df5e81d2925af2780075840c1526f0660e53696" + integrity sha512-+L8208OVbHVF2UQf1iDmRcbdjJkuBF6IS29yBDSiWUIzpYaAhtNl6JYnYm12FnkeCwQqF5LeklOu6rAqgfBZqQ== + +postcss-discard-duplicates@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/postcss-discard-duplicates/-/postcss-discard-duplicates-5.1.0.tgz#9eb4fe8456706a4eebd6d3b7b777d07bad03e848" + integrity sha512-zmX3IoSI2aoenxHV6C7plngHWWhUOV3sP1T8y2ifzxzbtnuhk1EdPwm0S1bIUNaJ2eNbWeGLEwzw8huPD67aQw== + +postcss-discard-empty@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/postcss-discard-empty/-/postcss-discard-empty-5.1.1.tgz#e57762343ff7f503fe53fca553d18d7f0c369c6c" + integrity sha512-zPz4WljiSuLWsI0ir4Mcnr4qQQ5e1Ukc3i7UfE2XcrwKK2LIPIqE5jxMRxO6GbI3cv//ztXDsXwEWT3BHOGh3A== + +postcss-discard-overridden@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/postcss-discard-overridden/-/postcss-discard-overridden-5.1.0.tgz#7e8c5b53325747e9d90131bb88635282fb4a276e" + integrity sha512-21nOL7RqWR1kasIVdKs8HNqQJhFxLsyRfAnUDm4Fe4t4mCWL9OJiHvlHPjcd8zc5Myu89b/7wZDnOSjFgeWRtw== + +postcss-discard-unused@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/postcss-discard-unused/-/postcss-discard-unused-5.1.0.tgz#8974e9b143d887677304e558c1166d3762501142" + integrity sha512-KwLWymI9hbwXmJa0dkrzpRbSJEh0vVUd7r8t0yOGPcfKzyJJxFM8kLyC5Ev9avji6nY95pOp1W6HqIrfT+0VGw== + dependencies: + postcss-selector-parser "^6.0.5" + +postcss-loader@^7.0.0, postcss-loader@^7.3.3: + version "7.3.4" + resolved "https://registry.yarnpkg.com/postcss-loader/-/postcss-loader-7.3.4.tgz#aed9b79ce4ed7e9e89e56199d25ad1ec8f606209" + integrity sha512-iW5WTTBSC5BfsBJ9daFMPVrLT36MrNiC6fqOZTTaHjBNX6Pfd5p+hSBqe/fEeNd7pc13QiAyGt7VdGMw4eRC4A== + dependencies: + cosmiconfig "^8.3.5" + jiti "^1.20.0" + semver "^7.5.4" + +postcss-merge-idents@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/postcss-merge-idents/-/postcss-merge-idents-5.1.1.tgz#7753817c2e0b75d0853b56f78a89771e15ca04a1" + integrity sha512-pCijL1TREiCoog5nQp7wUe+TUonA2tC2sQ54UGeMmryK3UFGIYKqDyjnqd6RcuI4znFn9hWSLNN8xKE/vWcUQw== + dependencies: + cssnano-utils "^3.1.0" + postcss-value-parser "^4.2.0" + +postcss-merge-longhand@^5.1.7: + version "5.1.7" + resolved "https://registry.yarnpkg.com/postcss-merge-longhand/-/postcss-merge-longhand-5.1.7.tgz#24a1bdf402d9ef0e70f568f39bdc0344d568fb16" + integrity sha512-YCI9gZB+PLNskrK0BB3/2OzPnGhPkBEwmwhfYk1ilBHYVAZB7/tkTHFBAnCrvBBOmeYyMYw3DMjT55SyxMBzjQ== + dependencies: + postcss-value-parser "^4.2.0" + stylehacks "^5.1.1" + +postcss-merge-rules@^5.1.4: + version "5.1.4" + resolved "https://registry.yarnpkg.com/postcss-merge-rules/-/postcss-merge-rules-5.1.4.tgz#2f26fa5cacb75b1402e213789f6766ae5e40313c" + integrity sha512-0R2IuYpgU93y9lhVbO/OylTtKMVcHb67zjWIfCiKR9rWL3GUk1677LAqD/BcHizukdZEjT8Ru3oHRoAYoJy44g== + dependencies: + browserslist "^4.21.4" + caniuse-api "^3.0.0" + cssnano-utils "^3.1.0" + postcss-selector-parser "^6.0.5" + +postcss-minify-font-values@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/postcss-minify-font-values/-/postcss-minify-font-values-5.1.0.tgz#f1df0014a726083d260d3bd85d7385fb89d1f01b" + integrity sha512-el3mYTgx13ZAPPirSVsHqFzl+BBBDrXvbySvPGFnQcTI4iNslrPaFq4muTkLZmKlGk4gyFAYUBMH30+HurREyA== + dependencies: + postcss-value-parser "^4.2.0" + +postcss-minify-gradients@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/postcss-minify-gradients/-/postcss-minify-gradients-5.1.1.tgz#f1fe1b4f498134a5068240c2f25d46fcd236ba2c" + integrity sha512-VGvXMTpCEo4qHTNSa9A0a3D+dxGFZCYwR6Jokk+/3oB6flu2/PnPXAh2x7x52EkY5xlIHLm+Le8tJxe/7TNhzw== + dependencies: + colord "^2.9.1" + cssnano-utils "^3.1.0" + postcss-value-parser "^4.2.0" + +postcss-minify-params@^5.1.4: + version "5.1.4" + resolved "https://registry.yarnpkg.com/postcss-minify-params/-/postcss-minify-params-5.1.4.tgz#c06a6c787128b3208b38c9364cfc40c8aa5d7352" + integrity sha512-+mePA3MgdmVmv6g+30rn57USjOGSAyuxUmkfiWpzalZ8aiBkdPYjXWtHuwJGm1v5Ojy0Z0LaSYhHaLJQB0P8Jw== + dependencies: + browserslist "^4.21.4" + cssnano-utils "^3.1.0" + postcss-value-parser "^4.2.0" + +postcss-minify-selectors@^5.2.1: + version "5.2.1" + resolved "https://registry.yarnpkg.com/postcss-minify-selectors/-/postcss-minify-selectors-5.2.1.tgz#d4e7e6b46147b8117ea9325a915a801d5fe656c6" + integrity sha512-nPJu7OjZJTsVUmPdm2TcaiohIwxP+v8ha9NehQ2ye9szv4orirRU3SDdtUmKH+10nzn0bAyOXZ0UEr7OpvLehg== + dependencies: + postcss-selector-parser "^6.0.5" + +postcss-modules-extract-imports@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz#cda1f047c0ae80c97dbe28c3e76a43b88025741d" + integrity sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw== + +postcss-modules-local-by-default@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.3.tgz#b08eb4f083050708998ba2c6061b50c2870ca524" + integrity sha512-2/u2zraspoACtrbFRnTijMiQtb4GW4BvatjaG/bCjYQo8kLTdevCUlwuBHx2sCnSyrI3x3qj4ZK1j5LQBgzmwA== + dependencies: + icss-utils "^5.0.0" + postcss-selector-parser "^6.0.2" + postcss-value-parser "^4.1.0" + +postcss-modules-scope@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/postcss-modules-scope/-/postcss-modules-scope-3.1.0.tgz#fbfddfda93a31f310f1d152c2bb4d3f3c5592ee0" + integrity sha512-SaIbK8XW+MZbd0xHPf7kdfA/3eOt7vxJ72IRecn3EzuZVLr1r0orzf0MX/pN8m+NMDoo6X/SQd8oeKqGZd8PXg== + dependencies: + postcss-selector-parser "^6.0.4" + +postcss-modules-values@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz#d7c5e7e68c3bb3c9b27cbf48ca0bb3ffb4602c9c" + integrity sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ== + dependencies: + icss-utils "^5.0.0" + +postcss-normalize-charset@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/postcss-normalize-charset/-/postcss-normalize-charset-5.1.0.tgz#9302de0b29094b52c259e9b2cf8dc0879879f0ed" + integrity sha512-mSgUJ+pd/ldRGVx26p2wz9dNZ7ji6Pn8VWBajMXFf8jk7vUoSrZ2lt/wZR7DtlZYKesmZI680qjr2CeFF2fbUg== + +postcss-normalize-display-values@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/postcss-normalize-display-values/-/postcss-normalize-display-values-5.1.0.tgz#72abbae58081960e9edd7200fcf21ab8325c3da8" + integrity sha512-WP4KIM4o2dazQXWmFaqMmcvsKmhdINFblgSeRgn8BJ6vxaMyaJkwAzpPpuvSIoG/rmX3M+IrRZEz2H0glrQNEA== + dependencies: + postcss-value-parser "^4.2.0" + +postcss-normalize-positions@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/postcss-normalize-positions/-/postcss-normalize-positions-5.1.1.tgz#ef97279d894087b59325b45c47f1e863daefbb92" + integrity sha512-6UpCb0G4eofTCQLFVuI3EVNZzBNPiIKcA1AKVka+31fTVySphr3VUgAIULBhxZkKgwLImhzMR2Bw1ORK+37INg== + dependencies: + postcss-value-parser "^4.2.0" + +postcss-normalize-repeat-style@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-5.1.1.tgz#e9eb96805204f4766df66fd09ed2e13545420fb2" + integrity sha512-mFpLspGWkQtBcWIRFLmewo8aC3ImN2i/J3v8YCFUwDnPu3Xz4rLohDO26lGjwNsQxB3YF0KKRwspGzE2JEuS0g== + dependencies: + postcss-value-parser "^4.2.0" + +postcss-normalize-string@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/postcss-normalize-string/-/postcss-normalize-string-5.1.0.tgz#411961169e07308c82c1f8c55f3e8a337757e228" + integrity sha512-oYiIJOf4T9T1N4i+abeIc7Vgm/xPCGih4bZz5Nm0/ARVJ7K6xrDlLwvwqOydvyL3RHNf8qZk6vo3aatiw/go3w== + dependencies: + postcss-value-parser "^4.2.0" + +postcss-normalize-timing-functions@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-5.1.0.tgz#d5614410f8f0b2388e9f240aa6011ba6f52dafbb" + integrity sha512-DOEkzJ4SAXv5xkHl0Wa9cZLF3WCBhF3o1SKVxKQAa+0pYKlueTpCgvkFAHfk+Y64ezX9+nITGrDZeVGgITJXjg== + dependencies: + postcss-value-parser "^4.2.0" + +postcss-normalize-unicode@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/postcss-normalize-unicode/-/postcss-normalize-unicode-5.1.1.tgz#f67297fca3fea7f17e0d2caa40769afc487aa030" + integrity sha512-qnCL5jzkNUmKVhZoENp1mJiGNPcsJCs1aaRmURmeJGES23Z/ajaln+EPTD+rBeNkSryI+2WTdW+lwcVdOikrpA== + dependencies: + browserslist "^4.21.4" + postcss-value-parser "^4.2.0" + +postcss-normalize-url@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/postcss-normalize-url/-/postcss-normalize-url-5.1.0.tgz#ed9d88ca82e21abef99f743457d3729a042adcdc" + integrity sha512-5upGeDO+PVthOxSmds43ZeMeZfKH+/DKgGRD7TElkkyS46JXAUhMzIKiCa7BabPeIy3AQcTkXwVVN7DbqsiCew== + dependencies: + normalize-url "^6.0.1" + postcss-value-parser "^4.2.0" + +postcss-normalize-whitespace@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/postcss-normalize-whitespace/-/postcss-normalize-whitespace-5.1.1.tgz#08a1a0d1ffa17a7cc6efe1e6c9da969cc4493cfa" + integrity sha512-83ZJ4t3NUDETIHTa3uEg6asWjSBYL5EdkVB0sDncx9ERzOKBVJIUeDO9RyA9Zwtig8El1d79HBp0JEi8wvGQnA== + dependencies: + postcss-value-parser "^4.2.0" + +postcss-ordered-values@^5.1.3: + version "5.1.3" + resolved "https://registry.yarnpkg.com/postcss-ordered-values/-/postcss-ordered-values-5.1.3.tgz#b6fd2bd10f937b23d86bc829c69e7732ce76ea38" + integrity sha512-9UO79VUhPwEkzbb3RNpqqghc6lcYej1aveQteWY+4POIwlqkYE21HKWaLDF6lWNuqCobEAyTovVhtI32Rbv2RQ== + dependencies: + cssnano-utils "^3.1.0" + postcss-value-parser "^4.2.0" + +postcss-reduce-idents@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/postcss-reduce-idents/-/postcss-reduce-idents-5.2.0.tgz#c89c11336c432ac4b28792f24778859a67dfba95" + integrity sha512-BTrLjICoSB6gxbc58D5mdBK8OhXRDqud/zodYfdSi52qvDHdMwk+9kB9xsM8yJThH/sZU5A6QVSmMmaN001gIg== + dependencies: + postcss-value-parser "^4.2.0" + +postcss-reduce-initial@^5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/postcss-reduce-initial/-/postcss-reduce-initial-5.1.2.tgz#798cd77b3e033eae7105c18c9d371d989e1382d6" + integrity sha512-dE/y2XRaqAi6OvjzD22pjTUQ8eOfc6m/natGHgKFBK9DxFmIm69YmaRVQrGgFlEfc1HePIurY0TmDeROK05rIg== + dependencies: + browserslist "^4.21.4" + caniuse-api "^3.0.0" + +postcss-reduce-transforms@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/postcss-reduce-transforms/-/postcss-reduce-transforms-5.1.0.tgz#333b70e7758b802f3dd0ddfe98bb1ccfef96b6e9" + integrity sha512-2fbdbmgir5AvpW9RLtdONx1QoYG2/EtqpNQbFASDlixBbAYuTcJ0dECwlqNqH7VbaUnEnh8SrxOe2sRIn24XyQ== + dependencies: + postcss-value-parser "^4.2.0" + +postcss-selector-parser@^6.0.2, postcss-selector-parser@^6.0.4, postcss-selector-parser@^6.0.5, postcss-selector-parser@^6.0.9: + version "6.0.15" + resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.15.tgz#11cc2b21eebc0b99ea374ffb9887174855a01535" + integrity sha512-rEYkQOMUCEMhsKbK66tbEU9QVIxbhN18YiniAwA7XQYTVBqrBy+P2p5JcdqsHgKM2zWylp8d7J6eszocfds5Sw== + dependencies: + cssesc "^3.0.0" + util-deprecate "^1.0.2" + +postcss-sort-media-queries@^4.2.1, postcss-sort-media-queries@^4.4.1: + version "4.4.1" + resolved "https://registry.yarnpkg.com/postcss-sort-media-queries/-/postcss-sort-media-queries-4.4.1.tgz#04a5a78db3921eb78f28a1a781a2e68e65258128" + integrity sha512-QDESFzDDGKgpiIh4GYXsSy6sek2yAwQx1JASl5AxBtU1Lq2JfKBljIPNdil989NcSKRQX1ToiaKphImtBuhXWw== + dependencies: + sort-css-media-queries "2.1.0" + +postcss-svgo@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/postcss-svgo/-/postcss-svgo-5.1.0.tgz#0a317400ced789f233a28826e77523f15857d80d" + integrity sha512-D75KsH1zm5ZrHyxPakAxJWtkyXew5qwS70v56exwvw542d9CRtTo78K0WeFxZB4G7JXKKMbEZtZayTGdIky/eA== + dependencies: + postcss-value-parser "^4.2.0" + svgo "^2.7.0" + +postcss-unique-selectors@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/postcss-unique-selectors/-/postcss-unique-selectors-5.1.1.tgz#a9f273d1eacd09e9aa6088f4b0507b18b1b541b6" + integrity sha512-5JiODlELrz8L2HwxfPnhOWZYWDxVHWL83ufOv84NrcgipI7TaeRsatAhK4Tr2/ZiYldpK/wBvw5BD3qfaK96GA== + dependencies: + postcss-selector-parser "^6.0.5" + +postcss-value-parser@^4.0.2, postcss-value-parser@^4.1.0, postcss-value-parser@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz#723c09920836ba6d3e5af019f92bc0971c02e514" + integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ== + +postcss-zindex@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/postcss-zindex/-/postcss-zindex-5.1.0.tgz#4a5c7e5ff1050bd4c01d95b1847dfdcc58a496ff" + integrity sha512-fgFMf0OtVSBR1va1JNHYgMxYk73yhn/qb4uQDq1DLGYolz8gHCyr/sesEuGUaYs58E3ZJRcpoGuPVoB7Meiq9A== + +postcss@8.4.31: + version "8.4.31" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.31.tgz#92b451050a9f914da6755af352bdc0192508656d" + integrity sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ== + dependencies: + nanoid "^3.3.6" + picocolors "^1.0.0" + source-map-js "^1.0.2" + +postcss@^8.3.11, postcss@^8.4.14, postcss@^8.4.17, postcss@^8.4.21, postcss@^8.4.26: + version "8.4.32" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.32.tgz#1dac6ac51ab19adb21b8b34fd2d93a86440ef6c9" + integrity sha512-D/kj5JNu6oo2EIy+XL/26JEDTlIbB8hw85G8StOE6L74RQAVVP5rej6wxCNqyMbR4RkPfqvezVbPw81Ngd6Kcw== + dependencies: + nanoid "^3.3.7" + picocolors "^1.0.0" + source-map-js "^1.0.2" + +prepend-http@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-2.0.0.tgz#e92434bfa5ea8c19f41cdfd401d741a3c819d897" + integrity sha512-ravE6m9Atw9Z/jjttRUZ+clIXogdghyZAuWJ3qEzjT+jI/dL1ifAqhZeC5VHzQp1MSt1+jxKkFNemj/iO7tVUA== + +pretty-error@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/pretty-error/-/pretty-error-4.0.0.tgz#90a703f46dd7234adb46d0f84823e9d1cb8f10d6" + integrity sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw== + dependencies: + lodash "^4.17.20" + renderkid "^3.0.0" + +pretty-time@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/pretty-time/-/pretty-time-1.1.0.tgz#ffb7429afabb8535c346a34e41873adf3d74dd0e" + integrity sha512-28iF6xPQrP8Oa6uxE6a1biz+lWeTOAPKggvjB8HAs6nVMKZwf5bG++632Dx614hIWgUPkgivRfG+a8uAXGTIbA== + +prism-react-renderer@^1.3.5: + version "1.3.5" + resolved "https://registry.yarnpkg.com/prism-react-renderer/-/prism-react-renderer-1.3.5.tgz#786bb69aa6f73c32ba1ee813fbe17a0115435085" + integrity sha512-IJ+MSwBWKG+SM3b2SUfdrhC+gu01QkV2KmRQgREThBfSQRoufqRfxfHUxpG1WcaFjP+kojcFyO9Qqtpgt3qLCg== + +prismjs@^1.27.0, prismjs@^1.28.0: + version "1.29.0" + resolved "https://registry.yarnpkg.com/prismjs/-/prismjs-1.29.0.tgz#f113555a8fa9b57c35e637bba27509dcf802dd12" + integrity sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q== + +process-nextick-args@~2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" + integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== + +promise@^7.1.1: + version "7.3.1" + resolved "https://registry.yarnpkg.com/promise/-/promise-7.3.1.tgz#064b72602b18f90f29192b8b1bc418ffd1ebd3bf" + integrity sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg== + dependencies: + asap "~2.0.3" + +prompts@^2.4.2: + version "2.4.2" + resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.4.2.tgz#7b57e73b3a48029ad10ebd44f74b01722a4cb069" + integrity sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q== + dependencies: + kleur "^3.0.3" + sisteransi "^1.0.5" + +prop-types@^15.5.0, prop-types@^15.6.2, prop-types@^15.7.2: + version "15.8.1" + resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.8.1.tgz#67d87bf1a694f48435cf332c24af10214a3140b5" + integrity sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg== + dependencies: + loose-envify "^1.4.0" + object-assign "^4.1.1" + react-is "^16.13.1" + +property-information@^5.0.0, property-information@^5.3.0: + version "5.6.0" + resolved "https://registry.yarnpkg.com/property-information/-/property-information-5.6.0.tgz#61675545fb23002f245c6540ec46077d4da3ed69" + integrity sha512-YUHSPk+A30YPv+0Qf8i9Mbfe/C0hdPXk1s1jPVToV8pk8BQtpw10ct89Eo7OWkutrwqvT0eicAxlOg3dOAu8JA== + dependencies: + xtend "^4.0.0" + +property-information@^6.0.0: + version "6.4.0" + resolved "https://registry.yarnpkg.com/property-information/-/property-information-6.4.0.tgz#6bc4c618b0c2d68b3bb8b552cbb97f8e300a0f82" + integrity sha512-9t5qARVofg2xQqKtytzt+lZ4d1Qvj8t5B8fEwXK6qOfgRLgH/b13QlgEyDh033NOS31nXeFbYv7CLUDG1CeifQ== + +proto-list@~1.2.1: + version "1.2.4" + resolved "https://registry.yarnpkg.com/proto-list/-/proto-list-1.2.4.tgz#212d5bfe1318306a420f6402b8e26ff39647a849" + integrity sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA== + +proxy-addr@~2.0.7: + version "2.0.7" + resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.7.tgz#f19fe69ceab311eeb94b42e70e8c2070f9ba1025" + integrity sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg== + dependencies: + forwarded "0.2.0" + ipaddr.js "1.9.1" + +pump@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" + integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== + dependencies: + end-of-stream "^1.1.0" + once "^1.3.1" + +punycode@^1.3.2: + version "1.4.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" + integrity sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ== + +punycode@^2.1.0: + version "2.3.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.1.tgz#027422e2faec0b25e1549c3e1bd8309b9133b6e5" + integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg== + +pupa@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/pupa/-/pupa-2.1.1.tgz#f5e8fd4afc2c5d97828faa523549ed8744a20d62" + integrity sha512-l1jNAspIBSFqbT+y+5FosojNpVpF94nlI+wDUpqP9enwOTfHx9f0gh5nB96vl+6yTpsJsypeNrwfzPrKuHB41A== + dependencies: + escape-goat "^2.0.0" + +pupa@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/pupa/-/pupa-3.1.0.tgz#f15610274376bbcc70c9a3aa8b505ea23f41c579" + integrity sha512-FLpr4flz5xZTSJxSeaheeMKN/EDzMdK7b8PTOC6a5PYFKTucWbdqjgqaEyH0shFiSJrVB1+Qqi4Tk19ccU6Aug== + dependencies: + escape-goat "^4.0.0" + +pure-color@^1.2.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/pure-color/-/pure-color-1.3.0.tgz#1fe064fb0ac851f0de61320a8bf796836422f33e" + integrity sha512-QFADYnsVoBMw1srW7OVKEYjG+MbIa49s54w1MA1EDY6r2r/sTcKKYqRX1f4GYvnXP7eN/Pe9HFcX+hwzmrXRHA== + +qs@6.13.0: + version "6.13.0" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.13.0.tgz#6ca3bd58439f7e245655798997787b0d88a51906" + integrity sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg== + dependencies: + side-channel "^1.0.6" + +queue-microtask@^1.2.2: + version "1.2.3" + resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" + integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== + +queue@6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/queue/-/queue-6.0.2.tgz#b91525283e2315c7553d2efa18d83e76432fed65" + integrity sha512-iHZWu+q3IdFZFX36ro/lKBkSvfkztY5Y7HMiPlOUjhupPcG2JMfst2KKEpu5XndviX/3UhFbRngUPNKtgvtZiA== + dependencies: + inherits "~2.0.3" + +quick-lru@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-5.1.1.tgz#366493e6b3e42a3a6885e2e99d18f80fb7a8c932" + integrity sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA== + +randombytes@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" + integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== + dependencies: + safe-buffer "^5.1.0" + +range-parser@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.0.tgz#f49be6b487894ddc40dcc94a322f611092e00d5e" + integrity sha512-kA5WQoNVo4t9lNx2kQNFCxKeBl5IbbSNBl1M/tLkw9WCn+hxNBAW5Qh8gdhs63CJnhjJ2zQWFoqPJP2sK1AV5A== + +range-parser@^1.2.1, range-parser@~1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" + integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== + +raw-body@2.5.2: + version "2.5.2" + resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.5.2.tgz#99febd83b90e08975087e8f1f9419a149366b68a" + integrity sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA== + dependencies: + bytes "3.1.2" + http-errors "2.0.0" + iconv-lite "0.4.24" + unpipe "1.0.0" + +rc@1.2.8, rc@^1.2.8: + version "1.2.8" + resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" + integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw== + dependencies: + deep-extend "^0.6.0" + ini "~1.3.0" + minimist "^1.2.0" + strip-json-comments "~2.0.1" + +react-base16-styling@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/react-base16-styling/-/react-base16-styling-0.6.0.tgz#ef2156d66cf4139695c8a167886cb69ea660792c" + integrity sha512-yvh/7CArceR/jNATXOKDlvTnPKPmGZz7zsenQ3jUwLzHkNUR0CvY3yGYJbWJ/nnxsL8Sgmt5cO3/SILVuPO6TQ== + dependencies: + base16 "^1.0.0" + lodash.curry "^4.0.1" + lodash.flow "^3.3.0" + pure-color "^1.2.0" + +react-dev-utils@^12.0.1: + version "12.0.1" + resolved "https://registry.yarnpkg.com/react-dev-utils/-/react-dev-utils-12.0.1.tgz#ba92edb4a1f379bd46ccd6bcd4e7bc398df33e73" + integrity sha512-84Ivxmr17KjUupyqzFode6xKhjwuEJDROWKJy/BthkL7Wn6NJ8h4WE6k/exAv6ImS+0oZLRRW5j/aINMHyeGeQ== + dependencies: + "@babel/code-frame" "^7.16.0" + address "^1.1.2" + browserslist "^4.18.1" + chalk "^4.1.2" + cross-spawn "^7.0.3" + detect-port-alt "^1.1.6" + escape-string-regexp "^4.0.0" + filesize "^8.0.6" + find-up "^5.0.0" + fork-ts-checker-webpack-plugin "^6.5.0" + global-modules "^2.0.0" + globby "^11.0.4" + gzip-size "^6.0.0" + immer "^9.0.7" + is-root "^2.1.0" + loader-utils "^3.2.0" + open "^8.4.0" + pkg-up "^3.1.0" + prompts "^2.4.2" + react-error-overlay "^6.0.11" + recursive-readdir "^2.2.2" + shell-quote "^1.7.3" + strip-ansi "^6.0.1" + text-table "^0.2.0" + +react-dom@^18.3.1: + version "18.3.1" + resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-18.3.1.tgz#c2265d79511b57d479b3dd3fdfa51536494c5cb4" + integrity sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw== + dependencies: + loose-envify "^1.1.0" + scheduler "^0.23.2" + +react-error-overlay@^6.0.11: + version "6.0.11" + resolved "https://registry.yarnpkg.com/react-error-overlay/-/react-error-overlay-6.0.11.tgz#92835de5841c5cf08ba00ddd2d677b6d17ff9adb" + integrity sha512-/6UZ2qgEyH2aqzYZgQPxEnz33NJ2gNsnHA2o5+o4wW9bLM/JYQitNP9xPhsXwC08hMMovfGe/8retsdDsczPRg== + +react-fast-compare@^3.2.0, react-fast-compare@^3.2.2: + version "3.2.2" + resolved "https://registry.yarnpkg.com/react-fast-compare/-/react-fast-compare-3.2.2.tgz#929a97a532304ce9fee4bcae44234f1ce2c21d49" + integrity sha512-nsO+KSNgo1SbJqJEYRE9ERzo7YtYbou/OqjSQKxV7jcKox7+usiUVZOAC+XnDOABXggQTno0Y1CpVnuWEc1boQ== + +react-helmet-async@*: + version "2.0.4" + resolved "https://registry.yarnpkg.com/react-helmet-async/-/react-helmet-async-2.0.4.tgz#50a4377778f380ed1d0136303916b38eff1bf153" + integrity sha512-yxjQMWposw+akRfvpl5+8xejl4JtUlHnEBcji6u8/e6oc7ozT+P9PNTWMhCbz2y9tc5zPegw2BvKjQA+NwdEjQ== + dependencies: + invariant "^2.2.4" + react-fast-compare "^3.2.2" + shallowequal "^1.1.0" + +react-helmet-async@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/react-helmet-async/-/react-helmet-async-1.3.0.tgz#7bd5bf8c5c69ea9f02f6083f14ce33ef545c222e" + integrity sha512-9jZ57/dAn9t3q6hneQS0wukqC2ENOBgMNVEhb/ZG9ZSxUetzVIw4iAmEU38IaVg3QGYauQPhSeUTuIUtFglWpg== + dependencies: + "@babel/runtime" "^7.12.5" + invariant "^2.2.4" + prop-types "^15.7.2" + react-fast-compare "^3.2.0" + shallowequal "^1.1.0" + +react-is@^16.13.1, react-is@^16.6.0, react-is@^16.7.0: + version "16.13.1" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" + integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== + +react-json-view@^1.21.3: + version "1.21.3" + resolved "https://registry.yarnpkg.com/react-json-view/-/react-json-view-1.21.3.tgz#f184209ee8f1bf374fb0c41b0813cff54549c475" + integrity sha512-13p8IREj9/x/Ye4WI/JpjhoIwuzEgUAtgJZNBJckfzJt1qyh24BdTm6UQNGnyTq9dapQdrqvquZTo3dz1X6Cjw== + dependencies: + flux "^4.0.1" + react-base16-styling "^0.6.0" + react-lifecycles-compat "^3.0.4" + react-textarea-autosize "^8.3.2" + +react-lifecycles-compat@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz#4f1a273afdfc8f3488a8c516bfda78f872352362" + integrity sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA== + +react-loadable-ssr-addon-v5-slorber@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/react-loadable-ssr-addon-v5-slorber/-/react-loadable-ssr-addon-v5-slorber-1.0.1.tgz#2cdc91e8a744ffdf9e3556caabeb6e4278689883" + integrity sha512-lq3Lyw1lGku8zUEJPDxsNm1AfYHBrO9Y1+olAYwpUJ2IGFBskM0DMKok97A6LWUpHm+o7IvQBOWu9MLenp9Z+A== + dependencies: + "@babel/runtime" "^7.10.3" + +"react-loadable@npm:@docusaurus/react-loadable@5.5.2": + version "5.5.2" + resolved "https://registry.yarnpkg.com/@docusaurus/react-loadable/-/react-loadable-5.5.2.tgz#81aae0db81ecafbdaee3651f12804580868fa6ce" + integrity sha512-A3dYjdBGuy0IGT+wyLIGIKLRE+sAk1iNk0f1HjNDysO7u8lhL4N3VEm+FAubmJbAztn94F7MxBTPmnixbiyFdQ== + dependencies: + "@types/react" "*" + prop-types "^15.6.2" + +react-router-config@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/react-router-config/-/react-router-config-5.1.1.tgz#0f4263d1a80c6b2dc7b9c1902c9526478194a988" + integrity sha512-DuanZjaD8mQp1ppHjgnnUnyOlqYXZVjnov/JzFhjLEwd3Z4dYjMSnqrEzzGThH47vpCOqPPwJM2FtthLeJ8Pbg== + dependencies: + "@babel/runtime" "^7.1.2" + +react-router-dom@^5.3.3, react-router-dom@^5.3.4: + version "5.3.4" + resolved "https://registry.yarnpkg.com/react-router-dom/-/react-router-dom-5.3.4.tgz#2ed62ffd88cae6db134445f4a0c0ae8b91d2e5e6" + integrity sha512-m4EqFMHv/Ih4kpcBCONHbkT68KoAeHN4p3lAGoNryfHi0dMy0kCzEZakiKRsvg5wHZ/JLrLW8o8KomWiz/qbYQ== + dependencies: + "@babel/runtime" "^7.12.13" + history "^4.9.0" + loose-envify "^1.3.1" + prop-types "^15.6.2" + react-router "5.3.4" + tiny-invariant "^1.0.2" + tiny-warning "^1.0.0" + +react-router@5.3.4, react-router@^5.3.3, react-router@^5.3.4: + version "5.3.4" + resolved "https://registry.yarnpkg.com/react-router/-/react-router-5.3.4.tgz#8ca252d70fcc37841e31473c7a151cf777887bb5" + integrity sha512-Ys9K+ppnJah3QuaRiLxk+jDWOR1MekYQrlytiXxC1RyfbdsZkS5pvKAzCCr031xHixZwpnsYNT5xysdFHQaYsA== + dependencies: + "@babel/runtime" "^7.12.13" + history "^4.9.0" + hoist-non-react-statics "^3.1.0" + loose-envify "^1.3.1" + path-to-regexp "^1.7.0" + prop-types "^15.6.2" + react-is "^16.6.0" + tiny-invariant "^1.0.2" + tiny-warning "^1.0.0" + +react-tabs@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/react-tabs/-/react-tabs-4.3.0.tgz#9f4db0fd209ba4ab2c1e78993ff964435f84af62" + integrity sha512-2GfoG+f41kiBIIyd3gF+/GRCCYtamC8/2zlAcD8cqQmqI9Q+YVz7fJLHMmU9pXDVYYHpJeCgUSBJju85vu5q8Q== + dependencies: + clsx "^1.1.0" + prop-types "^15.5.0" + +react-textarea-autosize@^8.3.2: + version "8.5.3" + resolved "https://registry.yarnpkg.com/react-textarea-autosize/-/react-textarea-autosize-8.5.3.tgz#d1e9fe760178413891484847d3378706052dd409" + integrity sha512-XT1024o2pqCuZSuBt9FwHlaDeNtVrtCXu0Rnz88t1jUGheCLa3PhjE1GH8Ctm2axEtvdCl5SUHYschyQ0L5QHQ== + dependencies: + "@babel/runtime" "^7.20.13" + use-composed-ref "^1.3.0" + use-latest "^1.2.1" + +react@^18.3.1: + version "18.3.1" + resolved "https://registry.yarnpkg.com/react/-/react-18.3.1.tgz#49ab892009c53933625bd16b2533fc754cab2891" + integrity sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ== + dependencies: + loose-envify "^1.1.0" + +readable-stream@^2.0.1: + version "2.3.8" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.8.tgz#91125e8042bba1b9887f49345f6277027ce8be9b" + integrity sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA== + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.3" + isarray "~1.0.0" + process-nextick-args "~2.0.0" + safe-buffer "~5.1.1" + string_decoder "~1.1.1" + util-deprecate "~1.0.1" + +readable-stream@^3.0.6: + version "3.6.2" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967" + integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== + dependencies: + inherits "^2.0.3" + string_decoder "^1.1.1" + util-deprecate "^1.0.1" + +readdirp@~3.6.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" + integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== + dependencies: + picomatch "^2.2.1" + +reading-time@^1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/reading-time/-/reading-time-1.5.0.tgz#d2a7f1b6057cb2e169beaf87113cc3411b5bc5bb" + integrity sha512-onYyVhBNr4CmAxFsKS7bz+uTLRakypIe4R+5A824vBSkQy/hB3fZepoVEf8OVAxzLvK+H/jm9TzpI3ETSm64Kg== + +rechoir@^0.6.2: + version "0.6.2" + resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.6.2.tgz#85204b54dba82d5742e28c96756ef43af50e3384" + integrity sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw== + dependencies: + resolve "^1.1.6" + +recursive-readdir@^2.2.2: + version "2.2.3" + resolved "https://registry.yarnpkg.com/recursive-readdir/-/recursive-readdir-2.2.3.tgz#e726f328c0d69153bcabd5c322d3195252379372" + integrity sha512-8HrF5ZsXk5FAH9dgsx3BlUer73nIhuj+9OrQwEbLTPOBzGkL1lsFCR01am+v+0m2Cmbs1nP12hLDl5FA7EszKA== + dependencies: + minimatch "^3.0.5" + +redoc@2.1.3: + version "2.1.3" + resolved "https://registry.yarnpkg.com/redoc/-/redoc-2.1.3.tgz#612c9fed744993d5fc99cbf39fe9056bd1034fa5" + integrity sha512-d7F9qLLxaiFW4GC03VkwlX9wuRIpx9aiIIf3o6mzMnqPfhxrn2IRKGndrkJeVdItgCfmg9jXZiFEowm60f1meQ== + dependencies: + "@redocly/openapi-core" "^1.0.0-rc.2" + classnames "^2.3.1" + decko "^1.2.0" + dompurify "^2.2.8" + eventemitter3 "^4.0.7" + json-pointer "^0.6.2" + lunr "^2.3.9" + mark.js "^8.11.1" + marked "^4.0.15" + mobx-react "^7.2.0" + openapi-sampler "^1.3.1" + path-browserify "^1.0.1" + perfect-scrollbar "^1.5.5" + polished "^4.1.3" + prismjs "^1.27.0" + prop-types "^15.7.2" + react-tabs "^4.3.0" + slugify "~1.4.7" + stickyfill "^1.1.1" + swagger2openapi "^7.0.6" + url-template "^2.0.8" + +redocusaurus@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/redocusaurus/-/redocusaurus-2.0.2.tgz#8e4d7b3a1e4d32f3be6cbc6d218d11957eb0474d" + integrity sha512-o71XY24IkqCWVUF39UpVbklvKilbI5LfqPPeD5yhuaME87agsIHpRNdvifdPIK0oAQog4RMjDM+qMRqKUB414A== + dependencies: + docusaurus-plugin-redoc "2.0.2" + docusaurus-theme-redoc "2.0.2" + +reftools@^1.1.9: + version "1.1.9" + resolved "https://registry.yarnpkg.com/reftools/-/reftools-1.1.9.tgz#e16e19f662ccd4648605312c06d34e5da3a2b77e" + integrity sha512-OVede/NQE13xBQ+ob5CKd5KyeJYU2YInb1bmV4nRoOfquZPkAkxuOXicSe1PvqIuZZ4kD13sPKBbR7UFDmli6w== + +regenerate-unicode-properties@^10.1.0: + version "10.1.1" + resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.1.tgz#6b0e05489d9076b04c436f318d9b067bba459480" + integrity sha512-X007RyZLsCJVVrjgEFVpLUTZwyOZk3oiL75ZcuYjlIWd6rNJtOjkBwQc5AsRrpbKVkxN6sklw/k/9m2jJYOf8Q== + dependencies: + regenerate "^1.4.2" + +regenerate@^1.4.2: + version "1.4.2" + resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.2.tgz#b9346d8827e8f5a32f7ba29637d398b69014848a" + integrity sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A== + +regenerator-runtime@^0.14.0: + version "0.14.1" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz#356ade10263f685dda125100cd862c1db895327f" + integrity sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw== + +regenerator-transform@^0.15.2: + version "0.15.2" + resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.15.2.tgz#5bbae58b522098ebdf09bca2f83838929001c7a4" + integrity sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg== + dependencies: + "@babel/runtime" "^7.8.4" + +regexpu-core@^5.3.1: + version "5.3.2" + resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-5.3.2.tgz#11a2b06884f3527aec3e93dbbf4a3b958a95546b" + integrity sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ== + dependencies: + "@babel/regjsgen" "^0.8.0" + regenerate "^1.4.2" + regenerate-unicode-properties "^10.1.0" + regjsparser "^0.9.1" + unicode-match-property-ecmascript "^2.0.0" + unicode-match-property-value-ecmascript "^2.1.0" + +registry-auth-token@^4.0.0: + version "4.2.2" + resolved "https://registry.yarnpkg.com/registry-auth-token/-/registry-auth-token-4.2.2.tgz#f02d49c3668884612ca031419491a13539e21fac" + integrity sha512-PC5ZysNb42zpFME6D/XlIgtNGdTl8bBOCw90xQLVMpzuuubJKYDWFAEuUNc+Cn8Z8724tg2SDhDRrkVEsqfDMg== + dependencies: + rc "1.2.8" + +registry-auth-token@^5.0.1: + version "5.0.2" + resolved "https://registry.yarnpkg.com/registry-auth-token/-/registry-auth-token-5.0.2.tgz#8b026cc507c8552ebbe06724136267e63302f756" + integrity sha512-o/3ikDxtXaA59BmZuZrJZDJv8NMDGSj+6j6XaeBmHw8eY1i1qd9+6H+LjVvQXx3HN6aRCGa1cUdJ9RaJZUugnQ== + dependencies: + "@pnpm/npm-conf" "^2.1.0" + +registry-url@^5.0.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/registry-url/-/registry-url-5.1.0.tgz#e98334b50d5434b81136b44ec638d9c2009c5009" + integrity sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw== + dependencies: + rc "^1.2.8" + +registry-url@^6.0.0: + version "6.0.1" + resolved "https://registry.yarnpkg.com/registry-url/-/registry-url-6.0.1.tgz#056d9343680f2f64400032b1e199faa692286c58" + integrity sha512-+crtS5QjFRqFCoQmvGduwYWEBng99ZvmFvF+cUJkGYF1L1BfU8C6Zp9T7f5vPAwyLkUExpvK+ANVZmGU49qi4Q== + dependencies: + rc "1.2.8" + +regjsparser@^0.9.1: + version "0.9.1" + resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.9.1.tgz#272d05aa10c7c1f67095b1ff0addae8442fc5709" + integrity sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ== + dependencies: + jsesc "~0.5.0" + +rehype-raw@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/rehype-raw/-/rehype-raw-7.0.0.tgz#59d7348fd5dbef3807bbaa1d443efd2dd85ecee4" + integrity sha512-/aE8hCfKlQeA8LmyeyQvQF3eBiLRGNlfBJEvWH7ivp9sBqs7TNqBL5X3v157rM4IFETqDnIOO+z5M/biZbo9Ww== + dependencies: + "@types/hast" "^3.0.0" + hast-util-raw "^9.0.0" + vfile "^6.0.0" + +relateurl@^0.2.7: + version "0.2.7" + resolved "https://registry.yarnpkg.com/relateurl/-/relateurl-0.2.7.tgz#54dbf377e51440aca90a4cd274600d3ff2d888a9" + integrity sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog== + +remark-directive@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/remark-directive/-/remark-directive-3.0.0.tgz#34452d951b37e6207d2e2a4f830dc33442923268" + integrity sha512-l1UyWJ6Eg1VPU7Hm/9tt0zKtReJQNOA4+iDMAxTyZNWnJnFlbS/7zhiel/rogTLQ2vMYwDzSJa4BiVNqGlqIMA== + dependencies: + "@types/mdast" "^4.0.0" + mdast-util-directive "^3.0.0" + micromark-extension-directive "^3.0.0" + unified "^11.0.0" + +remark-emoji@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/remark-emoji/-/remark-emoji-2.2.0.tgz#1c702090a1525da5b80e15a8f963ef2c8236cac7" + integrity sha512-P3cj9s5ggsUvWw5fS2uzCHJMGuXYRb0NnZqYlNecewXt8QBU9n5vW3DUUKOhepS8F9CwdMx9B8a3i7pqFWAI5w== + dependencies: + emoticon "^3.2.0" + node-emoji "^1.10.0" + unist-util-visit "^2.0.3" + +remark-emoji@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/remark-emoji/-/remark-emoji-4.0.1.tgz#671bfda668047689e26b2078c7356540da299f04" + integrity sha512-fHdvsTR1dHkWKev9eNyhTo4EFwbUvJ8ka9SgeWkMPYFX4WoI7ViVBms3PjlQYgw5TLvNQso3GUB/b/8t3yo+dg== + dependencies: + "@types/mdast" "^4.0.2" + emoticon "^4.0.1" + mdast-util-find-and-replace "^3.0.1" + node-emoji "^2.1.0" + unified "^11.0.4" + +remark-footnotes@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/remark-footnotes/-/remark-footnotes-2.0.0.tgz#9001c4c2ffebba55695d2dd80ffb8b82f7e6303f" + integrity sha512-3Clt8ZMH75Ayjp9q4CorNeyjwIxHFcTkaektplKGl2A1jNGEUey8cKL0ZC5vJwfcD5GFGsNLImLG/NGzWIzoMQ== + +remark-frontmatter@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/remark-frontmatter/-/remark-frontmatter-5.0.0.tgz#b68d61552a421ec412c76f4f66c344627dc187a2" + integrity sha512-XTFYvNASMe5iPN0719nPrdItC9aU0ssC4v14mH1BCi1u0n1gAocqcujWUrByftZTbLhRtiKRyjYTSIOcr69UVQ== + dependencies: + "@types/mdast" "^4.0.0" + mdast-util-frontmatter "^2.0.0" + micromark-extension-frontmatter "^2.0.0" + unified "^11.0.0" + +remark-gfm@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/remark-gfm/-/remark-gfm-4.0.0.tgz#aea777f0744701aa288b67d28c43565c7e8c35de" + integrity sha512-U92vJgBPkbw4Zfu/IiW2oTZLSL3Zpv+uI7My2eq8JxKgqraFdU8YUGicEJCEgSbeaG+QDFqIcwwfMTOEelPxuA== + dependencies: + "@types/mdast" "^4.0.0" + mdast-util-gfm "^3.0.0" + micromark-extension-gfm "^3.0.0" + remark-parse "^11.0.0" + remark-stringify "^11.0.0" + unified "^11.0.0" + +remark-mdx@1.6.22: + version "1.6.22" + resolved "https://registry.yarnpkg.com/remark-mdx/-/remark-mdx-1.6.22.tgz#06a8dab07dcfdd57f3373af7f86bd0e992108bbd" + integrity sha512-phMHBJgeV76uyFkH4rvzCftLfKCr2RZuF+/gmVcaKrpsihyzmhXjA0BEMDaPTXG5y8qZOKPVo83NAOX01LPnOQ== + dependencies: + "@babel/core" "7.12.9" + "@babel/helper-plugin-utils" "7.10.4" + "@babel/plugin-proposal-object-rest-spread" "7.12.1" + "@babel/plugin-syntax-jsx" "7.12.1" + "@mdx-js/util" "1.6.22" + is-alphabetical "1.0.4" + remark-parse "8.0.3" + unified "9.2.0" + +remark-mdx@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/remark-mdx/-/remark-mdx-3.0.0.tgz#146905a3925b078970e05fc89b0e16b9cc3bfddd" + integrity sha512-O7yfjuC6ra3NHPbRVxfflafAj3LTwx3b73aBvkEFU5z4PsD6FD4vrqJAkE5iNGLz71GdjXfgRqm3SQ0h0VuE7g== + dependencies: + mdast-util-mdx "^3.0.0" + micromark-extension-mdxjs "^3.0.0" + +remark-parse@8.0.3: + version "8.0.3" + resolved "https://registry.yarnpkg.com/remark-parse/-/remark-parse-8.0.3.tgz#9c62aa3b35b79a486454c690472906075f40c7e1" + integrity sha512-E1K9+QLGgggHxCQtLt++uXltxEprmWzNfg+MxpfHsZlrddKzZ/hZyWHDbK3/Ap8HJQqYJRXP+jHczdL6q6i85Q== + dependencies: + ccount "^1.0.0" + collapse-white-space "^1.0.2" + is-alphabetical "^1.0.0" + is-decimal "^1.0.0" + is-whitespace-character "^1.0.0" + is-word-character "^1.0.0" + markdown-escapes "^1.0.0" + parse-entities "^2.0.0" + repeat-string "^1.5.4" + state-toggle "^1.0.0" + trim "0.0.1" + trim-trailing-lines "^1.0.0" + unherit "^1.0.4" + unist-util-remove-position "^2.0.0" + vfile-location "^3.0.0" + xtend "^4.0.1" + +remark-parse@^11.0.0: + version "11.0.0" + resolved "https://registry.yarnpkg.com/remark-parse/-/remark-parse-11.0.0.tgz#aa60743fcb37ebf6b069204eb4da304e40db45a1" + integrity sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA== + dependencies: + "@types/mdast" "^4.0.0" + mdast-util-from-markdown "^2.0.0" + micromark-util-types "^2.0.0" + unified "^11.0.0" + +remark-rehype@^11.0.0: + version "11.0.0" + resolved "https://registry.yarnpkg.com/remark-rehype/-/remark-rehype-11.0.0.tgz#7f21c08738bde024be5f16e4a8b13e5d7a04cf6b" + integrity sha512-vx8x2MDMcxuE4lBmQ46zYUDfcFMmvg80WYX+UNLeG6ixjdCCLcw1lrgAukwBTuOFsS78eoAedHGn9sNM0w7TPw== + dependencies: + "@types/hast" "^3.0.0" + "@types/mdast" "^4.0.0" + mdast-util-to-hast "^13.0.0" + unified "^11.0.0" + vfile "^6.0.0" + +remark-squeeze-paragraphs@4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/remark-squeeze-paragraphs/-/remark-squeeze-paragraphs-4.0.0.tgz#76eb0e085295131c84748c8e43810159c5653ead" + integrity sha512-8qRqmL9F4nuLPIgl92XUuxI3pFxize+F1H0e/W3llTk0UsjJaj01+RrirkMw7P21RKe4X6goQhYRSvNWX+70Rw== + dependencies: + mdast-squeeze-paragraphs "^4.0.0" + +remark-stringify@^11.0.0: + version "11.0.0" + resolved "https://registry.yarnpkg.com/remark-stringify/-/remark-stringify-11.0.0.tgz#4c5b01dd711c269df1aaae11743eb7e2e7636fd3" + integrity sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw== + dependencies: + "@types/mdast" "^4.0.0" + mdast-util-to-markdown "^2.0.0" + unified "^11.0.0" + +renderkid@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/renderkid/-/renderkid-3.0.0.tgz#5fd823e4d6951d37358ecc9a58b1f06836b6268a" + integrity sha512-q/7VIQA8lmM1hF+jn+sFSPWGlMkSAeNYcPLmDQx2zzuiDfaLrOmumR8iaUKlenFgh0XRPIUeSPlH3A+AW3Z5pg== + dependencies: + css-select "^4.1.3" + dom-converter "^0.2.0" + htmlparser2 "^6.1.0" + lodash "^4.17.21" + strip-ansi "^6.0.1" + +repeat-string@^1.5.4: + version "1.6.1" + resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" + integrity sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w== + +require-directory@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" + integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== + +require-from-string@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" + integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== + +"require-like@>= 0.1.1": + version "0.1.2" + resolved "https://registry.yarnpkg.com/require-like/-/require-like-0.1.2.tgz#ad6f30c13becd797010c468afa775c0c0a6b47fa" + integrity sha512-oyrU88skkMtDdauHDuKVrgR+zuItqr6/c//FXzvmxRGMexSDc6hNvJInGW3LL46n+8b50RykrvwSUIIQH2LQ5A== + +requires-port@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" + integrity sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ== + +resolve-alpn@^1.2.0: + version "1.2.1" + resolved "https://registry.yarnpkg.com/resolve-alpn/-/resolve-alpn-1.2.1.tgz#b7adbdac3546aaaec20b45e7d8265927072726f9" + integrity sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g== + +resolve-from@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" + integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== + +resolve-pathname@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/resolve-pathname/-/resolve-pathname-3.0.0.tgz#99d02224d3cf263689becbb393bc560313025dcd" + integrity sha512-C7rARubxI8bXFNB/hqcp/4iUeIXJhJZvFPFPiSPRnhU5UPxzMFIl+2E6yY6c4k9giDJAhtV+enfA+G89N6Csng== + +resolve@^1.1.6, resolve@^1.14.2, resolve@^1.3.2: + version "1.22.8" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.8.tgz#b6c87a9f2aa06dfab52e3d70ac8cde321fa5a48d" + integrity sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw== + dependencies: + is-core-module "^2.13.0" + path-parse "^1.0.7" + supports-preserve-symlinks-flag "^1.0.0" + +responselike@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/responselike/-/responselike-1.0.2.tgz#918720ef3b631c5642be068f15ade5a46f4ba1e7" + integrity sha512-/Fpe5guzJk1gPqdJLJR5u7eG/gNY4nImjbRDaVWVMRhne55TCmj2i9Q+54PBRfatRC8v/rIiv9BN0pMd9OV5EQ== + dependencies: + lowercase-keys "^1.0.0" + +responselike@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/responselike/-/responselike-3.0.0.tgz#20decb6c298aff0dbee1c355ca95461d42823626" + integrity sha512-40yHxbNcl2+rzXvZuVkrYohathsSJlMTXKryG5y8uciHv1+xDLHQpgjG64JUO9nrEq2jGLH6IZ8BcZyw3wrweg== + dependencies: + lowercase-keys "^3.0.0" + +retry@^0.13.1: + version "0.13.1" + resolved "https://registry.yarnpkg.com/retry/-/retry-0.13.1.tgz#185b1587acf67919d63b357349e03537b2484658" + integrity sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg== + +reusify@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" + integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== + +rimraf@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" + integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== + dependencies: + glob "^7.1.3" + +rtl-detect@^1.0.4: + version "1.1.2" + resolved "https://registry.yarnpkg.com/rtl-detect/-/rtl-detect-1.1.2.tgz#ca7f0330af5c6bb626c15675c642ba85ad6273c6" + integrity sha512-PGMBq03+TTG/p/cRB7HCLKJ1MgDIi07+QU1faSjiYRfmY5UsAttV9Hs08jDAHVwcOwmVLcSJkpwyfXszVjWfIQ== + +rtlcss@^3.5.0: + version "3.5.0" + resolved "https://registry.yarnpkg.com/rtlcss/-/rtlcss-3.5.0.tgz#c9eb91269827a102bac7ae3115dd5d049de636c3" + integrity sha512-wzgMaMFHQTnyi9YOwsx9LjOxYXJPzS8sYnFaKm6R5ysvTkwzHiB0vxnbHwchHQT65PTdBjDG21/kQBWI7q9O7A== + dependencies: + find-up "^5.0.0" + picocolors "^1.0.0" + postcss "^8.3.11" + strip-json-comments "^3.1.1" + +run-parallel@^1.1.9: + version "1.2.0" + resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" + integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== + dependencies: + queue-microtask "^1.2.2" + +rxjs@^7.5.4: + version "7.8.1" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-7.8.1.tgz#6f6f3d99ea8044291efd92e7c7fcf562c4057543" + integrity sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg== + dependencies: + tslib "^2.1.0" + +safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: + version "5.1.2" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" + integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== + +safe-buffer@5.2.1, safe-buffer@>=5.1.0, safe-buffer@^5.1.0, safe-buffer@~5.2.0: + version "5.2.1" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" + integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== + +"safer-buffer@>= 2.1.2 < 3", "safer-buffer@>= 2.1.2 < 3.0.0": + version "2.1.2" + resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" + integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== + +sax@^1.2.4: + version "1.3.0" + resolved "https://registry.yarnpkg.com/sax/-/sax-1.3.0.tgz#a5dbe77db3be05c9d1ee7785dbd3ea9de51593d0" + integrity sha512-0s+oAmw9zLl1V1cS9BtZN7JAd0cW5e0QH4W3LWEK6a4LaLEA2OTpGYWDY+6XasBLtz6wkm3u1xRw95mRuJ59WA== + +scheduler@^0.23.2: + version "0.23.2" + resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.23.2.tgz#414ba64a3b282892e944cf2108ecc078d115cdc3" + integrity sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ== + dependencies: + loose-envify "^1.1.0" + +schema-utils@2.7.0: + version "2.7.0" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-2.7.0.tgz#17151f76d8eae67fbbf77960c33c676ad9f4efc7" + integrity sha512-0ilKFI6QQF5nxDZLFn2dMjvc4hjg/Wkg7rHd3jK6/A4a1Hl9VFdQWvgB1UMGoU94pad1P/8N7fMcEnLnSiju8A== + dependencies: + "@types/json-schema" "^7.0.4" + ajv "^6.12.2" + ajv-keywords "^3.4.1" + +schema-utils@^2.6.5: + version "2.7.1" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-2.7.1.tgz#1ca4f32d1b24c590c203b8e7a50bf0ea4cd394d7" + integrity sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg== + dependencies: + "@types/json-schema" "^7.0.5" + ajv "^6.12.4" + ajv-keywords "^3.5.2" + +schema-utils@^3.0.0, schema-utils@^3.1.1, schema-utils@^3.2.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-3.3.0.tgz#f50a88877c3c01652a15b622ae9e9795df7a60fe" + integrity sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg== + dependencies: + "@types/json-schema" "^7.0.8" + ajv "^6.12.5" + ajv-keywords "^3.5.2" + +schema-utils@^4.0.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-4.2.0.tgz#70d7c93e153a273a805801882ebd3bff20d89c8b" + integrity sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw== + dependencies: + "@types/json-schema" "^7.0.9" + ajv "^8.9.0" + ajv-formats "^2.1.1" + ajv-keywords "^5.1.0" + +section-matter@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/section-matter/-/section-matter-1.0.0.tgz#e9041953506780ec01d59f292a19c7b850b84167" + integrity sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA== + dependencies: + extend-shallow "^2.0.1" + kind-of "^6.0.0" + +select-hose@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/select-hose/-/select-hose-2.0.0.tgz#625d8658f865af43ec962bfc376a37359a4994ca" + integrity sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg== + +selfsigned@^2.1.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/selfsigned/-/selfsigned-2.4.1.tgz#560d90565442a3ed35b674034cec4e95dceb4ae0" + integrity sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q== + dependencies: + "@types/node-forge" "^1.3.0" + node-forge "^1" + +semver-diff@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/semver-diff/-/semver-diff-3.1.1.tgz#05f77ce59f325e00e2706afd67bb506ddb1ca32b" + integrity sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg== + dependencies: + semver "^6.3.0" + +semver-diff@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/semver-diff/-/semver-diff-4.0.0.tgz#3afcf5ed6d62259f5c72d0d5d50dffbdc9680df5" + integrity sha512-0Ju4+6A8iOnpL/Thra7dZsSlOHYAHIeMxfhWQRI1/VLcT3WDBZKKtQt/QkBOsiIN9ZpuvHE6cGZ0x4glCMmfiA== + dependencies: + semver "^7.3.5" + +semver@^5.4.1: + version "5.7.2" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.2.tgz#48d55db737c3287cd4835e17fa13feace1c41ef8" + integrity sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g== + +semver@^6.0.0, semver@^6.2.0, semver@^6.3.0, semver@^6.3.1: + version "6.3.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" + integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== + +semver@^7.3.2, semver@^7.3.4, semver@^7.3.5, semver@^7.3.7, semver@^7.3.8, semver@^7.5.4: + version "7.5.4" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.4.tgz#483986ec4ed38e1c6c48c34894a9182dbff68a6e" + integrity sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA== + dependencies: + lru-cache "^6.0.0" + +send@0.19.0: + version "0.19.0" + resolved "https://registry.yarnpkg.com/send/-/send-0.19.0.tgz#bbc5a388c8ea6c048967049dbeac0e4a3f09d7f8" + integrity sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw== + dependencies: + debug "2.6.9" + depd "2.0.0" + destroy "1.2.0" + encodeurl "~1.0.2" + escape-html "~1.0.3" + etag "~1.8.1" + fresh "0.5.2" + http-errors "2.0.0" + mime "1.6.0" + ms "2.1.3" + on-finished "2.4.1" + range-parser "~1.2.1" + statuses "2.0.1" + +serialize-javascript@^6.0.0, serialize-javascript@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-6.0.1.tgz#b206efb27c3da0b0ab6b52f48d170b7996458e5c" + integrity sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w== + dependencies: + randombytes "^2.1.0" + +serve-handler@^6.1.3, serve-handler@^6.1.5: + version "6.1.5" + resolved "https://registry.yarnpkg.com/serve-handler/-/serve-handler-6.1.5.tgz#a4a0964f5c55c7e37a02a633232b6f0d6f068375" + 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.1.2" + path-is-inside "1.0.2" + path-to-regexp "2.2.1" + range-parser "1.2.0" + +serve-index@^1.9.1: + version "1.9.1" + resolved "https://registry.yarnpkg.com/serve-index/-/serve-index-1.9.1.tgz#d3768d69b1e7d82e5ce050fff5b453bea12a9239" + integrity sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw== + dependencies: + accepts "~1.3.4" + batch "0.6.1" + debug "2.6.9" + escape-html "~1.0.3" + http-errors "~1.6.2" + mime-types "~2.1.17" + parseurl "~1.3.2" + +serve-static@1.16.2: + version "1.16.2" + resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.16.2.tgz#b6a5343da47f6bdd2673848bf45754941e803296" + integrity sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw== + dependencies: + encodeurl "~2.0.0" + escape-html "~1.0.3" + parseurl "~1.3.3" + send "0.19.0" + +set-function-length@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/set-function-length/-/set-function-length-1.1.1.tgz#4bc39fafb0307224a33e106a7d35ca1218d659ed" + integrity sha512-VoaqjbBJKiWtg4yRcKBQ7g7wnGnLV3M8oLvVWwOk2PdYY6PEFegR1vezXR0tw6fZGF9csVakIRjrJiy2veSBFQ== + dependencies: + define-data-property "^1.1.1" + get-intrinsic "^1.2.1" + gopd "^1.0.1" + has-property-descriptors "^1.0.0" + +set-function-length@^1.2.1: + version "1.2.2" + resolved "https://registry.yarnpkg.com/set-function-length/-/set-function-length-1.2.2.tgz#aac72314198eaed975cf77b2c3b6b880695e5449" + integrity sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg== + dependencies: + define-data-property "^1.1.4" + es-errors "^1.3.0" + function-bind "^1.1.2" + get-intrinsic "^1.2.4" + gopd "^1.0.1" + has-property-descriptors "^1.0.2" + +setimmediate@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" + integrity sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA== + +setprototypeof@1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.0.tgz#d0bd85536887b6fe7c0d818cb962d9d91c54e656" + integrity sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ== + +setprototypeof@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424" + integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw== + +shallow-clone@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/shallow-clone/-/shallow-clone-3.0.1.tgz#8f2981ad92531f55035b01fb230769a40e02efa3" + integrity sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA== + dependencies: + kind-of "^6.0.2" + +shallowequal@1.1.0, shallowequal@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/shallowequal/-/shallowequal-1.1.0.tgz#188d521de95b9087404fd4dcb68b13df0ae4e7f8" + integrity sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ== + +shebang-command@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" + integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== + dependencies: + shebang-regex "^3.0.0" + +shebang-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" + integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== + +shell-quote@^1.7.3, shell-quote@^1.8.1: + version "1.8.1" + resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.8.1.tgz#6dbf4db75515ad5bac63b4f1894c3a154c766680" + integrity sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA== + +shelljs@^0.8.5: + version "0.8.5" + resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.8.5.tgz#de055408d8361bed66c669d2f000538ced8ee20c" + integrity sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow== + dependencies: + glob "^7.0.0" + interpret "^1.0.0" + rechoir "^0.6.2" + +should-equal@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/should-equal/-/should-equal-2.0.0.tgz#6072cf83047360867e68e98b09d71143d04ee0c3" + integrity sha512-ZP36TMrK9euEuWQYBig9W55WPC7uo37qzAEmbjHz4gfyuXrEUgF8cUvQVO+w+d3OMfPvSRQJ22lSm8MQJ43LTA== + dependencies: + should-type "^1.4.0" + +should-format@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/should-format/-/should-format-3.0.3.tgz#9bfc8f74fa39205c53d38c34d717303e277124f1" + integrity sha512-hZ58adtulAk0gKtua7QxevgUaXTTXxIi8t41L3zo9AHvjXO1/7sdLECuHeIN2SRtYXpNkmhoUP2pdeWgricQ+Q== + dependencies: + should-type "^1.3.0" + should-type-adaptors "^1.0.1" + +should-type-adaptors@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/should-type-adaptors/-/should-type-adaptors-1.1.0.tgz#401e7f33b5533033944d5cd8bf2b65027792e27a" + integrity sha512-JA4hdoLnN+kebEp2Vs8eBe9g7uy0zbRo+RMcU0EsNy+R+k049Ki+N5tT5Jagst2g7EAja+euFuoXFCa8vIklfA== + dependencies: + should-type "^1.3.0" + should-util "^1.0.0" + +should-type@^1.3.0, should-type@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/should-type/-/should-type-1.4.0.tgz#0756d8ce846dfd09843a6947719dfa0d4cff5cf3" + integrity sha512-MdAsTu3n25yDbIe1NeN69G4n6mUnJGtSJHygX3+oN0ZbO3DTiATnf7XnYJdGT42JCXurTb1JI0qOBR65shvhPQ== + +should-util@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/should-util/-/should-util-1.0.1.tgz#fb0d71338f532a3a149213639e2d32cbea8bcb28" + integrity sha512-oXF8tfxx5cDk8r2kYqlkUJzZpDBqVY/II2WhvU0n9Y3XYvAYRmeaf1PvvIvTgPnv4KJ+ES5M0PyDq5Jp+Ygy2g== + +should@^13.2.1: + version "13.2.3" + resolved "https://registry.yarnpkg.com/should/-/should-13.2.3.tgz#96d8e5acf3e97b49d89b51feaa5ae8d07ef58f10" + integrity sha512-ggLesLtu2xp+ZxI+ysJTmNjh2U0TsC+rQ/pfED9bUZZ4DKefP27D+7YJVVTvKsmjLpIi9jAa7itwDGkDDmt1GQ== + dependencies: + should-equal "^2.0.0" + should-format "^3.0.3" + should-type "^1.4.0" + should-type-adaptors "^1.0.1" + should-util "^1.0.0" + +side-channel@^1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.6.tgz#abd25fb7cd24baf45466406b1096b7831c9215f2" + integrity sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA== + dependencies: + call-bind "^1.0.7" + es-errors "^1.3.0" + get-intrinsic "^1.2.4" + object-inspect "^1.13.1" + +signal-exit@^3.0.2, signal-exit@^3.0.3: + version "3.0.7" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" + integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== + +sirv@^2.0.3: + version "2.0.4" + resolved "https://registry.yarnpkg.com/sirv/-/sirv-2.0.4.tgz#5dd9a725c578e34e449f332703eb2a74e46a29b0" + integrity sha512-94Bdh3cC2PKrbgSOUqTiGPWVZeSiXfKOVZNJniWoqrWrRkB1CJzBU3NEbiTsPcYy1lDsANA/THzS+9WBiy5nfQ== + dependencies: + "@polka/url" "^1.0.0-next.24" + mrmime "^2.0.0" + totalist "^3.0.0" + +sisteransi@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-1.0.5.tgz#134d681297756437cc05ca01370d3a7a571075ed" + integrity sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg== + +sitemap@^7.1.1: + version "7.1.1" + resolved "https://registry.yarnpkg.com/sitemap/-/sitemap-7.1.1.tgz#eeed9ad6d95499161a3eadc60f8c6dce4bea2bef" + integrity sha512-mK3aFtjz4VdJN0igpIJrinf3EO8U8mxOPsTBzSsy06UtjZQJ3YY3o3Xa7zSc5nMqcMrRwlChHZ18Kxg0caiPBg== + dependencies: + "@types/node" "^17.0.5" + "@types/sax" "^1.2.1" + arg "^5.0.0" + sax "^1.2.4" + +skin-tone@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/skin-tone/-/skin-tone-2.0.0.tgz#4e3933ab45c0d4f4f781745d64b9f4c208e41237" + integrity sha512-kUMbT1oBJCpgrnKoSr0o6wPtvRWT9W9UKvGLwfJYO2WuahZRHOpEyL1ckyMGgMWh0UdpmaoFqKKD29WTomNEGA== + dependencies: + unicode-emoji-modifier-base "^1.0.0" + +slash@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" + integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== + +slash@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-4.0.0.tgz#2422372176c4c6c5addb5e2ada885af984b396a7" + integrity sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew== + +slugify@~1.4.7: + version "1.4.7" + resolved "https://registry.yarnpkg.com/slugify/-/slugify-1.4.7.tgz#e42359d505afd84a44513280868e31202a79a628" + integrity sha512-tf+h5W1IrjNm/9rKKj0JU2MDMruiopx0jjVA5zCdBtcGjfp0+c5rHw/zADLC3IeKlGHtVbHtpfzvYA0OYT+HKg== + +snake-case@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/snake-case/-/snake-case-3.0.4.tgz#4f2bbd568e9935abdfd593f34c691dadb49c452c" + integrity sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg== + dependencies: + dot-case "^3.0.4" + tslib "^2.0.3" + +sockjs@^0.3.24: + version "0.3.24" + resolved "https://registry.yarnpkg.com/sockjs/-/sockjs-0.3.24.tgz#c9bc8995f33a111bea0395ec30aa3206bdb5ccce" + integrity sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ== + dependencies: + faye-websocket "^0.11.3" + uuid "^8.3.2" + websocket-driver "^0.7.4" + +sort-css-media-queries@2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/sort-css-media-queries/-/sort-css-media-queries-2.1.0.tgz#7c85e06f79826baabb232f5560e9745d7a78c4ce" + integrity sha512-IeWvo8NkNiY2vVYdPa27MCQiR0MN0M80johAYFVxWWXQ44KU84WNxjslwBHmc/7ZL2ccwkM7/e6S5aiKZXm7jA== + +source-map-js@^1.0.1, source-map-js@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.0.2.tgz#adbc361d9c62df380125e7f161f71c826f1e490c" + integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw== + +source-map-support@~0.5.20: + version "0.5.21" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f" + integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== + dependencies: + buffer-from "^1.0.0" + source-map "^0.6.0" + +source-map@^0.5.0: + version "0.5.7" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" + integrity sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ== + +source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.0: + version "0.6.1" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" + integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== + +source-map@^0.7.0: + version "0.7.4" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.7.4.tgz#a9bbe705c9d8846f4e08ff6765acf0f1b0898656" + integrity sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA== + +space-separated-tokens@^1.0.0: + version "1.1.5" + resolved "https://registry.yarnpkg.com/space-separated-tokens/-/space-separated-tokens-1.1.5.tgz#85f32c3d10d9682007e917414ddc5c26d1aa6899" + integrity sha512-q/JSVd1Lptzhf5bkYm4ob4iWPjx0KiRe3sRFBNrVqbJkFaBm5vbbowy1mymoPNLRa52+oadOhJ+K49wsSeSjTA== + +space-separated-tokens@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz#1ecd9d2350a3844572c3f4a312bceb018348859f" + integrity sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q== + +spdy-transport@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/spdy-transport/-/spdy-transport-3.0.0.tgz#00d4863a6400ad75df93361a1608605e5dcdcf31" + integrity sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw== + dependencies: + debug "^4.1.0" + detect-node "^2.0.4" + hpack.js "^2.1.6" + obuf "^1.1.2" + readable-stream "^3.0.6" + wbuf "^1.7.3" + +spdy@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/spdy/-/spdy-4.0.2.tgz#b74f466203a3eda452c02492b91fb9e84a27677b" + integrity sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA== + dependencies: + debug "^4.1.0" + handle-thing "^2.0.0" + http-deceiver "^1.2.7" + select-hose "^2.0.0" + spdy-transport "^3.0.0" + +sprintf-js@~1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" + integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g== + +stable@^0.1.8: + version "0.1.8" + resolved "https://registry.yarnpkg.com/stable/-/stable-0.1.8.tgz#836eb3c8382fe2936feaf544631017ce7d47a3cf" + integrity sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w== + +state-toggle@^1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/state-toggle/-/state-toggle-1.0.3.tgz#e123b16a88e143139b09c6852221bc9815917dfe" + integrity sha512-d/5Z4/2iiCnHw6Xzghyhb+GcmF89bxwgXG60wjIiZaxnymbyOmI8Hk4VqHXiVVp6u2ysaskFfXg3ekCj4WNftQ== + +statuses@2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.1.tgz#55cb000ccf1d48728bd23c685a063998cf1a1b63" + integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== + +"statuses@>= 1.4.0 < 2": + version "1.5.0" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" + integrity sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA== + +std-env@^3.0.1: + version "3.7.0" + resolved "https://registry.yarnpkg.com/std-env/-/std-env-3.7.0.tgz#c9f7386ced6ecf13360b6c6c55b8aaa4ef7481d2" + integrity sha512-JPbdCEQLj1w5GilpiHAx3qJvFndqybBysA3qUOnznweH4QbNYUsW/ea8QzSrnh0vNsezMMw5bcVool8lM0gwzg== + +stickyfill@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/stickyfill/-/stickyfill-1.1.1.tgz#39413fee9d025c74a7e59ceecb23784cc0f17f02" + integrity sha512-GCp7vHAfpao+Qh/3Flh9DXEJ/qSi0KJwJw6zYlZOtRYXWUIpMM6mC2rIep/dK8RQqwW0KxGJIllmjPIBOGN8AA== + +string-width@^4.0.0, string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.2, string-width@^4.2.3: + version "4.2.3" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" + +string-width@^5.0.1, string-width@^5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-5.1.2.tgz#14f8daec6d81e7221d2a357e668cab73bdbca794" + integrity sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA== + dependencies: + eastasianwidth "^0.2.0" + emoji-regex "^9.2.2" + strip-ansi "^7.0.1" + +string_decoder@^1.1.1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" + integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== + dependencies: + safe-buffer "~5.2.0" + +string_decoder@~1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" + integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== + dependencies: + safe-buffer "~5.1.0" + +stringify-entities@^4.0.0: + version "4.0.3" + resolved "https://registry.yarnpkg.com/stringify-entities/-/stringify-entities-4.0.3.tgz#cfabd7039d22ad30f3cc435b0ca2c1574fc88ef8" + integrity sha512-BP9nNHMhhfcMbiuQKCqMjhDP5yBCAxsPu4pHFFzJ6Alo9dZgY4VLDPutXqIjpRiMoKdp7Av85Gr73Q5uH9k7+g== + dependencies: + character-entities-html4 "^2.0.0" + character-entities-legacy "^3.0.0" + +stringify-object@^3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/stringify-object/-/stringify-object-3.3.0.tgz#703065aefca19300d3ce88af4f5b3956d7556629" + integrity sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw== + dependencies: + get-own-enumerable-property-symbols "^3.0.0" + is-obj "^1.0.1" + is-regexp "^1.0.0" + +strip-ansi@^6.0.0, strip-ansi@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" + +strip-ansi@^7.0.1: + version "7.1.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.1.0.tgz#d5b6568ca689d8561370b0707685d22434faff45" + integrity sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ== + dependencies: + ansi-regex "^6.0.1" + +strip-bom-string@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/strip-bom-string/-/strip-bom-string-1.0.0.tgz#e5211e9224369fbb81d633a2f00044dc8cedad92" + integrity sha512-uCC2VHvQRYu+lMh4My/sFNmF2klFymLX1wHJeXnbEJERpV/ZsVuonzerjfrGpIGF7LBVa1O7i9kjiWvJiFck8g== + +strip-final-newline@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" + integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== + +strip-json-comments@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" + integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== + +strip-json-comments@~2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" + integrity sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ== + +style-to-object@0.3.0, style-to-object@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/style-to-object/-/style-to-object-0.3.0.tgz#b1b790d205991cc783801967214979ee19a76e46" + integrity sha512-CzFnRRXhzWIdItT3OmF8SQfWyahHhjq3HwcMNCNLn+N7klOOqPjMeG/4JSu77D7ypZdGvSzvkrbyeTMizz2VrA== + dependencies: + inline-style-parser "0.1.1" + +style-to-object@^0.4.0: + version "0.4.4" + resolved "https://registry.yarnpkg.com/style-to-object/-/style-to-object-0.4.4.tgz#266e3dfd56391a7eefb7770423612d043c3f33ec" + integrity sha512-HYNoHZa2GorYNyqiCaBgsxvcJIn7OHq6inEga+E6Ke3m5JkoqpQbnFssk4jwe+K7AhGa2fcha4wSOf1Kn01dMg== + dependencies: + inline-style-parser "0.1.1" + +style-to-object@^1.0.0: + version "1.0.5" + resolved "https://registry.yarnpkg.com/style-to-object/-/style-to-object-1.0.5.tgz#5e918349bc3a39eee3a804497d97fcbbf2f0d7c0" + integrity sha512-rDRwHtoDD3UMMrmZ6BzOW0naTjMsVZLIjsGleSKS/0Oz+cgCfAPRspaqJuE8rDzpKha/nEvnM0IF4seEAZUTKQ== + dependencies: + inline-style-parser "0.2.2" + +styled-components@^6.0.5: + version "6.1.8" + resolved "https://registry.yarnpkg.com/styled-components/-/styled-components-6.1.8.tgz#c109d36aeea52d8f049e12de2f3be39a6fc86201" + integrity sha512-PQ6Dn+QxlWyEGCKDS71NGsXoVLKfE1c3vApkvDYS5KAK+V8fNWGhbSUEo9Gg2iaID2tjLXegEW3bZDUGpofRWw== + dependencies: + "@emotion/is-prop-valid" "1.2.1" + "@emotion/unitless" "0.8.0" + "@types/stylis" "4.2.0" + css-to-react-native "3.2.0" + csstype "3.1.2" + postcss "8.4.31" + shallowequal "1.1.0" + stylis "4.3.1" + tslib "2.5.0" + +stylehacks@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/stylehacks/-/stylehacks-5.1.1.tgz#7934a34eb59d7152149fa69d6e9e56f2fc34bcc9" + integrity sha512-sBpcd5Hx7G6seo7b1LkpttvTz7ikD0LlH5RmdcBNb6fFR0Fl7LQwHDFr300q4cwUqi+IYrFGmsIHieMBfnN/Bw== + dependencies: + browserslist "^4.21.4" + postcss-selector-parser "^6.0.4" + +stylis@4.3.1: + version "4.3.1" + resolved "https://registry.yarnpkg.com/stylis/-/stylis-4.3.1.tgz#ed8a9ebf9f76fe1e12d462f5cc3c4c980b23a7eb" + integrity sha512-EQepAV+wMsIaGVGX1RECzgrcqRRU/0sYOHkeLsZ3fzHaHXZy4DaOOX0vOlGQdlsjkh3mFHAIlVimpwAs4dslyQ== + +supports-color@^5.3.0: + version "5.5.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" + integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== + dependencies: + has-flag "^3.0.0" + +supports-color@^7.1.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" + integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== + dependencies: + has-flag "^4.0.0" + +supports-color@^8.0.0: + version "8.1.1" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" + integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== + dependencies: + has-flag "^4.0.0" + +supports-preserve-symlinks-flag@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" + integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== + +svg-parser@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/svg-parser/-/svg-parser-2.0.4.tgz#fdc2e29e13951736140b76cb122c8ee6630eb6b5" + integrity sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ== + +svgo@^2.7.0, svgo@^2.8.0: + version "2.8.0" + resolved "https://registry.yarnpkg.com/svgo/-/svgo-2.8.0.tgz#4ff80cce6710dc2795f0c7c74101e6764cfccd24" + integrity sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg== + dependencies: + "@trysound/sax" "0.2.0" + commander "^7.2.0" + css-select "^4.1.3" + css-tree "^1.1.3" + csso "^4.2.0" + picocolors "^1.0.0" + stable "^0.1.8" + +svgo@^3.0.2: + version "3.2.0" + resolved "https://registry.yarnpkg.com/svgo/-/svgo-3.2.0.tgz#7a5dff2938d8c6096e00295c2390e8e652fa805d" + integrity sha512-4PP6CMW/V7l/GmKRKzsLR8xxjdHTV4IMvhTnpuHwwBazSIlw5W/5SmPjN8Dwyt7lKbSJrRDgp4t9ph0HgChFBQ== + dependencies: + "@trysound/sax" "0.2.0" + commander "^7.2.0" + css-select "^5.1.0" + css-tree "^2.3.1" + css-what "^6.1.0" + csso "^5.0.5" + picocolors "^1.0.0" + +swagger2openapi@^7.0.6: + version "7.0.8" + resolved "https://registry.yarnpkg.com/swagger2openapi/-/swagger2openapi-7.0.8.tgz#12c88d5de776cb1cbba758994930f40ad0afac59" + integrity sha512-upi/0ZGkYgEcLeGieoz8gT74oWHA0E7JivX7aN9mAf+Tc7BQoRBvnIGHoPDw+f9TXTW4s6kGYCZJtauP6OYp7g== + dependencies: + call-me-maybe "^1.0.1" + node-fetch "^2.6.1" + node-fetch-h2 "^2.3.0" + node-readfiles "^0.2.0" + oas-kit-common "^1.0.8" + oas-resolver "^2.5.6" + oas-schema-walker "^1.1.5" + oas-validator "^5.0.8" + reftools "^1.1.9" + yaml "^1.10.0" + yargs "^17.0.1" + +tapable@^1.0.0: + version "1.1.3" + resolved "https://registry.yarnpkg.com/tapable/-/tapable-1.1.3.tgz#a1fccc06b58db61fd7a45da2da44f5f3a3e67ba2" + integrity sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA== + +tapable@^2.0.0, tapable@^2.1.1, tapable@^2.2.0: + version "2.2.1" + resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.2.1.tgz#1967a73ef4060a82f12ab96af86d52fdb76eeca0" + integrity sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ== + +terser-webpack-plugin@^5.3.10, terser-webpack-plugin@^5.3.3, terser-webpack-plugin@^5.3.9: + version "5.3.10" + resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-5.3.10.tgz#904f4c9193c6fd2a03f693a2150c62a92f40d199" + integrity sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w== + dependencies: + "@jridgewell/trace-mapping" "^0.3.20" + jest-worker "^27.4.5" + schema-utils "^3.1.1" + serialize-javascript "^6.0.1" + terser "^5.26.0" + +terser@^5.10.0, terser@^5.15.1, terser@^5.26.0: + version "5.26.0" + resolved "https://registry.yarnpkg.com/terser/-/terser-5.26.0.tgz#ee9f05d929f4189a9c28a0feb889d96d50126fe1" + integrity sha512-dytTGoE2oHgbNV9nTzgBEPaqAWvcJNl66VZ0BkJqlvp71IjO8CxdBx/ykCNb47cLnCmCvRZ6ZR0tLkqvZCdVBQ== + dependencies: + "@jridgewell/source-map" "^0.3.3" + acorn "^8.8.2" + commander "^2.20.0" + source-map-support "~0.5.20" + +text-table@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" + integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== + +thunky@^1.0.2: + version "1.1.0" + resolved "https://registry.yarnpkg.com/thunky/-/thunky-1.1.0.tgz#5abaf714a9405db0504732bbccd2cedd9ef9537d" + integrity sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA== + +tiny-invariant@^1.0.2: + version "1.3.1" + resolved "https://registry.yarnpkg.com/tiny-invariant/-/tiny-invariant-1.3.1.tgz#8560808c916ef02ecfd55e66090df23a4b7aa642" + integrity sha512-AD5ih2NlSssTCwsMznbvwMZpJ1cbhkGd2uueNxzv2jDlEeZdU04JQfRnggJQ8DrcVBGjAsCKwFBbDlVNtEMlzw== + +tiny-warning@^1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/tiny-warning/-/tiny-warning-1.0.3.tgz#94a30db453df4c643d0fd566060d60a875d84754" + integrity sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA== + +to-fast-properties@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" + integrity sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog== + +to-readable-stream@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/to-readable-stream/-/to-readable-stream-1.0.0.tgz#ce0aa0c2f3df6adf852efb404a783e77c0475771" + integrity sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q== + +to-regex-range@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" + integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== + dependencies: + is-number "^7.0.0" + +toidentifier@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.1.tgz#3be34321a88a820ed1bd80dfaa33e479fbb8dd35" + integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== + +totalist@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/totalist/-/totalist-3.0.1.tgz#ba3a3d600c915b1a97872348f79c127475f6acf8" + integrity sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ== + +tr46@~0.0.3: + version "0.0.3" + resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" + integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== + +trim-lines@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/trim-lines/-/trim-lines-3.0.1.tgz#d802e332a07df861c48802c04321017b1bd87338" + integrity sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg== + +trim-trailing-lines@^1.0.0: + version "1.1.4" + resolved "https://registry.yarnpkg.com/trim-trailing-lines/-/trim-trailing-lines-1.1.4.tgz#bd4abbec7cc880462f10b2c8b5ce1d8d1ec7c2c0" + integrity sha512-rjUWSqnfTNrjbB9NQWfPMH/xRK1deHeGsHoVfpxJ++XeYXE0d6B1En37AHfw3jtfTU7dzMzZL2jjpe8Qb5gLIQ== + +trim@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/trim/-/trim-0.0.1.tgz#5858547f6b290757ee95cccc666fb50084c460dd" + integrity sha512-YzQV+TZg4AxpKxaTHK3c3D+kRDCGVEE7LemdlQZoQXn0iennk10RsIoY6ikzAqJTc9Xjl9C1/waHom/J86ziAQ== + +trough@^1.0.0: + version "1.0.5" + resolved "https://registry.yarnpkg.com/trough/-/trough-1.0.5.tgz#b8b639cefad7d0bb2abd37d433ff8293efa5f406" + integrity sha512-rvuRbTarPXmMb79SmzEp8aqXNKcK+y0XaB298IXueQ8I2PsrATcPBCSPyK/dDNa2iWOhKlfNnOjdAOTBU/nkFA== + +trough@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/trough/-/trough-2.1.0.tgz#0f7b511a4fde65a46f18477ab38849b22c554876" + integrity sha512-AqTiAOLcj85xS7vQ8QkAV41hPDIJ71XJB4RCUrzo/1GM2CQwhkJGaf9Hgr7BOugMRpgGUrqRg/DrBDl4H40+8g== + +tslib@2.5.0: + version "2.5.0" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.5.0.tgz#42bfed86f5787aeb41d031866c8f402429e0fddf" + integrity sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg== + +tslib@^2.0.3, tslib@^2.1.0, tslib@^2.4.0, tslib@^2.6.0: + version "2.6.2" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.2.tgz#703ac29425e7b37cd6fd456e92404d46d1f3e4ae" + integrity sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q== + +type-fest@^0.20.2: + version "0.20.2" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" + integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== + +type-fest@^1.0.1: + version "1.4.0" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-1.4.0.tgz#e9fb813fe3bf1744ec359d55d1affefa76f14be1" + integrity sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA== + +type-fest@^2.13.0, type-fest@^2.5.0: + version "2.19.0" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-2.19.0.tgz#88068015bb33036a598b952e55e9311a60fd3a9b" + integrity sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA== + +type-is@~1.6.18: + version "1.6.18" + resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" + integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== + dependencies: + media-typer "0.3.0" + mime-types "~2.1.24" + +typedarray-to-buffer@^3.1.5: + version "3.1.5" + resolved "https://registry.yarnpkg.com/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz#a97ee7a9ff42691b9f783ff1bc5112fe3fca9080" + integrity sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q== + dependencies: + is-typedarray "^1.0.0" + +ua-parser-js@^1.0.35: + version "1.0.37" + resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-1.0.37.tgz#b5dc7b163a5c1f0c510b08446aed4da92c46373f" + integrity sha512-bhTyI94tZofjo+Dn8SN6Zv8nBDvyXTymAdM3LDI/0IboIUwTu1rEhW7v2TfiVsoYWgkQ4kOVqnI8APUFbIQIFQ== + +undici-types@~5.26.4: + version "5.26.5" + resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-5.26.5.tgz#bcd539893d00b56e964fd2657a4866b221a65617" + integrity sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA== + +undici@^6.19.5: + version "6.19.8" + resolved "https://registry.yarnpkg.com/undici/-/undici-6.19.8.tgz#002d7c8a28f8cc3a44ff33c3d4be4d85e15d40e1" + integrity sha512-U8uCCl2x9TK3WANvmBavymRzxbfFYG+tAu+fgx3zxQy3qdagQqBLwJVrdyO1TBfUXvfKveMKJZhpvUYoOjM+4g== + +unherit@^1.0.4: + version "1.1.3" + resolved "https://registry.yarnpkg.com/unherit/-/unherit-1.1.3.tgz#6c9b503f2b41b262330c80e91c8614abdaa69c22" + integrity sha512-Ft16BJcnapDKp0+J/rqFC3Rrk6Y/Ng4nzsC028k2jdDII/rdZ7Wd3pPT/6+vIIxRagwRc9K0IUX0Ra4fKvw+WQ== + dependencies: + inherits "^2.0.0" + xtend "^4.0.0" + +unicode-canonical-property-names-ecmascript@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz#301acdc525631670d39f6146e0e77ff6bbdebddc" + integrity sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ== + +unicode-emoji-modifier-base@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unicode-emoji-modifier-base/-/unicode-emoji-modifier-base-1.0.0.tgz#dbbd5b54ba30f287e2a8d5a249da6c0cef369459" + integrity sha512-yLSH4py7oFH3oG/9K+XWrz1pSi3dfUrWEnInbxMfArOfc1+33BlGPQtLsOYwvdMy11AwUBetYuaRxSPqgkq+8g== + +unicode-match-property-ecmascript@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz#54fd16e0ecb167cf04cf1f756bdcc92eba7976c3" + integrity sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q== + dependencies: + unicode-canonical-property-names-ecmascript "^2.0.0" + unicode-property-aliases-ecmascript "^2.0.0" + +unicode-match-property-value-ecmascript@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz#cb5fffdcd16a05124f5a4b0bf7c3770208acbbe0" + integrity sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA== + +unicode-property-aliases-ecmascript@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz#43d41e3be698bd493ef911077c9b131f827e8ccd" + integrity sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w== + +unified@9.2.0: + version "9.2.0" + resolved "https://registry.yarnpkg.com/unified/-/unified-9.2.0.tgz#67a62c627c40589edebbf60f53edfd4d822027f8" + integrity sha512-vx2Z0vY+a3YoTj8+pttM3tiJHCwY5UFbYdiWrwBEbHmK8pvsPj2rtAX2BFfgXen8T39CJWblWRDT4L5WGXtDdg== + dependencies: + bail "^1.0.0" + extend "^3.0.0" + is-buffer "^2.0.0" + is-plain-obj "^2.0.0" + trough "^1.0.0" + vfile "^4.0.0" + +unified@^11.0.0, unified@^11.0.3, unified@^11.0.4: + version "11.0.4" + resolved "https://registry.yarnpkg.com/unified/-/unified-11.0.4.tgz#f4be0ac0fe4c88cb873687c07c64c49ed5969015" + integrity sha512-apMPnyLjAX+ty4OrNap7yumyVAMlKx5IWU2wlzzUdYJO9A8f1p9m/gywF/GM2ZDFcjQPrx59Mc90KwmxsoklxQ== + dependencies: + "@types/unist" "^3.0.0" + bail "^2.0.0" + devlop "^1.0.0" + extend "^3.0.0" + is-plain-obj "^4.0.0" + trough "^2.0.0" + vfile "^6.0.0" + +unified@^9.2.2: + version "9.2.2" + resolved "https://registry.yarnpkg.com/unified/-/unified-9.2.2.tgz#67649a1abfc3ab85d2969502902775eb03146975" + integrity sha512-Sg7j110mtefBD+qunSLO1lqOEKdrwBFBrR6Qd8f4uwkhWNlbkaqwHse6e7QvD3AP/MNoJdEDLaf8OxYyoWgorQ== + dependencies: + bail "^1.0.0" + extend "^3.0.0" + is-buffer "^2.0.0" + is-plain-obj "^2.0.0" + trough "^1.0.0" + vfile "^4.0.0" + +unique-string@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/unique-string/-/unique-string-2.0.0.tgz#39c6451f81afb2749de2b233e3f7c5e8843bd89d" + integrity sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg== + dependencies: + crypto-random-string "^2.0.0" + +unique-string@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/unique-string/-/unique-string-3.0.0.tgz#84a1c377aff5fd7a8bc6b55d8244b2bd90d75b9a" + integrity sha512-VGXBUVwxKMBUznyffQweQABPRRW1vHZAbadFZud4pLFAqRGvv/96vafgjWFqzourzr8YonlQiPgH0YCJfawoGQ== + dependencies: + crypto-random-string "^4.0.0" + +unist-builder@2.0.3, unist-builder@^2.0.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/unist-builder/-/unist-builder-2.0.3.tgz#77648711b5d86af0942f334397a33c5e91516436" + integrity sha512-f98yt5pnlMWlzP539tPc4grGMsFaQQlP/vM396b00jngsiINumNmsY8rkXjfoi1c6QaM8nQ3vaGDuoKWbe/1Uw== + +unist-util-generated@^1.0.0: + version "1.1.6" + resolved "https://registry.yarnpkg.com/unist-util-generated/-/unist-util-generated-1.1.6.tgz#5ab51f689e2992a472beb1b35f2ce7ff2f324d4b" + integrity sha512-cln2Mm1/CZzN5ttGK7vkoGw+RZ8VcUH6BtGbq98DDtRGquAAOXig1mrBQYelOwMXYS8rK+vZDyyojSjp7JX+Lg== + +unist-util-is@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/unist-util-is/-/unist-util-is-4.1.0.tgz#976e5f462a7a5de73d94b706bac1b90671b57797" + integrity sha512-ZOQSsnce92GrxSqlnEEseX0gi7GH9zTJZ0p9dtu87WRb/37mMPO2Ilx1s/t9vBHrFhbgweUwb+t7cIn5dxPhZg== + +unist-util-is@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/unist-util-is/-/unist-util-is-6.0.0.tgz#b775956486aff107a9ded971d996c173374be424" + integrity sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw== + dependencies: + "@types/unist" "^3.0.0" + +unist-util-position-from-estree@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/unist-util-position-from-estree/-/unist-util-position-from-estree-2.0.0.tgz#d94da4df596529d1faa3de506202f0c9a23f2200" + integrity sha512-KaFVRjoqLyF6YXCbVLNad/eS4+OfPQQn2yOd7zF/h5T/CSL2v8NpN6a5TPvtbXthAGw5nG+PuTtq+DdIZr+cRQ== + dependencies: + "@types/unist" "^3.0.0" + +unist-util-position@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/unist-util-position/-/unist-util-position-3.1.0.tgz#1c42ee6301f8d52f47d14f62bbdb796571fa2d47" + integrity sha512-w+PkwCbYSFw8vpgWD0v7zRCl1FpY3fjDSQ3/N/wNd9Ffa4gPi8+4keqt99N3XW6F99t/mUzp2xAhNmfKWp95QA== + +unist-util-position@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/unist-util-position/-/unist-util-position-5.0.0.tgz#678f20ab5ca1207a97d7ea8a388373c9cf896be4" + integrity sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA== + dependencies: + "@types/unist" "^3.0.0" + +unist-util-remove-position@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/unist-util-remove-position/-/unist-util-remove-position-2.0.1.tgz#5d19ca79fdba712301999b2b73553ca8f3b352cc" + integrity sha512-fDZsLYIe2uT+oGFnuZmy73K6ZxOPG/Qcm+w7jbEjaFcJgbQ6cqjs/eSPzXhsmGpAsWPkqZM9pYjww5QTn3LHMA== + dependencies: + unist-util-visit "^2.0.0" + +unist-util-remove-position@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/unist-util-remove-position/-/unist-util-remove-position-5.0.0.tgz#fea68a25658409c9460408bc6b4991b965b52163" + integrity sha512-Hp5Kh3wLxv0PHj9m2yZhhLt58KzPtEYKQQ4yxfYFEO7EvHwzyDYnduhHnY1mDxoqr7VUwVuHXk9RXKIiYS1N8Q== + dependencies: + "@types/unist" "^3.0.0" + unist-util-visit "^5.0.0" + +unist-util-remove@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/unist-util-remove/-/unist-util-remove-2.1.0.tgz#b0b4738aa7ee445c402fda9328d604a02d010588" + integrity sha512-J8NYPyBm4baYLdCbjmf1bhPu45Cr1MWTm77qd9istEkzWpnN6O9tMsEbB2JhNnBCqGENRqEWomQ+He6au0B27Q== + dependencies: + unist-util-is "^4.0.0" + +unist-util-stringify-position@^2.0.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/unist-util-stringify-position/-/unist-util-stringify-position-2.0.3.tgz#cce3bfa1cdf85ba7375d1d5b17bdc4cada9bd9da" + integrity sha512-3faScn5I+hy9VleOq/qNbAd6pAx7iH5jYBMS9I1HgQVijz/4mv5Bvw5iw1sC/90CODiKo81G/ps8AJrISn687g== + dependencies: + "@types/unist" "^2.0.2" + +unist-util-stringify-position@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz#449c6e21a880e0855bf5aabadeb3a740314abac2" + integrity sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ== + dependencies: + "@types/unist" "^3.0.0" + +unist-util-visit-parents@^3.0.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/unist-util-visit-parents/-/unist-util-visit-parents-3.1.1.tgz#65a6ce698f78a6b0f56aa0e88f13801886cdaef6" + integrity sha512-1KROIZWo6bcMrZEwiH2UrXDyalAa0uqzWCxCJj6lPOvTve2WkfgCytoDTPaMnodXh1WrXOq0haVYHj99ynJlsg== + dependencies: + "@types/unist" "^2.0.0" + unist-util-is "^4.0.0" + +unist-util-visit-parents@^6.0.0: + version "6.0.1" + resolved "https://registry.yarnpkg.com/unist-util-visit-parents/-/unist-util-visit-parents-6.0.1.tgz#4d5f85755c3b8f0dc69e21eca5d6d82d22162815" + integrity sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw== + dependencies: + "@types/unist" "^3.0.0" + unist-util-is "^6.0.0" + +unist-util-visit@2.0.3, unist-util-visit@^2.0.0, unist-util-visit@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/unist-util-visit/-/unist-util-visit-2.0.3.tgz#c3703893146df47203bb8a9795af47d7b971208c" + integrity sha512-iJ4/RczbJMkD0712mGktuGpm/U4By4FfDonL7N/9tATGIF4imikjOuagyMY53tnZq3NP6BcmlrHhEKAfGWjh7Q== + dependencies: + "@types/unist" "^2.0.0" + unist-util-is "^4.0.0" + unist-util-visit-parents "^3.0.0" + +unist-util-visit@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/unist-util-visit/-/unist-util-visit-5.0.0.tgz#a7de1f31f72ffd3519ea71814cccf5fd6a9217d6" + integrity sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg== + dependencies: + "@types/unist" "^3.0.0" + unist-util-is "^6.0.0" + unist-util-visit-parents "^6.0.0" + +universalify@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.1.tgz#168efc2180964e6386d061e094df61afe239b18d" + integrity sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw== + +unpipe@1.0.0, unpipe@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" + integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ== + +update-browserslist-db@^1.0.13: + version "1.0.13" + resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz#3c5e4f5c083661bd38ef64b6328c26ed6c8248c4" + integrity sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg== + dependencies: + escalade "^3.1.1" + picocolors "^1.0.0" + +update-notifier@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/update-notifier/-/update-notifier-5.1.0.tgz#4ab0d7c7f36a231dd7316cf7729313f0214d9ad9" + integrity sha512-ItnICHbeMh9GqUy31hFPrD1kcuZ3rpxDZbf4KUDavXwS0bW5m7SLbDQpGX3UYr072cbrF5hFUs3r5tUsPwjfHw== + dependencies: + boxen "^5.0.0" + chalk "^4.1.0" + configstore "^5.0.1" + has-yarn "^2.1.0" + import-lazy "^2.1.0" + is-ci "^2.0.0" + is-installed-globally "^0.4.0" + is-npm "^5.0.0" + is-yarn-global "^0.3.0" + latest-version "^5.1.0" + pupa "^2.1.1" + semver "^7.3.4" + semver-diff "^3.1.1" + xdg-basedir "^4.0.0" + +update-notifier@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/update-notifier/-/update-notifier-6.0.2.tgz#a6990253dfe6d5a02bd04fbb6a61543f55026b60" + integrity sha512-EDxhTEVPZZRLWYcJ4ZXjGFN0oP7qYvbXWzEgRm/Yql4dHX5wDbvh89YHP6PK1lzZJYrMtXUuZZz8XGK+U6U1og== + dependencies: + boxen "^7.0.0" + chalk "^5.0.1" + configstore "^6.0.0" + has-yarn "^3.0.0" + import-lazy "^4.0.0" + is-ci "^3.0.1" + is-installed-globally "^0.4.0" + is-npm "^6.0.0" + is-yarn-global "^0.4.0" + latest-version "^7.0.0" + pupa "^3.1.0" + semver "^7.3.7" + semver-diff "^4.0.0" + xdg-basedir "^5.1.0" + +uri-js@^4.2.2: + version "4.4.1" + resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" + integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== + dependencies: + punycode "^2.1.0" + +url-loader@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/url-loader/-/url-loader-4.1.1.tgz#28505e905cae158cf07c92ca622d7f237e70a4e2" + integrity sha512-3BTV812+AVHHOJQO8O5MkWgZ5aosP7GnROJwvzLS9hWDj00lZ6Z0wNak423Lp9PBZN05N+Jk/N5Si8jRAlGyWA== + dependencies: + loader-utils "^2.0.0" + mime-types "^2.1.27" + schema-utils "^3.0.0" + +url-parse-lax@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/url-parse-lax/-/url-parse-lax-3.0.0.tgz#16b5cafc07dbe3676c1b1999177823d6503acb0c" + integrity sha512-NjFKA0DidqPa5ciFcSrXnAltTtzz84ogy+NebPvfEgAck0+TNg4UJ4IN+fB7zRZfbgUf0syOo9MDxFkDSMuFaQ== + dependencies: + prepend-http "^2.0.0" + +url-template@^2.0.8: + version "2.0.8" + resolved "https://registry.yarnpkg.com/url-template/-/url-template-2.0.8.tgz#fc565a3cccbff7730c775f5641f9555791439f21" + integrity sha512-XdVKMF4SJ0nP/O7XIPB0JwAEuT9lDIYnNsK8yGVe43y0AWoKeJNdv3ZNWh7ksJ6KqQFjOO6ox/VEitLnaVNufw== + +use-composed-ref@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/use-composed-ref/-/use-composed-ref-1.3.0.tgz#3d8104db34b7b264030a9d916c5e94fbe280dbda" + integrity sha512-GLMG0Jc/jiKov/3Ulid1wbv3r54K9HlMW29IWcDFPEqFkSO2nS0MuefWgMJpeHQ9YJeXDL3ZUF+P3jdXlZX/cQ== + +use-isomorphic-layout-effect@^1.1.1: + version "1.1.2" + resolved "https://registry.yarnpkg.com/use-isomorphic-layout-effect/-/use-isomorphic-layout-effect-1.1.2.tgz#497cefb13d863d687b08477d9e5a164ad8c1a6fb" + integrity sha512-49L8yCO3iGT/ZF9QttjwLF/ZD9Iwto5LnH5LmEdk/6cFmXddqi2ulF0edxTwjj+7mqvpVVGQWvbXZdn32wRSHA== + +use-latest@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/use-latest/-/use-latest-1.2.1.tgz#d13dfb4b08c28e3e33991546a2cee53e14038cf2" + integrity sha512-xA+AVm/Wlg3e2P/JiItTziwS7FK92LWrDB0p+hgXloIMuVCeJJ8v6f0eeHyPZaJrM+usM1FkFfbNCrJGs8A/zw== + dependencies: + use-isomorphic-layout-effect "^1.1.1" + +use-sync-external-store@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/use-sync-external-store/-/use-sync-external-store-1.2.0.tgz#7dbefd6ef3fe4e767a0cf5d7287aacfb5846928a" + integrity sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA== + +util-deprecate@^1.0.1, util-deprecate@^1.0.2, util-deprecate@~1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== + +utila@~0.4: + version "0.4.0" + resolved "https://registry.yarnpkg.com/utila/-/utila-0.4.0.tgz#8a16a05d445657a3aea5eecc5b12a4fa5379772c" + integrity sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA== + +utility-types@^3.10.0: + version "3.10.0" + resolved "https://registry.yarnpkg.com/utility-types/-/utility-types-3.10.0.tgz#ea4148f9a741015f05ed74fd615e1d20e6bed82b" + integrity sha512-O11mqxmi7wMKCo6HKFt5AhO4BwY3VV68YU07tgxfz8zJTIxr4BpsezN49Ffwy9j3ZpwwJp4fkRwjRzq3uWE6Rg== + +utils-merge@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" + integrity sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA== + +uuid@^8.3.2: + version "8.3.2" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" + integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== + +value-equal@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/value-equal/-/value-equal-1.0.1.tgz#1e0b794c734c5c0cade179c437d356d931a34d6c" + integrity sha512-NOJ6JZCAWr0zlxZt+xqCHNTEKOsrks2HQd4MqhP1qy4z1SkbEP467eNx6TgDKXMvUOb+OENfJCZwM+16n7fRfw== + +vary@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" + integrity sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg== + +vfile-location@^3.0.0, vfile-location@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/vfile-location/-/vfile-location-3.2.0.tgz#d8e41fbcbd406063669ebf6c33d56ae8721d0f3c" + integrity sha512-aLEIZKv/oxuCDZ8lkJGhuhztf/BW4M+iHdCwglA/eWc+vtuRFJj8EtgceYFX4LRjOhCAAiNHsKGssC6onJ+jbA== + +vfile-location@^5.0.0: + version "5.0.2" + resolved "https://registry.yarnpkg.com/vfile-location/-/vfile-location-5.0.2.tgz#220d9ca1ab6f8b2504a4db398f7ebc149f9cb464" + integrity sha512-NXPYyxyBSH7zB5U6+3uDdd6Nybz6o6/od9rk8bp9H8GR3L+cm/fC0uUTbqBmUTnMCUDslAGBOIKNfvvb+gGlDg== + dependencies: + "@types/unist" "^3.0.0" + vfile "^6.0.0" + +vfile-message@^2.0.0: + version "2.0.4" + resolved "https://registry.yarnpkg.com/vfile-message/-/vfile-message-2.0.4.tgz#5b43b88171d409eae58477d13f23dd41d52c371a" + integrity sha512-DjssxRGkMvifUOJre00juHoP9DPWuzjxKuMDrhNbk2TdaYYBNMStsNhEOt3idrtI12VQYM/1+iM0KOzXi4pxwQ== + dependencies: + "@types/unist" "^2.0.0" + unist-util-stringify-position "^2.0.0" + +vfile-message@^4.0.0: + version "4.0.2" + resolved "https://registry.yarnpkg.com/vfile-message/-/vfile-message-4.0.2.tgz#c883c9f677c72c166362fd635f21fc165a7d1181" + integrity sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw== + dependencies: + "@types/unist" "^3.0.0" + unist-util-stringify-position "^4.0.0" + +vfile@^4.0.0: + version "4.2.1" + resolved "https://registry.yarnpkg.com/vfile/-/vfile-4.2.1.tgz#03f1dce28fc625c625bc6514350fbdb00fa9e624" + integrity sha512-O6AE4OskCG5S1emQ/4gl8zK586RqA3srz3nfK/Viy0UPToBc5Trp9BVFb1u0CjsKrAWwnpr4ifM/KBXPWwJbCA== + dependencies: + "@types/unist" "^2.0.0" + is-buffer "^2.0.0" + unist-util-stringify-position "^2.0.0" + vfile-message "^2.0.0" + +vfile@^6.0.0, vfile@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/vfile/-/vfile-6.0.1.tgz#1e8327f41eac91947d4fe9d237a2dd9209762536" + integrity sha512-1bYqc7pt6NIADBJ98UiG0Bn/CHIVOoZ/IyEkqIruLg0mE1BKzkOXY2D6CSqQIcKqgadppE5lrxgWXJmXd7zZJw== + dependencies: + "@types/unist" "^3.0.0" + unist-util-stringify-position "^4.0.0" + vfile-message "^4.0.0" + +wait-on@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/wait-on/-/wait-on-6.0.1.tgz#16bbc4d1e4ebdd41c5b4e63a2e16dbd1f4e5601e" + integrity sha512-zht+KASY3usTY5u2LgaNqn/Cd8MukxLGjdcZxT2ns5QzDmTFc4XoWBgC+C/na+sMRZTuVygQoMYwdcVjHnYIVw== + dependencies: + axios "^0.25.0" + joi "^17.6.0" + lodash "^4.17.21" + minimist "^1.2.5" + rxjs "^7.5.4" + +watchpack@^2.4.1: + version "2.4.2" + resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-2.4.2.tgz#2feeaed67412e7c33184e5a79ca738fbd38564da" + integrity sha512-TnbFSbcOCcDgjZ4piURLCbJ3nJhznVh9kw6F6iokjiFPl8ONxe9A6nMDVXDiNbrSfLILs6vB07F7wLBrwPYzJw== + dependencies: + glob-to-regexp "^0.4.1" + graceful-fs "^4.1.2" + +wbuf@^1.1.0, wbuf@^1.7.3: + version "1.7.3" + resolved "https://registry.yarnpkg.com/wbuf/-/wbuf-1.7.3.tgz#c1d8d149316d3ea852848895cb6a0bfe887b87df" + integrity sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA== + dependencies: + minimalistic-assert "^1.0.0" + +web-namespaces@^1.0.0: + version "1.1.4" + resolved "https://registry.yarnpkg.com/web-namespaces/-/web-namespaces-1.1.4.tgz#bc98a3de60dadd7faefc403d1076d529f5e030ec" + integrity sha512-wYxSGajtmoP4WxfejAPIr4l0fVh+jeMXZb08wNc0tMg6xsfZXj3cECqIK0G7ZAqUq0PP8WlMDtaOGVBTAWztNw== + +web-namespaces@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/web-namespaces/-/web-namespaces-2.0.1.tgz#1010ff7c650eccb2592cebeeaf9a1b253fd40692" + integrity sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ== + +webidl-conversions@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" + integrity sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ== + +webpack-bundle-analyzer@^4.5.0, webpack-bundle-analyzer@^4.9.0: + version "4.10.1" + resolved "https://registry.yarnpkg.com/webpack-bundle-analyzer/-/webpack-bundle-analyzer-4.10.1.tgz#84b7473b630a7b8c21c741f81d8fe4593208b454" + integrity sha512-s3P7pgexgT/HTUSYgxJyn28A+99mmLq4HsJepMPzu0R8ImJc52QNqaFYW1Z2z2uIb1/J3eYgaAWVpaC+v/1aAQ== + dependencies: + "@discoveryjs/json-ext" "0.5.7" + acorn "^8.0.4" + acorn-walk "^8.0.0" + commander "^7.2.0" + debounce "^1.2.1" + escape-string-regexp "^4.0.0" + gzip-size "^6.0.0" + html-escaper "^2.0.2" + is-plain-object "^5.0.0" + opener "^1.5.2" + picocolors "^1.0.0" + sirv "^2.0.3" + ws "^7.3.1" + +webpack-dev-middleware@^5.3.1: + version "5.3.4" + resolved "https://registry.yarnpkg.com/webpack-dev-middleware/-/webpack-dev-middleware-5.3.4.tgz#eb7b39281cbce10e104eb2b8bf2b63fce49a3517" + integrity sha512-BVdTqhhs+0IfoeAf7EoH5WE+exCmqGerHfDM0IL096Px60Tq2Mn9MAbnaGUe6HiMa41KMCYF19gyzZmBcq/o4Q== + dependencies: + colorette "^2.0.10" + memfs "^3.4.3" + mime-types "^2.1.31" + range-parser "^1.2.1" + schema-utils "^4.0.0" + +webpack-dev-server@^4.15.1, webpack-dev-server@^4.9.3: + version "4.15.1" + resolved "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-4.15.1.tgz#8944b29c12760b3a45bdaa70799b17cb91b03df7" + integrity sha512-5hbAst3h3C3L8w6W4P96L5vaV0PxSmJhxZvWKYIdgxOQm8pNZ5dEOmmSLBVpP85ReeyRt6AS1QJNyo/oFFPeVA== + dependencies: + "@types/bonjour" "^3.5.9" + "@types/connect-history-api-fallback" "^1.3.5" + "@types/express" "^4.17.13" + "@types/serve-index" "^1.9.1" + "@types/serve-static" "^1.13.10" + "@types/sockjs" "^0.3.33" + "@types/ws" "^8.5.5" + ansi-html-community "^0.0.8" + bonjour-service "^1.0.11" + chokidar "^3.5.3" + colorette "^2.0.10" + compression "^1.7.4" + connect-history-api-fallback "^2.0.0" + default-gateway "^6.0.3" + express "^4.17.3" + graceful-fs "^4.2.6" + html-entities "^2.3.2" + http-proxy-middleware "^2.0.3" + ipaddr.js "^2.0.1" + launch-editor "^2.6.0" + open "^8.0.9" + p-retry "^4.5.0" + rimraf "^3.0.2" + schema-utils "^4.0.0" + selfsigned "^2.1.1" + serve-index "^1.9.1" + sockjs "^0.3.24" + spdy "^4.0.2" + webpack-dev-middleware "^5.3.1" + ws "^8.13.0" + +webpack-merge@^5.8.0, webpack-merge@^5.9.0: + version "5.10.0" + resolved "https://registry.yarnpkg.com/webpack-merge/-/webpack-merge-5.10.0.tgz#a3ad5d773241e9c682803abf628d4cd62b8a4177" + integrity sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA== + dependencies: + clone-deep "^4.0.1" + flat "^5.0.2" + wildcard "^2.0.0" + +webpack-sources@^3.2.2, webpack-sources@^3.2.3: + version "3.2.3" + resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-3.2.3.tgz#2d4daab8451fd4b240cc27055ff6a0c2ccea0cde" + integrity sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w== + +webpack@^5.73.0, webpack@^5.88.1: + version "5.94.0" + resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.94.0.tgz#77a6089c716e7ab90c1c67574a28da518a20970f" + integrity sha512-KcsGn50VT+06JH/iunZJedYGUJS5FGjow8wb9c0v5n1Om8O1g4L6LjtfxwlXIATopoQu+vOXXa7gYisWxCoPyg== + dependencies: + "@types/estree" "^1.0.5" + "@webassemblyjs/ast" "^1.12.1" + "@webassemblyjs/wasm-edit" "^1.12.1" + "@webassemblyjs/wasm-parser" "^1.12.1" + acorn "^8.7.1" + acorn-import-attributes "^1.9.5" + browserslist "^4.21.10" + chrome-trace-event "^1.0.2" + enhanced-resolve "^5.17.1" + es-module-lexer "^1.2.1" + eslint-scope "5.1.1" + events "^3.2.0" + glob-to-regexp "^0.4.1" + graceful-fs "^4.2.11" + json-parse-even-better-errors "^2.3.1" + loader-runner "^4.2.0" + mime-types "^2.1.27" + neo-async "^2.6.2" + schema-utils "^3.2.0" + tapable "^2.1.1" + terser-webpack-plugin "^5.3.10" + watchpack "^2.4.1" + webpack-sources "^3.2.3" + +webpackbar@^5.0.2: + version "5.0.2" + resolved "https://registry.yarnpkg.com/webpackbar/-/webpackbar-5.0.2.tgz#d3dd466211c73852741dfc842b7556dcbc2b0570" + integrity sha512-BmFJo7veBDgQzfWXl/wwYXr/VFus0614qZ8i9znqcl9fnEdiVkdbi0TedLQ6xAK92HZHDJ0QmyQ0fmuZPAgCYQ== + dependencies: + chalk "^4.1.0" + consola "^2.15.3" + pretty-time "^1.1.0" + std-env "^3.0.1" + +websocket-driver@>=0.5.1, websocket-driver@^0.7.4: + version "0.7.4" + resolved "https://registry.yarnpkg.com/websocket-driver/-/websocket-driver-0.7.4.tgz#89ad5295bbf64b480abcba31e4953aca706f5760" + integrity sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg== + dependencies: + http-parser-js ">=0.5.1" + safe-buffer ">=5.1.0" + websocket-extensions ">=0.1.1" + +websocket-extensions@>=0.1.1: + version "0.1.4" + resolved "https://registry.yarnpkg.com/websocket-extensions/-/websocket-extensions-0.1.4.tgz#7f8473bc839dfd87608adb95d7eb075211578a42" + integrity sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg== + +whatwg-encoding@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-3.1.1.tgz#d0f4ef769905d426e1688f3e34381a99b60b76e5" + integrity sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ== + dependencies: + iconv-lite "0.6.3" + +whatwg-mimetype@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-4.0.0.tgz#bc1bf94a985dc50388d54a9258ac405c3ca2fc0a" + integrity sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg== + +whatwg-url@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d" + integrity sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw== + dependencies: + tr46 "~0.0.3" + webidl-conversions "^3.0.0" + +which@^1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" + integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== + dependencies: + isexe "^2.0.0" + +which@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" + integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== + dependencies: + isexe "^2.0.0" + +widest-line@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/widest-line/-/widest-line-3.1.0.tgz#8292333bbf66cb45ff0de1603b136b7ae1496eca" + integrity sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg== + dependencies: + string-width "^4.0.0" + +widest-line@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/widest-line/-/widest-line-4.0.1.tgz#a0fc673aaba1ea6f0a0d35b3c2795c9a9cc2ebf2" + integrity sha512-o0cyEG0e8GPzT4iGHphIOh0cJOV8fivsXxddQasHPHfoZf1ZexrfeA21w2NaEN1RHE+fXlfISmOE8R9N3u3Qig== + dependencies: + string-width "^5.0.1" + +wildcard@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/wildcard/-/wildcard-2.0.1.tgz#5ab10d02487198954836b6349f74fff961e10f67" + integrity sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ== + +wrap-ansi@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" + integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + +wrap-ansi@^8.0.1, wrap-ansi@^8.1.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz#56dc22368ee570face1b49819975d9b9a5ead214" + integrity sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ== + dependencies: + ansi-styles "^6.1.0" + string-width "^5.0.1" + strip-ansi "^7.0.1" + +wrappy@1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== + +write-file-atomic@^3.0.0, write-file-atomic@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-3.0.3.tgz#56bd5c5a5c70481cd19c571bd39ab965a5de56e8" + integrity sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q== + dependencies: + imurmurhash "^0.1.4" + is-typedarray "^1.0.0" + signal-exit "^3.0.2" + typedarray-to-buffer "^3.1.5" + +ws@^7.3.1: + version "7.5.10" + resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.10.tgz#58b5c20dc281633f6c19113f39b349bd8bd558d9" + integrity sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ== + +ws@^8.13.0: + version "8.17.1" + resolved "https://registry.yarnpkg.com/ws/-/ws-8.17.1.tgz#9293da530bb548febc95371d90f9c878727d919b" + integrity sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ== + +xdg-basedir@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-4.0.0.tgz#4bc8d9984403696225ef83a1573cbbcb4e79db13" + integrity sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q== + +xdg-basedir@^5.0.1, xdg-basedir@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-5.1.0.tgz#1efba19425e73be1bc6f2a6ceb52a3d2c884c0c9" + integrity sha512-GCPAHLvrIH13+c0SuacwvRYj2SxJXQ4kaVTT5xgL3kPrz56XxkF21IGhjSE1+W0aw7gpBWRGXLCPnPby6lSpmQ== + +xml-js@^1.6.11: + version "1.6.11" + resolved "https://registry.yarnpkg.com/xml-js/-/xml-js-1.6.11.tgz#927d2f6947f7f1c19a316dd8eea3614e8b18f8e9" + integrity sha512-7rVi2KMfwfWFl+GpPg6m80IVMWXLRjO+PxTq7V2CDhoGak0wzYzFgUY2m4XJ47OGdXd8eLE8EmwfAmdjw7lC1g== + dependencies: + sax "^1.2.4" + +xtend@^4.0.0, xtend@^4.0.1: + version "4.0.2" + resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" + integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== + +y18n@^5.0.5: + version "5.0.8" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" + integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== + +yallist@^3.0.2: + version "3.1.1" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" + integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== + +yallist@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" + integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== + +yaml-ast-parser@0.0.43: + version "0.0.43" + resolved "https://registry.yarnpkg.com/yaml-ast-parser/-/yaml-ast-parser-0.0.43.tgz#e8a23e6fb4c38076ab92995c5dca33f3d3d7c9bb" + integrity sha512-2PTINUwsRqSd+s8XxKaJWQlUuEMHJQyEuh2edBbW8KNJz0SJPwUSD2zRWqezFEdN7IzAgeuYHFUCF7o8zRdZ0A== + +yaml@^1.10.0, yaml@^1.10.2, yaml@^1.7.2: + version "1.10.2" + resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.2.tgz#2301c5ffbf12b467de8da2333a459e29e7920e4b" + integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg== + +yargs-parser@^21.1.1: + version "21.1.1" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35" + integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== + +yargs@^17.0.1: + version "17.7.2" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.7.2.tgz#991df39aca675a192b816e1e0363f9d75d2aa269" + integrity sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w== + dependencies: + cliui "^8.0.1" + escalade "^3.1.1" + get-caller-file "^2.0.5" + require-directory "^2.1.1" + string-width "^4.2.3" + y18n "^5.0.5" + yargs-parser "^21.1.1" + +yocto-queue@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" + integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== + +yocto-queue@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-1.0.0.tgz#7f816433fb2cbc511ec8bf7d263c3b58a1a3c251" + integrity sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g== + +zwitch@^1.0.0: + version "1.0.5" + resolved "https://registry.yarnpkg.com/zwitch/-/zwitch-1.0.5.tgz#d11d7381ffed16b742f6af7b3f223d5cd9fe9920" + integrity sha512-V50KMwwzqJV0NpZIZFwfOD5/lyny3WlSzRiXgA0G7VUnRlqttta1L6UQIHzd6EuBY/cHGfwTIck7w1yH6Q5zUw== + +zwitch@^2.0.0: + version "2.0.4" + resolved "https://registry.yarnpkg.com/zwitch/-/zwitch-2.0.4.tgz#c827d4b0acb76fc3e685a4c6ec2902d51070e9d7" + integrity sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==