diff --git a/.coderabbit.yaml b/.coderabbit.yaml new file mode 100644 index 0000000..55c025a --- /dev/null +++ b/.coderabbit.yaml @@ -0,0 +1,5 @@ +reviews: + path_filters: + - "!case-docs/content/tech-docs/management-api/api/**" + - "!case-docs/content/tech-docs/participant-api/api/**" + - "!case-docs/content/tech-docs/smtp-bridge/api/**" \ No newline at end of file diff --git a/README.md b/README.md index b3dd638..dd92cf1 100644 --- a/README.md +++ b/README.md @@ -36,17 +36,71 @@ Read the [Introduction](https://fumadocs.dev/docs/mdx) for further details. ## For API Documentation -Include the openapi spec file in the `public/openapi` directory. +OpenAPI docs are generated from profiles defined in `scripts/doc-profiles.ts`. -Add a new page with the name `api.mdx` in the `content/tech-docs/[api-name]` directory with the following content: +### 1. Add the OpenAPI spec -```mdx ---- -title: My API -description: My API Description ---- +Place your spec file in the `openapi` directory, for example: + +- `openapi/my-api.yaml` + +### 2. Add or update a docs profile + +In `scripts/doc-profiles.ts`, add a new profile entry: + +```ts +{ + id: 'my-api', + input: './openapi/my-api.yaml', + outputDir: 'content/tech-docs/my-api/api', + baseUrl: '/tech-docs/my-api/api', + groupByTag: true, +} ``` +`groupByTag: true` groups endpoints by OpenAPI tags in the generated docs. + +Current profiles: + +- `management-api` (`openapi/management-api.yaml`, `groupByTag: true`) +- `participant-api` (`openapi/participant-api.yaml`, `groupByTag: true`) +- `smtp-bridge` (`openapi/smtp-bridge.yaml`, `groupByTag: false`) + +### 3. Add the Tech Docs section (only for a new API) + +Create `content/tech-docs/my-api` with: + +- `overview.mdx` (landing page) +- `meta.json` with `"pages": ["overview", "api"]` + +Then add `my-api` to `content/tech-docs/meta.json` so the section appears in the sidebar. + +### 4. Generate the API docs + +List available profiles: + +```bash +pnpm exec tsx --no-cache scripts/generate-docs.ts --list +``` + +Generate one profile: + +```bash +pnpm exec tsx --no-cache scripts/generate-docs.ts my-api +``` + +Generate all profiles: + +```bash +pnpm exec tsx --no-cache scripts/generate-docs.ts --all +``` + +### 5. Result + +Generated API pages are written to `content/tech-docs//api` (including `index.mdx` and `meta.json`). + +Note: these files are generated and should not be edited manually. Re-run the generator after spec changes. + ## Learn More To learn more about Next.js and Fumadocs, take a look at the following diff --git a/app/(home)/page.tsx b/app/(home)/page.tsx index 75b78f1..2381577 100644 --- a/app/(home)/page.tsx +++ b/app/(home)/page.tsx @@ -19,7 +19,7 @@ export default function HomePage() {

User Guides

} @@ -33,7 +33,7 @@ export default function HomePage() { className="[&_div:has(svg)]:shadow" /> } diff --git a/app/docs/[[...slug]]/page.tsx b/app/docs/[[...slug]]/page.tsx index 10f2536..f09ed1e 100644 --- a/app/docs/[[...slug]]/page.tsx +++ b/app/docs/[[...slug]]/page.tsx @@ -9,7 +9,6 @@ import { notFound } from 'next/navigation'; import { createRelativeLink } from 'fumadocs-ui/mdx'; import { getMDXComponents } from '@/mdx-components'; - export default async function Page(props: { params: Promise<{ slug?: string[] }>; }) { diff --git a/app/global.css b/app/global.css index e6a932c..500d670 100644 --- a/app/global.css +++ b/app/global.css @@ -1,8 +1,17 @@ @import 'tailwindcss'; -@import 'fumadocs-ui/css/black.css'; +@import 'fumadocs-ui/css/solar.css'; @import 'fumadocs-ui/css/preset.css'; +@import 'fumadocs-openapi/css/preset.css'; -/* Hide the scheme container for Swagger UI */ -.swagger-ui .scheme-container { - display: none; +html { + scrollbar-gutter: stable; +} + +html>body[data-scroll-locked] { + margin-right: 0px !important; + --removed-body-scroll-bar-size: 0px !important; +} + +:root { + --fd-layout-width: 1600px; } \ No newline at end of file diff --git a/app/tech-docs/[[...slug]]/page.tsx b/app/tech-docs/[[...slug]]/page.tsx index be7e2d9..28ca1b4 100644 --- a/app/tech-docs/[[...slug]]/page.tsx +++ b/app/tech-docs/[[...slug]]/page.tsx @@ -8,7 +8,6 @@ import { import { notFound } from 'next/navigation'; import { createRelativeLink } from 'fumadocs-ui/mdx'; import { getMDXComponents } from '@/mdx-components'; -import ApiDoc from '@/components/api-doc'; const basePath = process.env.NEXT_PUBLIC_BASE_PATH || ''; @@ -20,13 +19,6 @@ export default async function Page(props: { const page = source.getPage(params.slug); if (!page) notFound(); - // Use the ApiDoc component for API pages (wrapper for Swagger UI) - if (params.slug?.includes('api')) { - return ( - - ) - } - const MDXContent = page.data.body; return ( diff --git a/components/api-doc.tsx b/components/api-doc.tsx deleted file mode 100644 index 7e8c6ed..0000000 --- a/components/api-doc.tsx +++ /dev/null @@ -1,29 +0,0 @@ -'use client'; -import SwaggerUI from "swagger-ui-react" -import 'swagger-ui-react/swagger-ui.css'; - - -const DisableAuthorizePlugin = function () { - return { - wrapComponents: { - authorizeBtn: () => () => null, - TryItOutButton: () => () => null - } - }; -}; - -const ApiDoc = ({ specUrl }: { specUrl: string }) => { - return ( - - ) -} - -export default ApiDoc; \ No newline at end of file diff --git a/components/api-page.client.tsx b/components/api-page.client.tsx new file mode 100644 index 0000000..3daad92 --- /dev/null +++ b/components/api-page.client.tsx @@ -0,0 +1,6 @@ +'use client'; +import { defineClientConfig } from 'fumadocs-openapi/ui/client'; + +export default defineClientConfig({ + // client-side config +}); \ No newline at end of file diff --git a/components/api-page.tsx b/components/api-page.tsx new file mode 100644 index 0000000..9651bf7 --- /dev/null +++ b/components/api-page.tsx @@ -0,0 +1,7 @@ +import { openapi } from '@/lib/openapi'; +import { createAPIPage } from 'fumadocs-openapi/ui'; +import client from './api-page.client'; + +export const APIPage = createAPIPage(openapi, { + client, +}); \ No newline at end of file diff --git a/content/docs/study-rules-editor/basics/meta.json b/content/docs/study-rules-editor/basics/meta.json deleted file mode 100644 index e289380..0000000 --- a/content/docs/study-rules-editor/basics/meta.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "pages": [ - "editor-overview", - "study-rules" - ] -} \ No newline at end of file diff --git a/content/docs/study-rules-editor/basics/editor-overview.mdx b/content/docs/study-rules-editor/editor-overview.mdx similarity index 95% rename from content/docs/study-rules-editor/basics/editor-overview.mdx rename to content/docs/study-rules-editor/editor-overview.mdx index 747493e..26d319a 100644 --- a/content/docs/study-rules-editor/basics/editor-overview.mdx +++ b/content/docs/study-rules-editor/editor-overview.mdx @@ -1,6 +1,6 @@ --- -title: Study Rules Editor -description: Overview of the study rules editor interface +title: Editor Overview +description: Main areas, navigation, and workflow for configuring study rules --- ## Introduction @@ -15,14 +15,14 @@ description: Overview of the study rules editor interface The **Study Rules Editor** is a graphical interface that allows you to create and manage these rules. It provides tools to define event handlers, configure contexts, and automate study workflows and participant management. -![Overview of study rules dashboard](../images/dashboardOverview.png) +![Overview of study rules dashboard](./images/dashboardOverview.png) ### Top Navigation Bar - **"Project"**: Click here to open an existing project, save your project or export the study rules. - **"Context"**: The editor context provides access to study and message keys, participant flags, reports and external event handlers that can be referenced in your rules. -You can import a context from a recent session or [create a new one](/docs/study-rules-editor/basics/editor-overview#context-editor) via the **"Open Context Editor"** button. +You can import a context from a recent session or [create a new one](/docs/study-rules-editor/editor-overview#context-editor) via the **"Open Context Editor"** button. ### General @@ -102,7 +102,7 @@ Rules defined here are applied **when a participant leaves the study** (e.g., wh The **Context Editor** is a configuration interface within the **Study Rules Editor**. It allows you to define the keys and identifiers that are used in **event handlers**, **conditions**, and **actions** throughout your study logic. These definitions ensure that all references to surveys, messages, flags, and other elements are valid and consistent. -![Overview of context editor](../images/contextEditor.png) +![Overview of context editor](./images/contextEditor.png) ### How to Access the Context Editor @@ -179,4 +179,4 @@ Send data to external systems or trigger external workflows. --- -For a complete list of available expressions and actions you can use in your study rules, see the [Methods of the study engine](/docs/study-rules-editor/basics/study-rules). +For a complete list of available expressions and actions you can use in your study rules, see the [Methods of the study engine](/docs/study-rules-editor/study-rules). diff --git a/content/docs/study-rules-editor/guide/entry-handler.mdx b/content/docs/study-rules-editor/guide/entry-handler.mdx index 2b536e8..626a69a 100644 --- a/content/docs/study-rules-editor/guide/entry-handler.mdx +++ b/content/docs/study-rules-editor/guide/entry-handler.mdx @@ -8,7 +8,7 @@ This example shows how to configure actions that are executed automatically when We’ll use the case where a **welcome message** is sent, the **intake survey** is assigned, and a **reminder message** for submitting the intake survey is scheduled. ## Prerequisite -Before you can configure ENTRY actions, make sure the Survey keys and Message keys are already defined in the [Survey context](/docs/study-rules-editor/basics/editor-overview#context-editor). +Before you can configure ENTRY actions, make sure the Survey keys and Message keys are already defined in the [Survey context](/docs/study-rules-editor/editor-overview#context-editor). Needed for this example: - Survey keys: `intake` diff --git a/content/docs/study-rules-editor/meta.json b/content/docs/study-rules-editor/meta.json index f368952..a3982ee 100644 --- a/content/docs/study-rules-editor/meta.json +++ b/content/docs/study-rules-editor/meta.json @@ -2,5 +2,10 @@ "title": "Study Rules Editor", "description": "Documentation for using the graphical study rules editor", "root": true, - "icon": "GitFork" + "icon": "GitFork", + "pages": [ + "editor-overview", + "study-rules", + "guide" + ] } \ No newline at end of file diff --git a/content/docs/study-rules-editor/basics/study-rules.mdx b/content/docs/study-rules-editor/study-rules.mdx similarity index 100% rename from content/docs/study-rules-editor/basics/study-rules.mdx rename to content/docs/study-rules-editor/study-rules.mdx diff --git a/content/docs/survey-editor/basics/meta.json b/content/docs/survey-editor/basics/meta.json deleted file mode 100644 index 9fd6c82..0000000 --- a/content/docs/survey-editor/basics/meta.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "pages": [ - "editor-overview", - "item-structure", - "conditions" - ] -} \ No newline at end of file diff --git a/content/docs/survey-editor/basics/conditions.mdx b/content/docs/survey-editor/conditions.mdx similarity index 100% rename from content/docs/survey-editor/basics/conditions.mdx rename to content/docs/survey-editor/conditions.mdx diff --git a/content/docs/survey-editor/basics/editor-overview.mdx b/content/docs/survey-editor/editor-overview.mdx similarity index 87% rename from content/docs/survey-editor/basics/editor-overview.mdx rename to content/docs/survey-editor/editor-overview.mdx index 03489ae..df111eb 100644 --- a/content/docs/survey-editor/basics/editor-overview.mdx +++ b/content/docs/survey-editor/editor-overview.mdx @@ -1,18 +1,18 @@ --- -title: Survey Editor Overview -description: Overview of the survey editor interface +title: Editor Overview +description: Main areas, navigation, and workflow for building surveys --- ## Survey Editor Dashboard -![Screenshot of survey editor dashboard](../images/dashboardEditor.png) +![Screenshot of survey editor dashboard](./images/dashboardEditor.png) This dashboard shows you the key content and structure of your survey. ### Top Navigation Bar - **Survey Editor**: displays the currently open editor. - **File**: Click here to generate a new survey, open an existing survey, save survey to disk or exit survey editor. -- **View**: Click here to go to [Survey Properties](/docs/survey-editor/basics/editor-overview#survey-properties-workspace) section or Survey Simulator. +- **View**: Click here to go to [Survey Properties](/docs/survey-editor/editor-overview#survey-properties-workspace) section or Survey Simulator. - **Survey Name:** Top left shows the unique key name of the current survey. Click on it to change its root key name. - **Survey label**: Top center displays the survey label. You can rename the survey label by clicking on it. - **Color Selector**: Click here to change the theme color of the survey. @@ -24,18 +24,18 @@ This dashboard shows you the key content and structure of your survey. ### Survey Item List -- **Items**: This section lists all the [items](/docs/survey-editor/basics/item-structure#survey-items) of the survey. Each item has: +- **Items**: This section lists all the [items](/docs/survey-editor/item-structure#survey-items) of the survey. Each item has: - an icon symbolizing the type of question (e.g. checkmark in circle for single choice question) - an unique **Item Key** (e.g., `SCG1`). - an optional **Label** text (e.g., `Single Choice Question`). -- Open the [item interface](/docs/survey-editor/basics/item-structure#item-interface) by clicking on the item or its icon shown in the left bar. +- Open the [item interface](/docs/survey-editor/item-structure#item-interface) by clicking on the item or its icon shown in the left bar. - New items can be added by - Click on **+ Add new item** at the bottom of the item list - Click on **+** in the left sidebar. - Items can be ordered by - drag and drop them in the item list or left sidebar or - toggle the switch `Use random ordering` in the **Item ordering** section to random order items when the survey runs. -- **Condition tab**: Switch to this tab to define [conditional logic](/docs/survey-editor/basics/conditions#conditions-and-expressions) that controls when items should be shown based on participant responses. +- **Condition tab**: Switch to this tab to define [conditional logic](/docs/survey-editor/conditions#conditions-and-expressions) that controls when items should be shown based on participant responses. --- @@ -44,7 +44,7 @@ This dashboard shows you the key content and structure of your survey. The **Survey Properties** workspace allows you to define and manage overall configuration and behavior of your survey. Click on **View** dropdown menu and select **Survey Properties** to open this section (shortcut **⌘ Cmd + 1**). -![Screenshot of survey properties workspace basic information](../images/surveyPropertiesBasic.png) +![Screenshot of survey properties workspace basic information](./images/surveyPropertiesBasic.png) ### Overview of Functions @@ -62,7 +62,7 @@ Click on **View** dropdown menu and select **Survey Properties** to open this se Use the language toggle to view and edit content in different languages. This helps manage multilingual surveys efficiently. -![Screenshot of survey properties workspace access conditions](../images/surveyPropertiesAccess.png) +![Screenshot of survey properties workspace access conditions](./images/surveyPropertiesAccess.png) - **Access Conditions** Configure who is allowed to access and complete the survey. @@ -75,7 +75,7 @@ Click on **View** dropdown menu and select **Survey Properties** to open this se - **Submission requires Login** Enable this toggle if participants must be logged in to submit their responses. If disabled, anyone with access to the survey can submit a response. -![Screenshot of survey properties workspace max items per page](../images/surveyPropertiesMaxItems.png) +![Screenshot of survey properties workspace max items per page](./images/surveyPropertiesMaxItems.png) - **Max Items per Page** Set the maximum number of question or content items that should appear on a single survey page for small and large screens. @@ -90,7 +90,7 @@ The simulator allows you to preview and test your survey questions under differe Below are the key components visible in the interface: -![Screenshot of survey simulator](../images/surveySimulator.png) +![Screenshot of survey simulator](./images/surveySimulator.png) ### Survey Items diff --git a/content/docs/survey-editor/guides/add-conditional-question.mdx b/content/docs/survey-editor/guides/add-conditional-question.mdx index 44e65c5..1091283 100644 --- a/content/docs/survey-editor/guides/add-conditional-question.mdx +++ b/content/docs/survey-editor/guides/add-conditional-question.mdx @@ -22,7 +22,7 @@ Select the option **"Question or Info item"**. Select the option **"Consent"**. The consent item is now shown in your item list. Click on the item to see the content item interface. -Select the component you would like to edit by clicking on it (Read more about [item components](/docs/survey-editor/basics/item-structure#survey-items)). +Select the component you would like to edit by clicking on it (Read more about [item components](/docs/survey-editor/item-structure#survey-items)). Write your title text e.g. *"Consent to Data Storage"* in the text field of the title component. Go back to consent item interface. @@ -126,6 +126,6 @@ In the dropdown menu, scroll to the Templates section and select **“Consent qu ![Condition interface with consent condition template](../images/addContact3.png) - A response slot key is not required. Use the survey [simulator](/docs/survey-editor/basics/editor-overview#simulator) to verify that the conditional logic works as expected. + A response slot key is not required. Use the survey [simulator](/docs/survey-editor/editor-overview#simulator) to verify that the conditional logic works as expected. diff --git a/content/docs/survey-editor/guides/add-date-constraints.mdx b/content/docs/survey-editor/guides/add-date-constraints.mdx index a64c5ee..b968b94 100644 --- a/content/docs/survey-editor/guides/add-date-constraints.mdx +++ b/content/docs/survey-editor/guides/add-date-constraints.mdx @@ -17,7 +17,7 @@ Create a date question by clicking the plus icon in the left toolbar or the **"A Select the option **"Date Input"**. The date item is now shown in your item list. Click on the item to see its interface. -Select the component you would like to edit by clicking on it (Read more about [item components](/docs/survey-editor/basics/item-structure#survey-items)). +Select the component you would like to edit by clicking on it (Read more about [item components](/docs/survey-editor/item-structure#survey-items)). Write your title text. In our example, the title text is: *"What is your child’s date of birth?"*. @@ -60,7 +60,7 @@ In the **Latest** section, click **+ add value**. Select **"Get timestamp"**. Leave the **Offset** at *0 days*. This restricts the latest possible vaccination date to *today*. -Use the survey [simulator](/docs/survey-editor/basics/editor-overview#simulator) to verify that your constraints are as expected. +Use the survey [simulator](/docs/survey-editor/editor-overview#simulator) to verify that your constraints are as expected. diff --git a/content/docs/survey-editor/guides/add-single-choice.mdx b/content/docs/survey-editor/guides/add-single-choice.mdx index 89f7845..b0860bb 100644 --- a/content/docs/survey-editor/guides/add-single-choice.mdx +++ b/content/docs/survey-editor/guides/add-single-choice.mdx @@ -18,7 +18,7 @@ Select the option **"Single choice"**. The single choice item is now shown in yo -Select the component you would like to edit by clicking on it (Read more about [item components](/docs/survey-editor/basics/item-structure#survey-items)). +Select the component you would like to edit by clicking on it (Read more about [item components](/docs/survey-editor/item-structure#survey-items)). Write your question in the text field of the title component. Add additional information in the text field of the subtitle. Write optional text before or after response options in top and bottom content components. @@ -44,10 +44,10 @@ Select **"With formatted label"** to use rich text (bold, italic, etc.) in label Enter label text of options for different languages by switching the language tabs above the options list. This ensures participants see the options in their selected language. -Define optional [conditions](/docs/survey-editor/basics/conditions) to control whether an option is shown or disabled. Select the option row and click on **"Show more settings"**. Use the **Display** condition to show the option only under certain criteria, and the **Disabled** condition to keep it visible but prevent selection. +Define optional [conditions](/docs/survey-editor/conditions) to control whether an option is shown or disabled. Select the option row and click on **"Show more settings"**. Use the **Display** condition to show the option only under certain criteria, and the **Disabled** condition to keep it visible but prevent selection. -Use the tabs to set optional [conditions](/docs/survey-editor/basics/conditions), validations or advanced settings. +Use the tabs to set optional [conditions](/docs/survey-editor/conditions), validations or advanced settings. View this question in the Survey Simulator by clicking on **"View"** in the top bar and selecting **"Simulator"**. diff --git a/content/docs/survey-editor/guides/edit-survey.mdx b/content/docs/survey-editor/guides/edit-survey.mdx index ca9ed3f..8e3133b 100644 --- a/content/docs/survey-editor/guides/edit-survey.mdx +++ b/content/docs/survey-editor/guides/edit-survey.mdx @@ -29,5 +29,5 @@ A dialog appears where you can either upload a survey file from your computer or ![Screenshot of survey editor welcome menu](../images/welcomeEditor.png) -You are now ready to edit your survey! Learn how to [configure the editor interface](/docs/survey-editor/basics/editor-overview#survey-editor-dashboard) or [save your changes](/docs/survey-editor/guides/save-survey). +You are now ready to edit your survey! Learn how to [configure the editor interface](/docs/survey-editor/editor-overview#survey-editor-dashboard) or [save your changes](/docs/survey-editor/guides/save-survey). diff --git a/content/docs/survey-editor/guides/setup-survey.mdx b/content/docs/survey-editor/guides/setup-survey.mdx index 0a6001d..96a9439 100644 --- a/content/docs/survey-editor/guides/setup-survey.mdx +++ b/content/docs/survey-editor/guides/setup-survey.mdx @@ -28,11 +28,11 @@ Click the **"Create new survey"** button and enter a **survey key**. ![Screenshot of survey editor welcome menu](../images/welcomeEditor.png) -You are now ready to edit your new survey! Learn more about how to configure the editor interface [here](/docs/survey-editor/basics/editor-overview#survey-editor-dashboard). +You are now ready to edit your new survey! Learn more about how to configure the editor interface [here](/docs/survey-editor/editor-overview#survey-editor-dashboard). ![Screenshot of survey editor dashboard](../images/dashboardEditor.png) -4. Click **"View"** and choose **"Survey Properties"** to define your [survey properties](/docs/survey-editor/basics/editor-overview#survey-properties-workspace) e.g. title, language or access conditions. +4. Click **"View"** and choose **"Survey Properties"** to define your [survey properties](/docs/survey-editor/editor-overview#survey-properties-workspace) e.g. title, language or access conditions. diff --git a/content/docs/survey-editor/basics/item-structure.mdx b/content/docs/survey-editor/item-structure.mdx similarity index 94% rename from content/docs/survey-editor/basics/item-structure.mdx rename to content/docs/survey-editor/item-structure.mdx index e838f02..760692a 100644 --- a/content/docs/survey-editor/basics/item-structure.mdx +++ b/content/docs/survey-editor/item-structure.mdx @@ -5,7 +5,7 @@ description: Understanding the structure of survey items ## Survey Items -A survey consists of items. An item can belong to either a question type or a non-question type category. (Read more about [item types](/docs/survey-editor/basics/item-structure#item-types)). +A survey consists of items. An item can belong to either a question type or a non-question type category. (Read more about [item types](/docs/survey-editor/item-structure#item-types)). A question item is structured by the following **components**: @@ -30,7 +30,7 @@ Main content that surrounds the response options: The item editor is displayed when you select an item or its icon in the left sidebar of the main editor. -![Overview of single choice item content](../images/overviewSinglechoice.png) +![Overview of single choice item content](./images/overviewSinglechoice.png) ### Top Navigation Bar @@ -51,7 +51,7 @@ The item editor is displayed when you select an item or its icon in the left sid ### Content Section (Left Side) -All item components described [above](/docs/survey-editor/basics/item-structure#survey-items) are listed here. Select any component by clicking on it to view and edit its settings. +All item components described [above](/docs/survey-editor/item-structure#survey-items) are listed here. Select any component by clicking on it to view and edit its settings. ### Preview Section (Right Side) diff --git a/content/docs/survey-editor/meta.json b/content/docs/survey-editor/meta.json index df098f7..3793f25 100644 --- a/content/docs/survey-editor/meta.json +++ b/content/docs/survey-editor/meta.json @@ -2,5 +2,11 @@ "title": "Survey Editor", "description": "Documentation for using the graphical survey editor", "root": true, - "icon": "PencilRuler" + "icon": "PencilRuler", + "pages": [ + "editor-overview", + "item-structure", + "conditions", + "guides" + ] } \ No newline at end of file diff --git a/content/tech-docs/management-api/api.mdx b/content/tech-docs/management-api/api.mdx deleted file mode 100644 index e051759..0000000 --- a/content/tech-docs/management-api/api.mdx +++ /dev/null @@ -1,4 +0,0 @@ ---- -title: API -description: Management API ---- diff --git a/content/tech-docs/management-api/api/accounts/meta.json b/content/tech-docs/management-api/api/accounts/meta.json new file mode 100644 index 0000000..55b909c --- /dev/null +++ b/content/tech-docs/management-api/api/accounts/meta.json @@ -0,0 +1,7 @@ +{ + "title": "Accounts", + "description": "Account tracking and identification", + "pages": [ + "updateStudyTrackAccount" + ] +} \ No newline at end of file diff --git a/content/tech-docs/management-api/api/accounts/updateStudyTrackAccount.mdx b/content/tech-docs/management-api/api/accounts/updateStudyTrackAccount.mdx new file mode 100644 index 0000000..2dad414 --- /dev/null +++ b/content/tech-docs/management-api/api/accounts/updateStudyTrackAccount.mdx @@ -0,0 +1,17 @@ +--- +title: Update study track-account flag +full: true +_openapi: + method: PUT + webhook: false + toc: [] + structuredData: + headings: [] + contents: + - content: | + Updates whether account tracking is enabled for the given study. +--- + +{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} + + \ No newline at end of file diff --git a/content/tech-docs/management-api/api/actions/actions_getPrevResponsesTaskResult.mdx b/content/tech-docs/management-api/api/actions/actions_getPrevResponsesTaskResult.mdx new file mode 100644 index 0000000..f10412c --- /dev/null +++ b/content/tech-docs/management-api/api/actions/actions_getPrevResponsesTaskResult.mdx @@ -0,0 +1,15 @@ +--- +title: Get previous-responses actions task result +full: true +_openapi: + method: GET + webhook: false + toc: [] + structuredData: + headings: [] + contents: [] +--- + +{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} + + \ No newline at end of file diff --git a/content/tech-docs/management-api/api/actions/actions_getPrevResponsesTaskStatus.mdx b/content/tech-docs/management-api/api/actions/actions_getPrevResponsesTaskStatus.mdx new file mode 100644 index 0000000..7d12947 --- /dev/null +++ b/content/tech-docs/management-api/api/actions/actions_getPrevResponsesTaskStatus.mdx @@ -0,0 +1,15 @@ +--- +title: Get previous-responses actions task status +full: true +_openapi: + method: GET + webhook: false + toc: [] + structuredData: + headings: [] + contents: [] +--- + +{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} + + \ No newline at end of file diff --git a/content/tech-docs/management-api/api/actions/actions_getTaskResult.mdx b/content/tech-docs/management-api/api/actions/actions_getTaskResult.mdx new file mode 100644 index 0000000..7495f5e --- /dev/null +++ b/content/tech-docs/management-api/api/actions/actions_getTaskResult.mdx @@ -0,0 +1,15 @@ +--- +title: Get actions task result +full: true +_openapi: + method: GET + webhook: false + toc: [] + structuredData: + headings: [] + contents: [] +--- + +{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} + + \ No newline at end of file diff --git a/content/tech-docs/management-api/api/actions/actions_getTaskStatus.mdx b/content/tech-docs/management-api/api/actions/actions_getTaskStatus.mdx new file mode 100644 index 0000000..5c90b9d --- /dev/null +++ b/content/tech-docs/management-api/api/actions/actions_getTaskStatus.mdx @@ -0,0 +1,15 @@ +--- +title: Get actions task status +full: true +_openapi: + method: GET + webhook: false + toc: [] + structuredData: + headings: [] + contents: [] +--- + +{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} + + \ No newline at end of file diff --git a/content/tech-docs/management-api/api/actions/actions_runOnParticipant.mdx b/content/tech-docs/management-api/api/actions/actions_runOnParticipant.mdx new file mode 100644 index 0000000..2ce526e --- /dev/null +++ b/content/tech-docs/management-api/api/actions/actions_runOnParticipant.mdx @@ -0,0 +1,15 @@ +--- +title: Run actions on a participant +full: true +_openapi: + method: POST + webhook: false + toc: [] + structuredData: + headings: [] + contents: [] +--- + +{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} + + \ No newline at end of file diff --git a/content/tech-docs/management-api/api/actions/actions_runOnParticipants.mdx b/content/tech-docs/management-api/api/actions/actions_runOnParticipants.mdx new file mode 100644 index 0000000..d8e7009 --- /dev/null +++ b/content/tech-docs/management-api/api/actions/actions_runOnParticipants.mdx @@ -0,0 +1,15 @@ +--- +title: Run actions on multiple participants +full: true +_openapi: + method: POST + webhook: false + toc: [] + structuredData: + headings: [] + contents: [] +--- + +{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} + + \ No newline at end of file diff --git a/content/tech-docs/management-api/api/actions/actions_runPrevResponsesOnParticipant.mdx b/content/tech-docs/management-api/api/actions/actions_runPrevResponsesOnParticipant.mdx new file mode 100644 index 0000000..1748c6e --- /dev/null +++ b/content/tech-docs/management-api/api/actions/actions_runPrevResponsesOnParticipant.mdx @@ -0,0 +1,15 @@ +--- +title: Run actions on previous responses for a participant +full: true +_openapi: + method: POST + webhook: false + toc: [] + structuredData: + headings: [] + contents: [] +--- + +{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} + + \ No newline at end of file diff --git a/content/tech-docs/management-api/api/actions/actions_runPrevResponsesOnParticipants.mdx b/content/tech-docs/management-api/api/actions/actions_runPrevResponsesOnParticipants.mdx new file mode 100644 index 0000000..6dde1d8 --- /dev/null +++ b/content/tech-docs/management-api/api/actions/actions_runPrevResponsesOnParticipants.mdx @@ -0,0 +1,15 @@ +--- +title: Run actions on previous responses for multiple participants +full: true +_openapi: + method: POST + webhook: false + toc: [] + structuredData: + headings: [] + contents: [] +--- + +{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} + + \ No newline at end of file diff --git a/content/tech-docs/management-api/api/actions/meta.json b/content/tech-docs/management-api/api/actions/meta.json new file mode 100644 index 0000000..164980c --- /dev/null +++ b/content/tech-docs/management-api/api/actions/meta.json @@ -0,0 +1,14 @@ +{ + "title": "Actions", + "description": "Run actions on participants", + "pages": [ + "actions_runOnParticipant", + "actions_runOnParticipants", + "actions_getTaskStatus", + "actions_getTaskResult", + "actions_runPrevResponsesOnParticipant", + "actions_runPrevResponsesOnParticipants", + "actions_getPrevResponsesTaskStatus", + "actions_getPrevResponsesTaskResult" + ] +} \ No newline at end of file diff --git a/content/tech-docs/management-api/api/app-roles/meta.json b/content/tech-docs/management-api/api/app-roles/meta.json new file mode 100644 index 0000000..e341b31 --- /dev/null +++ b/content/tech-docs/management-api/api/app-roles/meta.json @@ -0,0 +1,17 @@ +{ + "title": "App roles", + "description": "App role templates & assignments", + "pages": [ + "userManagement_listUserAppRoles", + "userManagement_addAppRoleToUser", + "userManagement_removeUserAppRole", + "userManagement_listAppRoleTemplates", + "userManagement_createAppRoleTemplate", + "userManagement_getAppRoleTemplate", + "userManagement_updateAppRoleTemplate", + "userManagement_deleteAppRoleTemplate", + "userManagement_deleteAppRoleTemplatesForApp", + "userManagement_listAppRoles", + "userManagement_deleteAppRolesForApp" + ] +} \ No newline at end of file diff --git a/content/tech-docs/management-api/api/app-roles/userManagement_addAppRoleToUser.mdx b/content/tech-docs/management-api/api/app-roles/userManagement_addAppRoleToUser.mdx new file mode 100644 index 0000000..80dd345 --- /dev/null +++ b/content/tech-docs/management-api/api/app-roles/userManagement_addAppRoleToUser.mdx @@ -0,0 +1,15 @@ +--- +title: Add app role to user +full: true +_openapi: + method: POST + webhook: false + toc: [] + structuredData: + headings: [] + contents: [] +--- + +{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} + + \ No newline at end of file diff --git a/content/tech-docs/management-api/api/app-roles/userManagement_createAppRoleTemplate.mdx b/content/tech-docs/management-api/api/app-roles/userManagement_createAppRoleTemplate.mdx new file mode 100644 index 0000000..d7b80e9 --- /dev/null +++ b/content/tech-docs/management-api/api/app-roles/userManagement_createAppRoleTemplate.mdx @@ -0,0 +1,15 @@ +--- +title: Create app role template +full: true +_openapi: + method: POST + webhook: false + toc: [] + structuredData: + headings: [] + contents: [] +--- + +{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} + + \ No newline at end of file diff --git a/content/tech-docs/management-api/api/app-roles/userManagement_deleteAppRoleTemplate.mdx b/content/tech-docs/management-api/api/app-roles/userManagement_deleteAppRoleTemplate.mdx new file mode 100644 index 0000000..ca80216 --- /dev/null +++ b/content/tech-docs/management-api/api/app-roles/userManagement_deleteAppRoleTemplate.mdx @@ -0,0 +1,15 @@ +--- +title: Delete app role template +full: true +_openapi: + method: DELETE + webhook: false + toc: [] + structuredData: + headings: [] + contents: [] +--- + +{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} + + \ No newline at end of file diff --git a/content/tech-docs/management-api/api/app-roles/userManagement_deleteAppRoleTemplatesForApp.mdx b/content/tech-docs/management-api/api/app-roles/userManagement_deleteAppRoleTemplatesForApp.mdx new file mode 100644 index 0000000..89cbd10 --- /dev/null +++ b/content/tech-docs/management-api/api/app-roles/userManagement_deleteAppRoleTemplatesForApp.mdx @@ -0,0 +1,15 @@ +--- +title: Delete app role templates for app +full: true +_openapi: + method: DELETE + webhook: false + toc: [] + structuredData: + headings: [] + contents: [] +--- + +{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} + + \ No newline at end of file diff --git a/content/tech-docs/management-api/api/app-roles/userManagement_deleteAppRolesForApp.mdx b/content/tech-docs/management-api/api/app-roles/userManagement_deleteAppRolesForApp.mdx new file mode 100644 index 0000000..1590719 --- /dev/null +++ b/content/tech-docs/management-api/api/app-roles/userManagement_deleteAppRolesForApp.mdx @@ -0,0 +1,15 @@ +--- +title: Delete app roles for app +full: true +_openapi: + method: DELETE + webhook: false + toc: [] + structuredData: + headings: [] + contents: [] +--- + +{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} + + \ No newline at end of file diff --git a/content/tech-docs/management-api/api/app-roles/userManagement_getAppRoleTemplate.mdx b/content/tech-docs/management-api/api/app-roles/userManagement_getAppRoleTemplate.mdx new file mode 100644 index 0000000..ab40f4c --- /dev/null +++ b/content/tech-docs/management-api/api/app-roles/userManagement_getAppRoleTemplate.mdx @@ -0,0 +1,15 @@ +--- +title: Get app role template +full: true +_openapi: + method: GET + webhook: false + toc: [] + structuredData: + headings: [] + contents: [] +--- + +{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} + + \ No newline at end of file diff --git a/content/tech-docs/management-api/api/app-roles/userManagement_listAppRoleTemplates.mdx b/content/tech-docs/management-api/api/app-roles/userManagement_listAppRoleTemplates.mdx new file mode 100644 index 0000000..3d6de59 --- /dev/null +++ b/content/tech-docs/management-api/api/app-roles/userManagement_listAppRoleTemplates.mdx @@ -0,0 +1,15 @@ +--- +title: List app role templates +full: true +_openapi: + method: GET + webhook: false + toc: [] + structuredData: + headings: [] + contents: [] +--- + +{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} + + \ No newline at end of file diff --git a/content/tech-docs/management-api/api/app-roles/userManagement_listAppRoles.mdx b/content/tech-docs/management-api/api/app-roles/userManagement_listAppRoles.mdx new file mode 100644 index 0000000..d4a7ad8 --- /dev/null +++ b/content/tech-docs/management-api/api/app-roles/userManagement_listAppRoles.mdx @@ -0,0 +1,15 @@ +--- +title: List app roles +full: true +_openapi: + method: GET + webhook: false + toc: [] + structuredData: + headings: [] + contents: [] +--- + +{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} + + \ No newline at end of file diff --git a/content/tech-docs/management-api/api/app-roles/userManagement_listUserAppRoles.mdx b/content/tech-docs/management-api/api/app-roles/userManagement_listUserAppRoles.mdx new file mode 100644 index 0000000..c490722 --- /dev/null +++ b/content/tech-docs/management-api/api/app-roles/userManagement_listUserAppRoles.mdx @@ -0,0 +1,15 @@ +--- +title: List app roles for user +full: true +_openapi: + method: GET + webhook: false + toc: [] + structuredData: + headings: [] + contents: [] +--- + +{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} + + \ No newline at end of file diff --git a/content/tech-docs/management-api/api/app-roles/userManagement_removeUserAppRole.mdx b/content/tech-docs/management-api/api/app-roles/userManagement_removeUserAppRole.mdx new file mode 100644 index 0000000..6edf917 --- /dev/null +++ b/content/tech-docs/management-api/api/app-roles/userManagement_removeUserAppRole.mdx @@ -0,0 +1,15 @@ +--- +title: Remove app role from user +full: true +_openapi: + method: DELETE + webhook: false + toc: [] + structuredData: + headings: [] + contents: [] +--- + +{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} + + \ No newline at end of file diff --git a/content/tech-docs/management-api/api/app-roles/userManagement_updateAppRoleTemplate.mdx b/content/tech-docs/management-api/api/app-roles/userManagement_updateAppRoleTemplate.mdx new file mode 100644 index 0000000..a0d1744 --- /dev/null +++ b/content/tech-docs/management-api/api/app-roles/userManagement_updateAppRoleTemplate.mdx @@ -0,0 +1,15 @@ +--- +title: Update app role template +full: true +_openapi: + method: PUT + webhook: false + toc: [] + structuredData: + headings: [] + contents: [] +--- + +{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} + + \ No newline at end of file diff --git a/content/tech-docs/management-api/api/auth/auth_extendSession.mdx b/content/tech-docs/management-api/api/auth/auth_extendSession.mdx new file mode 100644 index 0000000..602f2ee --- /dev/null +++ b/content/tech-docs/management-api/api/auth/auth_extendSession.mdx @@ -0,0 +1,15 @@ +--- +title: Extend session +full: true +_openapi: + method: POST + webhook: false + toc: [] + structuredData: + headings: [] + contents: [] +--- + +{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} + + \ No newline at end of file diff --git a/content/tech-docs/management-api/api/auth/auth_listPermissions.mdx b/content/tech-docs/management-api/api/auth/auth_listPermissions.mdx new file mode 100644 index 0000000..e40db4e --- /dev/null +++ b/content/tech-docs/management-api/api/auth/auth_listPermissions.mdx @@ -0,0 +1,15 @@ +--- +title: List permissions and roles +full: true +_openapi: + method: GET + webhook: false + toc: [] + structuredData: + headings: [] + contents: [] +--- + +{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} + + \ No newline at end of file diff --git a/content/tech-docs/management-api/api/auth/auth_renewToken.mdx b/content/tech-docs/management-api/api/auth/auth_renewToken.mdx new file mode 100644 index 0000000..9c1b3ce --- /dev/null +++ b/content/tech-docs/management-api/api/auth/auth_renewToken.mdx @@ -0,0 +1,15 @@ +--- +title: Get renew token +full: true +_openapi: + method: GET + webhook: false + toc: [] + structuredData: + headings: [] + contents: [] +--- + +{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} + + \ No newline at end of file diff --git a/content/tech-docs/management-api/api/auth/auth_signinWithIdp.mdx b/content/tech-docs/management-api/api/auth/auth_signinWithIdp.mdx new file mode 100644 index 0000000..a207f14 --- /dev/null +++ b/content/tech-docs/management-api/api/auth/auth_signinWithIdp.mdx @@ -0,0 +1,15 @@ +--- +title: Sign in with identity provider +full: true +_openapi: + method: POST + webhook: false + toc: [] + structuredData: + headings: [] + contents: [] +--- + +{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} + + \ No newline at end of file diff --git a/content/tech-docs/management-api/api/auth/meta.json b/content/tech-docs/management-api/api/auth/meta.json new file mode 100644 index 0000000..bbc3dd6 --- /dev/null +++ b/content/tech-docs/management-api/api/auth/meta.json @@ -0,0 +1,10 @@ +{ + "title": "Auth", + "description": "Authentication & Session", + "pages": [ + "auth_signinWithIdp", + "auth_extendSession", + "auth_renewToken", + "auth_listPermissions" + ] +} \ No newline at end of file diff --git a/content/tech-docs/management-api/api/code-lists/codeLists_addCodes.mdx b/content/tech-docs/management-api/api/code-lists/codeLists_addCodes.mdx new file mode 100644 index 0000000..00312a4 --- /dev/null +++ b/content/tech-docs/management-api/api/code-lists/codeLists_addCodes.mdx @@ -0,0 +1,15 @@ +--- +title: Add codes to a study code list +full: true +_openapi: + method: POST + webhook: false + toc: [] + structuredData: + headings: [] + contents: [] +--- + +{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} + + \ No newline at end of file diff --git a/content/tech-docs/management-api/api/code-lists/codeLists_getCodes.mdx b/content/tech-docs/management-api/api/code-lists/codeLists_getCodes.mdx new file mode 100644 index 0000000..f3cb6d5 --- /dev/null +++ b/content/tech-docs/management-api/api/code-lists/codeLists_getCodes.mdx @@ -0,0 +1,15 @@ +--- +title: List codes of a study code list +full: true +_openapi: + method: GET + webhook: false + toc: [] + structuredData: + headings: [] + contents: [] +--- + +{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} + + \ No newline at end of file diff --git a/content/tech-docs/management-api/api/code-lists/codeLists_getListKeys.mdx b/content/tech-docs/management-api/api/code-lists/codeLists_getListKeys.mdx new file mode 100644 index 0000000..feac440 --- /dev/null +++ b/content/tech-docs/management-api/api/code-lists/codeLists_getListKeys.mdx @@ -0,0 +1,15 @@ +--- +title: List code list keys +full: true +_openapi: + method: GET + webhook: false + toc: [] + structuredData: + headings: [] + contents: [] +--- + +{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} + + \ No newline at end of file diff --git a/content/tech-docs/management-api/api/code-lists/codeLists_removeCode.mdx b/content/tech-docs/management-api/api/code-lists/codeLists_removeCode.mdx new file mode 100644 index 0000000..61b75c4 --- /dev/null +++ b/content/tech-docs/management-api/api/code-lists/codeLists_removeCode.mdx @@ -0,0 +1,15 @@ +--- +title: Remove a code from a study code list +full: true +_openapi: + method: DELETE + webhook: false + toc: [] + structuredData: + headings: [] + contents: [] +--- + +{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} + + \ No newline at end of file diff --git a/content/tech-docs/management-api/api/code-lists/meta.json b/content/tech-docs/management-api/api/code-lists/meta.json new file mode 100644 index 0000000..dc8dd92 --- /dev/null +++ b/content/tech-docs/management-api/api/code-lists/meta.json @@ -0,0 +1,10 @@ +{ + "title": "Code lists", + "description": "Study code lists", + "pages": [ + "codeLists_getListKeys", + "codeLists_getCodes", + "codeLists_addCodes", + "codeLists_removeCode" + ] +} \ No newline at end of file diff --git a/content/tech-docs/management-api/api/files/dataExplorer_deleteFile.mdx b/content/tech-docs/management-api/api/files/dataExplorer_deleteFile.mdx new file mode 100644 index 0000000..33a8be7 --- /dev/null +++ b/content/tech-docs/management-api/api/files/dataExplorer_deleteFile.mdx @@ -0,0 +1,15 @@ +--- +title: Delete file +full: true +_openapi: + method: DELETE + webhook: false + toc: [] + structuredData: + headings: [] + contents: [] +--- + +{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} + + \ No newline at end of file diff --git a/content/tech-docs/management-api/api/files/dataExplorer_getFile.mdx b/content/tech-docs/management-api/api/files/dataExplorer_getFile.mdx new file mode 100644 index 0000000..a8b00bb --- /dev/null +++ b/content/tech-docs/management-api/api/files/dataExplorer_getFile.mdx @@ -0,0 +1,15 @@ +--- +title: Get file by ID +full: true +_openapi: + method: GET + webhook: false + toc: [] + structuredData: + headings: [] + contents: [] +--- + +{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} + + \ No newline at end of file diff --git a/content/tech-docs/management-api/api/files/dataExplorer_listFiles.mdx b/content/tech-docs/management-api/api/files/dataExplorer_listFiles.mdx new file mode 100644 index 0000000..5165422 --- /dev/null +++ b/content/tech-docs/management-api/api/files/dataExplorer_listFiles.mdx @@ -0,0 +1,15 @@ +--- +title: List files +full: true +_openapi: + method: GET + webhook: false + toc: [] + structuredData: + headings: [] + contents: [] +--- + +{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} + + \ No newline at end of file diff --git a/content/tech-docs/management-api/api/files/meta.json b/content/tech-docs/management-api/api/files/meta.json new file mode 100644 index 0000000..489cf89 --- /dev/null +++ b/content/tech-docs/management-api/api/files/meta.json @@ -0,0 +1,9 @@ +{ + "title": "Files", + "description": "File management for studies", + "pages": [ + "dataExplorer_listFiles", + "dataExplorer_getFile", + "dataExplorer_deleteFile" + ] +} \ No newline at end of file diff --git a/content/tech-docs/management-api/api/index.mdx b/content/tech-docs/management-api/api/index.mdx new file mode 100644 index 0000000..f49cf9f --- /dev/null +++ b/content/tech-docs/management-api/api/index.mdx @@ -0,0 +1,279 @@ +--- +title: Management API +description: Endpoints for management authentication, user management, study administration, messaging, and participant administration. +--- + +{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} + + +### Auth + +Authentication & Session + + +Sign in with identity provider POST} /> +Extend session POST} /> +Get renew token GET} /> +List permissions and roles GET} /> + + +### Studies + +Study management + + +List all studies GET} /> +Create a new study POST} /> +Get study configuration by key GET} /> +Delete a study by key DELETE} /> +Export study configuration, surveys, and rules GET} /> +Update default status of a study PUT} /> +Update status of a study PUT} /> +Update display properties of a study PUT} /> +Update file upload configuration of a study PUT} /> + + +### Surveys + +Survey management + + +List survey infos for a study GET} /> +Create a new survey in a study POST} /> +Get latest survey by key GET} /> +Update survey definition POST} /> +Unpublish a survey POST} /> +List all survey versions GET} /> +Get a specific survey version GET} /> +Delete a survey version DELETE} /> + + +### Study rules + +Study rules + + +Get current published study rules GET} /> +Publish a new version of study rules POST} /> +List all study rules versions GET} /> +Get a study rules version by ID GET} /> +Delete a study rules version DELETE} /> + + +### Study variables + +Study variables + + +List study variables GET} /> +Create a new study variable POST} /> +Get a study variable by key GET} /> +Delete a study variable DELETE} /> +Update study variable definition PUT} /> +Update study variable value PUT} /> + + +### Study counters + +Study counters + + +List all study counter values GET} /> +Set a study counter value for scope POST} /> +Remove a study counter value DELETE} /> +Increment a study counter value PUT} /> + + +### Study permissions + +Permissions for a study + + +List study permissions GET} /> +Add a study permission POST} /> +Remove a study permission DELETE} /> + + +### Notifications + +Notification subscriptions + + +List notification subscriptions GET} /> +Update notification subscriptions PUT} /> + + +### Code lists + +Study code lists + + +List code list keys GET} /> +List codes of a study code list GET} /> +Add codes to a study code list POST} /> +Remove a code from a study code list DELETE} /> + + +### Participants + +Participant operations + + +Create virtual participant POST} /> +List participant responses GET} /> +Submit participant response POST} /> +Submit participant event POST} /> +Remove or replace a participant study session POST} /> +Merge participants POST} /> +Edit participant PUT} /> +Get participants count GET} /> +Start participants export task POST} /> +Get participants export task status GET} /> +Get participants export task result GET} /> +List participants GET} /> +Get participant GET} /> + + +### Accounts + +Account tracking and identification + + +Update study track-account flag PUT} description={"Updates whether account tracking is enabled for the given study.\n"} /> + + +### Reports + +Participant reports + + +Submit participant report POST} /> +Update participant report PUT} /> +Get report items count GET} /> +Start report export task POST} /> +Get report export task status GET} /> +Get report export task result GET} /> +List available report keys GET} /> +List reports GET} /> +Get report by ID GET} /> + + +### Responses + +Response exports & queries + + +List survey info GET} /> +Get responses count GET} /> +Start responses export task POST} /> +Get responses export task status GET} /> +Get responses export task result GET} /> +List daily response exports GET} /> +Get daily response export by ID GET} /> +List confidential response exports GET} /> +Start confidential responses export task POST} /> +Get confidential response export by ID GET} /> +List survey responses GET} /> +Delete survey responses DELETE} /> +Get survey response by ID GET} /> +Delete survey response DELETE} /> + + +### Files + +File management for studies + + +List files GET} /> +Get file by ID GET} /> +Delete file DELETE} /> + + +### Messaging + +Messaging templates & scheduled emails + + +List global email templates GET} /> +Save global email template POST} /> +Get global email template by type GET} /> +Delete global email template DELETE} /> +List all study email templates GET} /> +List study email templates GET} /> +Save study email template POST} /> +Get study email template by type GET} /> +Delete study email template DELETE} /> +Save SMS template POST} /> +Get SMS template by type GET} /> +List scheduled emails GET} /> +Save scheduled email POST} /> +Get scheduled email GET} /> +Delete scheduled email DELETE} /> + + +### User management + +Management user accounts and permissions + + +List management users GET} /> +Get management user GET} /> +Delete management user DELETE} /> +List user permissions GET} /> +Add permission to user POST} /> +Delete user permission DELETE} /> +Update permission limiter PUT} /> +Request participant user deletion POST} /> + + +### Service accounts + +Service account management + + +List service accounts GET} /> +Create service account POST} /> +Get service account GET} /> +Delete service account DELETE} /> +Update service account PUT} /> +List service account API keys GET} /> +Create service account API key POST} /> +Delete service account API key DELETE} /> +List service account permissions GET} /> +Add permission to service account POST} /> +Delete service account permission DELETE} /> +Update service account permission limiter PUT} /> + + +### App roles + +App role templates & assignments + + +List app roles for user GET} /> +Add app role to user POST} /> +Remove app role from user DELETE} /> +List app role templates GET} /> +Create app role template POST} /> +Get app role template GET} /> +Update app role template PUT} /> +Delete app role template DELETE} /> +Delete app role templates for app DELETE} /> +List app roles GET} /> +Delete app roles for app DELETE} /> + + +### Actions + +Run actions on participants + + +Run actions on a participant POST} /> +Run actions on multiple participants POST} /> +Get actions task status GET} /> +Get actions task result GET} /> +Run actions on previous responses for a participant POST} /> +Run actions on previous responses for multiple participants POST} /> +Get previous-responses actions task status GET} /> +Get previous-responses actions task result GET} /> + \ No newline at end of file diff --git a/content/tech-docs/management-api/api/messaging/messaging_createScheduledEmail.mdx b/content/tech-docs/management-api/api/messaging/messaging_createScheduledEmail.mdx new file mode 100644 index 0000000..fe37179 --- /dev/null +++ b/content/tech-docs/management-api/api/messaging/messaging_createScheduledEmail.mdx @@ -0,0 +1,15 @@ +--- +title: Save scheduled email +full: true +_openapi: + method: POST + webhook: false + toc: [] + structuredData: + headings: [] + contents: [] +--- + +{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} + + \ No newline at end of file diff --git a/content/tech-docs/management-api/api/messaging/messaging_deleteGlobalEmailTemplate.mdx b/content/tech-docs/management-api/api/messaging/messaging_deleteGlobalEmailTemplate.mdx new file mode 100644 index 0000000..e85e98d --- /dev/null +++ b/content/tech-docs/management-api/api/messaging/messaging_deleteGlobalEmailTemplate.mdx @@ -0,0 +1,15 @@ +--- +title: Delete global email template +full: true +_openapi: + method: DELETE + webhook: false + toc: [] + structuredData: + headings: [] + contents: [] +--- + +{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} + + \ No newline at end of file diff --git a/content/tech-docs/management-api/api/messaging/messaging_deleteScheduledEmail.mdx b/content/tech-docs/management-api/api/messaging/messaging_deleteScheduledEmail.mdx new file mode 100644 index 0000000..fdba593 --- /dev/null +++ b/content/tech-docs/management-api/api/messaging/messaging_deleteScheduledEmail.mdx @@ -0,0 +1,15 @@ +--- +title: Delete scheduled email +full: true +_openapi: + method: DELETE + webhook: false + toc: [] + structuredData: + headings: [] + contents: [] +--- + +{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} + + \ No newline at end of file diff --git a/content/tech-docs/management-api/api/messaging/messaging_deleteStudyEmailTemplate.mdx b/content/tech-docs/management-api/api/messaging/messaging_deleteStudyEmailTemplate.mdx new file mode 100644 index 0000000..21ae082 --- /dev/null +++ b/content/tech-docs/management-api/api/messaging/messaging_deleteStudyEmailTemplate.mdx @@ -0,0 +1,15 @@ +--- +title: Delete study email template +full: true +_openapi: + method: DELETE + webhook: false + toc: [] + structuredData: + headings: [] + contents: [] +--- + +{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} + + \ No newline at end of file diff --git a/content/tech-docs/management-api/api/messaging/messaging_getGlobalEmailTemplate.mdx b/content/tech-docs/management-api/api/messaging/messaging_getGlobalEmailTemplate.mdx new file mode 100644 index 0000000..9c2bfb6 --- /dev/null +++ b/content/tech-docs/management-api/api/messaging/messaging_getGlobalEmailTemplate.mdx @@ -0,0 +1,15 @@ +--- +title: Get global email template by type +full: true +_openapi: + method: GET + webhook: false + toc: [] + structuredData: + headings: [] + contents: [] +--- + +{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} + + \ No newline at end of file diff --git a/content/tech-docs/management-api/api/messaging/messaging_getScheduledEmail.mdx b/content/tech-docs/management-api/api/messaging/messaging_getScheduledEmail.mdx new file mode 100644 index 0000000..a9787e6 --- /dev/null +++ b/content/tech-docs/management-api/api/messaging/messaging_getScheduledEmail.mdx @@ -0,0 +1,15 @@ +--- +title: Get scheduled email +full: true +_openapi: + method: GET + webhook: false + toc: [] + structuredData: + headings: [] + contents: [] +--- + +{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} + + \ No newline at end of file diff --git a/content/tech-docs/management-api/api/messaging/messaging_getSmsTemplate.mdx b/content/tech-docs/management-api/api/messaging/messaging_getSmsTemplate.mdx new file mode 100644 index 0000000..10613ba --- /dev/null +++ b/content/tech-docs/management-api/api/messaging/messaging_getSmsTemplate.mdx @@ -0,0 +1,15 @@ +--- +title: Get SMS template by type +full: true +_openapi: + method: GET + webhook: false + toc: [] + structuredData: + headings: [] + contents: [] +--- + +{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} + + \ No newline at end of file diff --git a/content/tech-docs/management-api/api/messaging/messaging_getStudyEmailTemplate.mdx b/content/tech-docs/management-api/api/messaging/messaging_getStudyEmailTemplate.mdx new file mode 100644 index 0000000..045af9d --- /dev/null +++ b/content/tech-docs/management-api/api/messaging/messaging_getStudyEmailTemplate.mdx @@ -0,0 +1,15 @@ +--- +title: Get study email template by type +full: true +_openapi: + method: GET + webhook: false + toc: [] + structuredData: + headings: [] + contents: [] +--- + +{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} + + \ No newline at end of file diff --git a/content/tech-docs/management-api/api/messaging/messaging_listAllStudyEmailTemplates.mdx b/content/tech-docs/management-api/api/messaging/messaging_listAllStudyEmailTemplates.mdx new file mode 100644 index 0000000..33af81b --- /dev/null +++ b/content/tech-docs/management-api/api/messaging/messaging_listAllStudyEmailTemplates.mdx @@ -0,0 +1,15 @@ +--- +title: List all study email templates +full: true +_openapi: + method: GET + webhook: false + toc: [] + structuredData: + headings: [] + contents: [] +--- + +{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} + + \ No newline at end of file diff --git a/content/tech-docs/management-api/api/messaging/messaging_listGlobalEmailTemplates.mdx b/content/tech-docs/management-api/api/messaging/messaging_listGlobalEmailTemplates.mdx new file mode 100644 index 0000000..08e2ced --- /dev/null +++ b/content/tech-docs/management-api/api/messaging/messaging_listGlobalEmailTemplates.mdx @@ -0,0 +1,15 @@ +--- +title: List global email templates +full: true +_openapi: + method: GET + webhook: false + toc: [] + structuredData: + headings: [] + contents: [] +--- + +{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} + + \ No newline at end of file diff --git a/content/tech-docs/management-api/api/messaging/messaging_listScheduledEmails.mdx b/content/tech-docs/management-api/api/messaging/messaging_listScheduledEmails.mdx new file mode 100644 index 0000000..4183235 --- /dev/null +++ b/content/tech-docs/management-api/api/messaging/messaging_listScheduledEmails.mdx @@ -0,0 +1,15 @@ +--- +title: List scheduled emails +full: true +_openapi: + method: GET + webhook: false + toc: [] + structuredData: + headings: [] + contents: [] +--- + +{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} + + \ No newline at end of file diff --git a/content/tech-docs/management-api/api/messaging/messaging_listStudyEmailTemplates.mdx b/content/tech-docs/management-api/api/messaging/messaging_listStudyEmailTemplates.mdx new file mode 100644 index 0000000..585e565 --- /dev/null +++ b/content/tech-docs/management-api/api/messaging/messaging_listStudyEmailTemplates.mdx @@ -0,0 +1,15 @@ +--- +title: List study email templates +full: true +_openapi: + method: GET + webhook: false + toc: [] + structuredData: + headings: [] + contents: [] +--- + +{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} + + \ No newline at end of file diff --git a/content/tech-docs/management-api/api/messaging/messaging_saveGlobalEmailTemplate.mdx b/content/tech-docs/management-api/api/messaging/messaging_saveGlobalEmailTemplate.mdx new file mode 100644 index 0000000..86f8667 --- /dev/null +++ b/content/tech-docs/management-api/api/messaging/messaging_saveGlobalEmailTemplate.mdx @@ -0,0 +1,15 @@ +--- +title: Save global email template +full: true +_openapi: + method: POST + webhook: false + toc: [] + structuredData: + headings: [] + contents: [] +--- + +{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} + + \ No newline at end of file diff --git a/content/tech-docs/management-api/api/messaging/messaging_saveSmsTemplate.mdx b/content/tech-docs/management-api/api/messaging/messaging_saveSmsTemplate.mdx new file mode 100644 index 0000000..fc42cad --- /dev/null +++ b/content/tech-docs/management-api/api/messaging/messaging_saveSmsTemplate.mdx @@ -0,0 +1,15 @@ +--- +title: Save SMS template +full: true +_openapi: + method: POST + webhook: false + toc: [] + structuredData: + headings: [] + contents: [] +--- + +{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} + + \ No newline at end of file diff --git a/content/tech-docs/management-api/api/messaging/messaging_saveStudyEmailTemplate.mdx b/content/tech-docs/management-api/api/messaging/messaging_saveStudyEmailTemplate.mdx new file mode 100644 index 0000000..4a750db --- /dev/null +++ b/content/tech-docs/management-api/api/messaging/messaging_saveStudyEmailTemplate.mdx @@ -0,0 +1,15 @@ +--- +title: Save study email template +full: true +_openapi: + method: POST + webhook: false + toc: [] + structuredData: + headings: [] + contents: [] +--- + +{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} + + \ No newline at end of file diff --git a/content/tech-docs/management-api/api/messaging/meta.json b/content/tech-docs/management-api/api/messaging/meta.json new file mode 100644 index 0000000..cc37da8 --- /dev/null +++ b/content/tech-docs/management-api/api/messaging/meta.json @@ -0,0 +1,21 @@ +{ + "title": "Messaging", + "description": "Messaging templates & scheduled emails", + "pages": [ + "messaging_listGlobalEmailTemplates", + "messaging_saveGlobalEmailTemplate", + "messaging_getGlobalEmailTemplate", + "messaging_deleteGlobalEmailTemplate", + "messaging_listAllStudyEmailTemplates", + "messaging_listStudyEmailTemplates", + "messaging_saveStudyEmailTemplate", + "messaging_getStudyEmailTemplate", + "messaging_deleteStudyEmailTemplate", + "messaging_saveSmsTemplate", + "messaging_getSmsTemplate", + "messaging_listScheduledEmails", + "messaging_createScheduledEmail", + "messaging_getScheduledEmail", + "messaging_deleteScheduledEmail" + ] +} \ No newline at end of file diff --git a/content/tech-docs/management-api/api/meta.json b/content/tech-docs/management-api/api/meta.json new file mode 100644 index 0000000..81d2635 --- /dev/null +++ b/content/tech-docs/management-api/api/meta.json @@ -0,0 +1,23 @@ +{ + "pages": [ + "auth", + "studies", + "surveys", + "study-rules", + "study-variables", + "study-counters", + "study-permissions", + "notifications", + "code-lists", + "participants", + "accounts", + "reports", + "responses", + "files", + "messaging", + "user-management", + "service-accounts", + "app-roles", + "actions" + ] +} diff --git a/content/tech-docs/management-api/api/notifications/meta.json b/content/tech-docs/management-api/api/notifications/meta.json new file mode 100644 index 0000000..d3757b7 --- /dev/null +++ b/content/tech-docs/management-api/api/notifications/meta.json @@ -0,0 +1,8 @@ +{ + "title": "Notifications", + "description": "Notification subscriptions", + "pages": [ + "notifications_getSubscriptions", + "notifications_updateSubscriptions" + ] +} \ No newline at end of file diff --git a/content/tech-docs/management-api/api/notifications/notifications_getSubscriptions.mdx b/content/tech-docs/management-api/api/notifications/notifications_getSubscriptions.mdx new file mode 100644 index 0000000..94d3f08 --- /dev/null +++ b/content/tech-docs/management-api/api/notifications/notifications_getSubscriptions.mdx @@ -0,0 +1,15 @@ +--- +title: List notification subscriptions +full: true +_openapi: + method: GET + webhook: false + toc: [] + structuredData: + headings: [] + contents: [] +--- + +{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} + + \ No newline at end of file diff --git a/content/tech-docs/management-api/api/notifications/notifications_updateSubscriptions.mdx b/content/tech-docs/management-api/api/notifications/notifications_updateSubscriptions.mdx new file mode 100644 index 0000000..6e202a3 --- /dev/null +++ b/content/tech-docs/management-api/api/notifications/notifications_updateSubscriptions.mdx @@ -0,0 +1,15 @@ +--- +title: Update notification subscriptions +full: true +_openapi: + method: PUT + webhook: false + toc: [] + structuredData: + headings: [] + contents: [] +--- + +{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} + + \ No newline at end of file diff --git a/content/tech-docs/management-api/api/participants/dataExplorer_getParticipant.mdx b/content/tech-docs/management-api/api/participants/dataExplorer_getParticipant.mdx new file mode 100644 index 0000000..4cdf299 --- /dev/null +++ b/content/tech-docs/management-api/api/participants/dataExplorer_getParticipant.mdx @@ -0,0 +1,15 @@ +--- +title: Get participant +full: true +_openapi: + method: GET + webhook: false + toc: [] + structuredData: + headings: [] + contents: [] +--- + +{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} + + \ No newline at end of file diff --git a/content/tech-docs/management-api/api/participants/dataExplorer_listParticipants.mdx b/content/tech-docs/management-api/api/participants/dataExplorer_listParticipants.mdx new file mode 100644 index 0000000..62af283 --- /dev/null +++ b/content/tech-docs/management-api/api/participants/dataExplorer_listParticipants.mdx @@ -0,0 +1,15 @@ +--- +title: List participants +full: true +_openapi: + method: GET + webhook: false + toc: [] + structuredData: + headings: [] + contents: [] +--- + +{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} + + \ No newline at end of file diff --git a/content/tech-docs/management-api/api/participants/dataExporter_generateParticipantsExport.mdx b/content/tech-docs/management-api/api/participants/dataExporter_generateParticipantsExport.mdx new file mode 100644 index 0000000..36ad307 --- /dev/null +++ b/content/tech-docs/management-api/api/participants/dataExporter_generateParticipantsExport.mdx @@ -0,0 +1,15 @@ +--- +title: Start participants export task +full: true +_openapi: + method: POST + webhook: false + toc: [] + structuredData: + headings: [] + contents: [] +--- + +{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} + + \ No newline at end of file diff --git a/content/tech-docs/management-api/api/participants/dataExporter_getParticipantsCount.mdx b/content/tech-docs/management-api/api/participants/dataExporter_getParticipantsCount.mdx new file mode 100644 index 0000000..5ec503a --- /dev/null +++ b/content/tech-docs/management-api/api/participants/dataExporter_getParticipantsCount.mdx @@ -0,0 +1,15 @@ +--- +title: Get participants count +full: true +_openapi: + method: GET + webhook: false + toc: [] + structuredData: + headings: [] + contents: [] +--- + +{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} + + \ No newline at end of file diff --git a/content/tech-docs/management-api/api/participants/dataExporter_getParticipantsTaskResult.mdx b/content/tech-docs/management-api/api/participants/dataExporter_getParticipantsTaskResult.mdx new file mode 100644 index 0000000..3f996dc --- /dev/null +++ b/content/tech-docs/management-api/api/participants/dataExporter_getParticipantsTaskResult.mdx @@ -0,0 +1,15 @@ +--- +title: Get participants export task result +full: true +_openapi: + method: GET + webhook: false + toc: [] + structuredData: + headings: [] + contents: [] +--- + +{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} + + \ No newline at end of file diff --git a/content/tech-docs/management-api/api/participants/dataExporter_getParticipantsTaskStatus.mdx b/content/tech-docs/management-api/api/participants/dataExporter_getParticipantsTaskStatus.mdx new file mode 100644 index 0000000..a95534b --- /dev/null +++ b/content/tech-docs/management-api/api/participants/dataExporter_getParticipantsTaskStatus.mdx @@ -0,0 +1,15 @@ +--- +title: Get participants export task status +full: true +_openapi: + method: GET + webhook: false + toc: [] + structuredData: + headings: [] + contents: [] +--- + +{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} + + \ No newline at end of file diff --git a/content/tech-docs/management-api/api/participants/meta.json b/content/tech-docs/management-api/api/participants/meta.json new file mode 100644 index 0000000..9eadd68 --- /dev/null +++ b/content/tech-docs/management-api/api/participants/meta.json @@ -0,0 +1,19 @@ +{ + "title": "Participants", + "description": "Participant operations", + "pages": [ + "participants_createVirtualParticipant", + "participants_listParticipantResponses", + "participants_submitParticipantResponse", + "participants_submitParticipantEvent", + "participants_removeStudySession", + "participants_mergeParticipants", + "participants_editParticipant", + "dataExporter_getParticipantsCount", + "dataExporter_generateParticipantsExport", + "dataExporter_getParticipantsTaskStatus", + "dataExporter_getParticipantsTaskResult", + "dataExplorer_listParticipants", + "dataExplorer_getParticipant" + ] +} \ No newline at end of file diff --git a/content/tech-docs/management-api/api/participants/participants_createVirtualParticipant.mdx b/content/tech-docs/management-api/api/participants/participants_createVirtualParticipant.mdx new file mode 100644 index 0000000..0ae4ea5 --- /dev/null +++ b/content/tech-docs/management-api/api/participants/participants_createVirtualParticipant.mdx @@ -0,0 +1,15 @@ +--- +title: Create virtual participant +full: true +_openapi: + method: POST + webhook: false + toc: [] + structuredData: + headings: [] + contents: [] +--- + +{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} + + \ No newline at end of file diff --git a/content/tech-docs/management-api/api/participants/participants_editParticipant.mdx b/content/tech-docs/management-api/api/participants/participants_editParticipant.mdx new file mode 100644 index 0000000..654ddfd --- /dev/null +++ b/content/tech-docs/management-api/api/participants/participants_editParticipant.mdx @@ -0,0 +1,15 @@ +--- +title: Edit participant +full: true +_openapi: + method: PUT + webhook: false + toc: [] + structuredData: + headings: [] + contents: [] +--- + +{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} + + \ No newline at end of file diff --git a/content/tech-docs/management-api/api/participants/participants_listParticipantResponses.mdx b/content/tech-docs/management-api/api/participants/participants_listParticipantResponses.mdx new file mode 100644 index 0000000..fafe4b0 --- /dev/null +++ b/content/tech-docs/management-api/api/participants/participants_listParticipantResponses.mdx @@ -0,0 +1,15 @@ +--- +title: List participant responses +full: true +_openapi: + method: GET + webhook: false + toc: [] + structuredData: + headings: [] + contents: [] +--- + +{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} + + \ No newline at end of file diff --git a/content/tech-docs/management-api/api/participants/participants_mergeParticipants.mdx b/content/tech-docs/management-api/api/participants/participants_mergeParticipants.mdx new file mode 100644 index 0000000..d7967b7 --- /dev/null +++ b/content/tech-docs/management-api/api/participants/participants_mergeParticipants.mdx @@ -0,0 +1,15 @@ +--- +title: Merge participants +full: true +_openapi: + method: POST + webhook: false + toc: [] + structuredData: + headings: [] + contents: [] +--- + +{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} + + \ No newline at end of file diff --git a/content/tech-docs/management-api/api/participants/participants_removeStudySession.mdx b/content/tech-docs/management-api/api/participants/participants_removeStudySession.mdx new file mode 100644 index 0000000..d2bd1df --- /dev/null +++ b/content/tech-docs/management-api/api/participants/participants_removeStudySession.mdx @@ -0,0 +1,15 @@ +--- +title: Remove or replace a participant study session +full: true +_openapi: + method: POST + webhook: false + toc: [] + structuredData: + headings: [] + contents: [] +--- + +{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} + + \ No newline at end of file diff --git a/content/tech-docs/management-api/api/participants/participants_submitParticipantEvent.mdx b/content/tech-docs/management-api/api/participants/participants_submitParticipantEvent.mdx new file mode 100644 index 0000000..9f1b711 --- /dev/null +++ b/content/tech-docs/management-api/api/participants/participants_submitParticipantEvent.mdx @@ -0,0 +1,15 @@ +--- +title: Submit participant event +full: true +_openapi: + method: POST + webhook: false + toc: [] + structuredData: + headings: [] + contents: [] +--- + +{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} + + \ No newline at end of file diff --git a/content/tech-docs/management-api/api/participants/participants_submitParticipantResponse.mdx b/content/tech-docs/management-api/api/participants/participants_submitParticipantResponse.mdx new file mode 100644 index 0000000..1a1061f --- /dev/null +++ b/content/tech-docs/management-api/api/participants/participants_submitParticipantResponse.mdx @@ -0,0 +1,15 @@ +--- +title: Submit participant response +full: true +_openapi: + method: POST + webhook: false + toc: [] + structuredData: + headings: [] + contents: [] +--- + +{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} + + \ No newline at end of file diff --git a/content/tech-docs/management-api/api/reports/dataExplorer_getReport.mdx b/content/tech-docs/management-api/api/reports/dataExplorer_getReport.mdx new file mode 100644 index 0000000..a4e6d10 --- /dev/null +++ b/content/tech-docs/management-api/api/reports/dataExplorer_getReport.mdx @@ -0,0 +1,15 @@ +--- +title: Get report by ID +full: true +_openapi: + method: GET + webhook: false + toc: [] + structuredData: + headings: [] + contents: [] +--- + +{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} + + \ No newline at end of file diff --git a/content/tech-docs/management-api/api/reports/dataExplorer_listReportKeys.mdx b/content/tech-docs/management-api/api/reports/dataExplorer_listReportKeys.mdx new file mode 100644 index 0000000..9b19db8 --- /dev/null +++ b/content/tech-docs/management-api/api/reports/dataExplorer_listReportKeys.mdx @@ -0,0 +1,15 @@ +--- +title: List available report keys +full: true +_openapi: + method: GET + webhook: false + toc: [] + structuredData: + headings: [] + contents: [] +--- + +{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} + + \ No newline at end of file diff --git a/content/tech-docs/management-api/api/reports/dataExplorer_listReports.mdx b/content/tech-docs/management-api/api/reports/dataExplorer_listReports.mdx new file mode 100644 index 0000000..df65a57 --- /dev/null +++ b/content/tech-docs/management-api/api/reports/dataExplorer_listReports.mdx @@ -0,0 +1,15 @@ +--- +title: List reports +full: true +_openapi: + method: GET + webhook: false + toc: [] + structuredData: + headings: [] + contents: [] +--- + +{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} + + \ No newline at end of file diff --git a/content/tech-docs/management-api/api/reports/dataExporter_generateReportsExport.mdx b/content/tech-docs/management-api/api/reports/dataExporter_generateReportsExport.mdx new file mode 100644 index 0000000..05524a5 --- /dev/null +++ b/content/tech-docs/management-api/api/reports/dataExporter_generateReportsExport.mdx @@ -0,0 +1,15 @@ +--- +title: Start report export task +full: true +_openapi: + method: POST + webhook: false + toc: [] + structuredData: + headings: [] + contents: [] +--- + +{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} + + \ No newline at end of file diff --git a/content/tech-docs/management-api/api/reports/dataExporter_getReportsCount.mdx b/content/tech-docs/management-api/api/reports/dataExporter_getReportsCount.mdx new file mode 100644 index 0000000..def46b1 --- /dev/null +++ b/content/tech-docs/management-api/api/reports/dataExporter_getReportsCount.mdx @@ -0,0 +1,15 @@ +--- +title: Get report items count +full: true +_openapi: + method: GET + webhook: false + toc: [] + structuredData: + headings: [] + contents: [] +--- + +{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} + + \ No newline at end of file diff --git a/content/tech-docs/management-api/api/reports/dataExporter_getReportsTaskResult.mdx b/content/tech-docs/management-api/api/reports/dataExporter_getReportsTaskResult.mdx new file mode 100644 index 0000000..a56e637 --- /dev/null +++ b/content/tech-docs/management-api/api/reports/dataExporter_getReportsTaskResult.mdx @@ -0,0 +1,15 @@ +--- +title: Get report export task result +full: true +_openapi: + method: GET + webhook: false + toc: [] + structuredData: + headings: [] + contents: [] +--- + +{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} + + \ No newline at end of file diff --git a/content/tech-docs/management-api/api/reports/dataExporter_getReportsTaskStatus.mdx b/content/tech-docs/management-api/api/reports/dataExporter_getReportsTaskStatus.mdx new file mode 100644 index 0000000..0874db5 --- /dev/null +++ b/content/tech-docs/management-api/api/reports/dataExporter_getReportsTaskStatus.mdx @@ -0,0 +1,15 @@ +--- +title: Get report export task status +full: true +_openapi: + method: GET + webhook: false + toc: [] + structuredData: + headings: [] + contents: [] +--- + +{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} + + \ No newline at end of file diff --git a/content/tech-docs/management-api/api/reports/meta.json b/content/tech-docs/management-api/api/reports/meta.json new file mode 100644 index 0000000..21b8647 --- /dev/null +++ b/content/tech-docs/management-api/api/reports/meta.json @@ -0,0 +1,15 @@ +{ + "title": "Reports", + "description": "Participant reports", + "pages": [ + "participants_submitParticipantReport", + "participants_updateParticipantReport", + "dataExporter_getReportsCount", + "dataExporter_generateReportsExport", + "dataExporter_getReportsTaskStatus", + "dataExporter_getReportsTaskResult", + "dataExplorer_listReportKeys", + "dataExplorer_listReports", + "dataExplorer_getReport" + ] +} \ No newline at end of file diff --git a/content/tech-docs/management-api/api/reports/participants_submitParticipantReport.mdx b/content/tech-docs/management-api/api/reports/participants_submitParticipantReport.mdx new file mode 100644 index 0000000..12faff4 --- /dev/null +++ b/content/tech-docs/management-api/api/reports/participants_submitParticipantReport.mdx @@ -0,0 +1,15 @@ +--- +title: Submit participant report +full: true +_openapi: + method: POST + webhook: false + toc: [] + structuredData: + headings: [] + contents: [] +--- + +{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} + + \ No newline at end of file diff --git a/content/tech-docs/management-api/api/reports/participants_updateParticipantReport.mdx b/content/tech-docs/management-api/api/reports/participants_updateParticipantReport.mdx new file mode 100644 index 0000000..bd66c71 --- /dev/null +++ b/content/tech-docs/management-api/api/reports/participants_updateParticipantReport.mdx @@ -0,0 +1,15 @@ +--- +title: Update participant report +full: true +_openapi: + method: PUT + webhook: false + toc: [] + structuredData: + headings: [] + contents: [] +--- + +{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} + + \ No newline at end of file diff --git a/content/tech-docs/management-api/api/responses/dataExplorer_deleteResponse.mdx b/content/tech-docs/management-api/api/responses/dataExplorer_deleteResponse.mdx new file mode 100644 index 0000000..f5a1dc1 --- /dev/null +++ b/content/tech-docs/management-api/api/responses/dataExplorer_deleteResponse.mdx @@ -0,0 +1,15 @@ +--- +title: Delete survey response +full: true +_openapi: + method: DELETE + webhook: false + toc: [] + structuredData: + headings: [] + contents: [] +--- + +{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} + + \ No newline at end of file diff --git a/content/tech-docs/management-api/api/responses/dataExplorer_deleteResponses.mdx b/content/tech-docs/management-api/api/responses/dataExplorer_deleteResponses.mdx new file mode 100644 index 0000000..afb70b0 --- /dev/null +++ b/content/tech-docs/management-api/api/responses/dataExplorer_deleteResponses.mdx @@ -0,0 +1,15 @@ +--- +title: Delete survey responses +full: true +_openapi: + method: DELETE + webhook: false + toc: [] + structuredData: + headings: [] + contents: [] +--- + +{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} + + \ No newline at end of file diff --git a/content/tech-docs/management-api/api/responses/dataExplorer_getResponse.mdx b/content/tech-docs/management-api/api/responses/dataExplorer_getResponse.mdx new file mode 100644 index 0000000..6f35848 --- /dev/null +++ b/content/tech-docs/management-api/api/responses/dataExplorer_getResponse.mdx @@ -0,0 +1,15 @@ +--- +title: Get survey response by ID +full: true +_openapi: + method: GET + webhook: false + toc: [] + structuredData: + headings: [] + contents: [] +--- + +{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} + + \ No newline at end of file diff --git a/content/tech-docs/management-api/api/responses/dataExplorer_listResponses.mdx b/content/tech-docs/management-api/api/responses/dataExplorer_listResponses.mdx new file mode 100644 index 0000000..716dd52 --- /dev/null +++ b/content/tech-docs/management-api/api/responses/dataExplorer_listResponses.mdx @@ -0,0 +1,15 @@ +--- +title: List survey responses +full: true +_openapi: + method: GET + webhook: false + toc: [] + structuredData: + headings: [] + contents: [] +--- + +{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} + + \ No newline at end of file diff --git a/content/tech-docs/management-api/api/responses/dataExporter_generateResponsesExport.mdx b/content/tech-docs/management-api/api/responses/dataExporter_generateResponsesExport.mdx new file mode 100644 index 0000000..be71cb9 --- /dev/null +++ b/content/tech-docs/management-api/api/responses/dataExporter_generateResponsesExport.mdx @@ -0,0 +1,15 @@ +--- +title: Start responses export task +full: true +_openapi: + method: POST + webhook: false + toc: [] + structuredData: + headings: [] + contents: [] +--- + +{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} + + \ No newline at end of file diff --git a/content/tech-docs/management-api/api/responses/dataExporter_getConfidentialResponseExport.mdx b/content/tech-docs/management-api/api/responses/dataExporter_getConfidentialResponseExport.mdx new file mode 100644 index 0000000..a540340 --- /dev/null +++ b/content/tech-docs/management-api/api/responses/dataExporter_getConfidentialResponseExport.mdx @@ -0,0 +1,15 @@ +--- +title: Get confidential response export by ID +full: true +_openapi: + method: GET + webhook: false + toc: [] + structuredData: + headings: [] + contents: [] +--- + +{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} + + \ No newline at end of file diff --git a/content/tech-docs/management-api/api/responses/dataExporter_getConfidentialResponses.mdx b/content/tech-docs/management-api/api/responses/dataExporter_getConfidentialResponses.mdx new file mode 100644 index 0000000..d8e874f --- /dev/null +++ b/content/tech-docs/management-api/api/responses/dataExporter_getConfidentialResponses.mdx @@ -0,0 +1,15 @@ +--- +title: Start confidential responses export task +full: true +_openapi: + method: POST + webhook: false + toc: [] + structuredData: + headings: [] + contents: [] +--- + +{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} + + \ No newline at end of file diff --git a/content/tech-docs/management-api/api/responses/dataExporter_getDailyResponseExport.mdx b/content/tech-docs/management-api/api/responses/dataExporter_getDailyResponseExport.mdx new file mode 100644 index 0000000..08475e3 --- /dev/null +++ b/content/tech-docs/management-api/api/responses/dataExporter_getDailyResponseExport.mdx @@ -0,0 +1,15 @@ +--- +title: Get daily response export by ID +full: true +_openapi: + method: GET + webhook: false + toc: [] + structuredData: + headings: [] + contents: [] +--- + +{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} + + \ No newline at end of file diff --git a/content/tech-docs/management-api/api/responses/dataExporter_getResponsesCount.mdx b/content/tech-docs/management-api/api/responses/dataExporter_getResponsesCount.mdx new file mode 100644 index 0000000..3f980f8 --- /dev/null +++ b/content/tech-docs/management-api/api/responses/dataExporter_getResponsesCount.mdx @@ -0,0 +1,15 @@ +--- +title: Get responses count +full: true +_openapi: + method: GET + webhook: false + toc: [] + structuredData: + headings: [] + contents: [] +--- + +{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} + + \ No newline at end of file diff --git a/content/tech-docs/management-api/api/responses/dataExporter_getResponsesTaskResult.mdx b/content/tech-docs/management-api/api/responses/dataExporter_getResponsesTaskResult.mdx new file mode 100644 index 0000000..51bf4c6 --- /dev/null +++ b/content/tech-docs/management-api/api/responses/dataExporter_getResponsesTaskResult.mdx @@ -0,0 +1,15 @@ +--- +title: Get responses export task result +full: true +_openapi: + method: GET + webhook: false + toc: [] + structuredData: + headings: [] + contents: [] +--- + +{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} + + \ No newline at end of file diff --git a/content/tech-docs/management-api/api/responses/dataExporter_getResponsesTaskStatus.mdx b/content/tech-docs/management-api/api/responses/dataExporter_getResponsesTaskStatus.mdx new file mode 100644 index 0000000..da338ee --- /dev/null +++ b/content/tech-docs/management-api/api/responses/dataExporter_getResponsesTaskStatus.mdx @@ -0,0 +1,15 @@ +--- +title: Get responses export task status +full: true +_openapi: + method: GET + webhook: false + toc: [] + structuredData: + headings: [] + contents: [] +--- + +{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} + + \ No newline at end of file diff --git a/content/tech-docs/management-api/api/responses/dataExporter_getSurveyInfo.mdx b/content/tech-docs/management-api/api/responses/dataExporter_getSurveyInfo.mdx new file mode 100644 index 0000000..9730667 --- /dev/null +++ b/content/tech-docs/management-api/api/responses/dataExporter_getSurveyInfo.mdx @@ -0,0 +1,15 @@ +--- +title: List survey info +full: true +_openapi: + method: GET + webhook: false + toc: [] + structuredData: + headings: [] + contents: [] +--- + +{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} + + \ No newline at end of file diff --git a/content/tech-docs/management-api/api/responses/dataExporter_listConfidentialResponseExports.mdx b/content/tech-docs/management-api/api/responses/dataExporter_listConfidentialResponseExports.mdx new file mode 100644 index 0000000..479c279 --- /dev/null +++ b/content/tech-docs/management-api/api/responses/dataExporter_listConfidentialResponseExports.mdx @@ -0,0 +1,15 @@ +--- +title: List confidential response exports +full: true +_openapi: + method: GET + webhook: false + toc: [] + structuredData: + headings: [] + contents: [] +--- + +{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} + + \ No newline at end of file diff --git a/content/tech-docs/management-api/api/responses/dataExporter_listDailyResponseExports.mdx b/content/tech-docs/management-api/api/responses/dataExporter_listDailyResponseExports.mdx new file mode 100644 index 0000000..25aba6b --- /dev/null +++ b/content/tech-docs/management-api/api/responses/dataExporter_listDailyResponseExports.mdx @@ -0,0 +1,15 @@ +--- +title: List daily response exports +full: true +_openapi: + method: GET + webhook: false + toc: [] + structuredData: + headings: [] + contents: [] +--- + +{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} + + \ No newline at end of file diff --git a/content/tech-docs/management-api/api/responses/meta.json b/content/tech-docs/management-api/api/responses/meta.json new file mode 100644 index 0000000..1bf5a2b --- /dev/null +++ b/content/tech-docs/management-api/api/responses/meta.json @@ -0,0 +1,20 @@ +{ + "title": "Responses", + "description": "Response exports & queries", + "pages": [ + "dataExporter_getSurveyInfo", + "dataExporter_getResponsesCount", + "dataExporter_generateResponsesExport", + "dataExporter_getResponsesTaskStatus", + "dataExporter_getResponsesTaskResult", + "dataExporter_listDailyResponseExports", + "dataExporter_getDailyResponseExport", + "dataExporter_listConfidentialResponseExports", + "dataExporter_getConfidentialResponses", + "dataExporter_getConfidentialResponseExport", + "dataExplorer_listResponses", + "dataExplorer_deleteResponses", + "dataExplorer_getResponse", + "dataExplorer_deleteResponse" + ] +} \ No newline at end of file diff --git a/content/tech-docs/management-api/api/service-accounts/meta.json b/content/tech-docs/management-api/api/service-accounts/meta.json new file mode 100644 index 0000000..3a54011 --- /dev/null +++ b/content/tech-docs/management-api/api/service-accounts/meta.json @@ -0,0 +1,18 @@ +{ + "title": "Service accounts", + "description": "Service account management", + "pages": [ + "userManagement_listServiceAccounts", + "userManagement_createServiceAccount", + "userManagement_getServiceAccount", + "userManagement_deleteServiceAccount", + "userManagement_updateServiceAccount", + "userManagement_listServiceAccountAPIKeys", + "userManagement_createServiceAccountAPIKey", + "userManagement_deleteServiceAccountAPIKey", + "userManagement_listServiceAccountPermissions", + "userManagement_addPermissionToServiceAccount", + "userManagement_deleteServiceAccountPermission", + "userManagement_updateServiceAccountPermissionLimiter" + ] +} \ No newline at end of file diff --git a/content/tech-docs/management-api/api/service-accounts/userManagement_addPermissionToServiceAccount.mdx b/content/tech-docs/management-api/api/service-accounts/userManagement_addPermissionToServiceAccount.mdx new file mode 100644 index 0000000..10efc78 --- /dev/null +++ b/content/tech-docs/management-api/api/service-accounts/userManagement_addPermissionToServiceAccount.mdx @@ -0,0 +1,15 @@ +--- +title: Add permission to service account +full: true +_openapi: + method: POST + webhook: false + toc: [] + structuredData: + headings: [] + contents: [] +--- + +{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} + + \ No newline at end of file diff --git a/content/tech-docs/management-api/api/service-accounts/userManagement_createServiceAccount.mdx b/content/tech-docs/management-api/api/service-accounts/userManagement_createServiceAccount.mdx new file mode 100644 index 0000000..47d903b --- /dev/null +++ b/content/tech-docs/management-api/api/service-accounts/userManagement_createServiceAccount.mdx @@ -0,0 +1,15 @@ +--- +title: Create service account +full: true +_openapi: + method: POST + webhook: false + toc: [] + structuredData: + headings: [] + contents: [] +--- + +{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} + + \ No newline at end of file diff --git a/content/tech-docs/management-api/api/service-accounts/userManagement_createServiceAccountAPIKey.mdx b/content/tech-docs/management-api/api/service-accounts/userManagement_createServiceAccountAPIKey.mdx new file mode 100644 index 0000000..579ee41 --- /dev/null +++ b/content/tech-docs/management-api/api/service-accounts/userManagement_createServiceAccountAPIKey.mdx @@ -0,0 +1,15 @@ +--- +title: Create service account API key +full: true +_openapi: + method: POST + webhook: false + toc: [] + structuredData: + headings: [] + contents: [] +--- + +{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} + + \ No newline at end of file diff --git a/content/tech-docs/management-api/api/service-accounts/userManagement_deleteServiceAccount.mdx b/content/tech-docs/management-api/api/service-accounts/userManagement_deleteServiceAccount.mdx new file mode 100644 index 0000000..98c33c9 --- /dev/null +++ b/content/tech-docs/management-api/api/service-accounts/userManagement_deleteServiceAccount.mdx @@ -0,0 +1,15 @@ +--- +title: Delete service account +full: true +_openapi: + method: DELETE + webhook: false + toc: [] + structuredData: + headings: [] + contents: [] +--- + +{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} + + \ No newline at end of file diff --git a/content/tech-docs/management-api/api/service-accounts/userManagement_deleteServiceAccountAPIKey.mdx b/content/tech-docs/management-api/api/service-accounts/userManagement_deleteServiceAccountAPIKey.mdx new file mode 100644 index 0000000..5c53adb --- /dev/null +++ b/content/tech-docs/management-api/api/service-accounts/userManagement_deleteServiceAccountAPIKey.mdx @@ -0,0 +1,15 @@ +--- +title: Delete service account API key +full: true +_openapi: + method: DELETE + webhook: false + toc: [] + structuredData: + headings: [] + contents: [] +--- + +{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} + + \ No newline at end of file diff --git a/content/tech-docs/management-api/api/service-accounts/userManagement_deleteServiceAccountPermission.mdx b/content/tech-docs/management-api/api/service-accounts/userManagement_deleteServiceAccountPermission.mdx new file mode 100644 index 0000000..763841d --- /dev/null +++ b/content/tech-docs/management-api/api/service-accounts/userManagement_deleteServiceAccountPermission.mdx @@ -0,0 +1,15 @@ +--- +title: Delete service account permission +full: true +_openapi: + method: DELETE + webhook: false + toc: [] + structuredData: + headings: [] + contents: [] +--- + +{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} + + \ No newline at end of file diff --git a/content/tech-docs/management-api/api/service-accounts/userManagement_getServiceAccount.mdx b/content/tech-docs/management-api/api/service-accounts/userManagement_getServiceAccount.mdx new file mode 100644 index 0000000..de0ee21 --- /dev/null +++ b/content/tech-docs/management-api/api/service-accounts/userManagement_getServiceAccount.mdx @@ -0,0 +1,15 @@ +--- +title: Get service account +full: true +_openapi: + method: GET + webhook: false + toc: [] + structuredData: + headings: [] + contents: [] +--- + +{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} + + \ No newline at end of file diff --git a/content/tech-docs/management-api/api/service-accounts/userManagement_listServiceAccountAPIKeys.mdx b/content/tech-docs/management-api/api/service-accounts/userManagement_listServiceAccountAPIKeys.mdx new file mode 100644 index 0000000..5d0010e --- /dev/null +++ b/content/tech-docs/management-api/api/service-accounts/userManagement_listServiceAccountAPIKeys.mdx @@ -0,0 +1,15 @@ +--- +title: List service account API keys +full: true +_openapi: + method: GET + webhook: false + toc: [] + structuredData: + headings: [] + contents: [] +--- + +{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} + + \ No newline at end of file diff --git a/content/tech-docs/management-api/api/service-accounts/userManagement_listServiceAccountPermissions.mdx b/content/tech-docs/management-api/api/service-accounts/userManagement_listServiceAccountPermissions.mdx new file mode 100644 index 0000000..d250c00 --- /dev/null +++ b/content/tech-docs/management-api/api/service-accounts/userManagement_listServiceAccountPermissions.mdx @@ -0,0 +1,15 @@ +--- +title: List service account permissions +full: true +_openapi: + method: GET + webhook: false + toc: [] + structuredData: + headings: [] + contents: [] +--- + +{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} + + \ No newline at end of file diff --git a/content/tech-docs/management-api/api/service-accounts/userManagement_listServiceAccounts.mdx b/content/tech-docs/management-api/api/service-accounts/userManagement_listServiceAccounts.mdx new file mode 100644 index 0000000..550404c --- /dev/null +++ b/content/tech-docs/management-api/api/service-accounts/userManagement_listServiceAccounts.mdx @@ -0,0 +1,15 @@ +--- +title: List service accounts +full: true +_openapi: + method: GET + webhook: false + toc: [] + structuredData: + headings: [] + contents: [] +--- + +{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} + + \ No newline at end of file diff --git a/content/tech-docs/management-api/api/service-accounts/userManagement_updateServiceAccount.mdx b/content/tech-docs/management-api/api/service-accounts/userManagement_updateServiceAccount.mdx new file mode 100644 index 0000000..413fe08 --- /dev/null +++ b/content/tech-docs/management-api/api/service-accounts/userManagement_updateServiceAccount.mdx @@ -0,0 +1,15 @@ +--- +title: Update service account +full: true +_openapi: + method: PUT + webhook: false + toc: [] + structuredData: + headings: [] + contents: [] +--- + +{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} + + \ No newline at end of file diff --git a/content/tech-docs/management-api/api/service-accounts/userManagement_updateServiceAccountPermissionLimiter.mdx b/content/tech-docs/management-api/api/service-accounts/userManagement_updateServiceAccountPermissionLimiter.mdx new file mode 100644 index 0000000..95eea45 --- /dev/null +++ b/content/tech-docs/management-api/api/service-accounts/userManagement_updateServiceAccountPermissionLimiter.mdx @@ -0,0 +1,15 @@ +--- +title: Update service account permission limiter +full: true +_openapi: + method: PUT + webhook: false + toc: [] + structuredData: + headings: [] + contents: [] +--- + +{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} + + \ No newline at end of file diff --git a/content/tech-docs/management-api/api/studies/meta.json b/content/tech-docs/management-api/api/studies/meta.json new file mode 100644 index 0000000..cb63d70 --- /dev/null +++ b/content/tech-docs/management-api/api/studies/meta.json @@ -0,0 +1,15 @@ +{ + "title": "Studies", + "description": "Study management", + "pages": [ + "studies_listStudies", + "studies_createStudy", + "studies_getStudy", + "studies_deleteStudy", + "studies_exportConfig", + "studies_updateIsDefault", + "studies_updateStatus", + "studies_updateDisplayProps", + "studies_updateFileUploadRule" + ] +} \ No newline at end of file diff --git a/content/tech-docs/management-api/api/studies/studies_createStudy.mdx b/content/tech-docs/management-api/api/studies/studies_createStudy.mdx new file mode 100644 index 0000000..7a5134c --- /dev/null +++ b/content/tech-docs/management-api/api/studies/studies_createStudy.mdx @@ -0,0 +1,15 @@ +--- +title: Create a new study +full: true +_openapi: + method: POST + webhook: false + toc: [] + structuredData: + headings: [] + contents: [] +--- + +{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} + + \ No newline at end of file diff --git a/content/tech-docs/management-api/api/studies/studies_deleteStudy.mdx b/content/tech-docs/management-api/api/studies/studies_deleteStudy.mdx new file mode 100644 index 0000000..0ad41a9 --- /dev/null +++ b/content/tech-docs/management-api/api/studies/studies_deleteStudy.mdx @@ -0,0 +1,15 @@ +--- +title: Delete a study by key +full: true +_openapi: + method: DELETE + webhook: false + toc: [] + structuredData: + headings: [] + contents: [] +--- + +{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} + + \ No newline at end of file diff --git a/content/tech-docs/management-api/api/studies/studies_exportConfig.mdx b/content/tech-docs/management-api/api/studies/studies_exportConfig.mdx new file mode 100644 index 0000000..fe57c03 --- /dev/null +++ b/content/tech-docs/management-api/api/studies/studies_exportConfig.mdx @@ -0,0 +1,15 @@ +--- +title: Export study configuration, surveys, and rules +full: true +_openapi: + method: GET + webhook: false + toc: [] + structuredData: + headings: [] + contents: [] +--- + +{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} + + \ No newline at end of file diff --git a/content/tech-docs/management-api/api/studies/studies_getStudy.mdx b/content/tech-docs/management-api/api/studies/studies_getStudy.mdx new file mode 100644 index 0000000..9690a17 --- /dev/null +++ b/content/tech-docs/management-api/api/studies/studies_getStudy.mdx @@ -0,0 +1,15 @@ +--- +title: Get study configuration by key +full: true +_openapi: + method: GET + webhook: false + toc: [] + structuredData: + headings: [] + contents: [] +--- + +{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} + + \ No newline at end of file diff --git a/content/tech-docs/management-api/api/studies/studies_listStudies.mdx b/content/tech-docs/management-api/api/studies/studies_listStudies.mdx new file mode 100644 index 0000000..5dc10ce --- /dev/null +++ b/content/tech-docs/management-api/api/studies/studies_listStudies.mdx @@ -0,0 +1,15 @@ +--- +title: List all studies +full: true +_openapi: + method: GET + webhook: false + toc: [] + structuredData: + headings: [] + contents: [] +--- + +{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} + + \ No newline at end of file diff --git a/content/tech-docs/management-api/api/studies/studies_updateDisplayProps.mdx b/content/tech-docs/management-api/api/studies/studies_updateDisplayProps.mdx new file mode 100644 index 0000000..2ca1b08 --- /dev/null +++ b/content/tech-docs/management-api/api/studies/studies_updateDisplayProps.mdx @@ -0,0 +1,15 @@ +--- +title: Update display properties of a study +full: true +_openapi: + method: PUT + webhook: false + toc: [] + structuredData: + headings: [] + contents: [] +--- + +{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} + + \ No newline at end of file diff --git a/content/tech-docs/management-api/api/studies/studies_updateFileUploadRule.mdx b/content/tech-docs/management-api/api/studies/studies_updateFileUploadRule.mdx new file mode 100644 index 0000000..abb2741 --- /dev/null +++ b/content/tech-docs/management-api/api/studies/studies_updateFileUploadRule.mdx @@ -0,0 +1,15 @@ +--- +title: Update file upload configuration of a study +full: true +_openapi: + method: PUT + webhook: false + toc: [] + structuredData: + headings: [] + contents: [] +--- + +{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} + + \ No newline at end of file diff --git a/content/tech-docs/management-api/api/studies/studies_updateIsDefault.mdx b/content/tech-docs/management-api/api/studies/studies_updateIsDefault.mdx new file mode 100644 index 0000000..6943fd0 --- /dev/null +++ b/content/tech-docs/management-api/api/studies/studies_updateIsDefault.mdx @@ -0,0 +1,15 @@ +--- +title: Update default status of a study +full: true +_openapi: + method: PUT + webhook: false + toc: [] + structuredData: + headings: [] + contents: [] +--- + +{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} + + \ No newline at end of file diff --git a/content/tech-docs/management-api/api/studies/studies_updateStatus.mdx b/content/tech-docs/management-api/api/studies/studies_updateStatus.mdx new file mode 100644 index 0000000..a89878d --- /dev/null +++ b/content/tech-docs/management-api/api/studies/studies_updateStatus.mdx @@ -0,0 +1,15 @@ +--- +title: Update status of a study +full: true +_openapi: + method: PUT + webhook: false + toc: [] + structuredData: + headings: [] + contents: [] +--- + +{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} + + \ No newline at end of file diff --git a/content/tech-docs/management-api/api/study-counters/meta.json b/content/tech-docs/management-api/api/study-counters/meta.json new file mode 100644 index 0000000..59a58ac --- /dev/null +++ b/content/tech-docs/management-api/api/study-counters/meta.json @@ -0,0 +1,10 @@ +{ + "title": "Study counters", + "description": "Study counters", + "pages": [ + "studyCounters_listValues", + "studyCounters_saveValue", + "studyCounters_removeValue", + "studyCounters_incrementValue" + ] +} \ No newline at end of file diff --git a/content/tech-docs/management-api/api/study-counters/studyCounters_incrementValue.mdx b/content/tech-docs/management-api/api/study-counters/studyCounters_incrementValue.mdx new file mode 100644 index 0000000..c328008 --- /dev/null +++ b/content/tech-docs/management-api/api/study-counters/studyCounters_incrementValue.mdx @@ -0,0 +1,15 @@ +--- +title: Increment a study counter value +full: true +_openapi: + method: PUT + webhook: false + toc: [] + structuredData: + headings: [] + contents: [] +--- + +{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} + + \ No newline at end of file diff --git a/content/tech-docs/management-api/api/study-counters/studyCounters_listValues.mdx b/content/tech-docs/management-api/api/study-counters/studyCounters_listValues.mdx new file mode 100644 index 0000000..9df8ccc --- /dev/null +++ b/content/tech-docs/management-api/api/study-counters/studyCounters_listValues.mdx @@ -0,0 +1,15 @@ +--- +title: List all study counter values +full: true +_openapi: + method: GET + webhook: false + toc: [] + structuredData: + headings: [] + contents: [] +--- + +{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} + + \ No newline at end of file diff --git a/content/tech-docs/management-api/api/study-counters/studyCounters_removeValue.mdx b/content/tech-docs/management-api/api/study-counters/studyCounters_removeValue.mdx new file mode 100644 index 0000000..ac41173 --- /dev/null +++ b/content/tech-docs/management-api/api/study-counters/studyCounters_removeValue.mdx @@ -0,0 +1,15 @@ +--- +title: Remove a study counter value +full: true +_openapi: + method: DELETE + webhook: false + toc: [] + structuredData: + headings: [] + contents: [] +--- + +{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} + + \ No newline at end of file diff --git a/content/tech-docs/management-api/api/study-counters/studyCounters_saveValue.mdx b/content/tech-docs/management-api/api/study-counters/studyCounters_saveValue.mdx new file mode 100644 index 0000000..db2da90 --- /dev/null +++ b/content/tech-docs/management-api/api/study-counters/studyCounters_saveValue.mdx @@ -0,0 +1,15 @@ +--- +title: Set a study counter value for scope +full: true +_openapi: + method: POST + webhook: false + toc: [] + structuredData: + headings: [] + contents: [] +--- + +{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} + + \ No newline at end of file diff --git a/content/tech-docs/management-api/api/study-permissions/meta.json b/content/tech-docs/management-api/api/study-permissions/meta.json new file mode 100644 index 0000000..b1af529 --- /dev/null +++ b/content/tech-docs/management-api/api/study-permissions/meta.json @@ -0,0 +1,9 @@ +{ + "title": "Study permissions", + "description": "Permissions for a study", + "pages": [ + "studyPermissions_listPermissions", + "studyPermissions_addPermission", + "studyPermissions_removePermission" + ] +} \ No newline at end of file diff --git a/content/tech-docs/management-api/api/study-permissions/studyPermissions_addPermission.mdx b/content/tech-docs/management-api/api/study-permissions/studyPermissions_addPermission.mdx new file mode 100644 index 0000000..b576cae --- /dev/null +++ b/content/tech-docs/management-api/api/study-permissions/studyPermissions_addPermission.mdx @@ -0,0 +1,15 @@ +--- +title: Add a study permission +full: true +_openapi: + method: POST + webhook: false + toc: [] + structuredData: + headings: [] + contents: [] +--- + +{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} + + \ No newline at end of file diff --git a/content/tech-docs/management-api/api/study-permissions/studyPermissions_listPermissions.mdx b/content/tech-docs/management-api/api/study-permissions/studyPermissions_listPermissions.mdx new file mode 100644 index 0000000..1b0fffc --- /dev/null +++ b/content/tech-docs/management-api/api/study-permissions/studyPermissions_listPermissions.mdx @@ -0,0 +1,15 @@ +--- +title: List study permissions +full: true +_openapi: + method: GET + webhook: false + toc: [] + structuredData: + headings: [] + contents: [] +--- + +{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} + + \ No newline at end of file diff --git a/content/tech-docs/management-api/api/study-permissions/studyPermissions_removePermission.mdx b/content/tech-docs/management-api/api/study-permissions/studyPermissions_removePermission.mdx new file mode 100644 index 0000000..84b41d4 --- /dev/null +++ b/content/tech-docs/management-api/api/study-permissions/studyPermissions_removePermission.mdx @@ -0,0 +1,15 @@ +--- +title: Remove a study permission +full: true +_openapi: + method: DELETE + webhook: false + toc: [] + structuredData: + headings: [] + contents: [] +--- + +{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} + + \ No newline at end of file diff --git a/content/tech-docs/management-api/api/study-rules/meta.json b/content/tech-docs/management-api/api/study-rules/meta.json new file mode 100644 index 0000000..03fc9b2 --- /dev/null +++ b/content/tech-docs/management-api/api/study-rules/meta.json @@ -0,0 +1,11 @@ +{ + "title": "Study rules", + "description": "Study rules", + "pages": [ + "studyRules_getCurrent", + "studyRules_publishNewVersion", + "studyRules_listVersions", + "studyRules_getVersion", + "studyRules_deleteVersion" + ] +} \ No newline at end of file diff --git a/content/tech-docs/management-api/api/study-rules/studyRules_deleteVersion.mdx b/content/tech-docs/management-api/api/study-rules/studyRules_deleteVersion.mdx new file mode 100644 index 0000000..1f82a72 --- /dev/null +++ b/content/tech-docs/management-api/api/study-rules/studyRules_deleteVersion.mdx @@ -0,0 +1,15 @@ +--- +title: Delete a study rules version +full: true +_openapi: + method: DELETE + webhook: false + toc: [] + structuredData: + headings: [] + contents: [] +--- + +{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} + + \ No newline at end of file diff --git a/content/tech-docs/management-api/api/study-rules/studyRules_getCurrent.mdx b/content/tech-docs/management-api/api/study-rules/studyRules_getCurrent.mdx new file mode 100644 index 0000000..c7ff670 --- /dev/null +++ b/content/tech-docs/management-api/api/study-rules/studyRules_getCurrent.mdx @@ -0,0 +1,15 @@ +--- +title: Get current published study rules +full: true +_openapi: + method: GET + webhook: false + toc: [] + structuredData: + headings: [] + contents: [] +--- + +{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} + + \ No newline at end of file diff --git a/content/tech-docs/management-api/api/study-rules/studyRules_getVersion.mdx b/content/tech-docs/management-api/api/study-rules/studyRules_getVersion.mdx new file mode 100644 index 0000000..467a470 --- /dev/null +++ b/content/tech-docs/management-api/api/study-rules/studyRules_getVersion.mdx @@ -0,0 +1,15 @@ +--- +title: Get a study rules version by ID +full: true +_openapi: + method: GET + webhook: false + toc: [] + structuredData: + headings: [] + contents: [] +--- + +{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} + + \ No newline at end of file diff --git a/content/tech-docs/management-api/api/study-rules/studyRules_listVersions.mdx b/content/tech-docs/management-api/api/study-rules/studyRules_listVersions.mdx new file mode 100644 index 0000000..6e61b6e --- /dev/null +++ b/content/tech-docs/management-api/api/study-rules/studyRules_listVersions.mdx @@ -0,0 +1,15 @@ +--- +title: List all study rules versions +full: true +_openapi: + method: GET + webhook: false + toc: [] + structuredData: + headings: [] + contents: [] +--- + +{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} + + \ No newline at end of file diff --git a/content/tech-docs/management-api/api/study-rules/studyRules_publishNewVersion.mdx b/content/tech-docs/management-api/api/study-rules/studyRules_publishNewVersion.mdx new file mode 100644 index 0000000..6f8ee27 --- /dev/null +++ b/content/tech-docs/management-api/api/study-rules/studyRules_publishNewVersion.mdx @@ -0,0 +1,15 @@ +--- +title: Publish a new version of study rules +full: true +_openapi: + method: POST + webhook: false + toc: [] + structuredData: + headings: [] + contents: [] +--- + +{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} + + \ No newline at end of file diff --git a/content/tech-docs/management-api/api/study-variables/meta.json b/content/tech-docs/management-api/api/study-variables/meta.json new file mode 100644 index 0000000..57506b9 --- /dev/null +++ b/content/tech-docs/management-api/api/study-variables/meta.json @@ -0,0 +1,12 @@ +{ + "title": "Study variables", + "description": "Study variables", + "pages": [ + "studyVariables_listVariables", + "studyVariables_addVariable", + "studyVariables_getVariable", + "studyVariables_deleteVariable", + "studyVariables_updateVariableDef", + "studyVariables_updateVariableValue" + ] +} \ No newline at end of file diff --git a/content/tech-docs/management-api/api/study-variables/studyVariables_addVariable.mdx b/content/tech-docs/management-api/api/study-variables/studyVariables_addVariable.mdx new file mode 100644 index 0000000..aef8197 --- /dev/null +++ b/content/tech-docs/management-api/api/study-variables/studyVariables_addVariable.mdx @@ -0,0 +1,15 @@ +--- +title: Create a new study variable +full: true +_openapi: + method: POST + webhook: false + toc: [] + structuredData: + headings: [] + contents: [] +--- + +{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} + + \ No newline at end of file diff --git a/content/tech-docs/management-api/api/study-variables/studyVariables_deleteVariable.mdx b/content/tech-docs/management-api/api/study-variables/studyVariables_deleteVariable.mdx new file mode 100644 index 0000000..2ce2cb1 --- /dev/null +++ b/content/tech-docs/management-api/api/study-variables/studyVariables_deleteVariable.mdx @@ -0,0 +1,15 @@ +--- +title: Delete a study variable +full: true +_openapi: + method: DELETE + webhook: false + toc: [] + structuredData: + headings: [] + contents: [] +--- + +{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} + + \ No newline at end of file diff --git a/content/tech-docs/management-api/api/study-variables/studyVariables_getVariable.mdx b/content/tech-docs/management-api/api/study-variables/studyVariables_getVariable.mdx new file mode 100644 index 0000000..e0b78bd --- /dev/null +++ b/content/tech-docs/management-api/api/study-variables/studyVariables_getVariable.mdx @@ -0,0 +1,15 @@ +--- +title: Get a study variable by key +full: true +_openapi: + method: GET + webhook: false + toc: [] + structuredData: + headings: [] + contents: [] +--- + +{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} + + \ No newline at end of file diff --git a/content/tech-docs/management-api/api/study-variables/studyVariables_listVariables.mdx b/content/tech-docs/management-api/api/study-variables/studyVariables_listVariables.mdx new file mode 100644 index 0000000..a581ecd --- /dev/null +++ b/content/tech-docs/management-api/api/study-variables/studyVariables_listVariables.mdx @@ -0,0 +1,15 @@ +--- +title: List study variables +full: true +_openapi: + method: GET + webhook: false + toc: [] + structuredData: + headings: [] + contents: [] +--- + +{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} + + \ No newline at end of file diff --git a/content/tech-docs/management-api/api/study-variables/studyVariables_updateVariableDef.mdx b/content/tech-docs/management-api/api/study-variables/studyVariables_updateVariableDef.mdx new file mode 100644 index 0000000..4a055f3 --- /dev/null +++ b/content/tech-docs/management-api/api/study-variables/studyVariables_updateVariableDef.mdx @@ -0,0 +1,15 @@ +--- +title: Update study variable definition +full: true +_openapi: + method: PUT + webhook: false + toc: [] + structuredData: + headings: [] + contents: [] +--- + +{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} + + \ No newline at end of file diff --git a/content/tech-docs/management-api/api/study-variables/studyVariables_updateVariableValue.mdx b/content/tech-docs/management-api/api/study-variables/studyVariables_updateVariableValue.mdx new file mode 100644 index 0000000..642e2b0 --- /dev/null +++ b/content/tech-docs/management-api/api/study-variables/studyVariables_updateVariableValue.mdx @@ -0,0 +1,15 @@ +--- +title: Update study variable value +full: true +_openapi: + method: PUT + webhook: false + toc: [] + structuredData: + headings: [] + contents: [] +--- + +{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} + + \ No newline at end of file diff --git a/content/tech-docs/management-api/api/surveys/meta.json b/content/tech-docs/management-api/api/surveys/meta.json new file mode 100644 index 0000000..1cacbe4 --- /dev/null +++ b/content/tech-docs/management-api/api/surveys/meta.json @@ -0,0 +1,14 @@ +{ + "title": "Surveys", + "description": "Survey management", + "pages": [ + "surveys_listSurveyInfos", + "surveys_createSurvey", + "surveys_getLatestSurvey", + "surveys_updateSurvey", + "surveys_unpublishSurvey", + "surveys_listSurveyVersions", + "surveys_getSurveyVersion", + "surveys_deleteSurveyVersion" + ] +} \ No newline at end of file diff --git a/content/tech-docs/management-api/api/surveys/surveys_createSurvey.mdx b/content/tech-docs/management-api/api/surveys/surveys_createSurvey.mdx new file mode 100644 index 0000000..90e5583 --- /dev/null +++ b/content/tech-docs/management-api/api/surveys/surveys_createSurvey.mdx @@ -0,0 +1,15 @@ +--- +title: Create a new survey in a study +full: true +_openapi: + method: POST + webhook: false + toc: [] + structuredData: + headings: [] + contents: [] +--- + +{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} + + \ No newline at end of file diff --git a/content/tech-docs/management-api/api/surveys/surveys_deleteSurveyVersion.mdx b/content/tech-docs/management-api/api/surveys/surveys_deleteSurveyVersion.mdx new file mode 100644 index 0000000..b7314b7 --- /dev/null +++ b/content/tech-docs/management-api/api/surveys/surveys_deleteSurveyVersion.mdx @@ -0,0 +1,15 @@ +--- +title: Delete a survey version +full: true +_openapi: + method: DELETE + webhook: false + toc: [] + structuredData: + headings: [] + contents: [] +--- + +{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} + + \ No newline at end of file diff --git a/content/tech-docs/management-api/api/surveys/surveys_getLatestSurvey.mdx b/content/tech-docs/management-api/api/surveys/surveys_getLatestSurvey.mdx new file mode 100644 index 0000000..d74261c --- /dev/null +++ b/content/tech-docs/management-api/api/surveys/surveys_getLatestSurvey.mdx @@ -0,0 +1,15 @@ +--- +title: Get latest survey by key +full: true +_openapi: + method: GET + webhook: false + toc: [] + structuredData: + headings: [] + contents: [] +--- + +{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} + + \ No newline at end of file diff --git a/content/tech-docs/management-api/api/surveys/surveys_getSurveyVersion.mdx b/content/tech-docs/management-api/api/surveys/surveys_getSurveyVersion.mdx new file mode 100644 index 0000000..08458da --- /dev/null +++ b/content/tech-docs/management-api/api/surveys/surveys_getSurveyVersion.mdx @@ -0,0 +1,15 @@ +--- +title: Get a specific survey version +full: true +_openapi: + method: GET + webhook: false + toc: [] + structuredData: + headings: [] + contents: [] +--- + +{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} + + \ No newline at end of file diff --git a/content/tech-docs/management-api/api/surveys/surveys_listSurveyInfos.mdx b/content/tech-docs/management-api/api/surveys/surveys_listSurveyInfos.mdx new file mode 100644 index 0000000..780ff86 --- /dev/null +++ b/content/tech-docs/management-api/api/surveys/surveys_listSurveyInfos.mdx @@ -0,0 +1,15 @@ +--- +title: List survey infos for a study +full: true +_openapi: + method: GET + webhook: false + toc: [] + structuredData: + headings: [] + contents: [] +--- + +{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} + + \ No newline at end of file diff --git a/content/tech-docs/management-api/api/surveys/surveys_listSurveyVersions.mdx b/content/tech-docs/management-api/api/surveys/surveys_listSurveyVersions.mdx new file mode 100644 index 0000000..9c4cc13 --- /dev/null +++ b/content/tech-docs/management-api/api/surveys/surveys_listSurveyVersions.mdx @@ -0,0 +1,15 @@ +--- +title: List all survey versions +full: true +_openapi: + method: GET + webhook: false + toc: [] + structuredData: + headings: [] + contents: [] +--- + +{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} + + \ No newline at end of file diff --git a/content/tech-docs/management-api/api/surveys/surveys_unpublishSurvey.mdx b/content/tech-docs/management-api/api/surveys/surveys_unpublishSurvey.mdx new file mode 100644 index 0000000..c1cf67f --- /dev/null +++ b/content/tech-docs/management-api/api/surveys/surveys_unpublishSurvey.mdx @@ -0,0 +1,15 @@ +--- +title: Unpublish a survey +full: true +_openapi: + method: POST + webhook: false + toc: [] + structuredData: + headings: [] + contents: [] +--- + +{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} + + \ No newline at end of file diff --git a/content/tech-docs/management-api/api/surveys/surveys_updateSurvey.mdx b/content/tech-docs/management-api/api/surveys/surveys_updateSurvey.mdx new file mode 100644 index 0000000..85d5640 --- /dev/null +++ b/content/tech-docs/management-api/api/surveys/surveys_updateSurvey.mdx @@ -0,0 +1,15 @@ +--- +title: Update survey definition +full: true +_openapi: + method: POST + webhook: false + toc: [] + structuredData: + headings: [] + contents: [] +--- + +{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} + + \ No newline at end of file diff --git a/content/tech-docs/management-api/api/user-management/meta.json b/content/tech-docs/management-api/api/user-management/meta.json new file mode 100644 index 0000000..550dce6 --- /dev/null +++ b/content/tech-docs/management-api/api/user-management/meta.json @@ -0,0 +1,14 @@ +{ + "title": "User management", + "description": "Management user accounts and permissions", + "pages": [ + "userManagement_listManagementUsers", + "userManagement_getManagementUser", + "userManagement_deleteManagementUser", + "userManagement_listUserPermissions", + "userManagement_addPermissionToUser", + "userManagement_deleteUserPermission", + "userManagement_updatePermissionLimiter", + "userManagement_requestParticipantUserDeletion" + ] +} \ No newline at end of file diff --git a/content/tech-docs/management-api/api/user-management/userManagement_addPermissionToUser.mdx b/content/tech-docs/management-api/api/user-management/userManagement_addPermissionToUser.mdx new file mode 100644 index 0000000..47b75d2 --- /dev/null +++ b/content/tech-docs/management-api/api/user-management/userManagement_addPermissionToUser.mdx @@ -0,0 +1,15 @@ +--- +title: Add permission to user +full: true +_openapi: + method: POST + webhook: false + toc: [] + structuredData: + headings: [] + contents: [] +--- + +{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} + + \ No newline at end of file diff --git a/content/tech-docs/management-api/api/user-management/userManagement_deleteManagementUser.mdx b/content/tech-docs/management-api/api/user-management/userManagement_deleteManagementUser.mdx new file mode 100644 index 0000000..2d55eb1 --- /dev/null +++ b/content/tech-docs/management-api/api/user-management/userManagement_deleteManagementUser.mdx @@ -0,0 +1,15 @@ +--- +title: Delete management user +full: true +_openapi: + method: DELETE + webhook: false + toc: [] + structuredData: + headings: [] + contents: [] +--- + +{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} + + \ No newline at end of file diff --git a/content/tech-docs/management-api/api/user-management/userManagement_deleteUserPermission.mdx b/content/tech-docs/management-api/api/user-management/userManagement_deleteUserPermission.mdx new file mode 100644 index 0000000..7ccd7f8 --- /dev/null +++ b/content/tech-docs/management-api/api/user-management/userManagement_deleteUserPermission.mdx @@ -0,0 +1,15 @@ +--- +title: Delete user permission +full: true +_openapi: + method: DELETE + webhook: false + toc: [] + structuredData: + headings: [] + contents: [] +--- + +{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} + + \ No newline at end of file diff --git a/content/tech-docs/management-api/api/user-management/userManagement_getManagementUser.mdx b/content/tech-docs/management-api/api/user-management/userManagement_getManagementUser.mdx new file mode 100644 index 0000000..b8037b8 --- /dev/null +++ b/content/tech-docs/management-api/api/user-management/userManagement_getManagementUser.mdx @@ -0,0 +1,15 @@ +--- +title: Get management user +full: true +_openapi: + method: GET + webhook: false + toc: [] + structuredData: + headings: [] + contents: [] +--- + +{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} + + \ No newline at end of file diff --git a/content/tech-docs/management-api/api/user-management/userManagement_listManagementUsers.mdx b/content/tech-docs/management-api/api/user-management/userManagement_listManagementUsers.mdx new file mode 100644 index 0000000..0f9d389 --- /dev/null +++ b/content/tech-docs/management-api/api/user-management/userManagement_listManagementUsers.mdx @@ -0,0 +1,15 @@ +--- +title: List management users +full: true +_openapi: + method: GET + webhook: false + toc: [] + structuredData: + headings: [] + contents: [] +--- + +{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} + + \ No newline at end of file diff --git a/content/tech-docs/management-api/api/user-management/userManagement_listUserPermissions.mdx b/content/tech-docs/management-api/api/user-management/userManagement_listUserPermissions.mdx new file mode 100644 index 0000000..34fe322 --- /dev/null +++ b/content/tech-docs/management-api/api/user-management/userManagement_listUserPermissions.mdx @@ -0,0 +1,15 @@ +--- +title: List user permissions +full: true +_openapi: + method: GET + webhook: false + toc: [] + structuredData: + headings: [] + contents: [] +--- + +{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} + + \ No newline at end of file diff --git a/content/tech-docs/management-api/api/user-management/userManagement_requestParticipantUserDeletion.mdx b/content/tech-docs/management-api/api/user-management/userManagement_requestParticipantUserDeletion.mdx new file mode 100644 index 0000000..006df0f --- /dev/null +++ b/content/tech-docs/management-api/api/user-management/userManagement_requestParticipantUserDeletion.mdx @@ -0,0 +1,15 @@ +--- +title: Request participant user deletion +full: true +_openapi: + method: POST + webhook: false + toc: [] + structuredData: + headings: [] + contents: [] +--- + +{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} + + \ No newline at end of file diff --git a/content/tech-docs/management-api/api/user-management/userManagement_updatePermissionLimiter.mdx b/content/tech-docs/management-api/api/user-management/userManagement_updatePermissionLimiter.mdx new file mode 100644 index 0000000..464d54d --- /dev/null +++ b/content/tech-docs/management-api/api/user-management/userManagement_updatePermissionLimiter.mdx @@ -0,0 +1,15 @@ +--- +title: Update permission limiter +full: true +_openapi: + method: PUT + webhook: false + toc: [] + structuredData: + headings: [] + contents: [] +--- + +{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} + + \ No newline at end of file diff --git a/content/tech-docs/participant-api/api.mdx b/content/tech-docs/participant-api/api.mdx deleted file mode 100644 index 391b47a..0000000 --- a/content/tech-docs/participant-api/api.mdx +++ /dev/null @@ -1,4 +0,0 @@ ---- -title: API -description: Participant API ---- diff --git a/content/tech-docs/participant-api/api/auth/getTempTokenInfo.mdx b/content/tech-docs/participant-api/api/auth/getTempTokenInfo.mdx new file mode 100644 index 0000000..0c80916 --- /dev/null +++ b/content/tech-docs/participant-api/api/auth/getTempTokenInfo.mdx @@ -0,0 +1,15 @@ +--- +title: Get info for a temporary token +full: true +_openapi: + method: POST + webhook: false + toc: [] + structuredData: + headings: [] + contents: [] +--- + +{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} + + \ No newline at end of file diff --git a/content/tech-docs/participant-api/api/auth/loginWithEmail.mdx b/content/tech-docs/participant-api/api/auth/loginWithEmail.mdx new file mode 100644 index 0000000..ab9cb56 --- /dev/null +++ b/content/tech-docs/participant-api/api/auth/loginWithEmail.mdx @@ -0,0 +1,15 @@ +--- +title: Login with email and password +full: true +_openapi: + method: POST + webhook: false + toc: [] + structuredData: + headings: [] + contents: [] +--- + +{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} + + \ No newline at end of file diff --git a/content/tech-docs/participant-api/api/auth/loginWithTempToken.mdx b/content/tech-docs/participant-api/api/auth/loginWithTempToken.mdx new file mode 100644 index 0000000..3b4b0d2 --- /dev/null +++ b/content/tech-docs/participant-api/api/auth/loginWithTempToken.mdx @@ -0,0 +1,15 @@ +--- +title: Login using a temporary token (optionally with password or access token) +full: true +_openapi: + method: POST + webhook: false + toc: [] + structuredData: + headings: [] + contents: [] +--- + +{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} + + \ No newline at end of file diff --git a/content/tech-docs/participant-api/api/auth/logout.mdx b/content/tech-docs/participant-api/api/auth/logout.mdx new file mode 100644 index 0000000..f8de5c0 --- /dev/null +++ b/content/tech-docs/participant-api/api/auth/logout.mdx @@ -0,0 +1,15 @@ +--- +title: Logout user (invalidate current session) +full: true +_openapi: + method: POST + webhook: false + toc: [] + structuredData: + headings: [] + contents: [] +--- + +{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} + + \ No newline at end of file diff --git a/content/tech-docs/participant-api/api/auth/meta.json b/content/tech-docs/participant-api/api/auth/meta.json new file mode 100644 index 0000000..4df1042 --- /dev/null +++ b/content/tech-docs/participant-api/api/auth/meta.json @@ -0,0 +1,18 @@ +{ + "title": "Auth", + "description": "Authentication endpoints", + "pages": [ + "loginWithEmail", + "signupWithEmail", + "loginWithTempToken", + "getTempTokenInfo", + "renewToken", + "validateToken", + "revokeTokens", + "resendEmailVerification", + "verifyEmail", + "logout", + "requestOTP", + "verifyOTP" + ] +} \ No newline at end of file diff --git a/content/tech-docs/participant-api/api/auth/renewToken.mdx b/content/tech-docs/participant-api/api/auth/renewToken.mdx new file mode 100644 index 0000000..ca23365 --- /dev/null +++ b/content/tech-docs/participant-api/api/auth/renewToken.mdx @@ -0,0 +1,15 @@ +--- +title: Renew access token +full: true +_openapi: + method: POST + webhook: false + toc: [] + structuredData: + headings: [] + contents: [] +--- + +{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} + + \ No newline at end of file diff --git a/content/tech-docs/participant-api/api/auth/requestOTP.mdx b/content/tech-docs/participant-api/api/auth/requestOTP.mdx new file mode 100644 index 0000000..eb5c8d0 --- /dev/null +++ b/content/tech-docs/participant-api/api/auth/requestOTP.mdx @@ -0,0 +1,15 @@ +--- +title: Request OTP (email by default) +full: true +_openapi: + method: GET + webhook: false + toc: [] + structuredData: + headings: [] + contents: [] +--- + +{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} + + \ No newline at end of file diff --git a/content/tech-docs/participant-api/api/auth/resendEmailVerification.mdx b/content/tech-docs/participant-api/api/auth/resendEmailVerification.mdx new file mode 100644 index 0000000..f7744f8 --- /dev/null +++ b/content/tech-docs/participant-api/api/auth/resendEmailVerification.mdx @@ -0,0 +1,15 @@ +--- +title: Resend email verification +full: true +_openapi: + method: POST + webhook: false + toc: [] + structuredData: + headings: [] + contents: [] +--- + +{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} + + \ No newline at end of file diff --git a/content/tech-docs/participant-api/api/auth/revokeTokens.mdx b/content/tech-docs/participant-api/api/auth/revokeTokens.mdx new file mode 100644 index 0000000..e2dc7da --- /dev/null +++ b/content/tech-docs/participant-api/api/auth/revokeTokens.mdx @@ -0,0 +1,15 @@ +--- +title: Revoke refresh tokens for user +full: true +_openapi: + method: GET + webhook: false + toc: [] + structuredData: + headings: [] + contents: [] +--- + +{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} + + \ No newline at end of file diff --git a/content/tech-docs/participant-api/api/auth/signupWithEmail.mdx b/content/tech-docs/participant-api/api/auth/signupWithEmail.mdx new file mode 100644 index 0000000..5f9ed73 --- /dev/null +++ b/content/tech-docs/participant-api/api/auth/signupWithEmail.mdx @@ -0,0 +1,15 @@ +--- +title: Sign up with email +full: true +_openapi: + method: POST + webhook: false + toc: [] + structuredData: + headings: [] + contents: [] +--- + +{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} + + \ No newline at end of file diff --git a/content/tech-docs/participant-api/api/auth/validateToken.mdx b/content/tech-docs/participant-api/api/auth/validateToken.mdx new file mode 100644 index 0000000..f8b8d48 --- /dev/null +++ b/content/tech-docs/participant-api/api/auth/validateToken.mdx @@ -0,0 +1,15 @@ +--- +title: Validate access token +full: true +_openapi: + method: GET + webhook: false + toc: [] + structuredData: + headings: [] + contents: [] +--- + +{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} + + \ No newline at end of file diff --git a/content/tech-docs/participant-api/api/auth/verifyEmail.mdx b/content/tech-docs/participant-api/api/auth/verifyEmail.mdx new file mode 100644 index 0000000..385e254 --- /dev/null +++ b/content/tech-docs/participant-api/api/auth/verifyEmail.mdx @@ -0,0 +1,15 @@ +--- +title: Verify email by token +full: true +_openapi: + method: POST + webhook: false + toc: [] + structuredData: + headings: [] + contents: [] +--- + +{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} + + \ No newline at end of file diff --git a/content/tech-docs/participant-api/api/auth/verifyOTP.mdx b/content/tech-docs/participant-api/api/auth/verifyOTP.mdx new file mode 100644 index 0000000..5f2063c --- /dev/null +++ b/content/tech-docs/participant-api/api/auth/verifyOTP.mdx @@ -0,0 +1,15 @@ +--- +title: Verify OTP code +full: true +_openapi: + method: POST + webhook: false + toc: [] + structuredData: + headings: [] + contents: [] +--- + +{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} + + \ No newline at end of file diff --git a/content/tech-docs/participant-api/api/events/customStudyEvent.mdx b/content/tech-docs/participant-api/api/events/customStudyEvent.mdx new file mode 100644 index 0000000..9e646ae --- /dev/null +++ b/content/tech-docs/participant-api/api/events/customStudyEvent.mdx @@ -0,0 +1,15 @@ +--- +title: Trigger a custom study event +full: true +_openapi: + method: POST + webhook: false + toc: [] + structuredData: + headings: [] + contents: [] +--- + +{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} + + \ No newline at end of file diff --git a/content/tech-docs/participant-api/api/events/enterStudy.mdx b/content/tech-docs/participant-api/api/events/enterStudy.mdx new file mode 100644 index 0000000..589af6e --- /dev/null +++ b/content/tech-docs/participant-api/api/events/enterStudy.mdx @@ -0,0 +1,15 @@ +--- +title: Enter a study +full: true +_openapi: + method: POST + webhook: false + toc: [] + structuredData: + headings: [] + contents: [] +--- + +{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} + + \ No newline at end of file diff --git a/content/tech-docs/participant-api/api/events/leaveStudyEvent.mdx b/content/tech-docs/participant-api/api/events/leaveStudyEvent.mdx new file mode 100644 index 0000000..28dad4d --- /dev/null +++ b/content/tech-docs/participant-api/api/events/leaveStudyEvent.mdx @@ -0,0 +1,15 @@ +--- +title: Leave a study +full: true +_openapi: + method: POST + webhook: false + toc: [] + structuredData: + headings: [] + contents: [] +--- + +{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} + + \ No newline at end of file diff --git a/content/tech-docs/participant-api/api/events/mergeTempParticipant.mdx b/content/tech-docs/participant-api/api/events/mergeTempParticipant.mdx new file mode 100644 index 0000000..2c316d5 --- /dev/null +++ b/content/tech-docs/participant-api/api/events/mergeTempParticipant.mdx @@ -0,0 +1,15 @@ +--- +title: Merge temporary participant into user profile +full: true +_openapi: + method: POST + webhook: false + toc: [] + structuredData: + headings: [] + contents: [] +--- + +{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} + + \ No newline at end of file diff --git a/content/tech-docs/participant-api/api/events/mergeVirtualParticipant.mdx b/content/tech-docs/participant-api/api/events/mergeVirtualParticipant.mdx new file mode 100644 index 0000000..3be9048 --- /dev/null +++ b/content/tech-docs/participant-api/api/events/mergeVirtualParticipant.mdx @@ -0,0 +1,15 @@ +--- +title: Merge a virtual participant into user profile by linking code +full: true +_openapi: + method: POST + webhook: false + toc: [] + structuredData: + headings: [] + contents: [] +--- + +{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} + + \ No newline at end of file diff --git a/content/tech-docs/participant-api/api/events/meta.json b/content/tech-docs/participant-api/api/events/meta.json new file mode 100644 index 0000000..0472764 --- /dev/null +++ b/content/tech-docs/participant-api/api/events/meta.json @@ -0,0 +1,14 @@ +{ + "title": "Events", + "description": "Study service events endpoints", + "pages": [ + "enterStudy", + "customStudyEvent", + "submitSurveyEvent", + "leaveStudyEvent", + "mergeTempParticipant", + "mergeVirtualParticipant", + "registerTempParticipant", + "submitTempParticipantResponse" + ] +} \ No newline at end of file diff --git a/content/tech-docs/participant-api/api/events/registerTempParticipant.mdx b/content/tech-docs/participant-api/api/events/registerTempParticipant.mdx new file mode 100644 index 0000000..9b50483 --- /dev/null +++ b/content/tech-docs/participant-api/api/events/registerTempParticipant.mdx @@ -0,0 +1,15 @@ +--- +title: Register a temporary participant +full: true +_openapi: + method: POST + webhook: false + toc: [] + structuredData: + headings: [] + contents: [] +--- + +{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} + + \ No newline at end of file diff --git a/content/tech-docs/participant-api/api/events/submitSurveyEvent.mdx b/content/tech-docs/participant-api/api/events/submitSurveyEvent.mdx new file mode 100644 index 0000000..52b07a7 --- /dev/null +++ b/content/tech-docs/participant-api/api/events/submitSurveyEvent.mdx @@ -0,0 +1,15 @@ +--- +title: Submit survey response +full: true +_openapi: + method: POST + webhook: false + toc: [] + structuredData: + headings: [] + contents: [] +--- + +{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} + + \ No newline at end of file diff --git a/content/tech-docs/participant-api/api/events/submitTempParticipantResponse.mdx b/content/tech-docs/participant-api/api/events/submitTempParticipantResponse.mdx new file mode 100644 index 0000000..a1594c9 --- /dev/null +++ b/content/tech-docs/participant-api/api/events/submitTempParticipantResponse.mdx @@ -0,0 +1,15 @@ +--- +title: Submit a survey response for a temporary participant +full: true +_openapi: + method: POST + webhook: false + toc: [] + structuredData: + headings: [] + contents: [] +--- + +{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} + + \ No newline at end of file diff --git a/content/tech-docs/participant-api/api/index.mdx b/content/tech-docs/participant-api/api/index.mdx new file mode 100644 index 0000000..57910e5 --- /dev/null +++ b/content/tech-docs/participant-api/api/index.mdx @@ -0,0 +1,117 @@ +--- +title: Participant API +description: Endpoints for participant authentication, user management, and study interactions. +--- + +{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} + + +### Auth + +Authentication endpoints + + +Login with email and password POST} /> +Sign up with email POST} /> +Login using a temporary token (optionally with password or access token) POST} /> +Get info for a temporary token POST} /> +Renew access token POST} /> +Validate access token GET} /> +Revoke refresh tokens for user GET} /> +Resend email verification POST} /> +Verify email by token POST} /> +Logout user (invalidate current session) POST} /> +Request OTP (email by default) GET} /> +Verify OTP code POST} /> + + +### Password + +Password endpoints + + +Initiate password reset POST} /> +Get info for a password reset token POST} /> +Reset password POST} /> + + +### Events + +Study service events endpoints + + +Enter a study POST} /> +Trigger a custom study event POST} /> +Submit survey response POST} /> +Leave a study POST} /> +Merge temporary participant into user profile POST} /> +Merge a virtual participant into user profile by linking code POST} /> +Register a temporary participant POST} /> +Submit a survey response for a temporary participant POST} /> + + +### Participant data + +Endpoints getting participant data in study service + + +Get assigned surveys for profiles GET} /> +Get a specific survey with context GET} /> +Get participant state GET} /> +Get a linking code by key GET} /> +Get survey responses for a profile GET} /> +Get confidential responses by key GET} /> +Get submission history for profiles GET} /> +Get reports for a profile GET} /> +Get assigned surveys for a temporary participant GET} /> +Get a survey with context for a temporary participant GET} /> +Get virtual participants by linking code GET} /> +List participant files GET} /> +Upload participant file POST} /> +Download participant file GET} /> +Delete participant file DELETE} /> + + +### Studies + +Endpoints getting study data in study service + + +List studies by status GET} /> +Get study by key GET} /> +Check if a code exists in a code list GET} /> +Count available codes in a code list GET} /> +List variables for a study GET} /> +Get a study variable GET} /> +List studies the user participates in GET} /> + + +### User + +User endpoints + + +Get current user GET} /> +Delete current user DELETE} /> +Update the account's preferred language PUT} /> +Add new profile POST} /> +Update profile PUT} /> +Remove a profile POST} /> +Change password POST} /> +Change account email POST} /> +Change phone number POST} /> +Request phone number verification code via SMS GET} /> +Get user attributes GET} /> +Create or update a user attribute POST} /> +Delete a user attribute DELETE} /> +Update contact preferences PUT} description={"Update the user's newsletter and weekly subscription preferences."} /> + + +### Misc + +Miscellaneous + + +Health check GET} /> +Unsubscribe user from newsletter (via token) POST} /> + \ No newline at end of file diff --git a/content/tech-docs/participant-api/api/meta.json b/content/tech-docs/participant-api/api/meta.json new file mode 100644 index 0000000..53cb925 --- /dev/null +++ b/content/tech-docs/participant-api/api/meta.json @@ -0,0 +1,11 @@ +{ + "pages": [ + "auth", + "password", + "events", + "participant-data", + "studies", + "user", + "misc" + ] +} diff --git a/content/tech-docs/participant-api/api/misc/getHealth.mdx b/content/tech-docs/participant-api/api/misc/getHealth.mdx new file mode 100644 index 0000000..292fe3a --- /dev/null +++ b/content/tech-docs/participant-api/api/misc/getHealth.mdx @@ -0,0 +1,15 @@ +--- +title: Health check +full: true +_openapi: + method: GET + webhook: false + toc: [] + structuredData: + headings: [] + contents: [] +--- + +{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} + + \ No newline at end of file diff --git a/content/tech-docs/participant-api/api/misc/meta.json b/content/tech-docs/participant-api/api/misc/meta.json new file mode 100644 index 0000000..848a564 --- /dev/null +++ b/content/tech-docs/participant-api/api/misc/meta.json @@ -0,0 +1,8 @@ +{ + "title": "Misc", + "description": "Miscellaneous", + "pages": [ + "getHealth", + "unsubscribeNewsletter" + ] +} \ No newline at end of file diff --git a/content/tech-docs/participant-api/api/misc/unsubscribeNewsletter.mdx b/content/tech-docs/participant-api/api/misc/unsubscribeNewsletter.mdx new file mode 100644 index 0000000..b13d4c9 --- /dev/null +++ b/content/tech-docs/participant-api/api/misc/unsubscribeNewsletter.mdx @@ -0,0 +1,15 @@ +--- +title: Unsubscribe user from newsletter (via token) +full: true +_openapi: + method: POST + webhook: false + toc: [] + structuredData: + headings: [] + contents: [] +--- + +{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} + + \ No newline at end of file diff --git a/content/tech-docs/participant-api/api/participant-data/deleteParticipantFile.mdx b/content/tech-docs/participant-api/api/participant-data/deleteParticipantFile.mdx new file mode 100644 index 0000000..4de1d0e --- /dev/null +++ b/content/tech-docs/participant-api/api/participant-data/deleteParticipantFile.mdx @@ -0,0 +1,15 @@ +--- +title: Delete participant file +full: true +_openapi: + method: DELETE + webhook: false + toc: [] + structuredData: + headings: [] + contents: [] +--- + +{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} + + \ No newline at end of file diff --git a/content/tech-docs/participant-api/api/participant-data/getAssignedSurveys.mdx b/content/tech-docs/participant-api/api/participant-data/getAssignedSurveys.mdx new file mode 100644 index 0000000..5fbcbbf --- /dev/null +++ b/content/tech-docs/participant-api/api/participant-data/getAssignedSurveys.mdx @@ -0,0 +1,15 @@ +--- +title: Get assigned surveys for profiles +full: true +_openapi: + method: GET + webhook: false + toc: [] + structuredData: + headings: [] + contents: [] +--- + +{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} + + \ No newline at end of file diff --git a/content/tech-docs/participant-api/api/participant-data/getConfidentialResponse.mdx b/content/tech-docs/participant-api/api/participant-data/getConfidentialResponse.mdx new file mode 100644 index 0000000..fc1af2b --- /dev/null +++ b/content/tech-docs/participant-api/api/participant-data/getConfidentialResponse.mdx @@ -0,0 +1,15 @@ +--- +title: Get confidential responses by key +full: true +_openapi: + method: GET + webhook: false + toc: [] + structuredData: + headings: [] + contents: [] +--- + +{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} + + \ No newline at end of file diff --git a/content/tech-docs/participant-api/api/participant-data/getLinkingCode.mdx b/content/tech-docs/participant-api/api/participant-data/getLinkingCode.mdx new file mode 100644 index 0000000..e50f267 --- /dev/null +++ b/content/tech-docs/participant-api/api/participant-data/getLinkingCode.mdx @@ -0,0 +1,15 @@ +--- +title: Get a linking code by key +full: true +_openapi: + method: GET + webhook: false + toc: [] + structuredData: + headings: [] + contents: [] +--- + +{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} + + \ No newline at end of file diff --git a/content/tech-docs/participant-api/api/participant-data/getParticipantFile.mdx b/content/tech-docs/participant-api/api/participant-data/getParticipantFile.mdx new file mode 100644 index 0000000..0d7f724 --- /dev/null +++ b/content/tech-docs/participant-api/api/participant-data/getParticipantFile.mdx @@ -0,0 +1,15 @@ +--- +title: Download participant file +full: true +_openapi: + method: GET + webhook: false + toc: [] + structuredData: + headings: [] + contents: [] +--- + +{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} + + \ No newline at end of file diff --git a/content/tech-docs/participant-api/api/participant-data/getParticipantState.mdx b/content/tech-docs/participant-api/api/participant-data/getParticipantState.mdx new file mode 100644 index 0000000..61c6bd1 --- /dev/null +++ b/content/tech-docs/participant-api/api/participant-data/getParticipantState.mdx @@ -0,0 +1,15 @@ +--- +title: Get participant state +full: true +_openapi: + method: GET + webhook: false + toc: [] + structuredData: + headings: [] + contents: [] +--- + +{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} + + \ No newline at end of file diff --git a/content/tech-docs/participant-api/api/participant-data/getReports.mdx b/content/tech-docs/participant-api/api/participant-data/getReports.mdx new file mode 100644 index 0000000..d3058bf --- /dev/null +++ b/content/tech-docs/participant-api/api/participant-data/getReports.mdx @@ -0,0 +1,15 @@ +--- +title: Get reports for a profile +full: true +_openapi: + method: GET + webhook: false + toc: [] + structuredData: + headings: [] + contents: [] +--- + +{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} + + \ No newline at end of file diff --git a/content/tech-docs/participant-api/api/participant-data/getStudyResponsesForProfile.mdx b/content/tech-docs/participant-api/api/participant-data/getStudyResponsesForProfile.mdx new file mode 100644 index 0000000..fc9e7db --- /dev/null +++ b/content/tech-docs/participant-api/api/participant-data/getStudyResponsesForProfile.mdx @@ -0,0 +1,15 @@ +--- +title: Get survey responses for a profile +full: true +_openapi: + method: GET + webhook: false + toc: [] + structuredData: + headings: [] + contents: [] +--- + +{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} + + \ No newline at end of file diff --git a/content/tech-docs/participant-api/api/participant-data/getSubmissionHistory.mdx b/content/tech-docs/participant-api/api/participant-data/getSubmissionHistory.mdx new file mode 100644 index 0000000..333bbc8 --- /dev/null +++ b/content/tech-docs/participant-api/api/participant-data/getSubmissionHistory.mdx @@ -0,0 +1,15 @@ +--- +title: Get submission history for profiles +full: true +_openapi: + method: GET + webhook: false + toc: [] + structuredData: + headings: [] + contents: [] +--- + +{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} + + \ No newline at end of file diff --git a/content/tech-docs/participant-api/api/participant-data/getSurveyWithContext.mdx b/content/tech-docs/participant-api/api/participant-data/getSurveyWithContext.mdx new file mode 100644 index 0000000..cd2dd39 --- /dev/null +++ b/content/tech-docs/participant-api/api/participant-data/getSurveyWithContext.mdx @@ -0,0 +1,15 @@ +--- +title: Get a specific survey with context +full: true +_openapi: + method: GET + webhook: false + toc: [] + structuredData: + headings: [] + contents: [] +--- + +{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} + + \ No newline at end of file diff --git a/content/tech-docs/participant-api/api/participant-data/getTempParticipantSurveyWithContext.mdx b/content/tech-docs/participant-api/api/participant-data/getTempParticipantSurveyWithContext.mdx new file mode 100644 index 0000000..7dfbcf9 --- /dev/null +++ b/content/tech-docs/participant-api/api/participant-data/getTempParticipantSurveyWithContext.mdx @@ -0,0 +1,15 @@ +--- +title: Get a survey with context for a temporary participant +full: true +_openapi: + method: GET + webhook: false + toc: [] + structuredData: + headings: [] + contents: [] +--- + +{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} + + \ No newline at end of file diff --git a/content/tech-docs/participant-api/api/participant-data/getTempParticipantSurveys.mdx b/content/tech-docs/participant-api/api/participant-data/getTempParticipantSurveys.mdx new file mode 100644 index 0000000..1a84263 --- /dev/null +++ b/content/tech-docs/participant-api/api/participant-data/getTempParticipantSurveys.mdx @@ -0,0 +1,15 @@ +--- +title: Get assigned surveys for a temporary participant +full: true +_openapi: + method: GET + webhook: false + toc: [] + structuredData: + headings: [] + contents: [] +--- + +{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} + + \ No newline at end of file diff --git a/content/tech-docs/participant-api/api/participant-data/getVirtualParticipantsByLinkingCode.mdx b/content/tech-docs/participant-api/api/participant-data/getVirtualParticipantsByLinkingCode.mdx new file mode 100644 index 0000000..eff198b --- /dev/null +++ b/content/tech-docs/participant-api/api/participant-data/getVirtualParticipantsByLinkingCode.mdx @@ -0,0 +1,15 @@ +--- +title: Get virtual participants by linking code +full: true +_openapi: + method: GET + webhook: false + toc: [] + structuredData: + headings: [] + contents: [] +--- + +{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} + + \ No newline at end of file diff --git a/content/tech-docs/participant-api/api/participant-data/listParticipantFiles.mdx b/content/tech-docs/participant-api/api/participant-data/listParticipantFiles.mdx new file mode 100644 index 0000000..d5a67a7 --- /dev/null +++ b/content/tech-docs/participant-api/api/participant-data/listParticipantFiles.mdx @@ -0,0 +1,15 @@ +--- +title: List participant files +full: true +_openapi: + method: GET + webhook: false + toc: [] + structuredData: + headings: [] + contents: [] +--- + +{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} + + \ No newline at end of file diff --git a/content/tech-docs/participant-api/api/participant-data/meta.json b/content/tech-docs/participant-api/api/participant-data/meta.json new file mode 100644 index 0000000..7019238 --- /dev/null +++ b/content/tech-docs/participant-api/api/participant-data/meta.json @@ -0,0 +1,21 @@ +{ + "title": "Participant data", + "description": "Endpoints getting participant data in study service", + "pages": [ + "getAssignedSurveys", + "getSurveyWithContext", + "getParticipantState", + "getLinkingCode", + "getStudyResponsesForProfile", + "getConfidentialResponse", + "getSubmissionHistory", + "getReports", + "getTempParticipantSurveys", + "getTempParticipantSurveyWithContext", + "getVirtualParticipantsByLinkingCode", + "listParticipantFiles", + "uploadParticipantFile", + "getParticipantFile", + "deleteParticipantFile" + ] +} \ No newline at end of file diff --git a/content/tech-docs/participant-api/api/participant-data/uploadParticipantFile.mdx b/content/tech-docs/participant-api/api/participant-data/uploadParticipantFile.mdx new file mode 100644 index 0000000..04e3e7a --- /dev/null +++ b/content/tech-docs/participant-api/api/participant-data/uploadParticipantFile.mdx @@ -0,0 +1,15 @@ +--- +title: Upload participant file +full: true +_openapi: + method: POST + webhook: false + toc: [] + structuredData: + headings: [] + contents: [] +--- + +{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} + + \ No newline at end of file diff --git a/content/tech-docs/participant-api/api/password/getPasswordResetInfos.mdx b/content/tech-docs/participant-api/api/password/getPasswordResetInfos.mdx new file mode 100644 index 0000000..c6d30cb --- /dev/null +++ b/content/tech-docs/participant-api/api/password/getPasswordResetInfos.mdx @@ -0,0 +1,15 @@ +--- +title: Get info for a password reset token +full: true +_openapi: + method: POST + webhook: false + toc: [] + structuredData: + headings: [] + contents: [] +--- + +{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} + + \ No newline at end of file diff --git a/content/tech-docs/participant-api/api/password/initiatePasswordReset.mdx b/content/tech-docs/participant-api/api/password/initiatePasswordReset.mdx new file mode 100644 index 0000000..b5e24c8 --- /dev/null +++ b/content/tech-docs/participant-api/api/password/initiatePasswordReset.mdx @@ -0,0 +1,15 @@ +--- +title: Initiate password reset +full: true +_openapi: + method: POST + webhook: false + toc: [] + structuredData: + headings: [] + contents: [] +--- + +{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} + + \ No newline at end of file diff --git a/content/tech-docs/participant-api/api/password/meta.json b/content/tech-docs/participant-api/api/password/meta.json new file mode 100644 index 0000000..61f19e3 --- /dev/null +++ b/content/tech-docs/participant-api/api/password/meta.json @@ -0,0 +1,9 @@ +{ + "title": "Password", + "description": "Password endpoints", + "pages": [ + "initiatePasswordReset", + "getPasswordResetInfos", + "resetPassword" + ] +} \ No newline at end of file diff --git a/content/tech-docs/participant-api/api/password/resetPassword.mdx b/content/tech-docs/participant-api/api/password/resetPassword.mdx new file mode 100644 index 0000000..bbc4331 --- /dev/null +++ b/content/tech-docs/participant-api/api/password/resetPassword.mdx @@ -0,0 +1,15 @@ +--- +title: Reset password +full: true +_openapi: + method: POST + webhook: false + toc: [] + structuredData: + headings: [] + contents: [] +--- + +{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} + + \ No newline at end of file diff --git a/content/tech-docs/participant-api/api/studies/getParticipatingStudies.mdx b/content/tech-docs/participant-api/api/studies/getParticipatingStudies.mdx new file mode 100644 index 0000000..380c3fd --- /dev/null +++ b/content/tech-docs/participant-api/api/studies/getParticipatingStudies.mdx @@ -0,0 +1,15 @@ +--- +title: List studies the user participates in +full: true +_openapi: + method: GET + webhook: false + toc: [] + structuredData: + headings: [] + contents: [] +--- + +{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} + + \ No newline at end of file diff --git a/content/tech-docs/participant-api/api/studies/getStudiesByStatus.mdx b/content/tech-docs/participant-api/api/studies/getStudiesByStatus.mdx new file mode 100644 index 0000000..8e76067 --- /dev/null +++ b/content/tech-docs/participant-api/api/studies/getStudiesByStatus.mdx @@ -0,0 +1,15 @@ +--- +title: List studies by status +full: true +_openapi: + method: GET + webhook: false + toc: [] + structuredData: + headings: [] + contents: [] +--- + +{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} + + \ No newline at end of file diff --git a/content/tech-docs/participant-api/api/studies/getStudy.mdx b/content/tech-docs/participant-api/api/studies/getStudy.mdx new file mode 100644 index 0000000..e671bce --- /dev/null +++ b/content/tech-docs/participant-api/api/studies/getStudy.mdx @@ -0,0 +1,15 @@ +--- +title: Get study by key +full: true +_openapi: + method: GET + webhook: false + toc: [] + structuredData: + headings: [] + contents: [] +--- + +{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} + + \ No newline at end of file diff --git a/content/tech-docs/participant-api/api/studies/getStudyCodeListAvailableCount.mdx b/content/tech-docs/participant-api/api/studies/getStudyCodeListAvailableCount.mdx new file mode 100644 index 0000000..4464860 --- /dev/null +++ b/content/tech-docs/participant-api/api/studies/getStudyCodeListAvailableCount.mdx @@ -0,0 +1,15 @@ +--- +title: Count available codes in a code list +full: true +_openapi: + method: GET + webhook: false + toc: [] + structuredData: + headings: [] + contents: [] +--- + +{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} + + \ No newline at end of file diff --git a/content/tech-docs/participant-api/api/studies/getStudyVariable.mdx b/content/tech-docs/participant-api/api/studies/getStudyVariable.mdx new file mode 100644 index 0000000..ec1cd51 --- /dev/null +++ b/content/tech-docs/participant-api/api/studies/getStudyVariable.mdx @@ -0,0 +1,15 @@ +--- +title: Get a study variable +full: true +_openapi: + method: GET + webhook: false + toc: [] + structuredData: + headings: [] + contents: [] +--- + +{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} + + \ No newline at end of file diff --git a/content/tech-docs/participant-api/api/studies/getStudyVariables.mdx b/content/tech-docs/participant-api/api/studies/getStudyVariables.mdx new file mode 100644 index 0000000..568cf16 --- /dev/null +++ b/content/tech-docs/participant-api/api/studies/getStudyVariables.mdx @@ -0,0 +1,15 @@ +--- +title: List variables for a study +full: true +_openapi: + method: GET + webhook: false + toc: [] + structuredData: + headings: [] + contents: [] +--- + +{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} + + \ No newline at end of file diff --git a/content/tech-docs/participant-api/api/studies/meta.json b/content/tech-docs/participant-api/api/studies/meta.json new file mode 100644 index 0000000..3363d80 --- /dev/null +++ b/content/tech-docs/participant-api/api/studies/meta.json @@ -0,0 +1,13 @@ +{ + "title": "Studies", + "description": "Endpoints getting study data in study service", + "pages": [ + "getStudiesByStatus", + "getStudy", + "studyHasCodeListCode", + "getStudyCodeListAvailableCount", + "getStudyVariables", + "getStudyVariable", + "getParticipatingStudies" + ] +} \ No newline at end of file diff --git a/content/tech-docs/participant-api/api/studies/studyHasCodeListCode.mdx b/content/tech-docs/participant-api/api/studies/studyHasCodeListCode.mdx new file mode 100644 index 0000000..68bc6de --- /dev/null +++ b/content/tech-docs/participant-api/api/studies/studyHasCodeListCode.mdx @@ -0,0 +1,15 @@ +--- +title: Check if a code exists in a code list +full: true +_openapi: + method: GET + webhook: false + toc: [] + structuredData: + headings: [] + contents: [] +--- + +{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} + + \ No newline at end of file diff --git a/content/tech-docs/participant-api/api/user/addProfile.mdx b/content/tech-docs/participant-api/api/user/addProfile.mdx new file mode 100644 index 0000000..85914a2 --- /dev/null +++ b/content/tech-docs/participant-api/api/user/addProfile.mdx @@ -0,0 +1,15 @@ +--- +title: Add new profile +full: true +_openapi: + method: POST + webhook: false + toc: [] + structuredData: + headings: [] + contents: [] +--- + +{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} + + \ No newline at end of file diff --git a/content/tech-docs/participant-api/api/user/changeAccountEmail.mdx b/content/tech-docs/participant-api/api/user/changeAccountEmail.mdx new file mode 100644 index 0000000..5d07ecb --- /dev/null +++ b/content/tech-docs/participant-api/api/user/changeAccountEmail.mdx @@ -0,0 +1,15 @@ +--- +title: Change account email +full: true +_openapi: + method: POST + webhook: false + toc: [] + structuredData: + headings: [] + contents: [] +--- + +{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} + + \ No newline at end of file diff --git a/content/tech-docs/participant-api/api/user/changePassword.mdx b/content/tech-docs/participant-api/api/user/changePassword.mdx new file mode 100644 index 0000000..b2a0d6e --- /dev/null +++ b/content/tech-docs/participant-api/api/user/changePassword.mdx @@ -0,0 +1,15 @@ +--- +title: Change password +full: true +_openapi: + method: POST + webhook: false + toc: [] + structuredData: + headings: [] + contents: [] +--- + +{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} + + \ No newline at end of file diff --git a/content/tech-docs/participant-api/api/user/changePhoneNumber.mdx b/content/tech-docs/participant-api/api/user/changePhoneNumber.mdx new file mode 100644 index 0000000..e23f995 --- /dev/null +++ b/content/tech-docs/participant-api/api/user/changePhoneNumber.mdx @@ -0,0 +1,15 @@ +--- +title: Change phone number +full: true +_openapi: + method: POST + webhook: false + toc: [] + structuredData: + headings: [] + contents: [] +--- + +{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} + + \ No newline at end of file diff --git a/content/tech-docs/participant-api/api/user/deleteUser.mdx b/content/tech-docs/participant-api/api/user/deleteUser.mdx new file mode 100644 index 0000000..c138fa6 --- /dev/null +++ b/content/tech-docs/participant-api/api/user/deleteUser.mdx @@ -0,0 +1,15 @@ +--- +title: Delete current user +full: true +_openapi: + method: DELETE + webhook: false + toc: [] + structuredData: + headings: [] + contents: [] +--- + +{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} + + \ No newline at end of file diff --git a/content/tech-docs/participant-api/api/user/deleteUserAttribute.mdx b/content/tech-docs/participant-api/api/user/deleteUserAttribute.mdx new file mode 100644 index 0000000..3a09abe --- /dev/null +++ b/content/tech-docs/participant-api/api/user/deleteUserAttribute.mdx @@ -0,0 +1,15 @@ +--- +title: Delete a user attribute +full: true +_openapi: + method: DELETE + webhook: false + toc: [] + structuredData: + headings: [] + contents: [] +--- + +{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} + + \ No newline at end of file diff --git a/content/tech-docs/participant-api/api/user/getUser.mdx b/content/tech-docs/participant-api/api/user/getUser.mdx new file mode 100644 index 0000000..d37b5e6 --- /dev/null +++ b/content/tech-docs/participant-api/api/user/getUser.mdx @@ -0,0 +1,15 @@ +--- +title: Get current user +full: true +_openapi: + method: GET + webhook: false + toc: [] + structuredData: + headings: [] + contents: [] +--- + +{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} + + \ No newline at end of file diff --git a/content/tech-docs/participant-api/api/user/getUserAttributes.mdx b/content/tech-docs/participant-api/api/user/getUserAttributes.mdx new file mode 100644 index 0000000..09012fa --- /dev/null +++ b/content/tech-docs/participant-api/api/user/getUserAttributes.mdx @@ -0,0 +1,15 @@ +--- +title: Get user attributes +full: true +_openapi: + method: GET + webhook: false + toc: [] + structuredData: + headings: [] + contents: [] +--- + +{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} + + \ No newline at end of file diff --git a/content/tech-docs/participant-api/api/user/meta.json b/content/tech-docs/participant-api/api/user/meta.json new file mode 100644 index 0000000..4ec2cf9 --- /dev/null +++ b/content/tech-docs/participant-api/api/user/meta.json @@ -0,0 +1,20 @@ +{ + "title": "User", + "description": "User endpoints", + "pages": [ + "getUser", + "deleteUser", + "updatePreferredLanguage", + "addProfile", + "updateProfile", + "removeProfile", + "changePassword", + "changeAccountEmail", + "changePhoneNumber", + "requestPhoneNumberVerification", + "getUserAttributes", + "setUserAttribute", + "deleteUserAttribute", + "updateContactPreferences" + ] +} \ No newline at end of file diff --git a/content/tech-docs/participant-api/api/user/removeProfile.mdx b/content/tech-docs/participant-api/api/user/removeProfile.mdx new file mode 100644 index 0000000..f224789 --- /dev/null +++ b/content/tech-docs/participant-api/api/user/removeProfile.mdx @@ -0,0 +1,15 @@ +--- +title: Remove a profile +full: true +_openapi: + method: POST + webhook: false + toc: [] + structuredData: + headings: [] + contents: [] +--- + +{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} + + \ No newline at end of file diff --git a/content/tech-docs/participant-api/api/user/requestPhoneNumberVerification.mdx b/content/tech-docs/participant-api/api/user/requestPhoneNumberVerification.mdx new file mode 100644 index 0000000..ed4f5aa --- /dev/null +++ b/content/tech-docs/participant-api/api/user/requestPhoneNumberVerification.mdx @@ -0,0 +1,15 @@ +--- +title: Request phone number verification code via SMS +full: true +_openapi: + method: GET + webhook: false + toc: [] + structuredData: + headings: [] + contents: [] +--- + +{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} + + \ No newline at end of file diff --git a/content/tech-docs/participant-api/api/user/setUserAttribute.mdx b/content/tech-docs/participant-api/api/user/setUserAttribute.mdx new file mode 100644 index 0000000..966e23f --- /dev/null +++ b/content/tech-docs/participant-api/api/user/setUserAttribute.mdx @@ -0,0 +1,15 @@ +--- +title: Create or update a user attribute +full: true +_openapi: + method: POST + webhook: false + toc: [] + structuredData: + headings: [] + contents: [] +--- + +{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} + + \ No newline at end of file diff --git a/content/tech-docs/participant-api/api/user/updateContactPreferences.mdx b/content/tech-docs/participant-api/api/user/updateContactPreferences.mdx new file mode 100644 index 0000000..19951d5 --- /dev/null +++ b/content/tech-docs/participant-api/api/user/updateContactPreferences.mdx @@ -0,0 +1,16 @@ +--- +title: Update contact preferences +full: true +_openapi: + method: PUT + webhook: false + toc: [] + structuredData: + headings: [] + contents: + - content: Update the user's newsletter and weekly subscription preferences. +--- + +{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} + + \ No newline at end of file diff --git a/content/tech-docs/participant-api/api/user/updatePreferredLanguage.mdx b/content/tech-docs/participant-api/api/user/updatePreferredLanguage.mdx new file mode 100644 index 0000000..797dbfc --- /dev/null +++ b/content/tech-docs/participant-api/api/user/updatePreferredLanguage.mdx @@ -0,0 +1,15 @@ +--- +title: Update the account's preferred language +full: true +_openapi: + method: PUT + webhook: false + toc: [] + structuredData: + headings: [] + contents: [] +--- + +{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} + + \ No newline at end of file diff --git a/content/tech-docs/participant-api/api/user/updateProfile.mdx b/content/tech-docs/participant-api/api/user/updateProfile.mdx new file mode 100644 index 0000000..0ede110 --- /dev/null +++ b/content/tech-docs/participant-api/api/user/updateProfile.mdx @@ -0,0 +1,15 @@ +--- +title: Update profile +full: true +_openapi: + method: PUT + webhook: false + toc: [] + structuredData: + headings: [] + contents: [] +--- + +{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} + + \ No newline at end of file diff --git a/content/tech-docs/participant-api/meta.json b/content/tech-docs/participant-api/meta.json index 47c1d96..abccb1d 100644 --- a/content/tech-docs/participant-api/meta.json +++ b/content/tech-docs/participant-api/meta.json @@ -1,6 +1,6 @@ { "title": "Participant API", - "description": "TODO", + "description": "API for participant-facing operations", "root": true, "icon": "Globe", "pages": [ diff --git a/content/tech-docs/smtp-bridge/api.mdx b/content/tech-docs/smtp-bridge/api.mdx deleted file mode 100644 index 9a3c444..0000000 --- a/content/tech-docs/smtp-bridge/api.mdx +++ /dev/null @@ -1,4 +0,0 @@ ---- -title: API -description: SMTP Bridge API ---- diff --git a/content/tech-docs/smtp-bridge/api/getHealth.mdx b/content/tech-docs/smtp-bridge/api/getHealth.mdx new file mode 100644 index 0000000..cc2b955 --- /dev/null +++ b/content/tech-docs/smtp-bridge/api/getHealth.mdx @@ -0,0 +1,15 @@ +--- +title: Health check +full: true +_openapi: + method: GET + webhook: false + toc: [] + structuredData: + headings: [] + contents: [] +--- + +{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} + + \ No newline at end of file diff --git a/content/tech-docs/smtp-bridge/api/index.mdx b/content/tech-docs/smtp-bridge/api/index.mdx new file mode 100644 index 0000000..8e23e89 --- /dev/null +++ b/content/tech-docs/smtp-bridge/api/index.mdx @@ -0,0 +1,11 @@ +--- +title: SMTP Bridge API +description: Simple bridge for sending emails via configured SMTP servers. +--- + +{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} + + +Health check GET} /> +Send an email POST} /> + \ No newline at end of file diff --git a/content/tech-docs/smtp-bridge/api/meta.json b/content/tech-docs/smtp-bridge/api/meta.json new file mode 100644 index 0000000..eb96376 --- /dev/null +++ b/content/tech-docs/smtp-bridge/api/meta.json @@ -0,0 +1,6 @@ +{ + "pages": [ + "getHealth", + "sendEmail" + ] +} diff --git a/content/tech-docs/smtp-bridge/api/sendEmail.mdx b/content/tech-docs/smtp-bridge/api/sendEmail.mdx new file mode 100644 index 0000000..58c0865 --- /dev/null +++ b/content/tech-docs/smtp-bridge/api/sendEmail.mdx @@ -0,0 +1,15 @@ +--- +title: Send an email +full: true +_openapi: + method: POST + webhook: false + toc: [] + structuredData: + headings: [] + contents: [] +--- + +{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} + + \ No newline at end of file diff --git a/content/tech-docs/smtp-bridge/meta.json b/content/tech-docs/smtp-bridge/meta.json index 7a02bea..dcded40 100644 --- a/content/tech-docs/smtp-bridge/meta.json +++ b/content/tech-docs/smtp-bridge/meta.json @@ -1,6 +1,6 @@ { "title": "SMTP Bridge", - "description": "TODO", + "description": "Email service integration", "root": true, "icon": "Mail", "pages": [ diff --git a/lib/openapi.ts b/lib/openapi.ts new file mode 100644 index 0000000..f6658fa --- /dev/null +++ b/lib/openapi.ts @@ -0,0 +1,17 @@ +import { createOpenAPI } from 'fumadocs-openapi/server'; + +export const defaultOpenAPIInputs = [ + './openapi/management-api.yaml', + './openapi/participant-api.yaml', + './openapi/smtp-bridge.yaml', +]; + +export function createDocsOpenAPI(input: string | string[]) { + const normalizedInput = Array.isArray(input) ? input : [input]; + + return createOpenAPI({ + input: normalizedInput, + }); +} + +export const openapi = createDocsOpenAPI(defaultOpenAPIInputs); diff --git a/lib/source-docs.ts b/lib/source-docs.ts index e6bed94..ea7df50 100644 --- a/lib/source-docs.ts +++ b/lib/source-docs.ts @@ -1,11 +1,13 @@ -import { docs } from '@/.source'; +import { docs } from 'fumadocs-mdx:collections/server'; import { loader } from 'fumadocs-core/source'; import { lucideIconsPlugin } from 'fumadocs-core/source/lucide-icons'; +import { openapiPlugin } from 'fumadocs-openapi/server'; // See https://fumadocs.vercel.app/docs/headless/source-api for more info -export const source = loader({ - // it assigns a URL to your pages - baseUrl: '/docs', - source: docs.toFumadocsSource(), - plugins: [lucideIconsPlugin()], -}); +export const source = loader( + { + // it assigns a URL to your pages + baseUrl: '/docs', + source: docs.toFumadocsSource(), + plugins: [lucideIconsPlugin(), openapiPlugin()], + },); diff --git a/lib/source-tech-docs.ts b/lib/source-tech-docs.ts index 6392e3d..5c53c79 100644 --- a/lib/source-tech-docs.ts +++ b/lib/source-tech-docs.ts @@ -1,11 +1,12 @@ -import { techDocs } from '@/.source'; +import { techDocs } from 'fumadocs-mdx:collections/server'; import { loader } from 'fumadocs-core/source'; import { lucideIconsPlugin } from 'fumadocs-core/source/lucide-icons'; +import { openapiPlugin } from 'fumadocs-openapi/server'; // See https://fumadocs.vercel.app/docs/headless/source-api for more info export const source = loader({ // it assigns a URL to your pages baseUrl: '/tech-docs', source: techDocs.toFumadocsSource(), - plugins: [lucideIconsPlugin()], + plugins: [lucideIconsPlugin(), openapiPlugin()], }); diff --git a/mdx-components.tsx b/mdx-components.tsx index 7b3bd3c..2844aee 100644 --- a/mdx-components.tsx +++ b/mdx-components.tsx @@ -5,7 +5,7 @@ import { ImageProps } from 'next/image'; import Video, { VideoProps } from './components/content-items/video'; import { joinPath } from './components/utils'; import ExampleBox, { ExampleBoxProps } from './components/content-items/example-box'; -import ApiDoc from './components/api-doc'; +import { APIPage } from '@/components/api-page'; const basePath = process.env.NEXT_PUBLIC_BASE_PATH || ""; @@ -23,7 +23,7 @@ export function getMDXComponents(components?: MDXComponents): MDXComponents { videoPath={joinPath(basePath, (props as VideoProps).videoPath)} />, ExampleBox: (props) => , - ApiDoc: (props) => , + APIPage, ...components, }; } diff --git a/openapi/management-api.yaml b/openapi/management-api.yaml new file mode 100644 index 0000000..5f325ef --- /dev/null +++ b/openapi/management-api.yaml @@ -0,0 +1,6408 @@ +--- +openapi: 3.1.0 +info: + title: Management API + version: 1.0.0 + description: Endpoints for management authentication, user management, study administration, + messaging, and participant administration. +tags: +- name: auth + description: Authentication & Session +- name: studies + description: Study management +- name: surveys + description: Survey management +- name: study-rules + description: Study rules +- name: study-variables + description: Study variables +- name: study-counters + description: Study counters +- name: study-permissions + description: Permissions for a study +- name: notifications + description: Notification subscriptions +- name: code-lists + description: Study code lists +- name: participants + description: Participant operations +- name: accounts + description: Account tracking and identification +- name: reports + description: Participant reports +- name: responses + description: Response exports & queries +- name: files + description: File management for studies +- name: messaging + description: Messaging templates & scheduled emails +- name: user-management + description: Management user accounts and permissions +- name: service-accounts + description: Service account management +- name: app-roles + description: App role templates & assignments +- name: actions + description: Run actions on participants +components: + securitySchemes: + BearerAuth: + type: http + scheme: bearer + bearerFormat: JWT + responses: + Error400: + description: Bad Request + content: + application/json: + schema: + "$ref": "#/components/schemas/Error" + Error401: + description: Unauthorized + content: + application/json: + schema: + "$ref": "#/components/schemas/Error" + Error403: + description: Forbidden + content: + application/json: + schema: + "$ref": "#/components/schemas/Error" + Error404: + description: Not Found + content: + application/json: + schema: + "$ref": "#/components/schemas/Error" + Error429: + description: Too Many Requests + content: + application/json: + schema: + "$ref": "#/components/schemas/Error" + Error500: + description: Internal Server Error + content: + application/json: + schema: + "$ref": "#/components/schemas/Error" + schemas: + Message: + type: object + properties: + message: + type: string + additionalProperties: false + Error: + type: object + properties: + error: + type: string + additionalProperties: false + User: + type: object + properties: + id: + type: string + description: ObjectID + account: + "$ref": "#/components/schemas/Account" + timestamps: + "$ref": "#/components/schemas/Timestamps" + profiles: + type: array + items: + "$ref": "#/components/schemas/Profile" + contactPreferences: + "$ref": "#/components/schemas/ContactPreferences" + contactInfos: + type: array + items: + "$ref": "#/components/schemas/ContactInfo" + additionalProperties: false + Account: + type: object + properties: + type: + type: string + accountID: + type: string + additionalProperties: true + Timestamps: + type: object + properties: + lastTokenRefresh: + type: integer + lastLogin: + type: integer + createdAt: + type: integer + updatedAt: + type: integer + lastPasswordChange: + type: integer + reminderToConfirmSentAt: + type: integer + markedForDeletion: + type: integer + additionalProperties: false + Profile: + type: object + properties: + id: + type: string + createdAt: + type: integer + mainProfile: + type: boolean + additionalProperties: true + ContactPreferences: + type: object + properties: + subscribedToNewsletter: + type: boolean + sendNewsletterTo: + type: array + items: + type: string + subscribedToWeekly: + type: boolean + receiveWeeklyMessageDayOfWeek: + type: integer + additionalProperties: false + ContactInfo: + type: object + properties: + id: + type: string + type: + type: string + enum: + - email + - phone + confirmedAt: + type: integer + confirmationLinkSentAt: + type: integer + email: + type: string + phone: + type: string + additionalProperties: false + Study: + type: object + properties: + id: + type: string + description: ObjectID + example: 64b8f0f2e1b1c8a1d2e3f4g5 + key: + type: string + secretKey: + type: string + status: + type: string + props: + type: object + additionalProperties: true + configs: + type: object + additionalProperties: true + notificationSubscriptions: + type: array + items: + type: object + additionalProperties: true + stats: + type: object + additionalProperties: true + nextTimerEvent: + type: integer + rules: + type: array + items: + type: object + additionalProperties: true + additionalProperties: false + description: Study object + Survey: + type: object + properties: + id: + type: string + description: ObjectID + surveyKey: + type: string + props: + type: object + additionalProperties: true + prefillRules: + type: array + items: + type: object + additionalProperties: true + contextRules: + type: object + additionalProperties: true + maxItemsPerPage: + type: object + additionalProperties: true + availableFor: + type: string + requireLoginBeforeSubmission: + type: boolean + published: + type: integer + unpublished: + type: integer + surveyDefinition: + type: object + additionalProperties: true + versionId: + type: string + metadata: + type: object + additionalProperties: + type: string + additionalProperties: false + description: Survey object + StudyVariables: + type: object + properties: + id: + type: string + description: ObjectID + createdAt: + type: string + format: date-time + configUpdatedAt: + type: string + format: date-time + valueUpdatedAt: + type: string + format: date-time + studyKey: + type: string + key: + type: string + value: + oneOf: + - type: string + - type: integer + - type: number + - type: boolean + - type: string + format: date-time + - type: object + additionalProperties: true + - type: array + items: {} + - type: 'null' + type: + type: string + enum: + - string + - int + - float + - boolean + - date + label: + type: string + description: + type: string + uiType: + type: string + uiPriority: + type: integer + configs: + type: object + additionalProperties: true + additionalProperties: false + description: Study variable object + Permission: + type: object + properties: + id: + type: string + description: ObjectID + subjectId: + type: string + subjectType: + type: string + resourceType: + type: string + resourceKey: + type: string + action: + type: string + limiter: + type: object + additionalProperties: + type: string + additionalProperties: false + description: Permission object + AppRoleTemplate: + type: object + properties: + id: + type: string + description: ObjectID + appName: + type: string + role: + type: string + requiredPermissions: + type: array + items: + "$ref": "#/components/schemas/Permission" + createdAt: + type: string + format: date-time + updatedAt: + type: string + format: date-time + additionalProperties: false + description: App role template object + ServiceUser: + type: object + properties: + id: + type: string + description: ObjectID + label: + type: string + description: + type: string + createdAt: + type: string + format: date-time + additionalProperties: false + ServiceUserAPIKey: + type: object + properties: + id: + type: string + serviceUserID: + type: string + key: + type: string + expiresAt: + type: string + format: date-time + createdAt: + type: string + format: date-time + lastUsedAt: + type: string + format: date-time + additionalProperties: false + StudyRules: + type: object + properties: + id: + type: string + description: ObjectID + studyKey: + type: string + uploadedAt: + type: integer + uploadedBy: + type: string + rules: + type: array + items: + type: object + additionalProperties: true + serialisedRules: + type: string + additionalProperties: false + description: Study rules object + SurveyInfo: + type: object + properties: + key: + type: string + StudyCounter: + type: object + properties: + studyKey: + type: string + scope: + type: string + value: + type: integer + additionalProperties: false + description: Study counter object + NotificationSubscription: + type: object + properties: + messageType: + type: string + email: + type: string + additionalProperties: false + description: Notification Subscription object + PaginationInfos: + type: object + description: Pagination information + properties: + totalCount: + type: integer + currentPage: + type: integer + totalPages: + type: integer + pageSize: + type: integer + additionalProperties: false + StudyCodeListEntry: + type: object + properties: + id: + type: string + description: ObjectID + studyKey: + type: string + listKey: + type: string + code: + type: string + addedAt: + type: string + format: date-time + additionalProperties: false + description: Study Code List Entry object + EmailTemplate: + type: object + properties: + id: + type: string + description: ObjectID + messageType: + type: string + studyKey: + type: string + defaultLanguage: + type: string + headerOverrides: + type: object + additionalProperties: true + translations: + type: array + items: + type: object + additionalProperties: true + additionalProperties: false + description: Email Template object + SmsTemplate: + type: object + properties: + id: + type: string + description: ObjectID + userID: + type: string + messageType: + type: string + sentAt: + type: string + format: date-time + phoneNumber: + type: string + additionalProperties: false + description: SMS Template object + ScheduledEmail: + type: object + properties: + id: + type: string + description: ObjectID + template: + "$ref": "#/components/schemas/EmailTemplate" + type: + type: string + studyKey: + type: string + condition: + type: object + additionalProperties: true + nextTime: + type: integer + period: + type: integer + label: + type: string + until: + type: integer + additionalProperties: false + description: Scheduled Email object + Report: + type: object + properties: + id: + type: string + description: MongoDB ObjectID as hex string + key: + type: string + participantID: + type: string + responseID: + type: string + timestamp: + type: integer + description: Unix timestamp + modifiedAt: + type: string + format: date-time + data: + type: array + items: + "$ref": "#/components/schemas/ReportData" + additionalProperties: false + description: Report object + required: + - key + - participantID + - timestamp + ReportData: + type: object + properties: + key: + type: string + value: + type: string + dtype: + type: string + enum: + - date + - float + - int + - string + - rawMessage + - keyList + additionalProperties: false + Task: + type: object + properties: + id: + type: string + createdAt: + type: string + format: date-time + createdBy: + type: string + updatedAt: + type: string + format: date-time + status: + type: string + targetCount: + type: integer + processedCount: + type: integer + resultFile: + type: string + fileType: + type: string + error: + type: string + additionalProperties: true + FileInfo: + type: object + properties: + id: + type: string + description: ObjectID + participantID: + type: string + status: + type: string + uploadedBy: + type: string + path: + type: string + previewPath: + type: string + submittedAt: + type: integer + createdAt: + type: string + format: date-time + updatedAt: + type: string + format: date-time + fileType: + type: string + visibleToParticipant: + type: boolean + size: + type: integer + required: + - id + - participantID + - path + additionalProperties: false + description: File Info object + AppRole: + type: object + properties: + id: + type: string + description: ObjectID + subjectId: + type: string + subjectType: + type: string + appName: + type: string + role: + type: string + createdAt: + type: string + format: date-time + Participant: + type: object + description: Participant object + properties: + id: + type: string + description: ObjectID + participantId: + type: string + currentStudySession: + type: string + modifiedAt: + type: integer + enteredAt: + type: integer + studyStatus: + type: string + flags: + type: object + additionalProperties: + type: string + linkingCodes: + type: object + additionalProperties: + type: string + assignedSurveys: + type: array + items: + "$ref": "#/components/schemas/AssignedSurvey" + lastSubmissions: + type: object + additionalProperties: + type: integer + messages: + type: array + items: + type: object + additionalProperties: true + required: + - participantId + additionalProperties: false + AssignedSurvey: + type: object + description: Assigned survey object + properties: + studyKey: + type: string + surveyKey: + type: string + validFrom: + type: integer + validUntil: + type: integer + category: + type: string + profileID: + type: string + required: + - studyKey + - surveyKey + additionalProperties: false + SurveyResponse: + type: object + description: Survey response + properties: + id: + type: string + description: ObjectID + key: + type: string + participantId: + type: string + versionId: + type: string + openedAt: + type: integer + submittedAt: + type: integer + arrivedAt: + type: integer + responses: + type: array + items: + type: object + additionalProperties: true + context: + type: object + additionalProperties: + type: string + required: + - key + additionalProperties: false + ManagementUser: + type: object + properties: + id: + type: string + description: MongoDB ObjectID as hex string + sub: + type: string + email: + type: string + format: email + username: + type: string + provider: + type: string + imageUrl: + type: string + format: uri + isAdmin: + type: boolean + lastLoginAt: + type: string + format: date-time + createdAt: + type: string + format: date-time + additionalProperties: false + description: Management User object +paths: + "/v1/auth/signin-with-idp": + post: + tags: + - auth + operationId: auth_signinWithIdp + summary: Sign in with identity provider + requestBody: + required: true + content: + application/json: + schema: + type: object + properties: + sub: + type: string + description: IDP Subject (User ID) + roles: + type: array + items: + type: string + name: + type: string + provider: + type: string + email: + type: string + format: email + imageURL: + type: string + renewToken: + type: string + description: Token used to renew the session + instanceID: + type: string + required: + - sub + responses: + '200': + description: Signed in + content: + application/json: + schema: + type: object + properties: + accessToken: + type: string + sessionID: + type: string + expiresAt: + type: integer + description: Unix timestamp (seconds) + isAdmin: + type: boolean + required: + - accessToken + - sessionID + - expiresAt + - isAdmin + '400': + "$ref": "#/components/responses/Error400" + '403': + "$ref": "#/components/responses/Error403" + '500': + "$ref": "#/components/responses/Error500" + "/v1/auth/extend-session": + post: + tags: + - auth + operationId: auth_extendSession + summary: Extend session + security: + - BearerAuth: [] + requestBody: + required: true + content: + application/json: + schema: + type: object + properties: + renewToken: + type: string + required: + - renewToken + responses: + '200': + description: Session extended + content: + application/json: + schema: + type: object + properties: + accessToken: + type: string + sessionID: + type: string + expiresAt: + type: integer + description: Unix timestamp (seconds) + isAdmin: + type: boolean + required: + - accessToken + - sessionID + - expiresAt + - isAdmin + '400': + "$ref": "#/components/responses/Error400" + '401': + "$ref": "#/components/responses/Error401" + '403': + "$ref": "#/components/responses/Error403" + '500': + "$ref": "#/components/responses/Error500" + "/v1/auth/renew-token/{sessionID}": + get: + tags: + - auth + operationId: auth_renewToken + summary: Get renew token + security: + - BearerAuth: [] + parameters: + - name: sessionID + in: path + required: true + schema: + type: string + responses: + '200': + description: Renew token + content: + application/json: + schema: + type: object + properties: + renewToken: + type: string + required: + - renewToken + '400': + "$ref": "#/components/responses/Error400" + '401': + "$ref": "#/components/responses/Error401" + '403': + "$ref": "#/components/responses/Error403" + '500': + "$ref": "#/components/responses/Error500" + "/v1/auth/permissions": + get: + tags: + - auth + operationId: auth_listPermissions + summary: List permissions and roles + security: + - BearerAuth: [] + responses: + '200': + description: Permissions + content: + application/json: + schema: + type: object + properties: + isAdmin: + type: boolean + permissions: + type: array + items: + "$ref": "#/components/schemas/Permission" + appRoles: + type: array + items: + "$ref": "#/components/schemas/AppRole" + required: + - isAdmin + - permissions + - appRoles + '400': + "$ref": "#/components/responses/Error400" + '401': + "$ref": "#/components/responses/Error401" + '500': + "$ref": "#/components/responses/Error500" + "/v1/studies/{studyKey}/participants/virtual": + post: + tags: + - participants + operationId: participants_createVirtualParticipant + summary: Create virtual participant + security: + - BearerAuth: [] + parameters: + - name: studyKey + in: path + required: true + schema: + type: string + responses: + '200': + description: Virtual participant created + content: + application/json: + schema: + type: object + properties: + message: + type: string + participant: + "$ref": "#/components/schemas/Participant" + required: + - message + - participant + '400': + "$ref": "#/components/responses/Error400" + '401': + "$ref": "#/components/responses/Error401" + '500': + "$ref": "#/components/responses/Error500" + "/v1/studies/{studyKey}/participants/{participantID}/responses": + get: + tags: + - participants + operationId: participants_listParticipantResponses + summary: List participant responses + security: + - BearerAuth: [] + parameters: + - name: studyKey + in: path + required: true + schema: + type: string + - name: participantID + in: path + required: true + schema: + type: string + - name: page + in: query + schema: + type: integer + minimum: 1 + - name: limit + in: query + schema: + type: integer + minimum: 1 + maximum: 100 + - name: filter + in: query + description: bson.M object to filter responses + schema: + type: object + additionalProperties: + type: object + - name: sort + in: query + description: bson.M object to sort responses + schema: + type: object + additionalProperties: + type: object + responses: + '200': + description: List participant responses + content: + application/json: + schema: + type: object + properties: + responses: + type: array + items: + "$ref": "#/components/schemas/SurveyResponse" + pagination: + "$ref": "#/components/schemas/PaginationInfos" + required: + - responses + - pagination + '400': + "$ref": "#/components/responses/Error400" + '401': + "$ref": "#/components/responses/Error401" + '500': + "$ref": "#/components/responses/Error500" + post: + tags: + - participants + operationId: participants_submitParticipantResponse + summary: Submit participant response + security: + - BearerAuth: [] + parameters: + - name: studyKey + in: path + required: true + schema: + type: string + - name: participantID + in: path + required: true + schema: + type: string + requestBody: + required: true + content: + application/json: + schema: + "$ref": "#/components/schemas/SurveyResponse" + responses: + '200': + description: Submit participant response + content: + application/json: + schema: + type: object + properties: + message: + type: string + result: + type: array + items: + "$ref": "#/components/schemas/AssignedSurvey" + participant: + "$ref": "#/components/schemas/Participant" + required: + - message + - result + - participant + '400': + "$ref": "#/components/responses/Error400" + '401': + "$ref": "#/components/responses/Error401" + '500': + "$ref": "#/components/responses/Error500" + "/v1/studies/{studyKey}/participants/{participantID}/events": + post: + tags: + - participants + operationId: participants_submitParticipantEvent + summary: Submit participant event + security: + - BearerAuth: [] + parameters: + - name: studyKey + in: path + required: true + schema: + type: string + - name: participantID + in: path + required: true + schema: + type: string + requestBody: + required: true + content: + application/json: + schema: + type: object + properties: + eventKey: + type: string + payload: + type: object + additionalProperties: + type: string + required: + - eventKey + responses: + '200': + description: Submit participant event + content: + application/json: + schema: + type: object + properties: + message: + type: string + result: + type: array + items: + "$ref": "#/components/schemas/AssignedSurvey" + required: + - message + - result + '400': + "$ref": "#/components/responses/Error400" + '401': + "$ref": "#/components/responses/Error401" + '500': + "$ref": "#/components/responses/Error500" + "/v1/studies/{studyKey}/participants/{participantID}/remove-session": + post: + tags: + - participants + operationId: participants_removeStudySession + summary: Remove or replace a participant study session + security: + - BearerAuth: [] + parameters: + - name: studyKey + in: path + required: true + schema: + type: string + - name: participantID + in: path + required: true + schema: + type: string + requestBody: + required: true + content: + application/json: + schema: + type: object + properties: + sessionToRemove: + type: string + replacementSession: + type: string + description: Optional replacement session; if empty, the session association is removed. + required: + - sessionToRemove + additionalProperties: false + responses: + '200': + description: Session removed + content: + application/json: + schema: + type: object + properties: + message: + type: string + participant: + "$ref": "#/components/schemas/Participant" + responsesUpdated: + type: integer + required: + - message + - participant + - responsesUpdated + additionalProperties: false + '400': + "$ref": "#/components/responses/Error400" + '401': + "$ref": "#/components/responses/Error401" + '500': + "$ref": "#/components/responses/Error500" + "/v1/studies/{studyKey}/participants/{participantID}/reports": + post: + tags: + - reports + operationId: participants_submitParticipantReport + summary: Submit participant report + security: + - BearerAuth: [] + parameters: + - name: studyKey + in: path + required: true + schema: + type: string + - name: participantID + in: path + required: true + schema: + type: string + requestBody: + required: true + content: + application/json: + schema: + "$ref": "#/components/schemas/Report" + responses: + '200': + description: Submit participant report + content: + application/json: + schema: + "$ref": "#/components/schemas/Message" + '400': + "$ref": "#/components/responses/Error400" + '401': + "$ref": "#/components/responses/Error401" + '500': + "$ref": "#/components/responses/Error500" + "/v1/studies/{studyKey}/participants/{participantID}/reports/{reportID}": + put: + tags: + - reports + operationId: participants_updateParticipantReport + summary: Update participant report + security: + - BearerAuth: [] + parameters: + - name: studyKey + in: path + required: true + schema: + type: string + - name: participantID + in: path + required: true + schema: + type: string + - name: reportID + in: path + required: true + schema: + type: string + requestBody: + required: true + content: + application/json: + schema: + type: object + properties: + data: + "$ref": "#/components/schemas/ReportData" + mode: + type: object + additionalProperties: true + required: + - data + - mode + responses: + '200': + description: Update participant report + content: + application/json: + schema: + "$ref": "#/components/schemas/Message" + '400': + "$ref": "#/components/responses/Error400" + '401': + "$ref": "#/components/responses/Error401" + '500': + "$ref": "#/components/responses/Error500" + "/v1/studies/{studyKey}/participants/merge": + post: + tags: + - participants + operationId: participants_mergeParticipants + summary: Merge participants + security: + - BearerAuth: [] + parameters: + - name: studyKey + in: path + required: true + schema: + type: string + requestBody: + required: true + content: + application/json: + schema: + type: object + properties: + targetParticipantID: + type: string + withParticipantID: + type: string + required: + - targetParticipantID + - withParticipantID + responses: + '200': + description: Merge participants + content: + application/json: + schema: + type: object + properties: + participant: + "$ref": "#/components/schemas/Participant" + required: + - participant + '400': + "$ref": "#/components/responses/Error400" + '401': + "$ref": "#/components/responses/Error401" + '500': + "$ref": "#/components/responses/Error500" + "/v1/studies/{studyKey}/participants/{participantID}": + put: + tags: + - participants + operationId: participants_editParticipant + summary: Edit participant + security: + - BearerAuth: [] + parameters: + - name: studyKey + in: path + required: true + schema: + type: string + - name: participantID + in: path + required: true + schema: + type: string + requestBody: + required: true + content: + application/json: + schema: + "$ref": "#/components/schemas/Participant" + responses: + '200': + description: Edit participant + content: + application/json: + schema: + type: object + properties: + message: + type: string + participant: + "$ref": "#/components/schemas/Participant" + required: + - message + - participant + '400': + "$ref": "#/components/responses/Error400" + '401': + "$ref": "#/components/responses/Error401" + '500': + "$ref": "#/components/responses/Error500" + "/v1/messaging/email-templates/global-templates": + get: + tags: + - messaging + operationId: messaging_listGlobalEmailTemplates + summary: List global email templates + security: + - BearerAuth: [] + responses: + '200': + description: List global templates + content: + application/json: + schema: + type: object + properties: + templates: + type: array + items: + "$ref": "#/components/schemas/EmailTemplate" + required: + - templates + '400': + "$ref": "#/components/responses/Error400" + '401': + "$ref": "#/components/responses/Error401" + '500': + "$ref": "#/components/responses/Error500" + post: + tags: + - messaging + operationId: messaging_saveGlobalEmailTemplate + summary: Save global email template + security: + - BearerAuth: [] + requestBody: + required: true + content: + application/json: + schema: + "$ref": "#/components/schemas/EmailTemplate" + responses: + '200': + description: Save global template + content: + application/json: + schema: + type: object + properties: + template: + "$ref": "#/components/schemas/EmailTemplate" + required: + - template + '400': + "$ref": "#/components/responses/Error400" + '401': + "$ref": "#/components/responses/Error401" + '500': + "$ref": "#/components/responses/Error500" + "/v1/messaging/email-templates/global-templates/{messageType}": + get: + tags: + - messaging + operationId: messaging_getGlobalEmailTemplate + summary: Get global email template by type + security: + - BearerAuth: [] + parameters: + - name: messageType + in: path + required: true + schema: + type: string + responses: + '200': + description: Global template + content: + application/json: + schema: + type: object + properties: + template: + "$ref": "#/components/schemas/EmailTemplate" + required: + - template + '400': + "$ref": "#/components/responses/Error400" + '401': + "$ref": "#/components/responses/Error401" + '500': + "$ref": "#/components/responses/Error500" + delete: + tags: + - messaging + operationId: messaging_deleteGlobalEmailTemplate + summary: Delete global email template + security: + - BearerAuth: [] + parameters: + - name: messageType + in: path + required: true + schema: + type: string + responses: + '200': + description: Deleted + content: + application/json: + schema: + "$ref": "#/components/schemas/Message" + '400': + "$ref": "#/components/responses/Error400" + '401': + "$ref": "#/components/responses/Error401" + '500': + "$ref": "#/components/responses/Error500" + "/v1/messaging/email-templates/study-templates": + get: + tags: + - messaging + operationId: messaging_listAllStudyEmailTemplates + summary: List all study email templates + security: + - BearerAuth: [] + responses: + '200': + description: List study templates (all studies) + content: + application/json: + schema: + type: object + properties: + templates: + type: array + items: + "$ref": "#/components/schemas/EmailTemplate" + required: + - templates + '400': + "$ref": "#/components/responses/Error400" + '401': + "$ref": "#/components/responses/Error401" + '500': + "$ref": "#/components/responses/Error500" + "/v1/messaging/email-templates/study-templates/{studyKey}": + get: + tags: + - messaging + operationId: messaging_listStudyEmailTemplates + summary: List study email templates + security: + - BearerAuth: [] + parameters: + - name: studyKey + in: path + required: true + schema: + type: string + responses: + '200': + description: List study templates + content: + application/json: + schema: + type: object + properties: + templates: + type: array + items: + "$ref": "#/components/schemas/EmailTemplate" + required: + - templates + '400': + "$ref": "#/components/responses/Error400" + '401': + "$ref": "#/components/responses/Error401" + '500': + "$ref": "#/components/responses/Error500" + post: + tags: + - messaging + operationId: messaging_saveStudyEmailTemplate + summary: Save study email template + security: + - BearerAuth: [] + parameters: + - name: studyKey + in: path + required: true + schema: + type: string + requestBody: + required: true + content: + application/json: + schema: + "$ref": "#/components/schemas/EmailTemplate" + responses: + '200': + description: Save study template + content: + application/json: + schema: + type: object + properties: + template: + "$ref": "#/components/schemas/EmailTemplate" + required: + - template + '400': + "$ref": "#/components/responses/Error400" + '401': + "$ref": "#/components/responses/Error401" + '404': + "$ref": "#/components/responses/Error404" + '500': + "$ref": "#/components/responses/Error500" + "/v1/messaging/email-templates/study-templates/{studyKey}/{messageType}": + get: + tags: + - messaging + operationId: messaging_getStudyEmailTemplate + summary: Get study email template by type + security: + - BearerAuth: [] + parameters: + - name: studyKey + in: path + required: true + schema: + type: string + - name: messageType + in: path + required: true + schema: + type: string + responses: + '200': + description: Study template + content: + application/json: + schema: + type: object + properties: + template: + "$ref": "#/components/schemas/EmailTemplate" + required: + - template + '400': + "$ref": "#/components/responses/Error400" + '401': + "$ref": "#/components/responses/Error401" + '500': + "$ref": "#/components/responses/Error500" + delete: + tags: + - messaging + operationId: messaging_deleteStudyEmailTemplate + summary: Delete study email template + security: + - BearerAuth: [] + parameters: + - name: studyKey + in: path + required: true + schema: + type: string + - name: messageType + in: path + required: true + schema: + type: string + responses: + '200': + description: Deleted + content: + application/json: + schema: + "$ref": "#/components/schemas/Message" + '400': + "$ref": "#/components/responses/Error400" + '401': + "$ref": "#/components/responses/Error401" + '500': + "$ref": "#/components/responses/Error500" + "/v1/messaging/sms-templates/": + post: + tags: + - messaging + operationId: messaging_saveSmsTemplate + summary: Save SMS template + security: + - BearerAuth: [] + requestBody: + required: true + content: + application/json: + schema: + "$ref": "#/components/schemas/SmsTemplate" + responses: + '200': + description: Save SMS template + content: + application/json: + schema: + type: object + properties: + template: + "$ref": "#/components/schemas/SmsTemplate" + required: + - template + '400': + "$ref": "#/components/responses/Error400" + '401': + "$ref": "#/components/responses/Error401" + '500': + "$ref": "#/components/responses/Error500" + "/v1/messaging/sms-templates/{messageType}": + get: + tags: + - messaging + operationId: messaging_getSmsTemplate + summary: Get SMS template by type + security: + - BearerAuth: [] + parameters: + - name: messageType + in: path + required: true + schema: + type: string + responses: + '200': + description: SMS template + content: + application/json: + schema: + type: object + properties: + template: + "$ref": "#/components/schemas/SmsTemplate" + required: + - template + '400': + "$ref": "#/components/responses/Error400" + '401': + "$ref": "#/components/responses/Error401" + '500': + "$ref": "#/components/responses/Error500" + "/v1/messaging/scheduled-emails/": + get: + tags: + - messaging + operationId: messaging_listScheduledEmails + summary: List scheduled emails + security: + - BearerAuth: [] + responses: + '200': + description: List scheduled emails + content: + application/json: + schema: + type: object + properties: + schedules: + type: array + items: + "$ref": "#/components/schemas/ScheduledEmail" + required: + - schedules + '400': + "$ref": "#/components/responses/Error400" + '401': + "$ref": "#/components/responses/Error401" + '500': + "$ref": "#/components/responses/Error500" + post: + tags: + - messaging + operationId: messaging_createScheduledEmail + summary: Save scheduled email + security: + - BearerAuth: [] + requestBody: + required: true + content: + application/json: + schema: + "$ref": "#/components/schemas/ScheduledEmail" + responses: + '200': + description: Save scheduled email + content: + application/json: + schema: + type: object + properties: + schedule: + "$ref": "#/components/schemas/ScheduledEmail" + required: + - schedule + '400': + "$ref": "#/components/responses/Error400" + '401': + "$ref": "#/components/responses/Error401" + '500': + "$ref": "#/components/responses/Error500" + "/v1/messaging/scheduled-emails/{id}": + get: + tags: + - messaging + operationId: messaging_getScheduledEmail + summary: Get scheduled email + security: + - BearerAuth: [] + parameters: + - name: id + in: path + required: true + schema: + type: string + responses: + '200': + description: Scheduled email + content: + application/json: + schema: + type: object + properties: + schedule: + "$ref": "#/components/schemas/ScheduledEmail" + required: + - schedule + '400': + "$ref": "#/components/responses/Error400" + '401': + "$ref": "#/components/responses/Error401" + '500': + "$ref": "#/components/responses/Error500" + delete: + tags: + - messaging + operationId: messaging_deleteScheduledEmail + summary: Delete scheduled email + security: + - BearerAuth: [] + parameters: + - name: id + in: path + required: true + schema: + type: string + responses: + '200': + description: Deleted + content: + application/json: + schema: + "$ref": "#/components/schemas/Message" + '400': + "$ref": "#/components/responses/Error400" + '401': + "$ref": "#/components/responses/Error401" + '500': + "$ref": "#/components/responses/Error500" + "/v1/studies/": + get: + tags: + - studies + operationId: studies_listStudies + security: + - BearerAuth: [] + summary: List all studies + responses: + '200': + description: List all studies + content: + application/json: + schema: + type: object + properties: + studies: + type: array + items: + "$ref": "#/components/schemas/Study" + required: + - studies + '400': + "$ref": "#/components/responses/Error400" + '401': + "$ref": "#/components/responses/Error401" + '500': + "$ref": "#/components/responses/Error500" + post: + tags: + - studies + operationId: studies_createStudy + security: + - BearerAuth: [] + summary: Create a new study + requestBody: + required: true + content: + application/json: + schema: + type: object + properties: + studyKey: + type: string + secretKey: + type: string + isSystemDefaultStudy: + type: boolean + required: + - studyKey + - secretKey + additionalProperties: false + responses: + '201': + description: Created study + content: + application/json: + schema: + type: object + properties: + study: + "$ref": "#/components/schemas/Study" + required: + - study + '400': + "$ref": "#/components/responses/Error400" + '401': + "$ref": "#/components/responses/Error401" + '500': + "$ref": "#/components/responses/Error500" + "/v1/studies/{studyKey}/": + get: + tags: + - studies + operationId: studies_getStudy + security: + - BearerAuth: [] + summary: Get study configuration by key + parameters: + - name: studyKey + in: path + required: true + schema: + type: string + responses: + '200': + description: Study config + content: + application/json: + schema: + type: object + properties: + study: + "$ref": "#/components/schemas/Study" + required: + - study + '400': + "$ref": "#/components/responses/Error400" + '401': + "$ref": "#/components/responses/Error401" + '500': + "$ref": "#/components/responses/Error500" + delete: + tags: + - studies + operationId: studies_deleteStudy + security: + - BearerAuth: [] + summary: Delete a study by key + parameters: + - name: studyKey + in: path + required: true + schema: + type: string + responses: + '200': + description: Deleted + content: + application/json: + schema: + "$ref": "#/components/schemas/Message" + '400': + "$ref": "#/components/responses/Error400" + '401': + "$ref": "#/components/responses/Error401" + '500': + "$ref": "#/components/responses/Error500" + "/v1/studies/{studyKey}/export-config": + get: + tags: + - studies + operationId: studies_exportConfig + security: + - BearerAuth: [] + summary: Export study configuration, surveys, and rules + parameters: + - name: studyKey + in: path + required: true + schema: + type: string + - name: config + in: query + schema: + type: string + enum: + - 'true' + - 'false' + default: 'false' + - name: surveys + in: query + schema: + type: string + enum: + - 'true' + - 'false' + default: 'false' + - name: rules + in: query + schema: + type: string + enum: + - 'true' + - 'false' + default: 'false' + responses: + '200': + description: Export + content: + application/json: + schema: + type: object + properties: + exportedAt: + type: string + format: date-time + config: + "$ref": "#/components/schemas/Study" + rules: + "$ref": "#/components/schemas/StudyRules" + surveys: + type: array + items: + "$ref": "#/components/schemas/Survey" + additionalProperties: false + description: Stream Export Object + '400': + "$ref": "#/components/responses/Error400" + '401': + "$ref": "#/components/responses/Error401" + '500': + "$ref": "#/components/responses/Error500" + "/v1/studies/{studyKey}/is-default": + put: + tags: + - studies + operationId: studies_updateIsDefault + security: + - BearerAuth: [] + summary: Update default status of a study + parameters: + - name: studyKey + in: path + required: true + schema: + type: string + requestBody: + required: true + content: + application/json: + schema: + type: object + properties: + isDefault: + type: boolean + required: + - isDefault + additionalProperties: false + responses: + '200': + description: Updated + content: + application/json: + schema: + "$ref": "#/components/schemas/Message" + '400': + "$ref": "#/components/responses/Error400" + '401': + "$ref": "#/components/responses/Error401" + '500': + "$ref": "#/components/responses/Error500" + "/v1/studies/{studyKey}/status": + put: + tags: + - studies + operationId: studies_updateStatus + security: + - BearerAuth: [] + summary: Update status of a study + parameters: + - name: studyKey + in: path + required: true + schema: + type: string + requestBody: + required: true + content: + application/json: + schema: + type: object + properties: + status: + type: string + required: + - status + additionalProperties: false + responses: + '200': + description: Updated + content: + application/json: + schema: + "$ref": "#/components/schemas/Message" + '400': + "$ref": "#/components/responses/Error400" + '401': + "$ref": "#/components/responses/Error401" + '500': + "$ref": "#/components/responses/Error500" + "/v1/studies/{studyKey}/display-props": + put: + tags: + - studies + operationId: studies_updateDisplayProps + security: + - BearerAuth: [] + summary: Update display properties of a study + parameters: + - name: studyKey + in: path + required: true + schema: + type: string + requestBody: + required: true + content: + application/json: + schema: + type: object + properties: + name: + type: array + items: + type: object + additionalProperties: true + description: + type: array + items: + type: object + additionalProperties: true + tags: + type: array + items: + type: object + additionalProperties: true + additionalProperties: false + responses: + '200': + description: Updated + content: + application/json: + schema: + "$ref": "#/components/schemas/Message" + '400': + "$ref": "#/components/responses/Error400" + '401': + "$ref": "#/components/responses/Error401" + '500': + "$ref": "#/components/responses/Error500" + "/v1/studies/{studyKey}/file-upload-config": + put: + tags: + - studies + operationId: studies_updateFileUploadRule + security: + - BearerAuth: [] + summary: Update file upload configuration of a study + parameters: + - name: studyKey + in: path + required: true + schema: + type: string + requestBody: + required: true + content: + application/json: + schema: + type: object + properties: + simplifiedAllowedUpload: + type: boolean + expression: + type: object + additionalProperties: true + responses: + '200': + description: Updated + content: + application/json: + schema: + "$ref": "#/components/schemas/Message" + '400': + "$ref": "#/components/responses/Error400" + '401': + "$ref": "#/components/responses/Error401" + '500': + "$ref": "#/components/responses/Error500" + "/v1/studies/{studyKey}/surveys/": + get: + tags: + - surveys + operationId: surveys_listSurveyInfos + security: + - BearerAuth: [] + summary: List survey infos for a study + parameters: + - name: studyKey + in: path + required: true + schema: + type: string + responses: + '200': + description: List survey infos + content: + application/json: + schema: + type: object + properties: + surveys: + type: array + items: + "$ref": "#/components/schemas/SurveyInfo" + required: + - surveys + '400': + "$ref": "#/components/responses/Error400" + '401': + "$ref": "#/components/responses/Error401" + '500': + "$ref": "#/components/responses/Error500" + post: + tags: + - surveys + operationId: surveys_createSurvey + security: + - BearerAuth: [] + summary: Create a new survey in a study + parameters: + - name: studyKey + in: path + required: true + schema: + type: string + requestBody: + required: true + content: + application/json: + schema: + "$ref": "#/components/schemas/Survey" + responses: + '201': + description: Created survey + content: + application/json: + schema: + type: object + properties: + survey: + "$ref": "#/components/schemas/Survey" + required: + - survey + '400': + "$ref": "#/components/responses/Error400" + '401': + "$ref": "#/components/responses/Error401" + '500': + "$ref": "#/components/responses/Error500" + "/v1/studies/{studyKey}/surveys/{surveyKey}": + get: + tags: + - surveys + operationId: surveys_getLatestSurvey + security: + - BearerAuth: [] + summary: Get latest survey by key + parameters: + - name: studyKey + in: path + required: true + schema: + type: string + - name: surveyKey + in: path + required: true + schema: + type: string + responses: + '200': + description: Latest survey + content: + application/json: + schema: + type: object + properties: + survey: + "$ref": "#/components/schemas/Survey" + required: + - survey + '400': + "$ref": "#/components/responses/Error400" + '401': + "$ref": "#/components/responses/Error401" + '500': + "$ref": "#/components/responses/Error500" + post: + tags: + - surveys + operationId: surveys_updateSurvey + security: + - BearerAuth: [] + summary: Update survey definition + parameters: + - name: studyKey + in: path + required: true + schema: + type: string + - name: surveyKey + in: path + required: true + schema: + type: string + requestBody: + required: true + content: + application/json: + schema: + type: object + properties: + survey: + "$ref": "#/components/schemas/Survey" + required: + - survey + responses: + '200': + description: Updated survey + content: + application/json: + schema: + type: object + properties: + survey: + "$ref": "#/components/schemas/Survey" + required: + - survey + '400': + "$ref": "#/components/responses/Error400" + '401': + "$ref": "#/components/responses/Error401" + '500': + "$ref": "#/components/responses/Error500" + "/v1/studies/{studyKey}/surveys/{surveyKey}/unpublish": + post: + tags: + - surveys + operationId: surveys_unpublishSurvey + security: + - BearerAuth: [] + summary: Unpublish a survey + parameters: + - name: studyKey + in: path + required: true + schema: + type: string + - name: surveyKey + in: path + required: true + schema: + type: string + responses: + '200': + description: Unpublished + content: + application/json: + schema: + "$ref": "#/components/schemas/Message" + '400': + "$ref": "#/components/responses/Error400" + '401': + "$ref": "#/components/responses/Error401" + '500': + "$ref": "#/components/responses/Error500" + "/v1/studies/{studyKey}/surveys/{surveyKey}/versions": + get: + tags: + - surveys + operationId: surveys_listSurveyVersions + security: + - BearerAuth: [] + summary: List all survey versions + parameters: + - name: studyKey + in: path + required: true + schema: + type: string + - name: surveyKey + in: path + required: true + schema: + type: string + responses: + '200': + description: Versions + content: + application/json: + schema: + type: object + properties: + versions: + type: array + items: + "$ref": "#/components/schemas/Survey" + required: + - versions + '400': + "$ref": "#/components/responses/Error400" + '401': + "$ref": "#/components/responses/Error401" + '500': + "$ref": "#/components/responses/Error500" + "/v1/studies/{studyKey}/surveys/{surveyKey}/versions/{versionID}": + get: + tags: + - surveys + operationId: surveys_getSurveyVersion + security: + - BearerAuth: [] + summary: Get a specific survey version + parameters: + - name: studyKey + in: path + required: true + schema: + type: string + - name: surveyKey + in: path + required: true + schema: + type: string + - name: versionID + in: path + required: true + schema: + type: string + responses: + '200': + description: Version + content: + application/json: + schema: + type: object + properties: + survey: + "$ref": "#/components/schemas/Survey" + required: + - survey + '400': + "$ref": "#/components/responses/Error400" + '401': + "$ref": "#/components/responses/Error401" + '500': + "$ref": "#/components/responses/Error500" + delete: + tags: + - surveys + operationId: surveys_deleteSurveyVersion + security: + - BearerAuth: [] + summary: Delete a survey version + parameters: + - name: studyKey + in: path + required: true + schema: + type: string + - name: surveyKey + in: path + required: true + schema: + type: string + - name: versionID + in: path + required: true + schema: + type: string + responses: + '200': + description: Deleted + content: + application/json: + schema: + "$ref": "#/components/schemas/Message" + '400': + "$ref": "#/components/responses/Error400" + '401': + "$ref": "#/components/responses/Error401" + '500': + "$ref": "#/components/responses/Error500" + "/v1/studies/{studyKey}/permissions/": + get: + tags: + - study-permissions + operationId: studyPermissions_listPermissions + summary: List study permissions + security: + - BearerAuth: [] + parameters: + - name: studyKey + in: path + required: true + schema: + type: string + responses: + '200': + description: Permission list + content: + application/json: + schema: + type: object + properties: + permissions: + type: object + additionalProperties: + type: object + properties: + user: + type: object + additionalProperties: true + permissions: + type: array + items: + "$ref": "#/components/schemas/Permission" + required: + - permissions + '400': + "$ref": "#/components/responses/Error400" + '401': + "$ref": "#/components/responses/Error401" + '500': + "$ref": "#/components/responses/Error500" + post: + tags: + - study-permissions + operationId: studyPermissions_addPermission + summary: Add a study permission + security: + - BearerAuth: [] + parameters: + - name: studyKey + in: path + required: true + schema: + type: string + requestBody: + required: true + content: + application/json: + schema: + "$ref": "#/components/schemas/Permission" + responses: + '200': + description: Created + content: + application/json: + schema: + "$ref": "#/components/schemas/Message" + '400': + "$ref": "#/components/responses/Error400" + '401': + "$ref": "#/components/responses/Error401" + '500': + "$ref": "#/components/responses/Error500" + "/v1/studies/{studyKey}/permissions/{permissionID}": + delete: + tags: + - study-permissions + operationId: studyPermissions_removePermission + summary: Remove a study permission + security: + - BearerAuth: [] + parameters: + - name: studyKey + in: path + required: true + schema: + type: string + - name: permissionID + in: path + required: true + schema: + type: string + responses: + '200': + description: Removed + content: + application/json: + schema: + "$ref": "#/components/schemas/Message" + '400': + "$ref": "#/components/responses/Error400" + '401': + "$ref": "#/components/responses/Error401" + '500': + "$ref": "#/components/responses/Error500" + "/v1/studies/{studyKey}/notification-subscriptions/": + get: + tags: + - notifications + operationId: notifications_getSubscriptions + summary: List notification subscriptions + security: + - BearerAuth: [] + parameters: + - name: studyKey + in: path + required: true + schema: + type: string + responses: + '200': + description: Subscriptions + content: + application/json: + schema: + type: object + properties: + subscriptions: + type: array + items: + "$ref": "#/components/schemas/NotificationSubscription" + required: + - subscriptions + additionalProperties: false + '400': + "$ref": "#/components/responses/Error400" + '401': + "$ref": "#/components/responses/Error401" + '500': + "$ref": "#/components/responses/Error500" + put: + tags: + - notifications + operationId: notifications_updateSubscriptions + summary: Update notification subscriptions + security: + - BearerAuth: [] + parameters: + - name: studyKey + in: path + required: true + schema: + type: string + requestBody: + required: true + content: + application/json: + schema: + type: object + properties: + subscriptions: + type: array + items: + "$ref": "#/components/schemas/NotificationSubscription" + required: + - subscriptions + additionalProperties: false + responses: + '200': + description: Updated + content: + application/json: + schema: + "$ref": "#/components/schemas/Message" + '400': + "$ref": "#/components/responses/Error400" + '401': + "$ref": "#/components/responses/Error401" + '500': + "$ref": "#/components/responses/Error500" + "/v1/studies/{studyKey}/study-code-list/list-keys": + get: + tags: + - code-lists + operationId: codeLists_getListKeys + summary: List code list keys + security: + - BearerAuth: [] + parameters: + - name: studyKey + in: path + required: true + schema: + type: string + responses: + '200': + description: List keys + content: + application/json: + schema: + type: object + properties: + listKeys: + type: array + items: + type: string + required: + - listKeys + additionalProperties: false + '400': + "$ref": "#/components/responses/Error400" + '401': + "$ref": "#/components/responses/Error401" + '500': + "$ref": "#/components/responses/Error500" + "/v1/studies/{studyKey}/study-code-list/codes": + get: + tags: + - code-lists + operationId: codeLists_getCodes + summary: List codes of a study code list + security: + - BearerAuth: [] + parameters: + - name: studyKey + in: path + required: true + schema: + type: string + - name: listKey + in: query + required: true + schema: + type: string + - name: page + in: query + description: page number (starting from 1) + schema: + type: integer + minimum: 1 + default: 1 + - name: limit + in: query + description: maximum number of codes per page + schema: + type: integer + minimum: 1 + default: 10 + responses: + '200': + description: Codes + content: + application/json: + schema: + type: object + properties: + codeList: + type: array + items: + "$ref": "#/components/schemas/StudyCodeListEntry" + pagination: + "$ref": "#/components/schemas/PaginationInfos" + required: + - codeList + - pagination + '400': + "$ref": "#/components/responses/Error400" + '401': + "$ref": "#/components/responses/Error401" + '500': + "$ref": "#/components/responses/Error500" + post: + tags: + - code-lists + operationId: codeLists_addCodes + summary: Add codes to a study code list + security: + - BearerAuth: [] + parameters: + - name: studyKey + in: path + required: true + schema: + type: string + requestBody: + required: true + content: + application/json: + schema: + type: object + properties: + listKey: + type: string + codes: + type: array + items: + type: string + required: + - listKey + - codes + additionalProperties: false + responses: + '200': + description: Added + content: + application/json: + schema: + type: object + properties: + errors: + type: array + items: + type: string + additionalProperties: false + '400': + "$ref": "#/components/responses/Error400" + '401': + "$ref": "#/components/responses/Error401" + delete: + tags: + - code-lists + operationId: codeLists_removeCode + summary: Remove a code from a study code list + security: + - BearerAuth: [] + parameters: + - name: studyKey + in: path + required: true + schema: + type: string + - name: listKey + in: query + required: true + schema: + type: string + - name: code + in: query + required: true + schema: + type: string + responses: + '200': + description: Removed + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + required: + - success + '400': + "$ref": "#/components/responses/Error400" + '401': + "$ref": "#/components/responses/Error401" + '500': + "$ref": "#/components/responses/Error500" + "/v1/studies/{studyKey}/study-counters/": + get: + tags: + - study-counters + operationId: studyCounters_listValues + security: + - BearerAuth: [] + summary: List all study counter values + parameters: + - name: studyKey + in: path + required: true + schema: + type: string + responses: + '200': + description: Counter values + content: + application/json: + schema: + type: object + properties: + values: + type: array + items: + "$ref": "#/components/schemas/StudyCounter" + required: + - values + '400': + "$ref": "#/components/responses/Error400" + '401': + "$ref": "#/components/responses/Error401" + '500': + "$ref": "#/components/responses/Error500" + "/v1/studies/{studyKey}/study-counters/{scope}": + post: + tags: + - study-counters + operationId: studyCounters_saveValue + security: + - BearerAuth: [] + summary: Set a study counter value for scope + parameters: + - name: studyKey + in: path + required: true + schema: + type: string + - name: scope + in: path + required: true + schema: + type: string + requestBody: + required: true + content: + application/json: + schema: + type: object + properties: + value: + type: integer + required: + - value + additionalProperties: false + responses: + '200': + description: Saved + content: + application/json: + schema: + type: object + properties: + value: + type: integer + required: + - value + additionalProperties: false + '400': + "$ref": "#/components/responses/Error400" + '401': + "$ref": "#/components/responses/Error401" + '500': + "$ref": "#/components/responses/Error500" + put: + tags: + - study-counters + operationId: studyCounters_incrementValue + security: + - BearerAuth: [] + summary: Increment a study counter value + parameters: + - name: studyKey + in: path + required: true + schema: + type: string + - name: scope + in: path + required: true + schema: + type: string + responses: + '200': + description: Incremented + content: + application/json: + schema: + type: object + properties: + value: + type: integer + required: + - value + additionalProperties: false + '400': + "$ref": "#/components/responses/Error400" + '401': + "$ref": "#/components/responses/Error401" + '500': + "$ref": "#/components/responses/Error500" + delete: + tags: + - study-counters + operationId: studyCounters_removeValue + security: + - BearerAuth: [] + summary: Remove a study counter value + parameters: + - name: studyKey + in: path + required: true + schema: + type: string + - name: scope + in: path + required: true + schema: + type: string + responses: + '200': + description: Removed + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + required: + - success + '400': + "$ref": "#/components/responses/Error400" + '401': + "$ref": "#/components/responses/Error401" + '500': + "$ref": "#/components/responses/Error500" + "/v1/studies/{studyKey}/variables/": + get: + tags: + - study-variables + operationId: studyVariables_listVariables + summary: List study variables + security: + - BearerAuth: [] + parameters: + - name: studyKey + in: path + required: true + schema: + type: string + responses: + '200': + description: Variable list + content: + application/json: + schema: + type: object + properties: + variables: + type: array + items: + "$ref": "#/components/schemas/StudyVariables" + additionalProperties: false + '400': + "$ref": "#/components/responses/Error400" + '401': + "$ref": "#/components/responses/Error401" + '500': + "$ref": "#/components/responses/Error500" + post: + tags: + - study-variables + operationId: studyVariables_addVariable + summary: Create a new study variable + security: + - BearerAuth: [] + parameters: + - name: studyKey + in: path + required: true + schema: + type: string + requestBody: + required: true + content: + application/json: + schema: + type: object + properties: + variableDef: + "$ref": "#/components/schemas/StudyVariables" + additionalProperties: false + responses: + '200': + description: Created variable + content: + application/json: + schema: + type: object + properties: + id: + type: string + additionalProperties: false + required: + - id + '400': + "$ref": "#/components/responses/Error400" + '401': + "$ref": "#/components/responses/Error401" + '500': + "$ref": "#/components/responses/Error500" + "/v1/studies/{studyKey}/variables/{variableKey}": + get: + tags: + - study-variables + operationId: studyVariables_getVariable + summary: Get a study variable by key + security: + - BearerAuth: [] + parameters: + - name: studyKey + in: path + required: true + schema: + type: string + - name: variableKey + in: path + required: true + schema: + type: string + responses: + '200': + description: Variable + content: + application/json: + schema: + type: object + properties: + variable: + "$ref": "#/components/schemas/StudyVariables" + additionalProperties: false + required: + - variable + '400': + "$ref": "#/components/responses/Error400" + '401': + "$ref": "#/components/responses/Error401" + '500': + "$ref": "#/components/responses/Error500" + put: + tags: + - study-variables + operationId: studyVariables_updateVariableDef + summary: Update study variable definition + security: + - BearerAuth: [] + parameters: + - name: studyKey + in: path + required: true + schema: + type: string + - name: variableKey + in: path + required: true + schema: + type: string + requestBody: + required: true + content: + application/json: + schema: + type: object + properties: + variableDef: + "$ref": "#/components/schemas/StudyVariables" + required: + - variableDef + additionalProperties: false + responses: + '200': + description: Updated + content: + application/json: + schema: + "$ref": "#/components/schemas/Message" + '400': + "$ref": "#/components/responses/Error400" + '401': + "$ref": "#/components/responses/Error401" + '500': + "$ref": "#/components/responses/Error500" + delete: + tags: + - study-variables + operationId: studyVariables_deleteVariable + summary: Delete a study variable + security: + - BearerAuth: [] + parameters: + - name: studyKey + in: path + required: true + schema: + type: string + - name: variableKey + in: path + required: true + schema: + type: string + responses: + '200': + description: Deleted + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + required: + - success + '400': + "$ref": "#/components/responses/Error400" + '401': + "$ref": "#/components/responses/Error401" + '500': + "$ref": "#/components/responses/Error500" + "/v1/studies/{studyKey}/variables/{variableKey}/value": + put: + tags: + - study-variables + operationId: studyVariables_updateVariableValue + summary: Update study variable value + security: + - BearerAuth: [] + parameters: + - name: studyKey + in: path + required: true + schema: + type: string + - name: variableKey + in: path + required: true + schema: + type: string + requestBody: + required: true + content: + application/json: + schema: + type: object + properties: + variable: + "$ref": "#/components/schemas/StudyVariables" + required: + - variable + additionalProperties: false + responses: + '200': + description: Value updated + content: + application/json: + schema: + "$ref": "#/components/schemas/Message" + '400': + "$ref": "#/components/responses/Error400" + '401': + "$ref": "#/components/responses/Error401" + '500': + "$ref": "#/components/responses/Error500" + "/v1/studies/{studyKey}/rules/": + get: + tags: + - study-rules + operationId: studyRules_getCurrent + summary: Get current published study rules + security: + - BearerAuth: [] + parameters: + - name: studyKey + in: path + required: true + schema: + type: string + responses: + '200': + description: Current rules + content: + application/json: + schema: + type: object + properties: + studyRules: + "$ref": "#/components/schemas/StudyRules" + required: + - studyRules + '400': + "$ref": "#/components/responses/Error400" + '401': + "$ref": "#/components/responses/Error401" + '500': + "$ref": "#/components/responses/Error500" + post: + tags: + - study-rules + operationId: studyRules_publishNewVersion + summary: Publish a new version of study rules + security: + - BearerAuth: [] + parameters: + - name: studyKey + in: path + required: true + schema: + type: string + requestBody: + required: true + content: + application/json: + schema: + "$ref": "#/components/schemas/StudyRules" + responses: + '200': + description: Published + content: + application/json: + schema: + "$ref": "#/components/schemas/Message" + '400': + "$ref": "#/components/responses/Error400" + '401': + "$ref": "#/components/responses/Error401" + '500': + "$ref": "#/components/responses/Error500" + "/v1/studies/{studyKey}/rules/versions": + get: + tags: + - study-rules + operationId: studyRules_listVersions + summary: List all study rules versions + security: + - BearerAuth: [] + parameters: + - name: studyKey + in: path + required: true + schema: + type: string + responses: + '200': + description: Versions + content: + application/json: + schema: + type: object + properties: + versions: + type: array + items: + "$ref": "#/components/schemas/StudyRules" + required: + - versions + '400': + "$ref": "#/components/responses/Error400" + '401': + "$ref": "#/components/responses/Error401" + '500': + "$ref": "#/components/responses/Error500" + "/v1/studies/{studyKey}/rules/versions/{id}": + get: + tags: + - study-rules + operationId: studyRules_getVersion + summary: Get a study rules version by ID + security: + - BearerAuth: [] + parameters: + - name: studyKey + in: path + required: true + schema: + type: string + - name: id + in: path + required: true + schema: + type: string + responses: + '200': + description: Version + content: + application/json: + schema: + type: object + properties: + studyRules: + "$ref": "#/components/schemas/StudyRules" + required: + - studyRules + '400': + "$ref": "#/components/responses/Error400" + '401': + "$ref": "#/components/responses/Error401" + '500': + "$ref": "#/components/responses/Error500" + delete: + tags: + - study-rules + operationId: studyRules_deleteVersion + summary: Delete a study rules version + security: + - BearerAuth: [] + parameters: + - name: studyKey + in: path + required: true + schema: + type: string + - name: id + in: path + required: true + schema: + type: string + responses: + '200': + description: Deleted + content: + application/json: + schema: + "$ref": "#/components/schemas/Message" + '400': + "$ref": "#/components/responses/Error400" + '401': + "$ref": "#/components/responses/Error401" + '500': + "$ref": "#/components/responses/Error500" + "/v1/studies/{studyKey}/run-actions/participants/{participantID}": + post: + tags: + - actions + operationId: actions_runOnParticipant + summary: Run actions on a participant + security: + - BearerAuth: [] + parameters: + - name: studyKey + in: path + required: true + schema: + type: string + - name: participantID + in: path + required: true + schema: + type: string + requestBody: + required: true + content: + application/json: + schema: + type: object + properties: + rules: + type: array + items: + type: object + additionalProperties: true + required: + - rules + additionalProperties: false + responses: + '200': + description: Task started + content: + application/json: + schema: + type: object + properties: + participantCount: + type: integer + duration: + type: integer + ruleResults: + type: array + items: + type: integer + required: + - participantCount + - duration + - ruleResults + '400': + "$ref": "#/components/responses/Error400" + '401': + "$ref": "#/components/responses/Error401" + '500': + "$ref": "#/components/responses/Error500" + "/v1/studies/{studyKey}/run-actions/participants/": + post: + tags: + - actions + operationId: actions_runOnParticipants + summary: Run actions on multiple participants + security: + - BearerAuth: [] + parameters: + - name: studyKey + in: path + required: true + schema: + type: string + requestBody: + required: true + content: + application/json: + schema: + type: object + properties: + rules: + type: array + items: + type: object + additionalProperties: true + required: + - rules + additionalProperties: false + responses: + '200': + description: Task started + content: + application/json: + schema: + type: object + properties: + task: + "$ref": "#/components/schemas/Task" + required: + - task + '400': + "$ref": "#/components/responses/Error400" + '401': + "$ref": "#/components/responses/Error401" + '500': + "$ref": "#/components/responses/Error500" + "/v1/studies/{studyKey}/run-actions/participants/task/{taskID}": + get: + tags: + - actions + operationId: actions_getTaskStatus + summary: Get actions task status + security: + - BearerAuth: [] + parameters: + - name: studyKey + in: path + required: true + schema: + type: string + - name: taskID + in: path + required: true + schema: + type: string + responses: + '200': + description: Task status + content: + application/json: + schema: + type: object + properties: + task: + "$ref": "#/components/schemas/Task" + required: + - task + '400': + "$ref": "#/components/responses/Error400" + '401': + "$ref": "#/components/responses/Error401" + '403': + "$ref": "#/components/responses/Error403" + '500': + "$ref": "#/components/responses/Error500" + "/v1/studies/{studyKey}/run-actions/participants/task/{taskID}/result": + get: + tags: + - actions + operationId: actions_getTaskResult + summary: Get actions task result + security: + - BearerAuth: [] + parameters: + - name: studyKey + in: path + required: true + schema: + type: string + - name: taskID + in: path + required: true + schema: + type: string + responses: + '200': + description: Result + content: + application/json: + schema: + type: object + properties: + result: + type: object + additionalProperties: + type: object + required: + - result + '400': + "$ref": "#/components/responses/Error400" + '401': + "$ref": "#/components/responses/Error401" + '403': + "$ref": "#/components/responses/Error403" + '404': + "$ref": "#/components/responses/Error404" + '500': + "$ref": "#/components/responses/Error500" + "/v1/studies/{studyKey}/run-actions/previous-responses/{participantID}": + post: + tags: + - actions + operationId: actions_runPrevResponsesOnParticipant + summary: Run actions on previous responses for a participant + security: + - BearerAuth: [] + parameters: + - name: studyKey + in: path + required: true + schema: + type: string + - name: participantID + in: path + required: true + schema: + type: string + requestBody: + required: true + content: + application/json: + schema: + type: object + properties: + surveyKeys: + type: array + items: + type: string + from: + type: integer + to: + type: integer + rules: + type: array + items: + type: object + additionalProperties: true + responses: + '200': + description: Task started + content: + application/json: + schema: + type: object + properties: + participantCount: + type: integer + duration: + type: integer + ruleResults: + type: array + items: + type: integer + required: + - participantCount + - duration + - ruleResults + '400': + "$ref": "#/components/responses/Error400" + '401': + "$ref": "#/components/responses/Error401" + '500': + "$ref": "#/components/responses/Error500" + "/v1/studies/{studyKey}/run-actions/previous-responses/": + post: + tags: + - actions + operationId: actions_runPrevResponsesOnParticipants + summary: Run actions on previous responses for multiple participants + security: + - BearerAuth: [] + parameters: + - name: studyKey + in: path + required: true + schema: + type: string + requestBody: + required: true + content: + application/json: + schema: + type: object + properties: + surveyKeys: + type: array + items: + type: string + from: + type: integer + to: + type: integer + rules: + type: array + items: + type: object + additionalProperties: true + responses: + '200': + description: Task started + content: + application/json: + schema: + type: object + properties: + task: + "$ref": "#/components/schemas/Task" + required: + - task + '400': + "$ref": "#/components/responses/Error400" + '401': + "$ref": "#/components/responses/Error401" + '500': + "$ref": "#/components/responses/Error500" + "/v1/studies/{studyKey}/run-actions/previous-responses/task/{taskID}": + get: + tags: + - actions + operationId: actions_getPrevResponsesTaskStatus + summary: Get previous-responses actions task status + security: + - BearerAuth: [] + parameters: + - name: studyKey + in: path + required: true + schema: + type: string + - name: taskID + in: path + required: true + schema: + type: string + responses: + '200': + description: Task status + content: + application/json: + schema: + type: object + properties: + task: + "$ref": "#/components/schemas/Task" + required: + - task + '400': + "$ref": "#/components/responses/Error400" + '401': + "$ref": "#/components/responses/Error401" + '403': + "$ref": "#/components/responses/Error403" + '500': + "$ref": "#/components/responses/Error500" + "/v1/studies/{studyKey}/run-actions/previous-responses/task/{taskID}/result": + get: + tags: + - actions + operationId: actions_getPrevResponsesTaskResult + summary: Get previous-responses actions task result + security: + - BearerAuth: [] + parameters: + - name: studyKey + in: path + required: true + schema: + type: string + - name: taskID + in: path + required: true + schema: + type: string + responses: + '200': + description: Result + content: + application/json: + schema: + type: object + properties: + result: + type: object + additionalProperties: + type: object + required: + - result + '400': + "$ref": "#/components/responses/Error400" + '401': + "$ref": "#/components/responses/Error401" + '403': + "$ref": "#/components/responses/Error403" + '404': + "$ref": "#/components/responses/Error404" + '500': + "$ref": "#/components/responses/Error500" + "/v1/studies/{studyKey}/data-exporter/survey-info/": + get: + tags: + - responses + operationId: dataExporter_getSurveyInfo + summary: List survey info + security: + - BearerAuth: [] + parameters: + - name: studyKey + in: path + required: true + schema: + type: string + - name: surveyKey + in: query + schema: + type: string + responses: + '200': + description: File download (JSON or CSV) + headers: + Content-Disposition: + description: Indicates the filename the client should save. + schema: + type: string + content: + application/json: + schema: + type: string + format: binary + text/csv: + schema: + type: string + format: binary + '400': + "$ref": "#/components/responses/Error400" + '401': + "$ref": "#/components/responses/Error401" + '500': + "$ref": "#/components/responses/Error500" + "/v1/studies/{studyKey}/data-exporter/responses/count": + get: + tags: + - responses + operationId: dataExporter_getResponsesCount + summary: Get responses count + security: + - BearerAuth: [] + parameters: + - name: studyKey + in: path + required: true + schema: + type: string + - name: surveyKey + in: query + schema: + type: string + - name: filter + in: query + description: bson.M object to filter files + schema: + type: object + additionalProperties: + type: object + responses: + '200': + description: Count + content: + application/json: + schema: + type: object + properties: + count: + type: integer + required: + - count + additionalProperties: false + '400': + "$ref": "#/components/responses/Error400" + '401': + "$ref": "#/components/responses/Error401" + '500': + "$ref": "#/components/responses/Error500" + "/v1/studies/{studyKey}/data-exporter/responses/": + post: + tags: + - responses + operationId: dataExporter_generateResponsesExport + summary: Start responses export task + security: + - BearerAuth: [] + parameters: + - name: studyKey + in: path + required: true + schema: + type: string + - name: surveyKey + in: query + schema: + type: string + - name: page + in: query + description: page number (starting from 1) + schema: + type: integer + minimum: 1 + default: 1 + - name: limit + in: query + description: maximum number of responses per page + schema: + type: integer + minimum: 1 + default: 10 + - name: filter + in: query + description: bson.M object to filter responses + schema: + type: object + additionalProperties: + type: object + - name: sort + in: query + description: bson.M object to sort responses + schema: + type: object + additionalProperties: + type: object + - name: shortKeys + in: query + description: return short keys for responses + schema: + type: boolean + default: false + - name: questionOptionSep + in: query + description: separator used in option keys + schema: + type: string + default: "-" + - name: format + in: query + description: response export format + schema: + type: string + default: wide + enum: + - wide + - long + - json + - name: extraContextColumns + in: query + description: comma-separated list of extra context columns + schema: + type: string + responses: + '200': + description: Export started + content: + application/json: + schema: + type: object + properties: + task: + "$ref": "#/components/schemas/Task" + required: + - task + '400': + "$ref": "#/components/responses/Error400" + '401': + "$ref": "#/components/responses/Error401" + '500': + "$ref": "#/components/responses/Error500" + "/v1/studies/{studyKey}/data-exporter/responses/task/{taskID}": + get: + tags: + - responses + operationId: dataExporter_getResponsesTaskStatus + summary: Get responses export task status + security: + - BearerAuth: [] + parameters: + - name: studyKey + in: path + required: true + schema: + type: string + - name: taskID + in: path + required: true + schema: + type: string + responses: + '200': + description: Task status + content: + application/json: + type: object + properties: + task: + "$ref": "#/components/schemas/Task" + required: + - task + '400': + "$ref": "#/components/responses/Error400" + '401': + "$ref": "#/components/responses/Error401" + '403': + "$ref": "#/components/responses/Error403" + '500': + "$ref": "#/components/responses/Error500" + "/v1/studies/{studyKey}/data-exporter/responses/task/{taskID}/result": + get: + tags: + - responses + operationId: dataExporter_getResponsesTaskResult + summary: Get responses export task result + security: + - BearerAuth: [] + parameters: + - name: studyKey + in: path + required: true + schema: + type: string + - name: taskID + in: path + required: true + schema: + type: string + responses: + '200': + description: File download + headers: + Content-Disposition: + description: Indicates the filename the client should save. + schema: + type: string + content: + "*/*": + schema: + type: string + format: binary + '400': + "$ref": "#/components/responses/Error400" + '401': + "$ref": "#/components/responses/Error401" + '403': + "$ref": "#/components/responses/Error403" + '404': + "$ref": "#/components/responses/Error404" + '500': + "$ref": "#/components/responses/Error500" + "/v1/studies/{studyKey}/data-exporter/responses/daily-exports": + get: + tags: + - responses + operationId: dataExporter_listDailyResponseExports + summary: List daily response exports + security: + - BearerAuth: [] + parameters: + - name: studyKey + in: path + required: true + schema: + type: string + responses: + '200': + description: Exports + content: + application/json: + schema: + type: object + properties: + dailyExports: + type: array + items: + type: string + required: + - dailyExports + additionalProperties: false + '400': + "$ref": "#/components/responses/Error400" + '401': + "$ref": "#/components/responses/Error401" + '500': + "$ref": "#/components/responses/Error500" + "/v1/studies/{studyKey}/data-exporter/responses/daily-exports/{exportID}": + get: + tags: + - responses + operationId: dataExporter_getDailyResponseExport + summary: Get daily response export by ID + security: + - BearerAuth: [] + parameters: + - name: studyKey + in: path + required: true + schema: + type: string + - name: exportID + in: path + required: true + schema: + type: string + responses: + '200': + description: File download (JSON or CSV) + headers: + Content-Disposition: + description: Indicates the filename the client should save. + schema: + type: string + content: + application/json: + schema: + type: string + format: binary + text/csv: + schema: + type: string + format: binary + '401': + "$ref": "#/components/responses/Error401" + '403': + "$ref": "#/components/responses/Error403" + '404': + "$ref": "#/components/responses/Error404" + '500': + "$ref": "#/components/responses/Error500" + "/v1/studies/{studyKey}/data-exporter/participants/count": + get: + tags: + - participants + operationId: dataExporter_getParticipantsCount + summary: Get participants count + security: + - BearerAuth: [] + parameters: + - name: studyKey + in: path + required: true + schema: + type: string + - name: filter + in: query + description: bson.M object to filter participants + schema: + type: object + additionalProperties: + type: object + responses: + '200': + description: Count + content: + application/json: + schema: + type: object + properties: + count: + type: integer + required: + - count + additionalProperties: false + '400': + "$ref": "#/components/responses/Error400" + '401': + "$ref": "#/components/responses/Error401" + '500': + "$ref": "#/components/responses/Error500" + "/v1/studies/{studyKey}/data-exporter/participants/": + post: + tags: + - participants + operationId: dataExporter_generateParticipantsExport + summary: Start participants export task + security: + - BearerAuth: [] + parameters: + - name: studyKey + in: path + required: true + schema: + type: string + - name: filter + in: query + description: bson.M object to filter participants + schema: + type: object + additionalProperties: + type: object + - name: sort + in: query + description: bson.M object to sort participants + schema: + type: object + additionalProperties: + type: object + responses: + '200': + description: Export started + content: + application/json: + schema: + type: object + properties: + task: + "$ref": "#/components/schemas/Task" + required: + - task + '400': + "$ref": "#/components/responses/Error400" + '401': + "$ref": "#/components/responses/Error401" + '500': + "$ref": "#/components/responses/Error500" + "/v1/studies/{studyKey}/data-exporter/participants/task/{taskID}": + get: + tags: + - participants + operationId: dataExporter_getParticipantsTaskStatus + summary: Get participants export task status + security: + - BearerAuth: [] + parameters: + - name: studyKey + in: path + required: true + schema: + type: string + - name: taskID + in: path + required: true + schema: + type: string + responses: + '200': + description: Task status + content: + application/json: + schema: + type: object + properties: + task: + "$ref": "#/components/schemas/Task" + '400': + "$ref": "#/components/responses/Error400" + '401': + "$ref": "#/components/responses/Error401" + '403': + "$ref": "#/components/responses/Error403" + '500': + "$ref": "#/components/responses/Error500" + "/v1/studies/{studyKey}/data-exporter/participants/task/{taskID}/result": + get: + tags: + - participants + operationId: dataExporter_getParticipantsTaskResult + summary: Get participants export task result + security: + - BearerAuth: [] + parameters: + - name: studyKey + in: path + required: true + schema: + type: string + - name: taskID + in: path + required: true + schema: + type: string + responses: + '200': + description: File download + headers: + Content-Disposition: + description: Indicates the filename the client should save. + schema: + type: string + content: + "*/*": + schema: + type: string + format: binary + '400': + "$ref": "#/components/responses/Error400" + '401': + "$ref": "#/components/responses/Error401" + '403': + "$ref": "#/components/responses/Error403" + '404': + "$ref": "#/components/responses/Error404" + '500': + "$ref": "#/components/responses/Error500" + "/v1/studies/{studyKey}/data-exporter/reports/count": + get: + tags: + - reports + operationId: dataExporter_getReportsCount + summary: Get report items count + security: + - BearerAuth: [] + parameters: + - name: studyKey + in: path + required: true + schema: + type: string + - name: reportKey + in: query + description: filter by report key + schema: + type: string + - name: pid + in: query + description: filter by participant ID + schema: + type: string + - name: from + in: query + description: filter by timestamp (greater than or equal to this value) + schema: + type: integer + - name: until + in: query + description: filter by timestamp (less than or equal to this value) + schema: + type: integer + responses: + '200': + description: Count + content: + application/json: + schema: + type: object + properties: + count: + type: integer + required: + - count + additionalProperties: false + '400': + "$ref": "#/components/responses/Error400" + '401': + "$ref": "#/components/responses/Error401" + '500': + "$ref": "#/components/responses/Error500" + "/v1/studies/{studyKey}/data-exporter/reports/": + post: + tags: + - reports + operationId: dataExporter_generateReportsExport + summary: Start report export task + security: + - BearerAuth: [] + parameters: + - name: studyKey + in: path + required: true + schema: + type: string + - name: reportKey + in: query + description: filter by report key + schema: + type: string + - name: pid + in: query + description: filter by participant ID + schema: + type: string + - name: from + in: query + description: filter by timestamp (greater than or equal to this value) + schema: + type: integer + - name: until + in: query + description: filter by timestamp (less than or equal to this value) + schema: + type: integer + - name: type + in: query + description: 'export type: ''csv'' to download as table, ''raw'' to export + as JSON' + schema: + type: string + enum: + - raw + - csv + default: raw + responses: + '200': + description: Export started + content: + application/json: + schema: + type: object + properties: + task: + "$ref": "#/components/schemas/Task" + required: + - task + additionalProperties: false + '400': + "$ref": "#/components/responses/Error400" + '401': + "$ref": "#/components/responses/Error401" + '500': + "$ref": "#/components/responses/Error500" + "/v1/studies/{studyKey}/data-exporter/reports/task/{taskID}": + get: + tags: + - reports + operationId: dataExporter_getReportsTaskStatus + summary: Get report export task status + security: + - BearerAuth: [] + parameters: + - name: studyKey + in: path + required: true + schema: + type: string + - name: taskID + in: path + required: true + schema: + type: string + responses: + '200': + description: Task status + content: + application/json: + schema: + type: object + properties: + task: + "$ref": "#/components/schemas/Task" + required: + - task + '400': + "$ref": "#/components/responses/Error400" + '401': + "$ref": "#/components/responses/Error401" + '403': + "$ref": "#/components/responses/Error403" + '500': + "$ref": "#/components/responses/Error500" + "/v1/studies/{studyKey}/data-exporter/reports/task/{taskID}/result": + get: + tags: + - reports + operationId: dataExporter_getReportsTaskResult + summary: Get report export task result + security: + - BearerAuth: [] + parameters: + - name: studyKey + in: path + required: true + schema: + type: string + - name: taskID + in: path + required: true + schema: + type: string + responses: + '200': + description: File download + headers: + Content-Disposition: + description: Indicates the filename the client should save. + schema: + type: string + content: + "*/*": + schema: + type: string + format: binary + '400': + "$ref": "#/components/responses/Error400" + '401': + "$ref": "#/components/responses/Error401" + '403': + "$ref": "#/components/responses/Error403" + '500': + "$ref": "#/components/responses/Error500" + "/v1/studies/{studyKey}/data-exporter/confidential-responses/": + post: + tags: + - responses + operationId: dataExporter_getConfidentialResponses + summary: Start confidential responses export task + security: + - BearerAuth: [] + parameters: + - name: studyKey + in: path + required: true + schema: + type: string + requestBody: + required: true + content: + application/json: + schema: + type: object + properties: + participantIDs: + type: array + items: + type: string + keyFilter: + type: string + required: + - participantIDs + responses: + '200': + description: Export started + content: + application/json: + schema: + type: object + properties: + responses: + type: array + items: + type: object + additionalProperties: true + description: Confidential survey response export entry + required: + - responses + '400': + "$ref": "#/components/responses/Error400" + '401': + "$ref": "#/components/responses/Error401" + '500': + "$ref": "#/components/responses/Error500" + get: + tags: + - responses + operationId: dataExporter_listConfidentialResponseExports + summary: List confidential response exports + security: + - BearerAuth: [] + parameters: + - name: studyKey + in: path + required: true + schema: + type: string + responses: + '200': + description: Exports + content: + application/json: + schema: + type: object + properties: + availableFiles: + type: array + items: + type: string + required: + - availableFiles + additionalProperties: false + '400': + "$ref": "#/components/responses/Error400" + '401': + "$ref": "#/components/responses/Error401" + '500': + "$ref": "#/components/responses/Error500" + "/v1/studies/{studyKey}/data-exporter/confidential-responses/{exportID}": + get: + tags: + - responses + operationId: dataExporter_getConfidentialResponseExport + summary: Get confidential response export by ID + security: + - BearerAuth: [] + parameters: + - name: studyKey + in: path + required: true + schema: + type: string + - name: exportID + in: path + required: true + schema: + type: string + responses: + '200': + description: File download (JSON or CSV) + headers: + Content-Disposition: + description: Indicates the filename the client should save. + schema: + type: string + content: + application/json: + schema: + type: string + format: binary + text/csv: + schema: + type: string + format: binary + '400': + "$ref": "#/components/responses/Error400" + '401': + "$ref": "#/components/responses/Error401" + '404': + "$ref": "#/components/responses/Error404" + '500': + "$ref": "#/components/responses/Error500" + "/v1/studies/{studyKey}/data-explorer/responses/": + get: + tags: + - responses + operationId: dataExplorer_listResponses + summary: List survey responses + security: + - BearerAuth: [] + parameters: + - name: studyKey + in: path + required: true + schema: + type: string + - name: surveyKey + in: query + required: true + schema: + type: string + - name: shortKeys + in: query + description: whether to return short keys for responses + required: false + schema: + type: boolean + default: false + - name: questionOptionSep + in: query + description: character used to seperate question options in response + required: false + schema: + type: string + default: "-" + - name: format + in: query + description: format for survey responses + required: false + schema: + type: string + default: wide + enum: + - wide + - long + - json + - name: page + in: query + description: page number (starting from 1) + schema: + type: integer + minimum: 1 + default: 1 + - name: limit + in: query + description: maximum number of responses per page + schema: + type: integer + minimum: 1 + default: 10 + - name: filter + in: query + description: bson.M object to filter responses + schema: + type: object + additionalProperties: + type: object + - name: sort + in: query + description: bson.M object to sort responses + schema: + type: object + additionalProperties: + type: object + - name: extraContextColumns + in: query + description: comma-separated list of extra context columns to include in the + response + schema: + type: string + responses: + '200': + description: List responses + content: + application/json: + schema: + type: object + properties: + responses: + type: array + items: + type: object + description: Responses + additionalProperties: + type: object + pagination: + "$ref": "#/components/schemas/PaginationInfos" + required: + - responses + - pagination + additionalProperties: false + '400': + "$ref": "#/components/responses/Error400" + '401': + "$ref": "#/components/responses/Error401" + '500': + "$ref": "#/components/responses/Error500" + delete: + tags: + - responses + operationId: dataExplorer_deleteResponses + summary: Delete survey responses + security: + - BearerAuth: [] + parameters: + - name: studyKey + in: path + required: true + schema: + type: string + - name: surveyKey + in: query + schema: + type: string + - name: controlField + in: query + description: field used to control deletion (should be equal to studyKey) + schema: + type: string + - name: filter + in: query + description: bson.M object to filter responses to delete + schema: + type: object + additionalProperties: + type: object + responses: + '200': + description: Deleted summary + content: + application/json: + schema: + "$ref": "#/components/schemas/Message" + '400': + "$ref": "#/components/responses/Error400" + '401': + "$ref": "#/components/responses/Error401" + '500': + "$ref": "#/components/responses/Error500" + "/v1/studies/{studyKey}/data-explorer/responses/{responseId}": + get: + tags: + - responses + operationId: dataExplorer_getResponse + summary: Get survey response by ID + security: + - BearerAuth: [] + parameters: + - name: studyKey + in: path + required: true + schema: + type: string + - name: responseId + in: path + required: true + schema: + type: string + - name: shortKeys + in: query + description: whether to return short keys for response + required: false + schema: + type: boolean + default: false + - name: questionOptionSep + in: query + description: character used to seperate question options in response + required: false + schema: + type: string + default: "-" + responses: + '200': + description: Response + content: + application/json: + schema: + type: object + properties: + response: + type: object + description: Response + additionalProperties: + type: object + required: + - response + additionalProperties: false + '400': + "$ref": "#/components/responses/Error400" + '401': + "$ref": "#/components/responses/Error401" + '500': + "$ref": "#/components/responses/Error500" + delete: + tags: + - responses + operationId: dataExplorer_deleteResponse + summary: Delete survey response + security: + - BearerAuth: [] + parameters: + - name: studyKey + in: path + required: true + schema: + type: string + - name: responseId + in: path + required: true + schema: + type: string + responses: + '200': + description: Deleted + content: + application/json: + schema: + "$ref": "#/components/schemas/Message" + '400': + "$ref": "#/components/responses/Error400" + '401': + "$ref": "#/components/responses/Error401" + '500': + "$ref": "#/components/responses/Error500" + "/v1/studies/{studyKey}/data-explorer/participants/": + get: + tags: + - participants + operationId: dataExplorer_listParticipants + summary: List participants + security: + - BearerAuth: [] + parameters: + - name: studyKey + in: path + required: true + schema: + type: string + - name: page + in: query + description: page number (starting from 1) + schema: + type: integer + minimum: 1 + default: 1 + - name: limit + in: query + description: maximum number of participants per page + schema: + type: integer + minimum: 1 + default: 10 + - name: filter + in: query + description: bson.M object to filter participants + schema: + type: object + additionalProperties: + type: object + - name: sort + in: query + description: bson.M object to sort participants + schema: + type: object + additionalProperties: + type: object + responses: + '200': + description: Participants + content: + application/json: + schema: + type: object + properties: + participants: + type: array + items: + "$ref": "#/components/schemas/Participant" + pagination: + "$ref": "#/components/schemas/PaginationInfos" + required: + - participants + - pagination + additionalProperties: false + '400': + "$ref": "#/components/responses/Error400" + '401': + "$ref": "#/components/responses/Error401" + '500': + "$ref": "#/components/responses/Error500" + "/v1/studies/{studyKey}/data-explorer/participants/{participantID}": + get: + tags: + - participants + operationId: dataExplorer_getParticipant + summary: Get participant + security: + - BearerAuth: [] + parameters: + - name: studyKey + in: path + required: true + schema: + type: string + - name: participantID + in: path + required: true + schema: + type: string + responses: + '200': + description: Participant + content: + application/json: + schema: + type: object + properties: + participant: + "$ref": "#/components/schemas/Participant" + required: + - participant + additionalProperties: false + '400': + "$ref": "#/components/responses/Error400" + '401': + "$ref": "#/components/responses/Error401" + '500': + "$ref": "#/components/responses/Error500" + "/v1/studies/{studyKey}/data-explorer/reports/keys": + get: + tags: + - reports + operationId: dataExplorer_listReportKeys + summary: List available report keys + security: + - BearerAuth: [] + parameters: + - name: studyKey + in: path + required: true + schema: + type: string + - name: pid + in: query + description: filter by participant ID + schema: + type: string + - name: from + in: query + description: filter by timestamp (greater than or equal to this value) + schema: + type: integer + - name: until + in: query + description: filter by timestamp (less than or equal to this value) + schema: + type: integer + responses: + '200': + description: Report keys + content: + application/json: + schema: + type: object + properties: + reportKeys: + type: array + items: + type: string + required: + - reportKeys + additionalProperties: false + '400': + "$ref": "#/components/responses/Error400" + '401': + "$ref": "#/components/responses/Error401" + '500': + "$ref": "#/components/responses/Error500" + "/v1/studies/{studyKey}/data-explorer/reports/": + get: + tags: + - reports + operationId: dataExplorer_listReports + summary: List reports + security: + - BearerAuth: [] + parameters: + - name: studyKey + in: path + required: true + schema: + type: string + - name: reportKey + in: query + description: filter by report key + schema: + type: string + - name: pid + in: query + description: filter by participant ID + schema: + type: string + - name: from + in: query + description: filter by timestamp (greater than or equal to this value) + schema: + type: integer + - name: until + in: query + description: filter by timestamp (less than or equal to this value) + schema: + type: integer + - name: page + in: query + description: page number (starting from 1) + schema: + type: integer + minimum: 1 + default: 1 + - name: limit + in: query + description: maximum number of reports per page + schema: + type: integer + minimum: 1 + default: 10 + - name: filter + in: query + description: bson.M object to filter files + schema: + type: object + additionalProperties: + type: object + responses: + '200': + description: Reports + content: + application/json: + schema: + type: object + properties: + reports: + type: array + items: + "$ref": "#/components/schemas/Report" + pagination: + "$ref": "#/components/schemas/PaginationInfos" + required: + - reports + - pagination + additionalProperties: false + '400': + "$ref": "#/components/responses/Error400" + '401': + "$ref": "#/components/responses/Error401" + '500': + "$ref": "#/components/responses/Error500" + "/v1/studies/{studyKey}/data-explorer/reports/{reportID}": + get: + tags: + - reports + operationId: dataExplorer_getReport + summary: Get report by ID + security: + - BearerAuth: [] + parameters: + - name: studyKey + in: path + required: true + schema: + type: string + - name: reportID + in: path + required: true + schema: + type: string + responses: + '200': + description: Report + content: + application/json: + schema: + type: object + properties: + report: + "$ref": "#/components/schemas/Report" + required: + - report + '400': + "$ref": "#/components/responses/Error400" + '401': + "$ref": "#/components/responses/Error401" + '500': + "$ref": "#/components/responses/Error500" + "/v1/studies/{studyKey}/data-explorer/files/": + get: + tags: + - files + operationId: dataExplorer_listFiles + summary: List files + security: + - BearerAuth: [] + parameters: + - name: studyKey + in: path + required: true + schema: + type: string + - name: page + in: query + description: page number (starting from 1) + schema: + type: integer + minimum: 1 + default: 1 + - name: limit + in: query + description: maximum number of files per page + schema: + type: integer + minimum: 1 + default: 10 + - name: filter + in: query + description: bson.M object to filter files + schema: + type: object + additionalProperties: + type: object + responses: + '200': + description: Files + content: + application/json: + schema: + type: object + properties: + files: + type: array + items: + "$ref": "#/components/schemas/FileInfo" + pagination: + "$ref": "#/components/schemas/PaginationInfos" + required: + - files + - pagination + additionalProperties: false + '400': + "$ref": "#/components/responses/Error400" + '401': + "$ref": "#/components/responses/Error401" + '500': + "$ref": "#/components/responses/Error500" + "/v1/studies/{studyKey}/data-explorer/files/{fileID}": + get: + tags: + - files + operationId: dataExplorer_getFile + summary: Get file by ID + security: + - BearerAuth: [] + parameters: + - name: studyKey + in: path + required: true + schema: + type: string + - name: fileID + in: path + required: true + schema: + type: string + responses: + '200': + description: File + content: + application/octet-stream: + schema: + type: string + format: binary + headers: + Content-Disposition: + description: The filename suggested for the download. + schema: + type: string + '400': + "$ref": "#/components/responses/Error400" + '401': + "$ref": "#/components/responses/Error401" + '404': + "$ref": "#/components/responses/Error404" + '500': + "$ref": "#/components/responses/Error500" + delete: + tags: + - files + operationId: dataExplorer_deleteFile + summary: Delete file + security: + - BearerAuth: [] + parameters: + - name: studyKey + in: path + required: true + schema: + type: string + - name: fileID + in: path + required: true + schema: + type: string + responses: + '200': + description: Deleted + content: + application/json: + schema: + "$ref": "#/components/schemas/Message" + '400': + "$ref": "#/components/responses/Error400" + '401': + "$ref": "#/components/responses/Error401" + '500': + "$ref": "#/components/responses/Error500" + "/v1/user-management/management-users": + get: + tags: + - user-management + summary: List management users + security: + - BearerAuth: [] + operationId: userManagement_listManagementUsers + responses: + '200': + description: List management users + content: + application/json: + schema: + type: object + properties: + users: + type: array + items: + "$ref": "#/components/schemas/ManagementUser" + required: + - users + '400': + "$ref": "#/components/responses/Error400" + '401': + "$ref": "#/components/responses/Error401" + '500': + "$ref": "#/components/responses/Error500" + "/v1/user-management/management-users/{userID}": + get: + tags: + - user-management + summary: Get management user + security: + - BearerAuth: [] + operationId: userManagement_getManagementUser + parameters: + - name: userID + in: path + required: true + schema: + type: string + responses: + '200': + description: Management user + content: + application/json: + schema: + type: object + properties: + user: + "$ref": "#/components/schemas/ManagementUser" + required: + - user + '400': + "$ref": "#/components/responses/Error400" + '401': + "$ref": "#/components/responses/Error401" + '500': + "$ref": "#/components/responses/Error500" + delete: + tags: + - user-management + summary: Delete management user + security: + - BearerAuth: [] + operationId: userManagement_deleteManagementUser + parameters: + - name: userID + in: path + required: true + schema: + type: string + responses: + '200': + description: Deleted management user + content: + application/json: + schema: + "$ref": "#/components/schemas/Message" + '400': + "$ref": "#/components/responses/Error400" + '401': + "$ref": "#/components/responses/Error401" + '500': + "$ref": "#/components/responses/Error500" + "/v1/user-management/management-users/{userID}/permissions": + get: + tags: + - user-management + summary: List user permissions + security: + - BearerAuth: [] + operationId: userManagement_listUserPermissions + parameters: + - name: userID + in: path + required: true + schema: + type: string + responses: + '200': + description: Permissions + content: + application/json: + schema: + type: object + properties: + permissions: + type: array + items: + "$ref": "#/components/schemas/Permission" + required: + - permissions + '400': + "$ref": "#/components/responses/Error400" + '401': + "$ref": "#/components/responses/Error401" + '500': + "$ref": "#/components/responses/Error500" + post: + tags: + - user-management + summary: Add permission to user + security: + - BearerAuth: [] + operationId: userManagement_addPermissionToUser + parameters: + - name: userID + in: path + required: true + schema: + type: string + requestBody: + required: true + content: + application/json: + schema: + "$ref": "#/components/schemas/Permission" + responses: + '200': + description: Added permission + content: + application/json: + schema: + type: object + properties: + permission: + "$ref": "#/components/schemas/Permission" + required: + - permission + '400': + "$ref": "#/components/responses/Error400" + '401': + "$ref": "#/components/responses/Error401" + '500': + "$ref": "#/components/responses/Error500" + "/v1/user-management/management-users/{userID}/permissions/{permissionID}": + delete: + tags: + - user-management + summary: Delete user permission + security: + - BearerAuth: [] + operationId: userManagement_deleteUserPermission + parameters: + - name: userID + in: path + required: true + schema: + type: string + - name: permissionID + in: path + required: true + schema: + type: string + responses: + '200': + description: Deleted + content: + application/json: + schema: + "$ref": "#/components/schemas/Message" + '400': + "$ref": "#/components/responses/Error400" + '401': + "$ref": "#/components/responses/Error401" + '500': + "$ref": "#/components/responses/Error500" + "/v1/user-management/management-users/{userID}/permissions/{permissionID}/limiter": + put: + tags: + - user-management + summary: Update permission limiter + security: + - BearerAuth: [] + operationId: userManagement_updatePermissionLimiter + parameters: + - name: userID + in: path + required: true + schema: + type: string + - name: permissionID + in: path + required: true + schema: + type: string + requestBody: + required: true + content: + application/json: + schema: + "$ref": "#/components/schemas/Permission" + responses: + '200': + description: Updated limiter + content: + application/json: + schema: + "$ref": "#/components/schemas/Message" + '400': + "$ref": "#/components/responses/Error400" + '401': + "$ref": "#/components/responses/Error401" + '500': + "$ref": "#/components/responses/Error500" + "/v1/user-management/management-users/{userID}/app-roles": + get: + tags: + - app-roles + summary: List app roles for user + security: + - BearerAuth: [] + operationId: userManagement_listUserAppRoles + parameters: + - name: userID + in: path + required: true + schema: + type: string + responses: + '200': + description: App roles + content: + application/json: + schema: + type: object + properties: + appRoles: + type: array + items: + "$ref": "#/components/schemas/AppRole" + required: + - appRoles + additionalProperties: false + '400': + "$ref": "#/components/responses/Error400" + '401': + "$ref": "#/components/responses/Error401" + '500': + "$ref": "#/components/responses/Error500" + "/v1/user-management/management-users/{userID}/app-roles/{appRoleTemplateID}": + post: + tags: + - app-roles + summary: Add app role to user + security: + - BearerAuth: [] + operationId: userManagement_addAppRoleToUser + parameters: + - name: userID + in: path + required: true + schema: + type: string + - name: appRoleTemplateID + in: path + required: true + schema: + type: string + responses: + '200': + description: Added app role + content: + application/json: + schema: + "$ref": "#/components/schemas/Message" + '400': + "$ref": "#/components/responses/Error400" + '401': + "$ref": "#/components/responses/Error401" + '500': + "$ref": "#/components/responses/Error500" + "/v1/user-management/management-users/{userID}/app-roles/{appRoleID}": + delete: + tags: + - app-roles + summary: Remove app role from user + security: + - BearerAuth: [] + operationId: userManagement_removeUserAppRole + parameters: + - name: userID + in: path + required: true + schema: + type: string + - name: appRoleID + in: path + required: true + schema: + type: string + responses: + '200': + description: Removed role + content: + application/json: + schema: + "$ref": "#/components/schemas/Message" + '400': + "$ref": "#/components/responses/Error400" + '401': + "$ref": "#/components/responses/Error401" + '500': + "$ref": "#/components/responses/Error500" + "/v1/user-management/app-roles/templates/": + get: + tags: + - app-roles + summary: List app role templates + security: + - BearerAuth: [] + operationId: userManagement_listAppRoleTemplates + responses: + '200': + description: Templates + content: + application/json: + schema: + type: object + properties: + appRoleTemplates: + type: array + items: + "$ref": "#/components/schemas/AppRoleTemplate" + required: + - appRoleTemplates + additionalProperties: false + '400': + "$ref": "#/components/responses/Error400" + '401': + "$ref": "#/components/responses/Error401" + '500': + "$ref": "#/components/responses/Error500" + post: + tags: + - app-roles + summary: Create app role template + security: + - BearerAuth: [] + operationId: userManagement_createAppRoleTemplate + requestBody: + required: true + content: + application/json: + schema: + type: object + properties: + appName: + type: string + role: + type: string + requiredPermissions: + type: array + items: + "$ref": "#/components/schemas/Permission" + required: + - appName + - role + responses: + '200': + description: Created template + content: + application/json: + schema: + "$ref": "#/components/schemas/Message" + '400': + "$ref": "#/components/responses/Error400" + '401': + "$ref": "#/components/responses/Error401" + '500': + "$ref": "#/components/responses/Error500" + "/v1/user-management/app-roles/templates/{appRoleTemplateID}": + get: + tags: + - app-roles + summary: Get app role template + security: + - BearerAuth: [] + operationId: userManagement_getAppRoleTemplate + parameters: + - name: appRoleTemplateID + in: path + required: true + schema: + type: string + responses: + '200': + description: Template + content: + application/json: + schema: + type: object + properties: + appRoleTemplate: + "$ref": "#/components/schemas/AppRoleTemplate" + required: + - appRoleTemplate + '400': + "$ref": "#/components/responses/Error400" + '401': + "$ref": "#/components/responses/Error401" + '500': + "$ref": "#/components/responses/Error500" + put: + tags: + - app-roles + summary: Update app role template + security: + - BearerAuth: [] + operationId: userManagement_updateAppRoleTemplate + parameters: + - name: appRoleTemplateID + in: path + required: true + schema: + type: string + requestBody: + required: true + content: + application/json: + schema: + type: object + properties: + appName: + type: string + role: + type: string + requiredPermissions: + type: array + items: + "$ref": "#/components/schemas/Permission" + required: + - appName + - role + responses: + '200': + description: Updated template + content: + application/json: + schema: + "$ref": "#/components/schemas/Message" + '400': + "$ref": "#/components/responses/Error400" + '401': + "$ref": "#/components/responses/Error401" + '500': + "$ref": "#/components/responses/Error500" + "/v1/user-management/app-roles/templates/delete/{appRoleTemplateID}": + delete: + tags: + - app-roles + summary: Delete app role template + security: + - BearerAuth: [] + operationId: userManagement_deleteAppRoleTemplate + parameters: + - name: appRoleTemplateID + in: path + required: true + schema: + type: string + responses: + '200': + description: Deleted + content: + application/json: + schema: + "$ref": "#/components/schemas/Message" + '400': + "$ref": "#/components/responses/Error400" + '401': + "$ref": "#/components/responses/Error401" + '500': + "$ref": "#/components/responses/Error500" + "/v1/user-management/app-roles/templates/delete-for-app/{appName}": + delete: + tags: + - app-roles + summary: Delete app role templates for app + security: + - BearerAuth: [] + operationId: userManagement_deleteAppRoleTemplatesForApp + parameters: + - name: appName + in: path + required: true + schema: + type: string + responses: + '200': + description: Deleted templates + content: + application/json: + schema: + "$ref": "#/components/schemas/Message" + '400': + "$ref": "#/components/responses/Error400" + '401': + "$ref": "#/components/responses/Error401" + '500': + "$ref": "#/components/responses/Error500" + "/v1/user-management/app-roles/": + get: + tags: + - app-roles + summary: List app roles + security: + - BearerAuth: [] + operationId: userManagement_listAppRoles + responses: + '200': + description: App roles + content: + application/json: + schema: + type: object + properties: + appRoles: + type: array + items: + "$ref": "#/components/schemas/AppRole" + required: + - appRoles + additionalProperties: false + '400': + "$ref": "#/components/responses/Error400" + '401': + "$ref": "#/components/responses/Error401" + '500': + "$ref": "#/components/responses/Error500" + "/v1/user-management/app-roles/delete/{appName}": + delete: + tags: + - app-roles + summary: Delete app roles for app + security: + - BearerAuth: [] + operationId: userManagement_deleteAppRolesForApp + parameters: + - name: appName + in: path + required: true + schema: + type: string + responses: + '200': + description: Deleted app roles + content: + application/json: + schema: + "$ref": "#/components/schemas/Message" + '400': + "$ref": "#/components/responses/Error400" + '401': + "$ref": "#/components/responses/Error401" + '500': + "$ref": "#/components/responses/Error500" + "/v1/user-management/participant-users/request-deletion": + post: + tags: + - user-management + summary: Request participant user deletion + security: + - BearerAuth: [] + operationId: userManagement_requestParticipantUserDeletion + requestBody: + required: true + content: + application/json: + schema: + type: object + properties: + email: + type: string + format: email + required: + - email + responses: + '200': + description: Deletion requested + content: + application/json: + schema: + "$ref": "#/components/schemas/Message" + '400': + "$ref": "#/components/responses/Error400" + '401': + "$ref": "#/components/responses/Error401" + '500': + "$ref": "#/components/responses/Error500" + "/v1/user-management/service-accounts/": + get: + tags: + - service-accounts + summary: List service accounts + security: + - BearerAuth: [] + operationId: userManagement_listServiceAccounts + responses: + '200': + description: Service accounts + content: + application/json: + schema: + type: object + properties: + serviceAccounts: + type: array + items: + "$ref": "#/components/schemas/ServiceUser" + required: + - serviceAccounts + additionalProperties: false + '400': + "$ref": "#/components/responses/Error400" + '401': + "$ref": "#/components/responses/Error401" + '500': + "$ref": "#/components/responses/Error500" + post: + tags: + - service-accounts + summary: Create service account + security: + - BearerAuth: [] + operationId: userManagement_createServiceAccount + requestBody: + required: true + content: + application/json: + schema: + type: object + properties: + label: + type: string + description: + type: string + additionalProperties: false + required: + - label + - description + responses: + '200': + description: Created service account + content: + application/json: + schema: + type: object + properties: + serviceAccount: + "$ref": "#/components/schemas/ServiceUser" + required: + - serviceAccount + '400': + "$ref": "#/components/responses/Error400" + '401': + "$ref": "#/components/responses/Error401" + '500': + "$ref": "#/components/responses/Error500" + "/v1/user-management/service-accounts/{serviceAccountID}": + get: + tags: + - service-accounts + summary: Get service account + security: + - BearerAuth: [] + operationId: userManagement_getServiceAccount + parameters: + - name: serviceAccountID + in: path + required: true + schema: + type: string + responses: + '200': + description: Service account + content: + application/json: + schema: + type: object + properties: + serviceAccount: + "$ref": "#/components/schemas/ServiceUser" + required: + - serviceAccount + '400': + "$ref": "#/components/responses/Error400" + '401': + "$ref": "#/components/responses/Error401" + '500': + "$ref": "#/components/responses/Error500" + put: + tags: + - service-accounts + summary: Update service account + security: + - BearerAuth: [] + operationId: userManagement_updateServiceAccount + parameters: + - name: serviceAccountID + in: path + required: true + schema: + type: string + requestBody: + required: true + content: + application/json: + schema: + type: object + properties: + label: + type: string + description: + type: string + additionalProperties: false + required: + - label + - description + responses: + '200': + description: Updated service account + content: + application/json: + schema: + type: object + properties: + serviceAccount: + "$ref": "#/components/schemas/ServiceUser" + required: + - serviceAccount + '400': + "$ref": "#/components/responses/Error400" + '401': + "$ref": "#/components/responses/Error401" + '500': + "$ref": "#/components/responses/Error500" + delete: + tags: + - service-accounts + summary: Delete service account + operationId: userManagement_deleteServiceAccount + security: + - BearerAuth: [] + parameters: + - name: serviceAccountID + in: path + required: true + schema: + type: string + responses: + '200': + description: Deleted service account + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + required: + - success + additionalProperties: false + '400': + "$ref": "#/components/responses/Error400" + '401': + "$ref": "#/components/responses/Error401" + '500': + "$ref": "#/components/responses/Error500" + "/v1/user-management/service-accounts/{serviceAccountID}/api-keys": + get: + tags: + - service-accounts + summary: List service account API keys + security: + - BearerAuth: [] + operationId: userManagement_listServiceAccountAPIKeys + parameters: + - name: serviceAccountID + in: path + required: true + schema: + type: string + responses: + '200': + description: API keys + content: + application/json: + schema: + type: object + properties: + apiKeys: + type: array + items: + "$ref": "#/components/schemas/ServiceUserAPIKey" + required: + - apiKeys + additionalProperties: false + '400': + "$ref": "#/components/responses/Error400" + '401': + "$ref": "#/components/responses/Error401" + '500': + "$ref": "#/components/responses/Error500" + post: + tags: + - service-accounts + summary: Create service account API key + security: + - BearerAuth: [] + operationId: userManagement_createServiceAccountAPIKey + parameters: + - name: serviceAccountID + in: path + required: true + schema: + type: string + requestBody: + required: true + content: + application/json: + schema: + type: object + properties: + expiresAt: + type: integer + additionalProperties: false + responses: + '200': + description: Created API key + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + required: + - success + '400': + "$ref": "#/components/responses/Error400" + '401': + "$ref": "#/components/responses/Error401" + '500': + "$ref": "#/components/responses/Error500" + "/v1/user-management/service-accounts/{serviceAccountID}/api-keys/{apiKeyID}": + delete: + tags: + - service-accounts + summary: Delete service account API key + security: + - BearerAuth: [] + operationId: userManagement_deleteServiceAccountAPIKey + parameters: + - name: serviceAccountID + in: path + required: true + schema: + type: string + - name: apiKeyID + in: path + required: true + schema: + type: string + responses: + '200': + description: Deleted API key + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + required: + - success + '400': + "$ref": "#/components/responses/Error400" + '401': + "$ref": "#/components/responses/Error401" + '500': + "$ref": "#/components/responses/Error500" + "/v1/user-management/service-accounts/{serviceAccountID}/permissions": + get: + tags: + - service-accounts + summary: List service account permissions + security: + - BearerAuth: [] + operationId: userManagement_listServiceAccountPermissions + parameters: + - name: serviceAccountID + in: path + required: true + schema: + type: string + responses: + '200': + description: Permissions + content: + application/json: + schema: + type: object + properties: + permissions: + type: array + items: + "$ref": "#/components/schemas/Permission" + required: + - permissions + additionalProperties: false + '400': + "$ref": "#/components/responses/Error400" + '401': + "$ref": "#/components/responses/Error401" + '500': + "$ref": "#/components/responses/Error500" + post: + tags: + - service-accounts + summary: Add permission to service account + security: + - BearerAuth: [] + operationId: userManagement_addPermissionToServiceAccount + parameters: + - name: serviceAccountID + in: path + required: true + schema: + type: string + requestBody: + required: true + content: + application/json: + schema: + "$ref": "#/components/schemas/Permission" + responses: + '200': + description: Added permission + content: + application/json: + schema: + type: object + properties: + permission: + "$ref": "#/components/schemas/Permission" + required: + - permission + '400': + "$ref": "#/components/responses/Error400" + '401': + "$ref": "#/components/responses/Error401" + '500': + "$ref": "#/components/responses/Error500" + "/v1/user-management/service-accounts/{serviceAccountID}/permissions/{permissionID}": + delete: + tags: + - service-accounts + summary: Delete service account permission + security: + - BearerAuth: [] + operationId: userManagement_deleteServiceAccountPermission + parameters: + - name: serviceAccountID + in: path + required: true + schema: + type: string + - name: permissionID + in: path + required: true + schema: + type: string + responses: + '200': + description: Deleted + content: + application/json: + schema: + "$ref": "#/components/schemas/Message" + '400': + "$ref": "#/components/responses/Error400" + '401': + "$ref": "#/components/responses/Error401" + '500': + "$ref": "#/components/responses/Error500" + "/v1/user-management/service-accounts/{serviceAccountID}/permissions/{permissionID}/limiter": + put: + tags: + - service-accounts + summary: Update service account permission limiter + operationId: userManagement_updateServiceAccountPermissionLimiter + security: + - BearerAuth: [] + parameters: + - name: serviceAccountID + in: path + required: true + schema: + type: string + - name: permissionID + in: path + required: true + schema: + type: string + requestBody: + required: true + content: + application/json: + schema: + "$ref": "#/components/schemas/Permission" + responses: + '200': + description: Updated permission limiter + content: + application/json: + schema: + "$ref": "#/components/schemas/Message" + '400': + "$ref": "#/components/responses/Error400" + '401': + "$ref": "#/components/responses/Error401" + '500': + "$ref": "#/components/responses/Error500" + /v1/studies/{studyKey}/track-account: + put: + operationId: updateStudyTrackAccount + tags: + - accounts + summary: Update study track-account flag + description: > + Updates whether account tracking is enabled for the given study. + security: + - BearerAuth: [] + parameters: + - name: studyKey + in: path + required: true + description: Unique key of the study + schema: + type: string + requestBody: + required: true + content: + application/json: + schema: + type: object + properties: + trackAccount: + type: boolean + examples: + enable: + summary: Enable tracking + value: + trackAccount: true + disable: + summary: Disable tracking + value: + trackAccount: false + responses: + "200": + description: Successfully updated + content: + application/json: + schema: + "$ref": "#/components/schemas/Message" + example: + message: study track account updated + '400': + "$ref": "#/components/responses/Error400" + '401': + "$ref": "#/components/responses/Error401" + '500': + "$ref": "#/components/responses/Error500" \ No newline at end of file diff --git a/openapi/participant-api.yaml b/openapi/participant-api.yaml new file mode 100644 index 0000000..885734c --- /dev/null +++ b/openapi/participant-api.yaml @@ -0,0 +1,2779 @@ +--- +openapi: 3.1.0 +info: + title: Participant API + version: 1.0.0 + description: Endpoints for participant authentication, user management, and study + interactions. +paths: + "/": + get: + summary: Health check + operationId: getHealth + tags: + - misc + responses: + '200': + description: Service is healthy + content: + application/json: + schema: + "$ref": "#/components/schemas/HealthStatus" + examples: + ok: + value: + status: ok + "/v1/auth/login": + post: + tags: + - auth + summary: Login with email and password + operationId: loginWithEmail + requestBody: + required: true + content: + application/json: + schema: + type: object + properties: + email: + type: string + format: email + password: + type: string + instanceId: + type: string + required: + - email + - password + - instanceId + additionalProperties: false + responses: + '200': + description: Access and refresh tokens with user + content: + application/json: + schema: + type: object + properties: + token: + "$ref": "#/components/schemas/TokenEnvelope" + user: + "$ref": "#/components/schemas/User" + required: + - token + - user + '400': + "$ref": "#/components/responses/Error400" + '401': + "$ref": "#/components/responses/Error401" + '500': + "$ref": "#/components/responses/Error500" + "/v1/auth/signup": + post: + tags: + - auth + summary: Sign up with email + operationId: signupWithEmail + requestBody: + required: true + content: + application/json: + schema: + type: object + properties: + email: + type: string + format: email + password: + type: string + instanceId: + type: string + infoCheck: + type: string + preferredLanguage: + type: string + withAttributes: + type: object + properties: + type: + type: string + attributes: + type: object + additionalProperties: true + required: + - email + - password + - instanceId + additionalProperties: false + responses: + '200': + description: Access and refresh tokens with user + content: + application/json: + schema: + type: object + properties: + token: + "$ref": "#/components/schemas/TokenEnvelope" + user: + "$ref": "#/components/schemas/User" + required: + - token + - user + '400': + "$ref": "#/components/responses/Error400" + '401': + "$ref": "#/components/responses/Error401" + '429': + "$ref": "#/components/responses/Error429" + '500': + "$ref": "#/components/responses/Error500" + "/v1/auth/login-with-temptoken": + post: + tags: + - auth + summary: Login using a temporary token (optionally with password or access token) + operationId: loginWithTempToken + requestBody: + required: true + content: + application/json: + schema: + type: object + properties: + tempToken: + type: string + accessToken: + type: string + password: + type: string + required: + - tempToken + additionalProperties: false + description: Provide either accessToken or password along with tempToken. + responses: + '200': + description: Access and refresh tokens with user + content: + application/json: + schema: + type: object + properties: + token: + "$ref": "#/components/schemas/TokenEnvelopeWithLastOTP" + user: + "$ref": "#/components/schemas/User" + required: + - token + - user + '400': + "$ref": "#/components/responses/Error400" + '401': + "$ref": "#/components/responses/Error401" + '500': + "$ref": "#/components/responses/Error500" + "/v1/auth/temptoken-info": + post: + tags: + - auth + summary: Get info for a temporary token + operationId: getTempTokenInfo + requestBody: + required: true + content: + application/json: + schema: + type: object + properties: + instanceId: + type: string + tempToken: + type: string + required: + - instanceId + - tempToken + additionalProperties: false + responses: + '200': + description: Info returned + content: + application/json: + schema: + type: object + properties: + userID: + type: string + email: + type: string + format: email + required: + - userID + - email + additionalProperties: false + '400': + "$ref": "#/components/responses/Error400" + '500': + "$ref": "#/components/responses/Error500" + "/v1/auth/token/renew": + post: + tags: + - auth + summary: Renew access token + security: + - BearerAuth: [] + operationId: renewToken + requestBody: + required: true + content: + application/json: + schema: + type: object + properties: + refreshToken: + type: string + required: + - refreshToken + additionalProperties: false + responses: + '200': + description: Access and refresh tokens with user + content: + application/json: + schema: + type: object + properties: + token: + "$ref": "#/components/schemas/TokenEnvelopeWithLastOTP" + user: + "$ref": "#/components/schemas/User" + required: + - token + - user + '400': + "$ref": "#/components/responses/Error400" + '401': + "$ref": "#/components/responses/Error401" + '500': + "$ref": "#/components/responses/Error500" + "/v1/auth/token/validate": + get: + tags: + - auth + summary: Validate access token + security: + - BearerAuth: [] + operationId: validateToken + responses: + '200': + description: Token valid + content: + application/json: + schema: + type: object + properties: + tokenInfos: + type: object + description: Decoded participant user JWT claims + additionalProperties: true + required: + - tokenInfos + '400': + "$ref": "#/components/responses/Error400" + '401': + "$ref": "#/components/responses/Error401" + "/v1/auth/token/revoke": + get: + tags: + - auth + summary: Revoke refresh tokens for user + security: + - BearerAuth: [] + operationId: revokeTokens + responses: + '200': + description: Revoked + content: + application/json: + schema: + "$ref": "#/components/schemas/Message" + '400': + "$ref": "#/components/responses/Error400" + '401': + "$ref": "#/components/responses/Error401" + '500': + "$ref": "#/components/responses/Error500" + "/v1/auth/resend-email-verification": + post: + tags: + - auth + summary: Resend email verification + security: + - BearerAuth: [] + operationId: resendEmailVerification + requestBody: + required: true + content: + application/json: + schema: + type: object + properties: + email: + type: string + format: email + required: + - email + responses: + '200': + "$ref": "#/components/responses/MessageOk" + '400': + "$ref": "#/components/responses/Error400" + '401': + "$ref": "#/components/responses/Error401" + '429': + "$ref": "#/components/responses/Error429" + '500': + "$ref": "#/components/responses/Error500" + "/v1/auth/verify-email": + post: + tags: + - auth + summary: Verify email by token + operationId: verifyEmail + requestBody: + required: true + content: + application/json: + schema: + type: object + properties: + token: + type: string + required: + - token + responses: + '200': + description: User returned + content: + application/json: + schema: + type: object + properties: + user: + "$ref": "#/components/schemas/User" + required: + - user + '400': + "$ref": "#/components/responses/Error400" + '500': + "$ref": "#/components/responses/Error500" + "/v1/auth/logout": + post: + tags: + - auth + summary: Logout user (invalidate current session) + security: + - BearerAuth: [] + operationId: logout + responses: + '200': + description: User logged out + content: + application/json: + schema: + type: object + properties: + message: + type: string + tokensRevoked: + type: integer + required: + - message + - tokensRevoked + additionalProperties: false + '400': + "$ref": "#/components/responses/Error400" + '401': + "$ref": "#/components/responses/Error401" + '500': + "$ref": "#/components/responses/Error500" + "/v1/auth/otp": + get: + tags: + - auth + summary: Request OTP (email by default) + security: + - BearerAuth: [] + operationId: requestOTP + parameters: + - name: type + in: query + schema: + type: string + enum: + - email + - sms + default: email + responses: + '200': + "$ref": "#/components/responses/MessageOk" + '400': + "$ref": "#/components/responses/Error400" + '401': + "$ref": "#/components/responses/Error401" + '500': + "$ref": "#/components/responses/Error500" + "/v1/auth/otp/verify": + post: + tags: + - auth + summary: Verify OTP code + security: + - BearerAuth: [] + operationId: verifyOTP + requestBody: + required: true + content: + application/json: + schema: + type: object + properties: + code: + type: string + required: + - code + additionalProperties: false + responses: + '200': + description: Access and refresh tokens with user + content: + application/json: + schema: + type: object + properties: + token: + "$ref": "#/components/schemas/TokenEnvelopeWithLastOTP" + user: + "$ref": "#/components/schemas/User" + required: + - token + - user + '400': + "$ref": "#/components/responses/Error400" + '401': + "$ref": "#/components/responses/Error401" + '500': + "$ref": "#/components/responses/Error500" + "/v1/password-reset/initiate": + post: + tags: + - password + summary: Initiate password reset + operationId: initiatePasswordReset + requestBody: + required: true + content: + application/json: + schema: + type: object + properties: + email: + type: string + format: email + instanceID: + type: string + required: + - email + - instanceID + additionalProperties: false + responses: + '200': + "$ref": "#/components/responses/MessageOk" + '400': + "$ref": "#/components/responses/Error400" + '401': + "$ref": "#/components/responses/Error401" + '429': + "$ref": "#/components/responses/Error429" + '500': + "$ref": "#/components/responses/Error500" + "/v1/password-reset/get-infos": + post: + tags: + - password + summary: Get info for a password reset token + operationId: getPasswordResetInfos + requestBody: + required: true + content: + application/json: + schema: + type: object + properties: + token: + type: string + required: + - token + responses: + '200': + description: Account ID returned + content: + application/json: + schema: + type: object + properties: + accountId: + type: string + required: + - accountId + '400': + "$ref": "#/components/responses/Error400" + '500': + "$ref": "#/components/responses/Error500" + "/v1/password-reset/reset": + post: + tags: + - password + summary: Reset password + operationId: resetPassword + requestBody: + required: true + content: + application/json: + schema: + type: object + properties: + token: + type: string + newPassword: + type: string + required: + - token + - newPassword + additionalProperties: false + responses: + '200': + "$ref": "#/components/responses/MessageOk" + '400': + "$ref": "#/components/responses/Error400" + '500': + "$ref": "#/components/responses/Error500" + "/v1/study-service/studies/": + get: + tags: + - studies + summary: List studies by status + operationId: getStudiesByStatus + parameters: + - name: instanceID + in: query + required: true + schema: + type: string + - name: status + in: query + required: false + schema: + type: string + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + studies: + type: array + items: + type: object + properties: + key: + type: string + status: + type: string + props: + type: object + additionalProperties: true + stats: + type: object + additionalProperties: true + required: + - key + - status + - props + - stats + required: + - studies + '401': + "$ref": "#/components/responses/Error401" + '500': + "$ref": "#/components/responses/Error500" + "/v1/study-service/studies/{studyKey}": + get: + tags: + - studies + summary: Get study by key + operationId: getStudy + parameters: + - name: studyKey + in: path + required: true + schema: + type: string + - name: instanceID + in: query + required: true + schema: + type: string + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + study: + type: object + properties: + key: + type: string + status: + type: string + props: + type: object + additionalProperties: true + stats: + type: object + additionalProperties: true + required: + - key + - status + - props + - stats + '400': + "$ref": "#/components/responses/Error400" + '401': + "$ref": "#/components/responses/Error401" + '500': + "$ref": "#/components/responses/Error500" + "/v1/study-service/studies/{studyKey}/code-lists/has-code": + get: + tags: + - studies + summary: Check if a code exists in a code list + operationId: studyHasCodeListCode + parameters: + - name: studyKey + in: path + required: true + schema: + type: string + - name: instanceID + in: query + required: true + schema: + type: string + - name: listKey + in: query + required: true + schema: + type: string + - name: code + in: query + required: true + schema: + type: string + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + exists: + type: boolean + required: + - exists + '400': + "$ref": "#/components/responses/Error400" + '401': + "$ref": "#/components/responses/Error401" + '500': + "$ref": "#/components/responses/Error500" + "/v1/study-service/studies/{studyKey}/code-lists/available-count": + get: + tags: + - studies + summary: Count available codes in a code list + operationId: getStudyCodeListAvailableCount + parameters: + - name: studyKey + in: path + required: true + schema: + type: string + - name: listKey + in: query + required: true + schema: + type: string + - name: instanceID + in: query + required: true + schema: + type: string + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + availableCount: + type: integer + required: + - availableCount + '400': + "$ref": "#/components/responses/Error400" + '401': + "$ref": "#/components/responses/Error401" + '500': + "$ref": "#/components/responses/Error500" + "/v1/study-service/studies/{studyKey}/variables": + get: + tags: + - studies + summary: List variables for a study + operationId: getStudyVariables + parameters: + - name: studyKey + in: path + required: true + schema: + type: string + - name: instanceID + in: query + required: true + schema: + type: string + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + variables: + type: array + items: + "$ref": "#/components/schemas/StudyVariables" + required: + - variables + '400': + "$ref": "#/components/responses/Error400" + '401': + "$ref": "#/components/responses/Error401" + '500': + "$ref": "#/components/responses/Error500" + "/v1/study-service/studies/{studyKey}/variables/{variableKey}": + get: + tags: + - studies + summary: Get a study variable + operationId: getStudyVariable + parameters: + - name: studyKey + in: path + required: true + schema: + type: string + - name: variableKey + in: path + required: true + schema: + type: string + - name: instanceID + in: query + required: true + schema: + type: string + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + variable: + "$ref": "#/components/schemas/StudyVariables" + required: + - variable + '400': + "$ref": "#/components/responses/Error400" + '401': + "$ref": "#/components/responses/Error401" + '500': + "$ref": "#/components/responses/Error500" + "/v1/study-service/studies/participating": + get: + tags: + - studies + summary: List studies the user participates in + security: + - BearerAuth: [] + operationId: getParticipatingStudies + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + studies: + type: array + items: + "$ref": "#/components/schemas/StudyInfo" + required: + - studies + '400': + "$ref": "#/components/responses/Error400" + '401': + "$ref": "#/components/responses/Error401" + '500': + "$ref": "#/components/responses/Error500" + "/v1/study-service/events/{studyKey}/enter": + post: + tags: + - events + summary: Enter a study + security: + - BearerAuth: [] + operationId: enterStudy + parameters: + - name: studyKey + in: path + required: true + schema: + type: string + requestBody: + required: true + content: + application/json: + schema: + type: object + properties: + profileID: + type: string + required: + - profileID + responses: + '200': + description: Assigned surveys returned + content: + application/json: + schema: + type: object + properties: + assignedSurveys: + type: array + items: + "$ref": "#/components/schemas/AssignedSurvey" + required: + - assignedSurveys + '400': + "$ref": "#/components/responses/Error400" + '401': + "$ref": "#/components/responses/Error401" + '500': + "$ref": "#/components/responses/Error500" + "/v1/study-service/events/{studyKey}/custom": + post: + tags: + - events + summary: Trigger a custom study event + security: + - BearerAuth: [] + operationId: customStudyEvent + parameters: + - name: studyKey + in: path + required: true + schema: + type: string + requestBody: + required: true + content: + application/json: + schema: + type: object + properties: + eventKey: + type: string + profileID: + type: string + payload: + type: object + additionalProperties: true + required: + - eventKey + - profileID + responses: + '200': + description: Assigned surveys returned + content: + application/json: + schema: + type: object + properties: + assignedSurveys: + type: array + items: + "$ref": "#/components/schemas/AssignedSurvey" + required: + - assignedSurveys + '400': + "$ref": "#/components/responses/Error400" + '401': + "$ref": "#/components/responses/Error401" + '500': + "$ref": "#/components/responses/Error500" + "/v1/study-service/events/{studyKey}/submit": + post: + tags: + - events + summary: Submit survey response + security: + - BearerAuth: [] + operationId: submitSurveyEvent + parameters: + - name: studyKey + in: path + required: true + schema: + type: string + requestBody: + required: true + content: + application/json: + schema: + type: object + properties: + profileID: + type: string + response: + type: object + description: SurveyResponse + additionalProperties: true + required: + - profileID + - response + responses: + '200': + description: Assigned surveys returned + content: + application/json: + schema: + type: object + properties: + assignedSurveys: + type: array + items: + "$ref": "#/components/schemas/AssignedSurvey" + required: + - assignedSurveys + '400': + "$ref": "#/components/responses/Error400" + '401': + "$ref": "#/components/responses/Error401" + '500': + "$ref": "#/components/responses/Error500" + "/v1/study-service/events/{studyKey}/leave": + post: + tags: + - events + summary: Leave a study + security: + - BearerAuth: [] + operationId: leaveStudyEvent + parameters: + - name: studyKey + in: path + required: true + schema: + type: string + requestBody: + required: true + content: + application/json: + schema: + type: object + properties: + profileID: + type: string + required: + - profileID + responses: + '200': + description: Assigned surveys returned + content: + application/json: + schema: + type: object + properties: + assignedSurveys: + type: array + items: + "$ref": "#/components/schemas/AssignedSurvey" + required: + - assignedSurveys + '400': + "$ref": "#/components/responses/Error400" + '401': + "$ref": "#/components/responses/Error401" + '500': + "$ref": "#/components/responses/Error500" + "/v1/study-service/events/{studyKey}/merge-temporary-participant": + post: + tags: + - events + summary: Merge temporary participant into user profile + security: + - BearerAuth: [] + operationId: mergeTempParticipant + parameters: + - name: studyKey + in: path + required: true + schema: + type: string + requestBody: + required: true + content: + application/json: + schema: + type: object + properties: + profileID: + type: string + temporaryParticipantID: + type: string + required: + - profileID + - temporaryParticipantID + responses: + '200': + description: Assigned surveys of participant returned + content: + application/json: + schema: + type: object + properties: + assignedSurveys: + type: array + items: + "$ref": "#/components/schemas/AssignedSurvey" + required: + - assignedSurveys + '400': + "$ref": "#/components/responses/Error400" + '401': + "$ref": "#/components/responses/Error401" + '500': + "$ref": "#/components/responses/Error500" + "/v1/study-service/events/{studyKey}/merge-virtual-participant": + post: + tags: + - events + summary: Merge a virtual participant into user profile by linking code + security: + - BearerAuth: [] + operationId: mergeVirtualParticipant + parameters: + - name: studyKey + in: path + required: true + schema: + type: string + requestBody: + required: true + content: + application/json: + schema: + type: object + properties: + profileID: + type: string + virtualParticipantID: + type: string + linkingCodeKey: + type: string + linkingCodeValue: + type: string + required: + - profileID + - virtualParticipantID + - linkingCodeKey + - linkingCodeValue + additionalProperties: false + responses: + '200': + description: Assigned surveys of merged participant returned + content: + application/json: + schema: + type: object + properties: + assignedSurveys: + type: array + items: + "$ref": "#/components/schemas/AssignedSurvey" + required: + - assignedSurveys + '400': + "$ref": "#/components/responses/Error400" + '401': + "$ref": "#/components/responses/Error401" + '500': + "$ref": "#/components/responses/Error500" + "/v1/study-service/participant-data/{studyKey}/surveys": + get: + tags: + - participant-data + summary: Get assigned surveys for profiles + security: + - BearerAuth: [] + operationId: getAssignedSurveys + parameters: + - name: studyKey + in: path + required: true + schema: + type: string + - name: pids + in: query + required: true + description: Comma-separated profile IDs + schema: + type: string + responses: + '200': + description: Assigned surveys with survey infos returned + content: + application/json: + schema: + "$ref": "#/components/schemas/AssignedSurveysWithInfos" + '400': + "$ref": "#/components/responses/Error400" + '401': + "$ref": "#/components/responses/Error401" + '500': + "$ref": "#/components/responses/Error500" + "/v1/study-service/participant-data/{studyKey}/survey/{surveyKey}": + get: + tags: + - participant-data + summary: Get a specific survey with context + security: + - BearerAuth: [] + operationId: getSurveyWithContext + parameters: + - name: studyKey + in: path + required: true + schema: + type: string + - name: surveyKey + in: path + required: true + schema: + type: string + - name: pid + in: query + required: true + description: Profile ID + schema: + type: string + responses: + '200': + description: Survey with context returned + content: + application/json: + schema: + type: object + properties: + surveyWithContext: + "$ref": "#/components/schemas/AssignedSurveyWithContext" + required: + - surveyWithContext + '400': + "$ref": "#/components/responses/Error400" + '401': + "$ref": "#/components/responses/Error401" + '500': + "$ref": "#/components/responses/Error500" + "/v1/study-service/participant-data/{studyKey}/participant-state": + get: + tags: + - participant-data + summary: Get participant state + security: + - BearerAuth: [] + operationId: getParticipantState + parameters: + - name: studyKey + in: path + required: true + schema: + type: string + - name: pid + in: query + required: true + description: Profile ID + schema: + type: string + responses: + '200': + description: Participant state returned + content: + application/json: + schema: + type: object + properties: + participant: + "$ref": "#/components/schemas/Participant" + required: + - participant + '400': + "$ref": "#/components/responses/Error400" + '401': + "$ref": "#/components/responses/Error401" + '500': + "$ref": "#/components/responses/Error500" + "/v1/study-service/participant-data/{studyKey}/linking-code": + get: + tags: + - participant-data + summary: Get a linking code by key + security: + - BearerAuth: [] + operationId: getLinkingCode + parameters: + - name: studyKey + in: path + required: true + schema: + type: string + - name: pid + in: query + required: true + description: Profile ID + schema: + type: string + - name: key + in: query + required: true + description: Key for linking code + schema: + type: string + responses: + '200': + description: Linking code returned + content: + application/json: + schema: + type: object + properties: + linkingCode: + type: string + required: + - linkingCode + '400': + "$ref": "#/components/responses/Error400" + '401': + "$ref": "#/components/responses/Error401" + '500': + "$ref": "#/components/responses/Error500" + "/v1/study-service/participant-data/{studyKey}/responses": + get: + tags: + - participant-data + summary: Get survey responses for a profile + security: + - BearerAuth: [] + operationId: getStudyResponsesForProfile + parameters: + - name: studyKey + in: path + required: true + schema: + type: string + - name: pid + in: query + required: false + description: Profile ID + schema: + type: string + - name: surveyKey + in: query + required: false + schema: + type: string + - name: page + in: query + description: page number (starting from 1) + schema: + type: integer + minimum: 1 + default: 1 + - name: limit + in: query + description: maximum number of responses per page + schema: + type: integer + minimum: 1 + default: 10 + - name: filter + in: query + description: bson.M object to filter responses + schema: + type: object + additionalProperties: + type: object + - name: sort + in: query + description: bson.M object to sort responses + schema: + type: object + additionalProperties: + type: object + - name: shortKeys + in: query + description: whether to return short keys for responses + schema: + type: boolean + default: false + - name: questionOptionSep + in: query + description: character used to seperate slot keys in response + schema: + type: string + default: "-" + - name: format + in: query + description: format for survey responses + schema: + type: string + default: wide + enum: + - wide + - long + - json + - name: extraContextColumns + in: query + description: comma-separated list of extra context columns to include in the + response + schema: + type: string + responses: + '200': + description: Responses returned + content: + application/json: + schema: + type: object + properties: + responses: + type: array + items: + type: object + description: Responses + additionalProperties: + type: object + pagination: + "$ref": "#/components/schemas/PaginationInfos" + required: + - responses + - pagination + '400': + "$ref": "#/components/responses/Error400" + '401': + "$ref": "#/components/responses/Error401" + '500': + "$ref": "#/components/responses/Error500" + "/v1/study-service/participant-data/{studyKey}/confidential-response": + get: + tags: + - participant-data + summary: Get confidential responses by key + security: + - BearerAuth: [] + operationId: getConfidentialResponse + parameters: + - name: studyKey + in: path + required: true + schema: + type: string + - name: pid + in: query + required: true + description: Profile ID + schema: + type: string + - name: key + in: query + required: true + description: Key for confidential responses + schema: + type: string + responses: + '200': + description: Confidential responses returned + content: + application/json: + schema: + type: object + properties: + confidentialResponse: + type: array + items: + type: object + description: Confidential survey response export entry + additionalProperties: true + required: + - confidentialResponse + '400': + "$ref": "#/components/responses/Error400" + '401': + "$ref": "#/components/responses/Error401" + '500': + "$ref": "#/components/responses/Error500" + "/v1/study-service/participant-data/{studyKey}/submission-history": + get: + tags: + - participant-data + summary: Get submission history for profiles + security: + - BearerAuth: [] + operationId: getSubmissionHistory + parameters: + - name: studyKey + in: path + required: true + schema: + type: string + - name: pids + in: query + required: true + description: Comma-separated profile IDs + schema: + type: string + - name: limit + in: query + required: false + description: Maximum number of submissions per page + schema: + type: integer + default: 100 + minimum: 1 + responses: + '200': + description: Submission history returned + content: + application/json: + schema: + type: object + properties: + submissionHistory: + "$ref": "#/components/schemas/SubmissionHistory" + required: + - submissionHistory + '400': + "$ref": "#/components/responses/Error400" + '401': + "$ref": "#/components/responses/Error401" + '500': + "$ref": "#/components/responses/Error500" + "/v1/study-service/participant-data/{studyKey}/reports": + get: + tags: + - participant-data + summary: Get reports for a profile + security: + - BearerAuth: [] + operationId: getReports + parameters: + - name: studyKey + in: path + required: true + schema: + type: string + - name: pid + in: query + required: true + description: Profile ID + schema: + type: string + - name: page + in: query + description: page number (starting from 1) + schema: + type: integer + minimum: 1 + default: 1 + - name: limit + in: query + description: maximum number of reports per page + schema: + type: integer + minimum: 1 + default: 10 + - name: filter + in: query + description: bson.M object to filter reports + schema: + type: object + additionalProperties: + type: object + responses: + '200': + description: Reports returned + content: + application/json: + schema: + type: object + properties: + reports: + type: array + items: + "$ref": "#/components/schemas/Report" + pagination: + "$ref": "#/components/schemas/PaginationInfos" + required: + - reports + - pagination + '400': + "$ref": "#/components/responses/Error400" + '401': + "$ref": "#/components/responses/Error401" + '500': + "$ref": "#/components/responses/Error500" + "/v1/study-service/temp-participant/register": + post: + tags: + - events + summary: Register a temporary participant + operationId: registerTempParticipant + requestBody: + required: true + content: + application/json: + schema: + type: object + properties: + instanceId: + type: string + studyKey: + type: string + required: + - instanceId + - studyKey + responses: + '200': + description: Temporary participant returned + content: + application/json: + schema: + type: object + properties: + participant: + "$ref": "#/components/schemas/Participant" + required: + - participant + '400': + "$ref": "#/components/responses/Error400" + '401': + "$ref": "#/components/responses/Error401" + '500': + "$ref": "#/components/responses/Error500" + "/v1/study-service/temp-participant/surveys": + get: + tags: + - participant-data + summary: Get assigned surveys for a temporary participant + operationId: getTempParticipantSurveys + parameters: + - name: instanceID + in: query + required: true + schema: + type: string + - name: studyKey + in: query + required: true + schema: + type: string + - name: pid + in: query + required: true + description: Profile ID + schema: + type: string + responses: + '200': + description: Assigned surveys with survey infos returned + content: + application/json: + schema: + "$ref": "#/components/schemas/AssignedSurveysWithInfos" + '400': + "$ref": "#/components/responses/Error400" + '401': + "$ref": "#/components/responses/Error401" + '500': + "$ref": "#/components/responses/Error500" + "/v1/study-service/temp-participant/survey": + get: + tags: + - participant-data + summary: Get a survey with context for a temporary participant + operationId: getTempParticipantSurveyWithContext + parameters: + - name: instanceID + in: query + required: true + schema: + type: string + - name: studyKey + in: query + required: true + schema: + type: string + - name: surveyKey + in: query + required: true + schema: + type: string + - name: pid + in: query + required: false + description: Profile ID + schema: + type: string + responses: + '200': + description: Survey with context returned + content: + application/json: + schema: + type: object + properties: + surveyWithContext: + "$ref": "#/components/schemas/AssignedSurveyWithContext" + required: + - surveyWithContext + '400': + "$ref": "#/components/responses/Error400" + '401': + "$ref": "#/components/responses/Error401" + '500': + "$ref": "#/components/responses/Error500" + "/v1/study-service/temp-participant/submit-response": + post: + tags: + - events + summary: Submit a survey response for a temporary participant + operationId: submitTempParticipantResponse + requestBody: + required: true + content: + application/json: + schema: + type: object + properties: + instanceId: + type: string + studyKey: + type: string + pid: + type: string + response: + type: object + additionalProperties: true + required: + - instanceId + - studyKey + - pid + - response + responses: + '200': + description: Assigned surveys returned + content: + application/json: + schema: + type: object + properties: + assignedSurveys: + type: array + items: + "$ref": "#/components/schemas/AssignedSurvey" + required: + - assignedSurveys + '400': + "$ref": "#/components/responses/Error400" + '401': + "$ref": "#/components/responses/Error401" + '500': + "$ref": "#/components/responses/Error500" + "/v1/study-service/virtual-participants/{studyKey}/": + get: + tags: + - participant-data + summary: Get virtual participants by linking code + security: + - BearerAuth: [] + operationId: getVirtualParticipantsByLinkingCode + parameters: + - name: studyKey + in: path + required: true + schema: + type: string + - name: key + in: query + required: true + description: Linking code key + schema: + type: string + - name: value + in: query + required: true + description: Linking code value + schema: + type: string + responses: + '200': + description: Participants returned + content: + application/json: + schema: + type: object + properties: + participants: + type: array + items: + "$ref": "#/components/schemas/Participant" + required: + - participants + '400': + "$ref": "#/components/responses/Error400" + '401': + "$ref": "#/components/responses/Error401" + '500': + "$ref": "#/components/responses/Error500" + "/v1/study-service/participant-data/{studyKey}/files": + post: + tags: + - participant-data + summary: Upload participant file + security: + - BearerAuth: [] + operationId: uploadParticipantFile + parameters: + - name: studyKey + in: path + required: true + schema: + type: string + requestBody: + required: true + content: + multipart/form-data: + schema: + type: object + properties: + profileID: + type: string + description: ID of the profile + file: + type: string + format: binary + description: File to upload. Only 'image/jpeg' and 'image/png' are + allowed. + required: + - profileID + - file + responses: + '200': + description: File uploaded + content: + application/json: + schema: + type: object + properties: + id: + type: string + description: object ID of the uploaded file + path: + type: string + status: + type: string + const: ready + required: + - id + - path + - status + additionalProperties: false + '400': + "$ref": "#/components/responses/Error400" + '401': + "$ref": "#/components/responses/Error401" + '403': + "$ref": "#/components/responses/Error403" + '500': + "$ref": "#/components/responses/Error500" + get: + tags: + - participant-data + summary: List participant files + security: + - BearerAuth: [] + operationId: listParticipantFiles + parameters: + - name: studyKey + in: path + required: true + schema: + type: string + - name: pid + in: query + required: true + description: Profile ID + schema: + type: string + - name: page + in: query + description: page number (starting from 1) + schema: + type: integer + minimum: 1 + default: 1 + - name: limit + in: query + description: maximum number of files per page + schema: + type: integer + minimum: 1 + default: 10 + responses: + '200': + description: Files returned + content: + application/json: + schema: + type: object + properties: + fileInfos: + type: array + items: + "$ref": "#/components/schemas/FileInfo" + pagination: + "$ref": "#/components/schemas/PaginationInfos" + required: + - fileInfos + - pagination + additionalProperties: false + '400': + "$ref": "#/components/responses/Error400" + '401': + "$ref": "#/components/responses/Error401" + '500': + "$ref": "#/components/responses/Error500" + "/v1/study-service/participant-data/{studyKey}/files/{fileID}": + get: + tags: + - participant-data + summary: Download participant file + security: + - BearerAuth: [] + operationId: getParticipantFile + parameters: + - name: studyKey + in: path + required: true + schema: + type: string + - name: fileID + in: path + required: true + schema: + type: string + - name: pid + in: query + required: true + description: Profile ID + schema: + type: string + responses: + '200': + description: File + content: + application/octet-stream: + schema: + type: string + format: binary + '400': + "$ref": "#/components/responses/Error400" + '401': + "$ref": "#/components/responses/Error401" + '404': + "$ref": "#/components/responses/Error404" + '500': + "$ref": "#/components/responses/Error500" + delete: + tags: + - participant-data + summary: Delete participant file + security: + - BearerAuth: [] + operationId: deleteParticipantFile + parameters: + - name: studyKey + in: path + required: true + schema: + type: string + - name: fileID + in: path + required: true + schema: + type: string + - name: pid + in: query + required: true + description: Profile ID + schema: + type: string + responses: + '200': + description: Deleted + content: + application/json: + schema: + "$ref": "#/components/schemas/Message" + '400': + "$ref": "#/components/responses/Error400" + '401': + "$ref": "#/components/responses/Error401" + '404': + "$ref": "#/components/responses/Error404" + '500': + "$ref": "#/components/responses/Error500" + "/v1/user/": + get: + tags: + - user + summary: Get current user + security: + - BearerAuth: [] + operationId: getUser + responses: + '200': + description: User returned + content: + application/json: + schema: + type: object + properties: + user: + "$ref": "#/components/schemas/User" + required: + - user + '400': + "$ref": "#/components/responses/Error400" + '401': + "$ref": "#/components/responses/Error401" + '500': + "$ref": "#/components/responses/Error500" + delete: + tags: + - user + summary: Delete current user + security: + - BearerAuth: [] + operationId: deleteUser + requestBody: + required: false + content: + application/json: + schema: + type: object + properties: + exitSurveyResponse: + type: object + additionalProperties: true + responses: + '200': + "$ref": "#/components/responses/MessageOk" + '400': + "$ref": "#/components/responses/Error400" + '401': + "$ref": "#/components/responses/Error401" + '500': + "$ref": "#/components/responses/Error500" + "/v1/user/preferred-language": + put: + summary: Update the account's preferred language + tags: + - user + security: + - BearerAuth: [] + operationId: updatePreferredLanguage + requestBody: + required: true + content: + application/json: + schema: + type: object + properties: + newLocale: + type: string + description: language code, e.g., en, de-DE + required: + - newLocale + additionalProperties: false + responses: + '200': + "$ref": "#/components/responses/MessageOk" + '400': + "$ref": "#/components/responses/Error400" + '401': + "$ref": "#/components/responses/Error401" + '500': + "$ref": "#/components/responses/Error500" + "/v1/user/profiles": + post: + tags: + - user + summary: Add new profile + security: + - BearerAuth: [] + operationId: addProfile + requestBody: + required: true + content: + application/json: + schema: + type: object + properties: + profile: + "$ref": "#/components/schemas/Profile" + required: + - profile + responses: + '200': + description: Profile added + content: + application/json: + schema: + type: object + properties: + profile: + "$ref": "#/components/schemas/Profile" + required: + - profile + '400': + "$ref": "#/components/responses/Error400" + '401': + "$ref": "#/components/responses/Error401" + '500': + "$ref": "#/components/responses/Error500" + put: + tags: + - user + summary: Update profile + security: + - BearerAuth: [] + operationId: updateProfile + requestBody: + required: true + content: + application/json: + schema: + type: object + properties: + profile: + "$ref": "#/components/schemas/Profile" + required: + - profile + responses: + '200': + description: Profile updated + content: + application/json: + schema: + type: object + properties: + profile: + "$ref": "#/components/schemas/Profile" + required: + - profile + '400': + "$ref": "#/components/responses/Error400" + '401': + "$ref": "#/components/responses/Error401" + '500': + "$ref": "#/components/responses/Error500" + "/v1/user/profiles/remove": + post: + tags: + - user + summary: Remove a profile + security: + - BearerAuth: [] + operationId: removeProfile + requestBody: + required: true + content: + application/json: + schema: + type: object + properties: + profileId: + type: string + exitSurveyResponse: + type: object + additionalProperties: true + required: + - profileId + responses: + '200': + "$ref": "#/components/responses/MessageOk" + '400': + "$ref": "#/components/responses/Error400" + '401': + "$ref": "#/components/responses/Error401" + '500': + "$ref": "#/components/responses/Error500" + "/v1/user/password": + post: + tags: + - user + summary: Change password + security: + - BearerAuth: [] + operationId: changePassword + requestBody: + required: true + content: + application/json: + schema: + type: object + properties: + oldPassword: + type: string + newPassword: + type: string + required: + - oldPassword + - newPassword + responses: + '200': + "$ref": "#/components/responses/MessageOk" + '400': + "$ref": "#/components/responses/Error400" + '401': + "$ref": "#/components/responses/Error401" + '500': + "$ref": "#/components/responses/Error500" + "/v1/user/change-account-email": + post: + tags: + - user + summary: Change account email + security: + - BearerAuth: [] + operationId: changeAccountEmail + requestBody: + required: true + content: + application/json: + schema: + type: object + properties: + email: + type: string + format: email + password: + type: string + required: + - email + - password + responses: + '200': + "$ref": "#/components/responses/MessageOk" + '400': + "$ref": "#/components/responses/Error400" + '401': + "$ref": "#/components/responses/Error401" + '500': + "$ref": "#/components/responses/Error500" + "/v1/user/change-phone-number": + post: + tags: + - user + summary: Change phone number + security: + - BearerAuth: [] + operationId: changePhoneNumber + requestBody: + required: true + content: + application/json: + schema: + type: object + properties: + newPhoneNumber: + type: string + password: + type: string + required: + - newPhoneNumber + - password + responses: + '200': + "$ref": "#/components/responses/MessageOk" + '400': + "$ref": "#/components/responses/Error400" + '401': + "$ref": "#/components/responses/Error401" + '429': + "$ref": "#/components/responses/Error429" + '500': + "$ref": "#/components/responses/Error500" + "/v1/user/request-phone-number-verification": + get: + tags: + - user + summary: Request phone number verification code via SMS + security: + - BearerAuth: [] + operationId: requestPhoneNumberVerification + responses: + '200': + "$ref": "#/components/responses/MessageOk" + '400': + "$ref": "#/components/responses/Error400" + '401': + "$ref": "#/components/responses/Error401" + '429': + "$ref": "#/components/responses/Error429" + '500': + "$ref": "#/components/responses/Error500" + "/v1/user/attributes": + get: + tags: + - user + summary: Get user attributes + security: + - BearerAuth: [] + operationId: getUserAttributes + responses: + '200': + description: Attributes returned + content: + application/json: + schema: + type: object + properties: + attributes: + type: array + items: + "$ref": "#/components/schemas/UserAttributes" + required: + - attributes + '400': + "$ref": "#/components/responses/Error400" + '401': + "$ref": "#/components/responses/Error401" + '500': + "$ref": "#/components/responses/Error500" + post: + tags: + - user + summary: Create or update a user attribute + security: + - BearerAuth: [] + operationId: setUserAttribute + requestBody: + required: true + content: + application/json: + schema: + type: object + properties: + type: + type: string + attributes: + type: object + additionalProperties: true + required: + - type + - attributes + responses: + '200': + "$ref": "#/components/responses/MessageOk" + '400': + "$ref": "#/components/responses/Error400" + '401': + "$ref": "#/components/responses/Error401" + '500': + "$ref": "#/components/responses/Error500" + "/v1/user/attributes/{attributeID}": + delete: + tags: + - user + summary: Delete a user attribute + security: + - BearerAuth: [] + operationId: deleteUserAttribute + parameters: + - name: attributeID + in: path + required: true + schema: + type: string + responses: + '200': + "$ref": "#/components/responses/MessageOk" + '400': + "$ref": "#/components/responses/Error400" + '401': + "$ref": "#/components/responses/Error401" + '500': + "$ref": "#/components/responses/Error500" + "/v1/user/contact-preferences": + put: + tags: + - user + summary: Update contact preferences + description: Update the user's newsletter and weekly subscription preferences. + security: + - BearerAuth: [] + operationId: updateContactPreferences + requestBody: + required: true + content: + application/json: + schema: + type: object + properties: + subscribedToNewsletter: + type: boolean + toggleWeeklySubscription: + type: boolean + required: + - subscribedToNewsletter + - toggleWeeklySubscription + responses: + '200': + "$ref": "#/components/responses/MessageOk" + '400': + "$ref": "#/components/responses/Error400" + '401': + "$ref": "#/components/responses/Error401" + '500': + "$ref": "#/components/responses/Error500" + "/v1/unsubscribe-newsletter": + post: + tags: + - misc + summary: Unsubscribe user from newsletter (via token) + operationId: unsubscribeNewsletter + requestBody: + required: true + content: + application/json: + schema: + type: object + properties: + token: + type: string + required: + - token + responses: + '200': + "$ref": "#/components/responses/MessageOk" + '400': + "$ref": "#/components/responses/Error400" + '500': + "$ref": "#/components/responses/Error500" +components: + securitySchemes: + BearerAuth: + type: http + scheme: bearer + bearerFormat: JWT + responses: + MessageOk: + description: Generic OK message + content: + application/json: + schema: + "$ref": "#/components/schemas/Message" + Error400: + description: Bad request + content: + application/json: + schema: + "$ref": "#/components/schemas/Error" + Error401: + description: Unauthorized + content: + application/json: + schema: + "$ref": "#/components/schemas/Error" + Error403: + description: Forbidden + content: + application/json: + schema: + "$ref": "#/components/schemas/Error" + Error404: + description: Not Found + content: + application/json: + schema: + "$ref": "#/components/schemas/Error" + Error429: + description: Too many requests + content: + application/json: + schema: + "$ref": "#/components/schemas/Error" + Error500: + description: Internal Server Error + content: + application/json: + schema: + "$ref": "#/components/schemas/Error" + schemas: + HealthStatus: + type: object + properties: + status: + type: string + required: + - status + additionalProperties: false + Message: + type: object + properties: + message: + type: string + required: + - message + additionalProperties: false + Error: + type: object + properties: + error: + type: string + required: + - error + additionalProperties: false + TokenEnvelope: + type: object + properties: + accessToken: + type: string + refreshToken: + type: string + expiresIn: + type: number + selectedProfile: + type: string + required: + - accessToken + - refreshToken + - expiresIn + - selectedProfile + additionalProperties: false + TokenEnvelopeWithLastOTP: + type: object + properties: + accessToken: + type: string + refreshToken: + type: string + expiresIn: + type: number + selectedProfile: + type: string + lastOTP: + type: object + additionalProperties: + type: integer + required: + - accessToken + - refreshToken + - expiresIn + - selectedProfile + - lastOTP + additionalProperties: false + AssignedSurvey: + type: object + description: Assigned survey object + additionalProperties: true + AssignedSurveysWithInfos: + type: object + description: Assigned surveys object with survey infos + properties: + surveys: + type: array + items: + type: object + additionalProperties: true + surveyInfos: + type: array + items: + type: object + additionalProperties: true + required: + - surveys + - surveyInfos + additionalProperties: false + AssignedSurveyWithContext: + type: object + description: Assigned survey object with optional context and prefill survey + response + properties: + survey: + type: object + additionalProperties: true + context: + type: object + additionalProperties: true + prefill: + type: object + additionalProperties: true + required: + - survey + additionalProperties: false + FileInfo: + type: object + properties: + id: + type: string + description: ObjectID + participantID: + type: string + status: + type: string + uploadedBy: + type: string + path: + type: string + previewPath: + type: string + submittedAt: + type: integer + createdAt: + type: string + format: date-time + updatedAt: + type: string + format: date-time + fileType: + type: string + visibleToParticipant: + type: boolean + size: + type: integer + required: + - id + - participantID + - path + additionalProperties: false + description: File Info object + PaginationInfos: + type: object + description: Pagination information + properties: + totalCount: + type: integer + currentPage: + type: integer + totalPages: + type: integer + pageSize: + type: integer + additionalProperties: false + SubmissionHistory: + type: object + description: Submission history + additionalProperties: true + Report: + type: object + description: Report object + properties: + id: + type: string + description: MongoDB ObjectID as hex string + key: + type: string + participantID: + type: string + responseID: + type: string + timestamp: + type: integer + description: Unix timestamp + modifiedAt: + type: string + format: date-time + data: + type: array + items: + type: object + properties: + key: + type: string + value: + type: string + dtype: + type: string + enum: + - date + - float + - int + - string + - rawMessage + - keyList + additionalProperties: false + required: + - key + - participantID + - timestamp + additionalProperties: false + Participant: + type: object + description: Participant defines the datamodel for current state of the participant + in a study as stored in the database + additionalProperties: true + User: + type: object + description: User object + additionalProperties: true + Profile: + type: object + description: User profile object + additionalProperties: true + UserAttributes: + type: object + description: User attributes object + additionalProperties: true + StudyInfo: + type: object + properties: + key: + type: string + status: + type: string + props: + type: object + additionalProperties: true + stats: + type: object + additionalProperties: true + profileIds: + type: array + items: + type: string + description: ProfileIDs only required in study info objects related to participants + required: + - key + - status + - props + - stats + - profileIds + additionalProperties: false + StudyVariables: + type: object + properties: + id: + type: string + description: MongoDB ObjectID + example: 64e4b2f2c2a4e2b1a1c2d3e4 + createdAt: + type: string + format: date-time + configUpdatedAt: + type: string + format: date-time + valueUpdatedAt: + type: string + format: date-time + studyKey: + type: string + key: + type: string + value: + description: Value of the study variable, type depends on 'type' + oneOf: + - type: string + - type: integer + - type: number + format: float + - type: boolean + - type: string + format: date-time + type: + type: string + enum: + - string + - int + - float + - boolean + - date + label: + type: string + description: + type: string + uiType: + type: string + uiPriority: + type: integer + configs: + type: object + additionalProperties: true + required: + - createdAt + - configUpdatedAt + - valueUpdatedAt + - studyKey + - key + - value + - type +tags: +- name: auth + description: Authentication endpoints +- name: password + description: Password endpoints +- name: events + description: Study service events endpoints +- name: participant-data + description: Endpoints getting participant data in study service +- name: studies + description: Endpoints getting study data in study service +- name: user + description: User endpoints +- name: misc + description: Miscellaneous diff --git a/openapi/smtp-bridge.yaml b/openapi/smtp-bridge.yaml new file mode 100644 index 0000000..861dc97 --- /dev/null +++ b/openapi/smtp-bridge.yaml @@ -0,0 +1,162 @@ +--- +openapi: 3.1.0 +info: + title: SMTP Bridge API + version: 1.0.0 + description: Simple bridge for sending emails via configured SMTP servers. +tags: +- name: default + description: Default operations for SMTP Bridge API +paths: + "/": + get: + tags: + - default + summary: Health check + operationId: getHealth + responses: + '200': + description: Service is healthy + content: + application/json: + schema: + "$ref": "#/components/schemas/HealthStatus" + examples: + ok: + value: + status: ok + "/send-email": + post: + tags: + - default + summary: Send an email + operationId: sendEmail + security: + - BearerAuth: [] + requestBody: + required: true + content: + application/json: + schema: + "$ref": "#/components/schemas/SendEmailRequest" + examples: + basic: + value: + to: + - user@example.com + subject: Hello + content: "

Hi there

" + highPrio: false + withHeaderOverrides: + value: + to: + - user@example.com + subject: Important + content: Text body + highPrio: true + headerOverrides: + from: '"System Notifications" ' + sender: system@example.com + replyTo: + - support@example.com + noReplyTo: false + responses: + '200': + description: Email accepted for sending + content: + application/json: + schema: + "$ref": "#/components/schemas/SuccessMessage" + examples: + sent: + value: + message: email sent + '400': + description: Bad request + content: + application/json: + schema: + "$ref": "#/components/schemas/Error" + examples: + missingApiKey: + value: + error: A valid API key missing + missingTo: + value: + error: missing 'to' field + '500': + description: Failed to send after retries + content: + application/json: + schema: + "$ref": "#/components/schemas/Error" + examples: + sendFailed: + value: + error: failed to send email +components: + securitySchemes: + BearerAuth: + type: http + scheme: bearer + bearerFormat: JWT + schemas: + HealthStatus: + type: object + properties: + status: + type: string + required: + - status + additionalProperties: false + SuccessMessage: + type: object + properties: + message: + type: string + required: + - message + additionalProperties: false + Error: + type: object + properties: + error: + type: string + required: + - error + additionalProperties: false + HeaderOverrides: + type: object + properties: + from: + type: string + sender: + type: string + replyTo: + type: array + items: + type: string + format: email + noReplyTo: + type: boolean + additionalProperties: false + SendEmailRequest: + type: object + properties: + to: + type: array + items: + type: string + format: email + minItems: 1 + subject: + type: string + content: + type: string + highPrio: + type: boolean + headerOverrides: + "$ref": "#/components/schemas/HeaderOverrides" + required: + - to + additionalProperties: false diff --git a/package.json b/package.json index f12c587..63e3ce9 100644 --- a/package.json +++ b/package.json @@ -10,26 +10,27 @@ }, "dependencies": { "@orama/orama": "^3.1.16", - "fumadocs-core": "16.0.1", - "fumadocs-mdx": "13.0.0", - "fumadocs-ui": "16.0.1", + "fumadocs-core": "16.9.3", + "fumadocs-mdx": "14.2.9", + "fumadocs-openapi": "10.9.1", + "fumadocs-ui": "16.9.3", "lucide-react": "^0.546.0", - "next": "15.3.4", - "react": "^19.2.0", - "react-dom": "^19.2.0", - "swagger-ui-react": "^5.29.5" + "next": "16.1.6", + "react": "^19.2.4", + "react-dom": "^19.2.4" }, "devDependencies": { "@tailwindcss/postcss": "^4.1.15", "@types/mdx": "^2.0.13", - "@types/node": "24.9.1", + "@types/node": "25.3.3", "@types/react": "^19.2.2", "@types/react-dom": "^19.2.2", - "@types/swagger-ui-react": "^5.18.0", - "eslint": "^8", - "eslint-config-next": "15.3.4", + "eslint": "^10.0.2", + "eslint-config-next": "16.1.6", "postcss": "^8.5.6", + "shiki": "^4.0.1", "tailwindcss": "^4.1.15", + "tsx": "^4.21.0", "typescript": "^5.8.3" } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml new file mode 100644 index 0000000..639215b --- /dev/null +++ b/pnpm-lock.yaml @@ -0,0 +1,7387 @@ +lockfileVersion: '9.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +importers: + + .: + dependencies: + '@orama/orama': + specifier: ^3.1.16 + version: 3.1.18 + fumadocs-core: + specifier: 16.9.3 + version: 16.9.3(@mdx-js/mdx@3.1.1)(@types/estree-jsx@1.0.5)(@types/hast@3.0.4)(@types/mdast@4.0.4)(@types/react@19.2.15)(lucide-react@0.546.0(react@19.2.6))(next@16.1.6(@babel/core@7.29.7)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(zod@4.4.3) + fumadocs-mdx: + specifier: 14.2.9 + version: 14.2.9(@types/mdast@4.0.4)(@types/mdx@2.0.13)(@types/react@19.2.15)(fumadocs-core@16.9.3(@mdx-js/mdx@3.1.1)(@types/estree-jsx@1.0.5)(@types/hast@3.0.4)(@types/mdast@4.0.4)(@types/react@19.2.15)(lucide-react@0.546.0(react@19.2.6))(next@16.1.6(@babel/core@7.29.7)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(zod@4.4.3))(next@16.1.6(@babel/core@7.29.7)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(react@19.2.6) + fumadocs-openapi: + specifier: 10.9.1 + version: 10.9.1(6c397e23616c8e23c2ab5a065a8a1f4c) + fumadocs-ui: + specifier: 16.9.3 + version: 16.9.3(@tailwindcss/oxide@4.3.0)(@types/mdx@2.0.13)(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(fumadocs-core@16.9.3(@mdx-js/mdx@3.1.1)(@types/estree-jsx@1.0.5)(@types/hast@3.0.4)(@types/mdast@4.0.4)(@types/react@19.2.15)(lucide-react@0.546.0(react@19.2.6))(next@16.1.6(@babel/core@7.29.7)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(zod@4.4.3))(next@16.1.6(@babel/core@7.29.7)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(tailwindcss@4.3.0) + lucide-react: + specifier: ^0.546.0 + version: 0.546.0(react@19.2.6) + next: + specifier: 16.1.6 + version: 16.1.6(@babel/core@7.29.7)(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + react: + specifier: ^19.2.4 + version: 19.2.6 + react-dom: + specifier: ^19.2.4 + version: 19.2.6(react@19.2.6) + devDependencies: + '@tailwindcss/postcss': + specifier: ^4.1.15 + version: 4.3.0 + '@types/mdx': + specifier: ^2.0.13 + version: 2.0.13 + '@types/node': + specifier: 25.3.3 + version: 25.3.3 + '@types/react': + specifier: ^19.2.2 + version: 19.2.15 + '@types/react-dom': + specifier: ^19.2.2 + version: 19.2.3(@types/react@19.2.15) + eslint: + specifier: ^10.0.2 + version: 10.4.1(jiti@2.7.0) + eslint-config-next: + specifier: 16.1.6 + version: 16.1.6(@typescript-eslint/parser@8.60.0(eslint@10.4.1(jiti@2.7.0))(typescript@5.9.3))(eslint@10.4.1(jiti@2.7.0))(typescript@5.9.3) + postcss: + specifier: ^8.5.6 + version: 8.5.15 + shiki: + specifier: ^4.0.1 + version: 4.1.0 + tailwindcss: + specifier: ^4.1.15 + version: 4.3.0 + tsx: + specifier: ^4.21.0 + version: 4.22.4 + typescript: + specifier: ^5.8.3 + version: 5.9.3 + +packages: + + '@alloc/quick-lru@5.2.0': + resolution: {integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==} + engines: {node: '>=10'} + + '@babel/code-frame@7.29.7': + resolution: {integrity: sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==} + engines: {node: '>=6.9.0'} + + '@babel/compat-data@7.29.7': + resolution: {integrity: sha512-locTkQyKvwIEgBzVrn8693ebc97F2U8ZHjbXwDXJ5Fn2TCpNwTlKcaKLkdHop5c/icOFE7qt7Q9JC5hnKNa6Gg==} + engines: {node: '>=6.9.0'} + + '@babel/core@7.29.7': + resolution: {integrity: sha512-RgHBCvtjbOK2gXSNBNIkNoEc9qoVEtau3hj8gEqKQuL3HZAibKarWFEI3Lfm6EYKkLalOh8eSrj9b+ch9H/VBA==} + engines: {node: '>=6.9.0'} + + '@babel/generator@7.29.7': + resolution: {integrity: sha512-DkXD5OJQaAQIdZ1bt3UZdEnHAn9Imd3IVBdX03UFe+ony9Ojw5pzr9YVKGDY1jt+Gcn/FnGkNf8r+Vj5NOJWtQ==} + engines: {node: '>=6.9.0'} + + '@babel/helper-compilation-targets@7.29.7': + resolution: {integrity: sha512-wem6WaBj4NaVYVdNhLPPVacES6ZJ+KBBfSkTMD3YZxbP3rm3Di85tJU5ljaUNhaOynt+Aj0xruhYuzQBt8n71g==} + engines: {node: '>=6.9.0'} + + '@babel/helper-globals@7.29.7': + resolution: {integrity: sha512-3nQVUAtvkKH9zahfWgw96Jc/uFOmjACE1kQz82E2lqWmHBgjzbNlsC22nuQTfahmWeQtTq5nQ/4Nnd2A1wj4zA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-module-imports@7.29.7': + resolution: {integrity: sha512-ejHwrQQYcm9xnTivShn2IDOlIzInN34AXskvq9QicvCtEzq1Vzclu/tKF8Jq1Cg8JG2GL6/EmjgsCT7lXepE3g==} + engines: {node: '>=6.9.0'} + + '@babel/helper-module-transforms@7.29.7': + resolution: {integrity: sha512-UPUVSyXbOh627KiCIGQSgwWzGeBKLkaJ9PJEdrngIwMSzxLR4jS4+f1f1jb7VzBbg8nFLaYotvVPFCTqdrmTAg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-string-parser@7.29.7': + resolution: {integrity: sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-identifier@7.29.7': + resolution: {integrity: sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-option@7.29.7': + resolution: {integrity: sha512-N9ZErrD+yW5geCDtBqnOoxmR8+tNKiGuxKlDpuJxfsqpa2dFcexaziGAE/qoHLiDDreVNMupxGmSoNlyvsA3gw==} + engines: {node: '>=6.9.0'} + + '@babel/helpers@7.29.7': + resolution: {integrity: sha512-1k2lAGRMfHTcwuNYcCNUmaUffmQv8KWMfh2iJUUeRlwlwH4FdNG7mfPI10NPfLHJFThE4Tyr4mv7kTNZOiPuBg==} + engines: {node: '>=6.9.0'} + + '@babel/parser@7.29.7': + resolution: {integrity: sha512-hnORnjP/1P/zFEndoeX+n+t1RwWRJiJpM/jO7FW32Kn9r5+sJB2JWOdYo4L6k78j15eCwY3Gm/7364B1EMwtNg==} + engines: {node: '>=6.0.0'} + hasBin: true + + '@babel/template@7.29.7': + resolution: {integrity: sha512-puq+Gf35oI24FeN11LkoUQFqv9uwNeWpxXZi/Ji3rRIoKAzKnxRaZ+Gkj0vKS9ZCiTESfng1N9LyOyXvo+m+Gg==} + engines: {node: '>=6.9.0'} + + '@babel/traverse@7.29.7': + resolution: {integrity: sha512-EhlfNQtZ+NK22w5BM61ciuiq1m58ed33Wr1Xan//ZRTy6hgjnwyCffRYwzsGXdASJSUJ1guZILsErh1eQcl+zw==} + engines: {node: '>=6.9.0'} + + '@babel/types@7.29.7': + resolution: {integrity: sha512-4zBIxpPzowiZpusoFkyGVwakdRJUyuH5PxQ/PrqghfdFWWasvnCdPfQXHrenDai+gyLARulZjZowCOj6fjT4pA==} + engines: {node: '>=6.9.0'} + + '@emnapi/core@1.10.0': + resolution: {integrity: sha512-yq6OkJ4p82CAfPl0u9mQebQHKPJkY7WrIuk205cTYnYe+k2Z8YBh11FrbRG/H6ihirqcacOgl2BIO8oyMQLeXw==} + + '@emnapi/runtime@1.10.0': + resolution: {integrity: sha512-ewvYlk86xUoGI0zQRNq/mC+16R1QeDlKQy21Ki3oSYXNgLb45GV1P6A0M+/s6nyCuNDqe5VpaY84BzXGwVbwFA==} + + '@emnapi/wasi-threads@1.2.1': + resolution: {integrity: sha512-uTII7OYF+/Mes/MrcIOYp5yOtSMLBWSIoLPpcgwipoiKbli6k322tcoFsxoIIxPDqW01SQGAgko4EzZi2BNv2w==} + + '@esbuild/aix-ppc64@0.27.7': + resolution: {integrity: sha512-EKX3Qwmhz1eMdEJokhALr0YiD0lhQNwDqkPYyPhiSwKrh7/4KRjQc04sZ8db+5DVVnZ1LmbNDI1uAMPEUBnQPg==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] + + '@esbuild/aix-ppc64@0.28.0': + resolution: {integrity: sha512-lhRUCeuOyJQURhTxl4WkpFTjIsbDayJHih5kZC1giwE+MhIzAb7mEsQMqMf18rHLsrb5qI1tafG20mLxEWcWlA==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] + + '@esbuild/android-arm64@0.27.7': + resolution: {integrity: sha512-62dPZHpIXzvChfvfLJow3q5dDtiNMkwiRzPylSCfriLvZeq0a1bWChrGx/BbUbPwOrsWKMn8idSllklzBy+dgQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm64@0.28.0': + resolution: {integrity: sha512-+WzIXQOSaGs33tLEgYPYe/yQHf0WTU0X42Jca3y8NWMbUVhp7rUnw+vAsRC/QiDrdD31IszMrZy+qwPOPjd+rw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm@0.27.7': + resolution: {integrity: sha512-jbPXvB4Yj2yBV7HUfE2KHe4GJX51QplCN1pGbYjvsyCZbQmies29EoJbkEc+vYuU5o45AfQn37vZlyXy4YJ8RQ==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] + + '@esbuild/android-arm@0.28.0': + resolution: {integrity: sha512-wqh0ByljabXLKHeWXYLqoJ5jKC4XBaw6Hk08OfMrCRd2nP2ZQ5eleDZC41XHyCNgktBGYMbqnrJKq/K/lzPMSQ==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] + + '@esbuild/android-x64@0.27.7': + resolution: {integrity: sha512-x5VpMODneVDb70PYV2VQOmIUUiBtY3D3mPBG8NxVk5CogneYhkR7MmM3yR/uMdITLrC1ml/NV1rj4bMJuy9MCg==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] + + '@esbuild/android-x64@0.28.0': + resolution: {integrity: sha512-+VJggoaKhk2VNNqVL7f6S189UzShHC/mR9EE8rDdSkdpN0KflSwWY/gWjDrNxxisg8Fp1ZCD9jLMo4m0OUfeUA==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] + + '@esbuild/darwin-arm64@0.27.7': + resolution: {integrity: sha512-5lckdqeuBPlKUwvoCXIgI2D9/ABmPq3Rdp7IfL70393YgaASt7tbju3Ac+ePVi3KDH6N2RqePfHnXkaDtY9fkw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-arm64@0.28.0': + resolution: {integrity: sha512-0T+A9WZm+bZ84nZBtk1ckYsOvyA3x7e2Acj1KdVfV4/2tdG4fzUp91YHx+GArWLtwqp77pBXVCPn2We7Letr0Q==} + engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-x64@0.27.7': + resolution: {integrity: sha512-rYnXrKcXuT7Z+WL5K980jVFdvVKhCHhUwid+dDYQpH+qu+TefcomiMAJpIiC2EM3Rjtq0sO3StMV/+3w3MyyqQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] + + '@esbuild/darwin-x64@0.28.0': + resolution: {integrity: sha512-fyzLm/DLDl/84OCfp2f/XQ4flmORsjU7VKt8HLjvIXChJoFFOIL6pLJPH4Yhd1n1gGFF9mPwtlN5Wf82DZs+LQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] + + '@esbuild/freebsd-arm64@0.27.7': + resolution: {integrity: sha512-B48PqeCsEgOtzME2GbNM2roU29AMTuOIN91dsMO30t+Ydis3z/3Ngoj5hhnsOSSwNzS+6JppqWsuhTp6E82l2w==} + engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-arm64@0.28.0': + resolution: {integrity: sha512-l9GeW5UZBT9k9brBYI+0WDffcRxgHQD8ShN2Ur4xWq/NFzUKm3k5lsH4PdaRgb2w7mI9u61nr2gI2mLI27Nh3Q==} + engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.27.7': + resolution: {integrity: sha512-jOBDK5XEjA4m5IJK3bpAQF9/Lelu/Z9ZcdhTRLf4cajlB+8VEhFFRjWgfy3M1O4rO2GQ/b2dLwCUGpiF/eATNQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.28.0': + resolution: {integrity: sha512-BXoQai/A0wPO6Es3yFJ7APCiKGc1tdAEOgeTNy3SsB491S3aHn4S4r3e976eUnPdU+NbdtmBuLncYir2tMU9Nw==} + engines: {node: '>=18'} + cpu: [x64] + os: [freebsd] + + '@esbuild/linux-arm64@0.27.7': + resolution: {integrity: sha512-RZPHBoxXuNnPQO9rvjh5jdkRmVizktkT7TCDkDmQ0W2SwHInKCAV95GRuvdSvA7w4VMwfCjUiPwDi0ZO6Nfe9A==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm64@0.28.0': + resolution: {integrity: sha512-RVyzfb3FWsGA55n6WY0MEIEPURL1FcbhFE6BffZEMEekfCzCIMtB5yyDcFnVbTnwk+CLAgTujmV/Lgvih56W+A==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm@0.27.7': + resolution: {integrity: sha512-RkT/YXYBTSULo3+af8Ib0ykH8u2MBh57o7q/DAs3lTJlyVQkgQvlrPTnjIzzRPQyavxtPtfg0EopvDyIt0j1rA==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-arm@0.28.0': + resolution: {integrity: sha512-CjaaREJagqJp7iTaNQjjidaNbCKYcd4IDkzbwwxtSvjI7NZm79qiHc8HqciMddQ6CKvJT6aBd8lO9kN/ZudLlw==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-ia32@0.27.7': + resolution: {integrity: sha512-GA48aKNkyQDbd3KtkplYWT102C5sn/EZTY4XROkxONgruHPU72l+gW+FfF8tf2cFjeHaRbWpOYa/uRBz/Xq1Pg==} + engines: {node: '>=18'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-ia32@0.28.0': + resolution: {integrity: sha512-KBnSTt1kxl9x70q+ydterVdl+Cn0H18ngRMRCEQfrbqdUuntQQ0LoMZv47uB97NljZFzY6HcfqEZ2SAyIUTQBQ==} + engines: {node: '>=18'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-loong64@0.27.7': + resolution: {integrity: sha512-a4POruNM2oWsD4WKvBSEKGIiWQF8fZOAsycHOt6JBpZ+JN2n2JH9WAv56SOyu9X5IqAjqSIPTaJkqN8F7XOQ5Q==} + engines: {node: '>=18'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-loong64@0.28.0': + resolution: {integrity: sha512-zpSlUce1mnxzgBADvxKXX5sl8aYQHo2ezvMNI8I0lbblJtp8V4odlm3Yzlj7gPyt3T8ReksE6bK+pT3WD+aJRg==} + engines: {node: '>=18'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-mips64el@0.27.7': + resolution: {integrity: sha512-KabT5I6StirGfIz0FMgl1I+R1H73Gp0ofL9A3nG3i/cYFJzKHhouBV5VWK1CSgKvVaG4q1RNpCTR2LuTVB3fIw==} + engines: {node: '>=18'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-mips64el@0.28.0': + resolution: {integrity: sha512-2jIfP6mmjkdmeTlsX/9vmdmhBmKADrWqN7zcdtHIeNSCH1SqIoNI63cYsjQR8J+wGa4Y5izRcSHSm8K3QWmk3w==} + engines: {node: '>=18'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-ppc64@0.27.7': + resolution: {integrity: sha512-gRsL4x6wsGHGRqhtI+ifpN/vpOFTQtnbsupUF5R5YTAg+y/lKelYR1hXbnBdzDjGbMYjVJLJTd2OFmMewAgwlQ==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-ppc64@0.28.0': + resolution: {integrity: sha512-bc0FE9wWeC0WBm49IQMPSPILRocGTQt3j5KPCA8os6VprfuJ7KD+5PzESSrJ6GmPIPJK965ZJHTUlSA6GNYEhg==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-riscv64@0.27.7': + resolution: {integrity: sha512-hL25LbxO1QOngGzu2U5xeXtxXcW+/GvMN3ejANqXkxZ/opySAZMrc+9LY/WyjAan41unrR3YrmtTsUpwT66InQ==} + engines: {node: '>=18'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-riscv64@0.28.0': + resolution: {integrity: sha512-SQPZOwoTTT/HXFXQJG/vBX8sOFagGqvZyXcgLA3NhIqcBv1BJU1d46c0rGcrij2B56Z2rNiSLaZOYW5cUk7yLQ==} + engines: {node: '>=18'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-s390x@0.27.7': + resolution: {integrity: sha512-2k8go8Ycu1Kb46vEelhu1vqEP+UeRVj2zY1pSuPdgvbd5ykAw82Lrro28vXUrRmzEsUV0NzCf54yARIK8r0fdw==} + engines: {node: '>=18'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-s390x@0.28.0': + resolution: {integrity: sha512-SCfR0HN8CEEjnYnySJTd2cw0k9OHB/YFzt5zgJEwa+wL/T/raGWYMBqwDNAC6dqFKmJYZoQBRfHjgwLHGSrn3Q==} + engines: {node: '>=18'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-x64@0.27.7': + resolution: {integrity: sha512-hzznmADPt+OmsYzw1EE33ccA+HPdIqiCRq7cQeL1Jlq2gb1+OyWBkMCrYGBJ+sxVzve2ZJEVeePbLM2iEIZSxA==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] + + '@esbuild/linux-x64@0.28.0': + resolution: {integrity: sha512-us0dSb9iFxIi8srnpl931Nvs65it/Jd2a2K3qs7fz2WfGPHqzfzZTfec7oxZJRNPXPnNYZtanmRc4AL/JwVzHQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] + + '@esbuild/netbsd-arm64@0.27.7': + resolution: {integrity: sha512-b6pqtrQdigZBwZxAn1UpazEisvwaIDvdbMbmrly7cDTMFnw/+3lVxxCTGOrkPVnsYIosJJXAsILG9XcQS+Yu6w==} + engines: {node: '>=18'} + cpu: [arm64] + os: [netbsd] + + '@esbuild/netbsd-arm64@0.28.0': + resolution: {integrity: sha512-CR/RYotgtCKwtftMwJlUU7xCVNg3lMYZ0RzTmAHSfLCXw3NtZtNpswLEj/Kkf6kEL3Gw+BpOekRX0BYCtklhUw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [netbsd] + + '@esbuild/netbsd-x64@0.27.7': + resolution: {integrity: sha512-OfatkLojr6U+WN5EDYuoQhtM+1xco+/6FSzJJnuWiUw5eVcicbyK3dq5EeV/QHT1uy6GoDhGbFpprUiHUYggrw==} + engines: {node: '>=18'} + cpu: [x64] + os: [netbsd] + + '@esbuild/netbsd-x64@0.28.0': + resolution: {integrity: sha512-nU1yhmYutL+fQ71Kxnhg8uEOdC0pwEW9entHykTgEbna2pw2dkbFSMeqjjyHZoCmt8SBkOSvV+yNmm94aUrrqw==} + engines: {node: '>=18'} + cpu: [x64] + os: [netbsd] + + '@esbuild/openbsd-arm64@0.27.7': + resolution: {integrity: sha512-AFuojMQTxAz75Fo8idVcqoQWEHIXFRbOc1TrVcFSgCZtQfSdc1RXgB3tjOn/krRHENUB4j00bfGjyl2mJrU37A==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + + '@esbuild/openbsd-arm64@0.28.0': + resolution: {integrity: sha512-cXb5vApOsRsxsEl4mcZ1XY3D4DzcoMxR/nnc4IyqYs0rTI8ZKmW6kyyg+11Z8yvgMfAEldKzP7AdP64HnSC/6g==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.27.7': + resolution: {integrity: sha512-+A1NJmfM8WNDv5CLVQYJ5PshuRm/4cI6WMZRg1by1GwPIQPCTs1GLEUHwiiQGT5zDdyLiRM/l1G0Pv54gvtKIg==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.28.0': + resolution: {integrity: sha512-8wZM2qqtv9UP3mzy7HiGYNH/zjTA355mpeuA+859TyR+e+Tc08IHYpLJuMsfpDJwoLo1ikIJI8jC3GFjnRClzA==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] + + '@esbuild/openharmony-arm64@0.27.7': + resolution: {integrity: sha512-+KrvYb/C8zA9CU/g0sR6w2RBw7IGc5J2BPnc3dYc5VJxHCSF1yNMxTV5LQ7GuKteQXZtspjFbiuW5/dOj7H4Yw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openharmony] + + '@esbuild/openharmony-arm64@0.28.0': + resolution: {integrity: sha512-FLGfyizszcef5C3YtoyQDACyg95+dndv79i2EekILBofh5wpCa1KuBqOWKrEHZg3zrL3t5ouE5jgr94vA+Wb2w==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openharmony] + + '@esbuild/sunos-x64@0.27.7': + resolution: {integrity: sha512-ikktIhFBzQNt/QDyOL580ti9+5mL/YZeUPKU2ivGtGjdTYoqz6jObj6nOMfhASpS4GU4Q/Clh1QtxWAvcYKamA==} + engines: {node: '>=18'} + cpu: [x64] + os: [sunos] + + '@esbuild/sunos-x64@0.28.0': + resolution: {integrity: sha512-1ZgjUoEdHZZl/YlV76TSCz9Hqj9h9YmMGAgAPYd+q4SicWNX3G5GCyx9uhQWSLcbvPW8Ni7lj4gDa1T40akdlw==} + engines: {node: '>=18'} + cpu: [x64] + os: [sunos] + + '@esbuild/win32-arm64@0.27.7': + resolution: {integrity: sha512-7yRhbHvPqSpRUV7Q20VuDwbjW5kIMwTHpptuUzV+AA46kiPze5Z7qgt6CLCK3pWFrHeNfDd1VKgyP4O+ng17CA==} + engines: {node: '>=18'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-arm64@0.28.0': + resolution: {integrity: sha512-Q9StnDmQ/enxnpxCCLSg0oo4+34B9TdXpuyPeTedN/6+iXBJ4J+zwfQI28u/Jl40nOYAxGoNi7mFP40RUtkmUA==} + engines: {node: '>=18'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-ia32@0.27.7': + resolution: {integrity: sha512-SmwKXe6VHIyZYbBLJrhOoCJRB/Z1tckzmgTLfFYOfpMAx63BJEaL9ExI8x7v0oAO3Zh6D/Oi1gVxEYr5oUCFhw==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-ia32@0.28.0': + resolution: {integrity: sha512-zF3ag/gfiCe6U2iczcRzSYJKH1DCI+ByzSENHlM2FcDbEeo5Zd2C86Aq0tKUYAJJ1obRP84ymxIAksZUcdztHA==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-x64@0.27.7': + resolution: {integrity: sha512-56hiAJPhwQ1R4i+21FVF7V8kSD5zZTdHcVuRFMW0hn753vVfQN8xlx4uOPT4xoGH0Z/oVATuR82AiqSTDIpaHg==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] + + '@esbuild/win32-x64@0.28.0': + resolution: {integrity: sha512-pEl1bO9mfAmIC+tW5btTmrKaujg3zGtUmWNdCw/xs70FBjwAL3o9OEKNHvNmnyylD6ubxUERiEhdsL0xBQ9efw==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] + + '@eslint-community/eslint-utils@4.9.1': + resolution: {integrity: sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + + '@eslint-community/regexpp@4.12.2': + resolution: {integrity: sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==} + engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + + '@eslint/config-array@0.23.5': + resolution: {integrity: sha512-Y3kKLvC1dvTOT+oGlqNQ1XLqK6D1HU2YXPc52NmAlJZbMMWDzGYXMiPRJ8TYD39muD/OTjlZmNJ4ib7dvSrMBA==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} + + '@eslint/config-helpers@0.6.0': + resolution: {integrity: sha512-ii6Bw9jJ2zi2cWA2Z+9/QZ/+3DX6kwaV5Q986D/CdP3Lap3w/pgQZ373FV7byY/i7L4IRH/G43I5dz1ClsCbpA==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} + + '@eslint/core@1.2.1': + resolution: {integrity: sha512-MwcE1P+AZ4C6DWlpin/OmOA54mmIZ/+xZuJiQd4SyB29oAJjN30UW9wkKNptW2ctp4cEsvhlLY/CsQ1uoHDloQ==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} + + '@eslint/object-schema@3.0.5': + resolution: {integrity: sha512-vqTaUEgxzm+YDSdElad6PiRoX4t8VGDjCtt05zn4nU810UIx/uNEV7/lZJ6KwFThKZOzOxzXy48da+No7HZaMw==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} + + '@eslint/plugin-kit@0.7.2': + resolution: {integrity: sha512-+CNAzxglkrpNf/kKywqQfk74QjtceuOE7Qm+AF8miRvPF/wmmK5+OJOgVh3AVTT3RP2mH3+FOaxlE5v72owk0A==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} + + '@floating-ui/core@1.7.5': + resolution: {integrity: sha512-1Ih4WTWyw0+lKyFMcBHGbb5U5FtuHJuujoyyr5zTaWS5EYMeT6Jb2AuDeftsCsEuchO+mM2ij5+q9crhydzLhQ==} + + '@floating-ui/dom@1.7.6': + resolution: {integrity: sha512-9gZSAI5XM36880PPMm//9dfiEngYoC6Am2izES1FF406YFsjvyBMmeJ2g4SAju3xWwtuynNRFL2s9hgxpLI5SQ==} + + '@floating-ui/react-dom@2.1.8': + resolution: {integrity: sha512-cC52bHwM/n/CxS87FH0yWdngEZrjdtLW/qVruo68qg+prK7ZQ4YGdut2GyDVpoGeAYe/h899rVeOVm6Oi40k2A==} + peerDependencies: + react: '>=16.8.0' + react-dom: '>=16.8.0' + + '@floating-ui/utils@0.2.11': + resolution: {integrity: sha512-RiB/yIh78pcIxl6lLMG0CgBXAZ2Y0eVHqMPYugu+9U0AeT6YBeiJpf7lbdJNIugFP5SIjwNRgo4DhR1Qxi26Gg==} + + '@fumadocs/tailwind@0.0.5': + resolution: {integrity: sha512-ENKPWUDRmriccsrUDE4bDBq3FNr/ms3BP2rWlsAEMV1yP23pcCaan+ceGfeBUsAQjw7sj9Q3R4Kl3g/TCStPzQ==} + peerDependencies: + '@tailwindcss/oxide': ^4.0.0 + tailwindcss: ^4.0.0 + peerDependenciesMeta: + '@tailwindcss/oxide': + optional: true + tailwindcss: + optional: true + + '@fumari/json-schema-ts@0.0.2': + resolution: {integrity: sha512-A2x8nj45r8Kc3Gqa+HpWRF9uzIMc9dySB6L2R2kiyjLHXWBsZUX99Atj5+Yup/iRQXQ9s8AX+uAPwPze7Xn05A==} + engines: {node: '>=20.0.0'} + peerDependencies: + json-schema-typed: ^8.0.2 + peerDependenciesMeta: + json-schema-typed: + optional: true + + '@fumari/stf@1.0.5': + resolution: {integrity: sha512-O9UQIbV15ePV5vUgceCcaMDuBRYfrSuogDEY5E//CmrbIiWJ1Ji5VgGHHH0L0HQuRr5riUJuAEr9lYIvJl9OyQ==} + peerDependencies: + '@types/react': '*' + react: ^19.2.0 + react-dom: ^19.2.0 + peerDependenciesMeta: + '@types/react': + optional: true + + '@humanfs/core@0.19.2': + resolution: {integrity: sha512-UhXNm+CFMWcbChXywFwkmhqjs3PRCmcSa/hfBgLIb7oQ5HNb1wS0icWsGtSAUNgefHeI+eBrA8I1fxmbHsGdvA==} + engines: {node: '>=18.18.0'} + + '@humanfs/node@0.16.8': + resolution: {integrity: sha512-gE1eQNZ3R++kTzFUpdGlpmy8kDZD/MLyHqDwqjkVQI0JMdI1D51sy1H958PNXYkM2rAac7e5/CnIKZrHtPh3BQ==} + engines: {node: '>=18.18.0'} + + '@humanfs/types@0.15.0': + resolution: {integrity: sha512-ZZ1w0aoQkwuUuC7Yf+7sdeaNfqQiiLcSRbfI08oAxqLtpXQr9AIVX7Ay7HLDuiLYAaFPu8oBYNq/QIi9URHJ3Q==} + engines: {node: '>=18.18.0'} + + '@humanwhocodes/module-importer@1.0.1': + resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} + engines: {node: '>=12.22'} + + '@humanwhocodes/retry@0.4.3': + resolution: {integrity: sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==} + engines: {node: '>=18.18'} + + '@img/colour@1.1.0': + resolution: {integrity: sha512-Td76q7j57o/tLVdgS746cYARfSyxk8iEfRxewL9h4OMzYhbW4TAcppl0mT4eyqXddh6L/jwoM75mo7ixa/pCeQ==} + engines: {node: '>=18'} + + '@img/sharp-darwin-arm64@0.34.5': + resolution: {integrity: sha512-imtQ3WMJXbMY4fxb/Ndp6HBTNVtWCUI0WdobyheGf5+ad6xX8VIDO8u2xE4qc/fr08CKG/7dDseFtn6M6g/r3w==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm64] + os: [darwin] + + '@img/sharp-darwin-x64@0.34.5': + resolution: {integrity: sha512-YNEFAF/4KQ/PeW0N+r+aVVsoIY0/qxxikF2SWdp+NRkmMB7y9LBZAVqQ4yhGCm/H3H270OSykqmQMKLBhBJDEw==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [darwin] + + '@img/sharp-libvips-darwin-arm64@1.2.4': + resolution: {integrity: sha512-zqjjo7RatFfFoP0MkQ51jfuFZBnVE2pRiaydKJ1G/rHZvnsrHAOcQALIi9sA5co5xenQdTugCvtb1cuf78Vf4g==} + cpu: [arm64] + os: [darwin] + + '@img/sharp-libvips-darwin-x64@1.2.4': + resolution: {integrity: sha512-1IOd5xfVhlGwX+zXv2N93k0yMONvUlANylbJw1eTah8K/Jtpi15KC+WSiaX/nBmbm2HxRM1gZ0nSdjSsrZbGKg==} + cpu: [x64] + os: [darwin] + + '@img/sharp-libvips-linux-arm64@1.2.4': + resolution: {integrity: sha512-excjX8DfsIcJ10x1Kzr4RcWe1edC9PquDRRPx3YVCvQv+U5p7Yin2s32ftzikXojb1PIFc/9Mt28/y+iRklkrw==} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@img/sharp-libvips-linux-arm@1.2.4': + resolution: {integrity: sha512-bFI7xcKFELdiNCVov8e44Ia4u2byA+l3XtsAj+Q8tfCwO6BQ8iDojYdvoPMqsKDkuoOo+X6HZA0s0q11ANMQ8A==} + cpu: [arm] + os: [linux] + libc: [glibc] + + '@img/sharp-libvips-linux-ppc64@1.2.4': + resolution: {integrity: sha512-FMuvGijLDYG6lW+b/UvyilUWu5Ayu+3r2d1S8notiGCIyYU/76eig1UfMmkZ7vwgOrzKzlQbFSuQfgm7GYUPpA==} + cpu: [ppc64] + os: [linux] + libc: [glibc] + + '@img/sharp-libvips-linux-riscv64@1.2.4': + resolution: {integrity: sha512-oVDbcR4zUC0ce82teubSm+x6ETixtKZBh/qbREIOcI3cULzDyb18Sr/Wcyx7NRQeQzOiHTNbZFF1UwPS2scyGA==} + cpu: [riscv64] + os: [linux] + libc: [glibc] + + '@img/sharp-libvips-linux-s390x@1.2.4': + resolution: {integrity: sha512-qmp9VrzgPgMoGZyPvrQHqk02uyjA0/QrTO26Tqk6l4ZV0MPWIW6LTkqOIov+J1yEu7MbFQaDpwdwJKhbJvuRxQ==} + cpu: [s390x] + os: [linux] + libc: [glibc] + + '@img/sharp-libvips-linux-x64@1.2.4': + resolution: {integrity: sha512-tJxiiLsmHc9Ax1bz3oaOYBURTXGIRDODBqhveVHonrHJ9/+k89qbLl0bcJns+e4t4rvaNBxaEZsFtSfAdquPrw==} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@img/sharp-libvips-linuxmusl-arm64@1.2.4': + resolution: {integrity: sha512-FVQHuwx1IIuNow9QAbYUzJ+En8KcVm9Lk5+uGUQJHaZmMECZmOlix9HnH7n1TRkXMS0pGxIJokIVB9SuqZGGXw==} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@img/sharp-libvips-linuxmusl-x64@1.2.4': + resolution: {integrity: sha512-+LpyBk7L44ZIXwz/VYfglaX/okxezESc6UxDSoyo2Ks6Jxc4Y7sGjpgU9s4PMgqgjj1gZCylTieNamqA1MF7Dg==} + cpu: [x64] + os: [linux] + libc: [musl] + + '@img/sharp-linux-arm64@0.34.5': + resolution: {integrity: sha512-bKQzaJRY/bkPOXyKx5EVup7qkaojECG6NLYswgktOZjaXecSAeCWiZwwiFf3/Y+O1HrauiE3FVsGxFg8c24rZg==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@img/sharp-linux-arm@0.34.5': + resolution: {integrity: sha512-9dLqsvwtg1uuXBGZKsxem9595+ujv0sJ6Vi8wcTANSFpwV/GONat5eCkzQo/1O6zRIkh0m/8+5BjrRr7jDUSZw==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm] + os: [linux] + libc: [glibc] + + '@img/sharp-linux-ppc64@0.34.5': + resolution: {integrity: sha512-7zznwNaqW6YtsfrGGDA6BRkISKAAE1Jo0QdpNYXNMHu2+0dTrPflTLNkpc8l7MUP5M16ZJcUvysVWWrMefZquA==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [ppc64] + os: [linux] + libc: [glibc] + + '@img/sharp-linux-riscv64@0.34.5': + resolution: {integrity: sha512-51gJuLPTKa7piYPaVs8GmByo7/U7/7TZOq+cnXJIHZKavIRHAP77e3N2HEl3dgiqdD/w0yUfiJnII77PuDDFdw==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [riscv64] + os: [linux] + libc: [glibc] + + '@img/sharp-linux-s390x@0.34.5': + resolution: {integrity: sha512-nQtCk0PdKfho3eC5MrbQoigJ2gd1CgddUMkabUj+rBevs8tZ2cULOx46E7oyX+04WGfABgIwmMC0VqieTiR4jg==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [s390x] + os: [linux] + libc: [glibc] + + '@img/sharp-linux-x64@0.34.5': + resolution: {integrity: sha512-MEzd8HPKxVxVenwAa+JRPwEC7QFjoPWuS5NZnBt6B3pu7EG2Ge0id1oLHZpPJdn3OQK+BQDiw9zStiHBTJQQQQ==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@img/sharp-linuxmusl-arm64@0.34.5': + resolution: {integrity: sha512-fprJR6GtRsMt6Kyfq44IsChVZeGN97gTD331weR1ex1c1rypDEABN6Tm2xa1wE6lYb5DdEnk03NZPqA7Id21yg==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@img/sharp-linuxmusl-x64@0.34.5': + resolution: {integrity: sha512-Jg8wNT1MUzIvhBFxViqrEhWDGzqymo3sV7z7ZsaWbZNDLXRJZoRGrjulp60YYtV4wfY8VIKcWidjojlLcWrd8Q==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [linux] + libc: [musl] + + '@img/sharp-wasm32@0.34.5': + resolution: {integrity: sha512-OdWTEiVkY2PHwqkbBI8frFxQQFekHaSSkUIJkwzclWZe64O1X4UlUjqqqLaPbUpMOQk6FBu/HtlGXNblIs0huw==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [wasm32] + + '@img/sharp-win32-arm64@0.34.5': + resolution: {integrity: sha512-WQ3AgWCWYSb2yt+IG8mnC6Jdk9Whs7O0gxphblsLvdhSpSTtmu69ZG1Gkb6NuvxsNACwiPV6cNSZNzt0KPsw7g==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm64] + os: [win32] + + '@img/sharp-win32-ia32@0.34.5': + resolution: {integrity: sha512-FV9m/7NmeCmSHDD5j4+4pNI8Cp3aW+JvLoXcTUo0IqyjSfAZJ8dIUmijx1qaJsIiU+Hosw6xM5KijAWRJCSgNg==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [ia32] + os: [win32] + + '@img/sharp-win32-x64@0.34.5': + resolution: {integrity: sha512-+29YMsqY2/9eFEiW93eqWnuLcWcufowXewwSNIT6UwZdUUCrM3oFjMWH/Z6/TMmb4hlFenmfAVbpWeup2jryCw==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [win32] + + '@jridgewell/gen-mapping@0.3.13': + resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} + + '@jridgewell/remapping@2.3.5': + resolution: {integrity: sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==} + + '@jridgewell/resolve-uri@3.1.2': + resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} + engines: {node: '>=6.0.0'} + + '@jridgewell/sourcemap-codec@1.5.5': + resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} + + '@jridgewell/trace-mapping@0.3.31': + resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} + + '@mdx-js/mdx@3.1.1': + resolution: {integrity: sha512-f6ZO2ifpwAQIpzGWaBQT2TXxPv6z3RBzQKpVftEWN78Vl/YweF1uwussDx8ECAXVtr3Rs89fKyG9YlzUs9DyGQ==} + + '@napi-rs/wasm-runtime@1.1.4': + resolution: {integrity: sha512-3NQNNgA1YSlJb/kMH1ildASP9HW7/7kYnRI2szWJaofaS1hWmbGI4H+d3+22aGzXXN9IJ+n+GiFVcGipJP18ow==} + peerDependencies: + '@emnapi/core': ^1.7.1 + '@emnapi/runtime': ^1.7.1 + + '@next/env@16.1.6': + resolution: {integrity: sha512-N1ySLuZjnAtN3kFnwhAwPvZah8RJxKasD7x1f8shFqhncnWZn4JMfg37diLNuoHsLAlrDfM3g4mawVdtAG8XLQ==} + + '@next/eslint-plugin-next@16.1.6': + resolution: {integrity: sha512-/Qq3PTagA6+nYVfryAtQ7/9FEr/6YVyvOtl6rZnGsbReGLf0jZU6gkpr1FuChAQpvV46a78p4cmHOVP8mbfSMQ==} + + '@next/swc-darwin-arm64@16.1.6': + resolution: {integrity: sha512-wTzYulosJr/6nFnqGW7FrG3jfUUlEf8UjGA0/pyypJl42ExdVgC6xJgcXQ+V8QFn6niSG2Pb8+MIG1mZr2vczw==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [darwin] + + '@next/swc-darwin-x64@16.1.6': + resolution: {integrity: sha512-BLFPYPDO+MNJsiDWbeVzqvYd4NyuRrEYVB5k2N3JfWncuHAy2IVwMAOlVQDFjj+krkWzhY2apvmekMkfQR0CUQ==} + engines: {node: '>= 10'} + cpu: [x64] + os: [darwin] + + '@next/swc-linux-arm64-gnu@16.1.6': + resolution: {integrity: sha512-OJYkCd5pj/QloBvoEcJ2XiMnlJkRv9idWA/j0ugSuA34gMT6f5b7vOiCQHVRpvStoZUknhl6/UxOXL4OwtdaBw==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@next/swc-linux-arm64-musl@16.1.6': + resolution: {integrity: sha512-S4J2v+8tT3NIO9u2q+S0G5KdvNDjXfAv06OhfOzNDaBn5rw84DGXWndOEB7d5/x852A20sW1M56vhC/tRVbccQ==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@next/swc-linux-x64-gnu@16.1.6': + resolution: {integrity: sha512-2eEBDkFlMMNQnkTyPBhQOAyn2qMxyG2eE7GPH2WIDGEpEILcBPI/jdSv4t6xupSP+ot/jkfrCShLAa7+ZUPcJQ==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@next/swc-linux-x64-musl@16.1.6': + resolution: {integrity: sha512-oicJwRlyOoZXVlxmIMaTq7f8pN9QNbdes0q2FXfRsPhfCi8n8JmOZJm5oo1pwDaFbnnD421rVU409M3evFbIqg==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + libc: [musl] + + '@next/swc-win32-arm64-msvc@16.1.6': + resolution: {integrity: sha512-gQmm8izDTPgs+DCWH22kcDmuUp7NyiJgEl18bcr8irXA5N2m2O+JQIr6f3ct42GOs9c0h8QF3L5SzIxcYAAXXw==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [win32] + + '@next/swc-win32-x64-msvc@16.1.6': + resolution: {integrity: sha512-NRfO39AIrzBnixKbjuo2YiYhB6o9d8v/ymU9m/Xk8cyVk+k7XylniXkHwjs4s70wedVffc6bQNbufk5v0xEm0A==} + engines: {node: '>= 10'} + cpu: [x64] + os: [win32] + + '@nodelib/fs.scandir@2.1.5': + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} + + '@nodelib/fs.stat@2.0.5': + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} + + '@nodelib/fs.walk@1.2.8': + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: '>= 8'} + + '@nolyfill/is-core-module@1.0.39': + resolution: {integrity: sha512-nn5ozdjYQpUCZlWGuxcJY/KpxkWQs4DcbMCmKojjyrYDEAGy4Ce19NN4v5MduafTwJlbKc99UA8YhSVqq9yPZA==} + engines: {node: '>=12.4.0'} + + '@orama/orama@3.1.18': + resolution: {integrity: sha512-a61ljmRVVyG5MC/698C8/FfFDw5a8LOIvyOLW5fztgUXqUpc1jOfQzOitSCbge657OgXXThmY3Tk8fpiDb4UcA==} + engines: {node: '>= 20.0.0'} + + '@radix-ui/number@1.1.1': + resolution: {integrity: sha512-MkKCwxlXTgz6CFoJx3pCwn07GKp36+aZyu/u2Ln2VrA5DcdyCZkASEDBTd8x5whTQQL5CiYf4prXKLcgQdv29g==} + + '@radix-ui/primitive@1.1.3': + resolution: {integrity: sha512-JTF99U/6XIjCBo0wqkU5sK10glYe27MRRsfwoiq5zzOEZLHU3A3KCMa5X/azekYRCJ0HlwI0crAXS/5dEHTzDg==} + + '@radix-ui/react-accordion@1.2.12': + resolution: {integrity: sha512-T4nygeh9YE9dLRPhAHSeOZi7HBXo+0kYIPJXayZfvWOWA0+n3dESrZbjfDPUABkUNym6Hd+f2IR113To8D2GPA==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-arrow@1.1.7': + resolution: {integrity: sha512-F+M1tLhO+mlQaOWspE8Wstg+z6PwxwRd8oQ8IXceWz92kfAmalTRf0EjrouQeo7QssEPfCn05B4Ihs1K9WQ/7w==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-collapsible@1.1.12': + resolution: {integrity: sha512-Uu+mSh4agx2ib1uIGPP4/CKNULyajb3p92LsVXmH2EHVMTfZWpll88XJ0j4W0z3f8NK1eYl1+Mf/szHPmcHzyA==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-collection@1.1.7': + resolution: {integrity: sha512-Fh9rGN0MoI4ZFUNyfFVNU4y9LUz93u9/0K+yLgA2bwRojxM8JU1DyvvMBabnZPBgMWREAJvU2jjVzq+LrFUglw==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-compose-refs@1.1.2': + resolution: {integrity: sha512-z4eqJvfiNnFMHIIvXP3CY57y2WJs5g2v3X0zm9mEJkrkNv4rDxu+sg9Jh8EkXyeqBkB7SOcboo9dMVqhyrACIg==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-context@1.1.2': + resolution: {integrity: sha512-jCi/QKUM2r1Ju5a3J64TH2A5SpKAgh0LpknyqdQ4m6DCV0xJ2HG1xARRwNGPQfi1SLdLWZ1OJz6F4OMBBNiGJA==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-dialog@1.1.15': + resolution: {integrity: sha512-TCglVRtzlffRNxRMEyR36DGBLJpeusFcgMVD9PZEzAKnUs1lKCgX5u9BmC2Yg+LL9MgZDugFFs1Vl+Jp4t/PGw==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-direction@1.1.1': + resolution: {integrity: sha512-1UEWRX6jnOA2y4H5WczZ44gOOjTEmlqv1uNW4GAJEO5+bauCBhv8snY65Iw5/VOS/ghKN9gr2KjnLKxrsvoMVw==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-dismissable-layer@1.1.11': + resolution: {integrity: sha512-Nqcp+t5cTB8BinFkZgXiMJniQH0PsUt2k51FUhbdfeKvc4ACcG2uQniY/8+h1Yv6Kza4Q7lD7PQV0z0oicE0Mg==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-focus-guards@1.1.3': + resolution: {integrity: sha512-0rFg/Rj2Q62NCm62jZw0QX7a3sz6QCQU0LpZdNrJX8byRGaGVTqbrW9jAoIAHyMQqsNpeZ81YgSizOt5WXq0Pw==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-focus-scope@1.1.7': + resolution: {integrity: sha512-t2ODlkXBQyn7jkl6TNaw/MtVEVvIGelJDCG41Okq/KwUsJBwQ4XVZsHAVUkK4mBv3ewiAS3PGuUWuY2BoK4ZUw==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-id@1.1.1': + resolution: {integrity: sha512-kGkGegYIdQsOb4XjsfM97rXsiHaBwco+hFI66oO4s9LU+PLAC5oJ7khdOVFxkhsmlbpUqDAvXw11CluXP+jkHg==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-navigation-menu@1.2.14': + resolution: {integrity: sha512-YB9mTFQvCOAQMHU+C/jVl96WmuWeltyUEpRJJky51huhds5W2FQr1J8D/16sQlf0ozxkPK8uF3niQMdUwZPv5w==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-popover@1.1.15': + resolution: {integrity: sha512-kr0X2+6Yy/vJzLYJUPCZEc8SfQcf+1COFoAqauJm74umQhta9M7lNJHP7QQS3vkvcGLQUbWpMzwrXYwrYztHKA==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-popper@1.2.8': + resolution: {integrity: sha512-0NJQ4LFFUuWkE7Oxf0htBKS6zLkkjBH+hM1uk7Ng705ReR8m/uelduy1DBo0PyBXPKVnBA6YBlU94MBGXrSBCw==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-portal@1.1.9': + resolution: {integrity: sha512-bpIxvq03if6UNwXZ+HTK71JLh4APvnXntDc6XOX8UVq4XQOVl7lwok0AvIl+b8zgCw3fSaVTZMpAPPagXbKmHQ==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-presence@1.1.5': + resolution: {integrity: sha512-/jfEwNDdQVBCNvjkGit4h6pMOzq8bHkopq458dPt2lMjx+eBQUohZNG9A7DtO/O5ukSbxuaNGXMjHicgwy6rQQ==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-primitive@2.1.3': + resolution: {integrity: sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-roving-focus@1.1.11': + resolution: {integrity: sha512-7A6S9jSgm/S+7MdtNDSb+IU859vQqJ/QAtcYQcfFC6W8RS4IxIZDldLR0xqCFZ6DCyrQLjLPsxtTNch5jVA4lA==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-scroll-area@1.2.10': + resolution: {integrity: sha512-tAXIa1g3sM5CGpVT0uIbUx/U3Gs5N8T52IICuCtObaos1S8fzsrPXG5WObkQN3S6NVl6wKgPhAIiBGbWnvc97A==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-select@2.2.6': + resolution: {integrity: sha512-I30RydO+bnn2PQztvo25tswPH+wFBjehVGtmagkU78yMdwTwVf12wnAOF+AeP8S2N8xD+5UPbGhkUfPyvT+mwQ==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-slot@1.2.3': + resolution: {integrity: sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-slot@1.2.4': + resolution: {integrity: sha512-Jl+bCv8HxKnlTLVrcDE8zTMJ09R9/ukw4qBs/oZClOfoQk/cOTbDn+NceXfV7j09YPVQUryJPHurafcSg6EVKA==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-tabs@1.1.13': + resolution: {integrity: sha512-7xdcatg7/U+7+Udyoj2zodtI9H/IIopqo+YOIcZOq1nJwXWBZ9p8xiu5llXlekDbZkca79a/fozEYQXIA4sW6A==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-use-callback-ref@1.1.1': + resolution: {integrity: sha512-FkBMwD+qbGQeMu1cOHnuGB6x4yzPjho8ap5WtbEJ26umhgqVXbhekKUQO+hZEL1vU92a3wHwdp0HAcqAUF5iDg==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-use-controllable-state@1.2.2': + resolution: {integrity: sha512-BjasUjixPFdS+NKkypcyyN5Pmg83Olst0+c6vGov0diwTEo6mgdqVR6hxcEgFuh4QrAs7Rc+9KuGJ9TVCj0Zzg==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-use-effect-event@0.0.2': + resolution: {integrity: sha512-Qp8WbZOBe+blgpuUT+lw2xheLP8q0oatc9UpmiemEICxGvFLYmHm9QowVZGHtJlGbS6A6yJ3iViad/2cVjnOiA==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-use-escape-keydown@1.1.1': + resolution: {integrity: sha512-Il0+boE7w/XebUHyBjroE+DbByORGR9KKmITzbR7MyQ4akpORYP/ZmbhAr0DG7RmmBqoOnZdy2QlvajJ2QA59g==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-use-layout-effect@1.1.1': + resolution: {integrity: sha512-RbJRS4UWQFkzHTTwVymMTUv8EqYhOp8dOOviLj2ugtTiXRaRQS7GLGxZTLL1jWhMeoSCf5zmcZkqTl9IiYfXcQ==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-use-previous@1.1.1': + resolution: {integrity: sha512-2dHfToCj/pzca2Ck724OZ5L0EVrr3eHRNsG/b3xQJLA2hZpVCS99bLAX+hm1IHXDEnzU6by5z/5MIY794/a8NQ==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-use-rect@1.1.1': + resolution: {integrity: sha512-QTYuDesS0VtuHNNvMh+CjlKJ4LJickCMUAqjlE3+j8w+RlRpwyX3apEQKGFzbZGdo7XNG1tXa+bQqIE7HIXT2w==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-use-size@1.1.1': + resolution: {integrity: sha512-ewrXRDTAqAXlkl6t/fkXWNAhFX9I+CkKlw6zjEwk86RSPKwZr3xpBRso655aqYafwtnbpHLj6toFzmd6xdVptQ==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-visually-hidden@1.2.3': + resolution: {integrity: sha512-pzJq12tEaaIhqjbzpCuv/OypJY/BPavOofm+dbab+MHLajy277+1lLm6JFcGgF5eskJ6mquGirhXY2GD/8u8Ug==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/rect@1.1.1': + resolution: {integrity: sha512-HPwpGIzkl28mWyZqG52jiqDJ12waP11Pa1lGoiyUkIEuMLBP0oeK/C89esbXrxsky5we7dfd8U58nm0SgAWpVw==} + + '@rtsao/scc@1.1.0': + resolution: {integrity: sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==} + + '@shikijs/core@4.1.0': + resolution: {integrity: sha512-jLJtSJeuFffqX6/inRE1zqU5aFv2hrszvYgq3OjbAgFRZiWv7abKMDdQzYxuSDfmUPQozZvI/kuy6VMTvnvqTQ==} + engines: {node: '>=20'} + + '@shikijs/engine-javascript@4.1.0': + resolution: {integrity: sha512-YquhawCUgaBfhsS72e2Y/dI59gCBNPHu3fEO/tvLaXrTssxZrY5ddjtNLTwndrMgPo8b3IscE+xoICDzpTmlFQ==} + engines: {node: '>=20'} + + '@shikijs/engine-oniguruma@4.1.0': + resolution: {integrity: sha512-axLpjVs45YBvvINa+dJF+NPW+KtFkNXsFr4SDw2BMj9GdeMnGxVB9PQb2xXlJYovslt/nz6giedAyOANkfc7hg==} + engines: {node: '>=20'} + + '@shikijs/langs@4.1.0': + resolution: {integrity: sha512-nwOMruEkbgdZfQ/b8CgpNBVOpvG1k0N5tbmgiFeqsan401+x3ILqlzZJowSla4Agmq4hG2Uf2wh5jLTEhR8VSg==} + engines: {node: '>=20'} + + '@shikijs/primitive@4.1.0': + resolution: {integrity: sha512-zx2/2Uwj2q9X3KSyYREEhXO23xBw5WUhP4orK2lE4r+t9JGITmEe0JH+wPmJhqHpOT2bRRs6lAL945+LDvOAGw==} + engines: {node: '>=20'} + + '@shikijs/themes@4.1.0': + resolution: {integrity: sha512-emCcTnUM7yO2wltYbaxm+yLvcCI4+h8XBKc4KmJ7EZUXoSGjcCHifkI//R4OFit9ewpg7H2/9tjOuXrT2v/Knw==} + engines: {node: '>=20'} + + '@shikijs/types@4.1.0': + resolution: {integrity: sha512-3EQWX54fMpniOrDblzAhiwiJwpiTMW6+B9DWyUd9ska483tbayFYuw47UxwuPknI31bKnySfVQ/QW+jFL4rFdA==} + engines: {node: '>=20'} + + '@shikijs/vscode-textmate@10.0.2': + resolution: {integrity: sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==} + + '@standard-schema/spec@1.1.0': + resolution: {integrity: sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==} + + '@swc/helpers@0.5.15': + resolution: {integrity: sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==} + + '@tailwindcss/node@4.3.0': + resolution: {integrity: sha512-aFb4gUhFOgdh9AXo4IzBEOzBkkAxm9VigwDJnMIYv3lcfXCJVesNfbEaBl4BNgVRyid92AmdviqwBUBRKSeY3g==} + + '@tailwindcss/oxide-android-arm64@4.3.0': + resolution: {integrity: sha512-TJPiq67tKlLuObP6RkwvVGDoxCMBVtDgKkLfa/uyj7/FyxvQwHS+UOnVrXXgbEsfUaMgiVvC4KbJnRr26ho4Ng==} + engines: {node: '>= 20'} + cpu: [arm64] + os: [android] + + '@tailwindcss/oxide-darwin-arm64@4.3.0': + resolution: {integrity: sha512-oMN/WZRb+SO37BmUElEgeEWuU8E/HXRkiODxJxLe1UTHVXLrdVSgfaJV7pSlhRGMSOiXLuxTIjfsF3wYvz8cgQ==} + engines: {node: '>= 20'} + cpu: [arm64] + os: [darwin] + + '@tailwindcss/oxide-darwin-x64@4.3.0': + resolution: {integrity: sha512-N6CUmu4a6bKVADfw77p+iw6Yd9Q3OBhe0veaDX+QazfuVYlQsHfDgxBrsjQ/IW+zywL8mTrNd0SdJT/zgtvMdA==} + engines: {node: '>= 20'} + cpu: [x64] + os: [darwin] + + '@tailwindcss/oxide-freebsd-x64@4.3.0': + resolution: {integrity: sha512-zDL5hBkQdH5C6MpqbK3gQAgP80tsMwSI26vjOzjJtNCMUo0lFgOItzHKBIupOZNQxt3ouPH7RPhvNhiTfCe5CQ==} + engines: {node: '>= 20'} + cpu: [x64] + os: [freebsd] + + '@tailwindcss/oxide-linux-arm-gnueabihf@4.3.0': + resolution: {integrity: sha512-R06HdNi7A7OEoMsf6d4tjZ71RCWnZQPHj2mnotSFURjNLdBC+cIgXQ7l81CqeoiQftjf6OOblxXMInMgN2VzMA==} + engines: {node: '>= 20'} + cpu: [arm] + os: [linux] + + '@tailwindcss/oxide-linux-arm64-gnu@4.3.0': + resolution: {integrity: sha512-qTJHELX8jetjhRQHCLilkVLmybpzNQAtaI/gaoVoidn/ufbNDbAo8KlK2J+yPoc8wQxvDxCmh/5lr8nC1+lTbg==} + engines: {node: '>= 20'} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@tailwindcss/oxide-linux-arm64-musl@4.3.0': + resolution: {integrity: sha512-Z6sukiQsngnWO+l39X4pPbiWT81IC+PLKF+PHxIlyZbGNb9MODfYlXEVlFvej5BOZInWX01kVyzeLvHsXhfczQ==} + engines: {node: '>= 20'} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@tailwindcss/oxide-linux-x64-gnu@4.3.0': + resolution: {integrity: sha512-DRNdQRpSGzRGfARVuVkxvM8Q12nh19l4BF/G7zGA1oe+9wcC6saFBHTISrpIcKzhiXtSrlSrluCfvMuledoCTQ==} + engines: {node: '>= 20'} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@tailwindcss/oxide-linux-x64-musl@4.3.0': + resolution: {integrity: sha512-Z0IADbDo8bh6I7h2IQMx601AdXBLfFpEdUotft86evd/8ZPflZe9COPO8Q1vw+pfLWIUo9zN/JGZvwuAJqduqg==} + engines: {node: '>= 20'} + cpu: [x64] + os: [linux] + libc: [musl] + + '@tailwindcss/oxide-wasm32-wasi@4.3.0': + resolution: {integrity: sha512-HNZGOUxEmElksYR7S6sC5jTeNGpobAsy9u7Gu0AskJ8/20FR9GqebUyB+HBcU/ax6BHuiuJi+Oda4B+YX6H1yA==} + engines: {node: '>=14.0.0'} + cpu: [wasm32] + bundledDependencies: + - '@napi-rs/wasm-runtime' + - '@emnapi/core' + - '@emnapi/runtime' + - '@tybys/wasm-util' + - '@emnapi/wasi-threads' + - tslib + + '@tailwindcss/oxide-win32-arm64-msvc@4.3.0': + resolution: {integrity: sha512-Pe+RPVTi1T+qymuuRpcdvwSVZjnll/f7n8gBxMMh3xLTctMDKqpdfGimbMyioqtLhUYZxdJ9wGNhV7MKHvgZsQ==} + engines: {node: '>= 20'} + cpu: [arm64] + os: [win32] + + '@tailwindcss/oxide-win32-x64-msvc@4.3.0': + resolution: {integrity: sha512-Mvrf2kXW/yeW/OTezZlCGOirXRcUuLIBx/5Y12BaPM7wJoryG6dfS/NJL8aBPqtTEx/Vm4T4vKzFUcKDT+TKUA==} + engines: {node: '>= 20'} + cpu: [x64] + os: [win32] + + '@tailwindcss/oxide@4.3.0': + resolution: {integrity: sha512-F7HZGBeN9I0/AuuJS5PwcD8xayx5ri5GhjYUDBEVYUkexyA/giwbDNjRVrxSezE3T250OU2K/wp/ltWx3UOefg==} + engines: {node: '>= 20'} + + '@tailwindcss/postcss@4.3.0': + resolution: {integrity: sha512-Jm05Tjx+9yCLGv5qw1c+84Psds8MnyrEQYCB+FFk2lgGiUjlRqdxke4mVTuYrj2xnVZqKim2Apr5ySuQRYAw/w==} + + '@tybys/wasm-util@0.10.2': + resolution: {integrity: sha512-RoBvJ2X0wuKlWFIjrwffGw1IqZHKQqzIchKaadZZfnNpsAYp2mM0h36JtPCjNDAHGgYez/15uMBpfGwchhiMgg==} + + '@types/debug@4.1.13': + resolution: {integrity: sha512-KSVgmQmzMwPlmtljOomayoR89W4FynCAi3E8PPs7vmDVPe84hT+vGPKkJfThkmXs0x0jAaa9U8uW8bbfyS2fWw==} + + '@types/esrecurse@4.3.1': + resolution: {integrity: sha512-xJBAbDifo5hpffDBuHl0Y8ywswbiAp/Wi7Y/GtAgSlZyIABppyurxVueOPE8LUQOxdlgi6Zqce7uoEpqNTeiUw==} + + '@types/estree-jsx@1.0.5': + resolution: {integrity: sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==} + + '@types/estree@1.0.9': + resolution: {integrity: sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==} + + '@types/hast@3.0.4': + resolution: {integrity: sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==} + + '@types/json-schema@7.0.15': + resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} + + '@types/json5@0.0.29': + resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} + + '@types/mdast@4.0.4': + resolution: {integrity: sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==} + + '@types/mdx@2.0.13': + resolution: {integrity: sha512-+OWZQfAYyio6YkJb3HLxDrvnx6SWWDbC0zVPfBRzUk0/nqoDyf6dNxQi3eArPe8rJ473nobTMQ/8Zk+LxJ+Yuw==} + + '@types/ms@2.1.0': + resolution: {integrity: sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==} + + '@types/node@25.3.3': + resolution: {integrity: sha512-DpzbrH7wIcBaJibpKo9nnSQL0MTRdnWttGyE5haGwK86xgMOkFLp7vEyfQPGLOJh5wNYiJ3V9PmUMDhV9u8kkQ==} + + '@types/react-dom@19.2.3': + resolution: {integrity: sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ==} + peerDependencies: + '@types/react': ^19.2.0 + + '@types/react@19.2.15': + resolution: {integrity: sha512-eRwcGNHve+E8qtEQSSRl6urh+rFop4v8gm6O8rGv25CodbvFdLjA1vVQ1KkiFE0w0UPOnb8tDiFKL5lp0rtY5Q==} + + '@types/unist@2.0.11': + resolution: {integrity: sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==} + + '@types/unist@3.0.3': + resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==} + + '@typescript-eslint/eslint-plugin@8.60.0': + resolution: {integrity: sha512-QYb/sa74/s7OKMbACMjrYnGspj9Hs5YI5aaffSL65UfeBUzVzBJfVo3oWSpbzPurvm7yaCCo2Lk7lVj610HqKw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + '@typescript-eslint/parser': ^8.60.0 + eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 + typescript: '>=4.8.4 <6.1.0' + + '@typescript-eslint/parser@8.60.0': + resolution: {integrity: sha512-fcqpj/MyK4sxDPcbe7STNPbpQL4RLZOPWuaTmwZYuc+hJKzRf58yRxfhqGpc6PIq9ZyfSBpfHgmUHmHs0KwHwg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 + typescript: '>=4.8.4 <6.1.0' + + '@typescript-eslint/project-service@8.60.0': + resolution: {integrity: sha512-aZu74NNKJeUWqCjDddzdiKaS82dgYgV/vmf+Ui3ZdZejmgfXR/q+pRumgobnQ2cCJTgGTWp4ypiwsuofFubavg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <6.1.0' + + '@typescript-eslint/scope-manager@8.60.0': + resolution: {integrity: sha512-pFzqhllJMs+jghLQWzV00ds39xLzuyqPSev5pd8f4Ir0rtKR3ZLUB4/4dhjOFighWb9larvtfJvqL+4yKDI3Xw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@typescript-eslint/tsconfig-utils@8.60.0': + resolution: {integrity: sha512-BZPR3RGYlAXnly6ymAxfkVn5rCbZzQNou0rxv3GfWZ8cTQp+hhVd73khbGLAd8k1TlAPLISH337M+tAgAnaJDQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <6.1.0' + + '@typescript-eslint/type-utils@8.60.0': + resolution: {integrity: sha512-SX46wEUtitCpq7AN38HkUU/+zvUpdKf7ephtWAFgckH8O7PQIyL5gvrhQgBLuEYgLfuKWOVvWVskMbuFHAz5xg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 + typescript: '>=4.8.4 <6.1.0' + + '@typescript-eslint/types@8.60.0': + resolution: {integrity: sha512-AsE7x2XaAK+CVbeih0Fvbn+r1qHxtpLDJ3XUuFcIinT318T90yHMJC+Zgv+jUuDjQQd06HKwxnDu6sz1IcTilA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@typescript-eslint/typescript-estree@8.60.0': + resolution: {integrity: sha512-3AcZNBGMClm6CXDyo8kYvVGT/sx29sS0oBsIb9oZI2gunA4Vm2M3YHzRLPvsUBBsl+yB5FPtltq7gGH0iTlp9g==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <6.1.0' + + '@typescript-eslint/utils@8.60.0': + resolution: {integrity: sha512-HtXuPfrHTyBDkameWpl+vJb1Uevu2tznAyahM1Oc4AENidCLTPiZDWIo4GfcxNdC/RcfGcadzzkqbRG87dUrQA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 + typescript: '>=4.8.4 <6.1.0' + + '@typescript-eslint/visitor-keys@8.60.0': + resolution: {integrity: sha512-9WI52t8ZGLVGrPMBet25yAftqY/n95+zmoUUtJBBQTKDSKUu7OsPTroT2op7U9JatkoRccL0YkWDNMFfC4Sjxg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@ungap/structured-clone@1.3.1': + resolution: {integrity: sha512-mUFwbeTqrVgDQxFveS+df2yfap6iuP20NAKAsBt5jDEoOTDew+zwLAOilHCeQJOVSvmgCX4ogqIrA0mnyr08yQ==} + + '@unrs/resolver-binding-android-arm-eabi@1.12.2': + resolution: {integrity: sha512-g5T90pqg1bo/7mytQx6F4iBNC0Wsh9cu+z9veDbFjc7HjpesJFWD7QMS0NGStXM075+7dJPPVvBbpZlnrdpi/w==} + cpu: [arm] + os: [android] + + '@unrs/resolver-binding-android-arm64@1.12.2': + resolution: {integrity: sha512-YGCRZv/9GLhwmz6mYDeTsm/92BAyR28l6c2ReweVW5pWgfsitWLY8upvfRlGdoyD8HjeTHSYJWyZGD4KJA/nFQ==} + cpu: [arm64] + os: [android] + + '@unrs/resolver-binding-darwin-arm64@1.12.2': + resolution: {integrity: sha512-u9DiNT1auQMO20A9SyTuG3wUgQWB9Z7KjAg0uFuCDR1FsAY8A0CG2S6JpHS1xwm/w1G08bjXZDcyOCjv1WAm2w==} + cpu: [arm64] + os: [darwin] + + '@unrs/resolver-binding-darwin-x64@1.12.2': + resolution: {integrity: sha512-f7rPLi/T1HVKZu/u6t87lroib16n8vrSzcyxI7lg4BGO9UF26KhQL44sd9eOUgrTYhvRXtWOIZT5PejdPyJfUA==} + cpu: [x64] + os: [darwin] + + '@unrs/resolver-binding-freebsd-x64@1.12.2': + resolution: {integrity: sha512-BpcOjWCJub6nRZUS2zA20pmLvjtqAtGejETaIyRLiZiQf++cbrjltLA5NN/xaXfqeOBOSlMFbemIl5/S5tljmg==} + cpu: [x64] + os: [freebsd] + + '@unrs/resolver-binding-linux-arm-gnueabihf@1.12.2': + resolution: {integrity: sha512-vZTDvdSISZjJx66OzJqtsOhzifbqRjbmI1Mnu49fQDwog5GtDI4QidRiEAYbZCRj9C8YZEW+3ZjqsyS9GR4k2A==} + cpu: [arm] + os: [linux] + + '@unrs/resolver-binding-linux-arm-musleabihf@1.12.2': + resolution: {integrity: sha512-BiPI+IrIlwcW4nLLMM21+B1dFPzd55yAVgVGrdgDjNef+ch03GdxrcyaIz8X9SsQirh/kCQ7mviyWlMxdh2D7g==} + cpu: [arm] + os: [linux] + + '@unrs/resolver-binding-linux-arm64-gnu@1.12.2': + resolution: {integrity: sha512-zJc0H99FEPoFfSrNpa91HYfxzfAJCr502oxNK1cfdC9hlaFI43RT+JFCann9JUgZmLzzntChHyn13Sgn9ljHNg==} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@unrs/resolver-binding-linux-arm64-musl@1.12.2': + resolution: {integrity: sha512-KQ3Lki6l+Pz1k/eBipN41ES+YUK30beLGb9YqcB1O542cyLCNE6GaxrfcY3T6EezmGGk84wb5XyO9loTM9tkcA==} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@unrs/resolver-binding-linux-loong64-gnu@1.12.2': + resolution: {integrity: sha512-3SJGEh1DborhG6pyxvhPzCT4bbSIVihsvgJc13P1bHG7KLdNDaF9T3gsTwFc7Jw/5Y5/iWOjkEx7Zy0NvCGX3Q==} + cpu: [loong64] + os: [linux] + libc: [glibc] + + '@unrs/resolver-binding-linux-loong64-musl@1.12.2': + resolution: {integrity: sha512-jiuG/Obbel7uw1PwHNFfrkiKhLAF6mnyZ6aWlOAVN9WqKm8v0OFGnciJIHu8+CMvXLQ8AD51LPzAoUfT21D5Ew==} + cpu: [loong64] + os: [linux] + libc: [musl] + + '@unrs/resolver-binding-linux-ppc64-gnu@1.12.2': + resolution: {integrity: sha512-q7xRvVpmcfeL+LlZg8Pbbo6QaTZwDU5BaGZbwfhkEsXJn3Was8xYfE0RBH266xZt0rM6B7i8xAYIvjthuUIWHg==} + cpu: [ppc64] + os: [linux] + libc: [glibc] + + '@unrs/resolver-binding-linux-riscv64-gnu@1.12.2': + resolution: {integrity: sha512-0CVdx6lcnT3Q9inOH8tsMIOJ6ImndllMjqJHg8RLVdB7Vq4SfkEXl9mCSsVNuNA4MCYycRicCUxPCabVHJRr6A==} + cpu: [riscv64] + os: [linux] + libc: [glibc] + + '@unrs/resolver-binding-linux-riscv64-musl@1.12.2': + resolution: {integrity: sha512-iOwlRo9vnp6R6ohHQS11n0NnfdXx/omhkocmIfaPRpQhKZ+3BDMkkdRVh53qjkFkpPddf+FETA28NwGN7l5l+w==} + cpu: [riscv64] + os: [linux] + libc: [musl] + + '@unrs/resolver-binding-linux-s390x-gnu@1.12.2': + resolution: {integrity: sha512-HYJtLfXq94q8iZNFT1lknx258wlkkWhZeUXJRqzKBBUJ00CvZ+N33zgbCqimLjsyw5Va6uUxhVa12mI+kaveEw==} + cpu: [s390x] + os: [linux] + libc: [glibc] + + '@unrs/resolver-binding-linux-x64-gnu@1.12.2': + resolution: {integrity: sha512-mPsUhunKKDih5O96Y6enDQyHc1SqBPlY1E/SfMWDM3EdJ95Z9CArPeCVwCCqbP45ljvivdEk8Fxn+SIb1rDAJQ==} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@unrs/resolver-binding-linux-x64-musl@1.12.2': + resolution: {integrity: sha512-azrt6+5ydLd8Vt210AAFis/lZevSfPw93EJRIJG+xPu4WCJ8K0kppCTpMyLPcKT7H15M4Jnt2tMp5bOvCkRC6A==} + cpu: [x64] + os: [linux] + libc: [musl] + + '@unrs/resolver-binding-openharmony-arm64@1.12.2': + resolution: {integrity: sha512-YZ9hP4O0X9PQb8eO980qmLNGH4zT3I9+SZTdt0Pr0YyuGQhYKoOZkV02VzrzyOZJ5xIJ3UFIenKkUkGg8GjgWQ==} + cpu: [arm64] + os: [openharmony] + + '@unrs/resolver-binding-wasm32-wasi@1.12.2': + resolution: {integrity: sha512-tYFDIkMxSflfEc/h92ZWNsZlHSwgimbNHSO3PL2JWQHfCuC2q316jMyYU9TIWZsFK2bQwyK5VAdYgn8ygPj69A==} + engines: {node: '>=14.0.0'} + cpu: [wasm32] + + '@unrs/resolver-binding-win32-arm64-msvc@1.12.2': + resolution: {integrity: sha512-qzNyg3xL0VPQmCaUh+N5jSitce6k+uCBfMDesWRnlULOZaqUkaJ0ybdT+UqlAWJoQjuqfIU/0Ptx9bteN4D82g==} + cpu: [arm64] + os: [win32] + + '@unrs/resolver-binding-win32-ia32-msvc@1.12.2': + resolution: {integrity: sha512-WD9sY00OfpHVGfsnHZoA8jVT+esS/Bg8z8jzxp5BnDCjjwsuKsPQrzswwpFy4J1AUJbXPRfkpcX0mXrzeXW79g==} + cpu: [ia32] + os: [win32] + + '@unrs/resolver-binding-win32-x64-msvc@1.12.2': + resolution: {integrity: sha512-nAB74NfSNKknqQ1RrYj6uz8FcXEomu/MATJZxh/x+BArzN2U3JbOYC0APYzUIGhVY3m5hRxA8VPNdPBoG8txlA==} + cpu: [x64] + os: [win32] + + acorn-jsx@5.3.2: + resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + + acorn@8.16.0: + resolution: {integrity: sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==} + engines: {node: '>=0.4.0'} + hasBin: true + + ajv@6.15.0: + resolution: {integrity: sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==} + + argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + + aria-hidden@1.2.6: + resolution: {integrity: sha512-ik3ZgC9dY/lYVVM++OISsaYDeg1tb0VtP5uL3ouh1koGOaUMDPpbFIei4JkFimWUFPn90sbMNMXQAIVOlnYKJA==} + engines: {node: '>=10'} + + aria-query@5.3.2: + resolution: {integrity: sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==} + engines: {node: '>= 0.4'} + + array-buffer-byte-length@1.0.2: + resolution: {integrity: sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==} + engines: {node: '>= 0.4'} + + array-includes@3.1.9: + resolution: {integrity: sha512-FmeCCAenzH0KH381SPT5FZmiA/TmpndpcaShhfgEN9eCVjnFBqq3l1xrI42y8+PPLI6hypzou4GXw00WHmPBLQ==} + engines: {node: '>= 0.4'} + + array.prototype.findlast@1.2.5: + resolution: {integrity: sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==} + engines: {node: '>= 0.4'} + + array.prototype.findlastindex@1.2.6: + resolution: {integrity: sha512-F/TKATkzseUExPlfvmwQKGITM3DGTK+vkAsCZoDc5daVygbJBnjEUCbgkAvVFsgfXfX4YIqZ/27G3k3tdXrTxQ==} + engines: {node: '>= 0.4'} + + array.prototype.flat@1.3.3: + resolution: {integrity: sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==} + engines: {node: '>= 0.4'} + + array.prototype.flatmap@1.3.3: + resolution: {integrity: sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==} + engines: {node: '>= 0.4'} + + array.prototype.tosorted@1.1.4: + resolution: {integrity: sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==} + engines: {node: '>= 0.4'} + + arraybuffer.prototype.slice@1.0.4: + resolution: {integrity: sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==} + engines: {node: '>= 0.4'} + + ast-types-flow@0.0.8: + resolution: {integrity: sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==} + + astring@1.9.0: + resolution: {integrity: sha512-LElXdjswlqjWrPpJFg1Fx4wpkOCxj1TDHlSV4PlaRxHGWko024xICaa97ZkMfs6DRKlCguiAI+rbXv5GWwXIkg==} + hasBin: true + + async-function@1.0.0: + resolution: {integrity: sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==} + engines: {node: '>= 0.4'} + + available-typed-arrays@1.0.7: + resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} + engines: {node: '>= 0.4'} + + axe-core@4.11.4: + resolution: {integrity: sha512-KunSNx+TVpkAw/6ULfhnx+HWRecjqZGTOyquAoWHYLRSdK1tB5Ihce1ZW+UY3fj33bYAFWPu7W/GRSmmrCGuxA==} + engines: {node: '>=4'} + + axobject-query@4.1.0: + resolution: {integrity: sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==} + engines: {node: '>= 0.4'} + + bail@2.0.2: + resolution: {integrity: sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==} + + balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + + balanced-match@4.0.4: + resolution: {integrity: sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==} + engines: {node: 18 || 20 || >=22} + + baseline-browser-mapping@2.10.33: + resolution: {integrity: sha512-bA6+tcSLpz2tIEdDXZPpPTIuxBcC4+w6SieaYyfigIa4h8GlFxbA17v22Vx3JUtuZQj9SgOsnbK+aTBzyDyEuw==} + engines: {node: '>=6.0.0'} + hasBin: true + + brace-expansion@1.1.15: + resolution: {integrity: sha512-EwOCDEex4quD37XhqM3omwtMoJjr//isUZz1JopUNWms+4Z2ViyM/k1YIRePpoVNnQhENnxtFjLaxNHrT7xIUg==} + + brace-expansion@5.0.6: + resolution: {integrity: sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g==} + engines: {node: 18 || 20 || >=22} + + braces@3.0.3: + resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} + engines: {node: '>=8'} + + browserslist@4.28.2: + resolution: {integrity: sha512-48xSriZYYg+8qXna9kwqjIVzuQxi+KYWp2+5nCYnYKPTr0LvD89Jqk2Or5ogxz0NUMfIjhh2lIUX/LyX9B4oIg==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + + call-bind-apply-helpers@1.0.2: + resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} + engines: {node: '>= 0.4'} + + call-bind@1.0.9: + resolution: {integrity: sha512-a/hy+pNsFUTR+Iz8TCJvXudKVLAnz/DyeSUo10I5yvFDQJBFU2s9uqQpoSrJlroHUKoKqzg+epxyP9lqFdzfBQ==} + engines: {node: '>= 0.4'} + + call-bound@1.0.4: + resolution: {integrity: sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==} + engines: {node: '>= 0.4'} + + caniuse-lite@1.0.30001793: + resolution: {integrity: sha512-iwSsYWaCOoh26cV8NwNRViHlrfUvYsHDfRVcbtmw0Kg6PJIZZXwMkj1442FYLBGkeUf1juAsU3DTfxW579mrPA==} + + ccount@2.0.1: + resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} + + character-entities-html4@2.1.0: + resolution: {integrity: sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==} + + character-entities-legacy@3.0.0: + resolution: {integrity: sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==} + + character-entities@2.0.2: + resolution: {integrity: sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==} + + character-reference-invalid@2.0.1: + resolution: {integrity: sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==} + + chokidar@5.0.0: + resolution: {integrity: sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw==} + engines: {node: '>= 20.19.0'} + + class-variance-authority@0.7.1: + resolution: {integrity: sha512-Ka+9Trutv7G8M6WT6SeiRWz792K5qEqIGEGzXKhAE6xOWAY6pPH8U+9IY3oCMv6kqTmLsv7Xh/2w2RigkePMsg==} + + client-only@0.0.1: + resolution: {integrity: sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==} + + clsx@2.1.1: + resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==} + engines: {node: '>=6'} + + collapse-white-space@2.1.0: + resolution: {integrity: sha512-loKTxY1zCOuG4j9f6EPnuyyYkf58RnhhWTvRoZEokgB+WbdXehfjFviyOVYkqzEWz1Q5kRiZdBYS5SwxbQYwzw==} + + comma-separated-tokens@2.0.3: + resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==} + + compute-scroll-into-view@3.1.1: + resolution: {integrity: sha512-VRhuHOLoKYOy4UbilLbUzbYg93XLjv2PncJC50EuTWPA3gaja1UjBsUP/D/9/juV3vQFr6XBEzn9KCAHdUvOHw==} + + concat-map@0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + + convert-source-map@2.0.0: + resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} + + cross-spawn@7.0.6: + resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} + engines: {node: '>= 8'} + + csstype@3.2.3: + resolution: {integrity: sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==} + + damerau-levenshtein@1.0.8: + resolution: {integrity: sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==} + + data-view-buffer@1.0.2: + resolution: {integrity: sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==} + engines: {node: '>= 0.4'} + + data-view-byte-length@1.0.2: + resolution: {integrity: sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==} + engines: {node: '>= 0.4'} + + data-view-byte-offset@1.0.1: + resolution: {integrity: sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==} + engines: {node: '>= 0.4'} + + debug@3.2.7: + resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + debug@4.4.3: + resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + decode-named-character-reference@1.3.0: + resolution: {integrity: sha512-GtpQYB283KrPp6nRw50q3U9/VfOutZOe103qlN7BPP6Ad27xYnOIWv4lPzo8HCAL+mMZofJ9KEy30fq6MfaK6Q==} + + deep-is@0.1.4: + resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + + define-data-property@1.1.4: + resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} + engines: {node: '>= 0.4'} + + define-properties@1.2.1: + resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} + engines: {node: '>= 0.4'} + + dequal@2.0.3: + resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} + engines: {node: '>=6'} + + detect-libc@2.1.2: + resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==} + engines: {node: '>=8'} + + detect-node-es@1.1.0: + resolution: {integrity: sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==} + + devlop@1.1.0: + resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==} + + doctrine@2.1.0: + resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} + engines: {node: '>=0.10.0'} + + dunder-proto@1.0.1: + resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} + engines: {node: '>= 0.4'} + + electron-to-chromium@1.5.364: + resolution: {integrity: sha512-G/dYE3+AYhyHwzTwg8UbnXf7zqMERYh7l2jJ3QujhFsH8agSYwtnGAR2aZ7f0AakIKJXd5En/Hre4igIUrdlYw==} + + emoji-regex@9.2.2: + resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + + enhanced-resolve@5.22.1: + resolution: {integrity: sha512-6QEuw3zoX1SJQc7b87aBXke/no+mG2bTBgw29gWMQonLmpEkWoCAVkl+M49e48AZlWzxiDzDZzYdp6kobcyLww==} + engines: {node: '>=10.13.0'} + + entities@6.0.1: + resolution: {integrity: sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==} + engines: {node: '>=0.12'} + + es-abstract@1.24.2: + resolution: {integrity: sha512-2FpH9Q5i2RRwyEP1AylXe6nYLR5OhaJTZwmlcP0dL/+JCbgg7yyEo/sEK6HeGZRf3dFpWwThaRHVApXSkW3xeg==} + engines: {node: '>= 0.4'} + + es-define-property@1.0.1: + resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} + engines: {node: '>= 0.4'} + + es-errors@1.3.0: + resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} + engines: {node: '>= 0.4'} + + es-iterator-helpers@1.3.2: + resolution: {integrity: sha512-HVLACW1TppGYjJ8H6/jqH/pqOtKRw6wMlrB23xfExmFWxFquAIWCmwoLsOyN96K4a5KbmOf5At9ZUO3GZbetAw==} + engines: {node: '>= 0.4'} + + es-object-atoms@1.1.2: + resolution: {integrity: sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw==} + engines: {node: '>= 0.4'} + + es-set-tostringtag@2.1.0: + resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==} + engines: {node: '>= 0.4'} + + es-shim-unscopables@1.1.0: + resolution: {integrity: sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw==} + engines: {node: '>= 0.4'} + + es-to-primitive@1.3.0: + resolution: {integrity: sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==} + engines: {node: '>= 0.4'} + + esast-util-from-estree@2.0.0: + resolution: {integrity: sha512-4CyanoAudUSBAn5K13H4JhsMH6L9ZP7XbLVe/dKybkxMO7eDyLsT8UHl9TRNrU2Gr9nz+FovfSIjuXWJ81uVwQ==} + + esast-util-from-js@2.0.1: + resolution: {integrity: sha512-8Ja+rNJ0Lt56Pcf3TAmpBZjmx8ZcK5Ts4cAzIOjsjevg9oSXJnl6SUQ2EevU8tv3h6ZLWmoKL5H4fgWvdvfETw==} + + esbuild@0.27.7: + resolution: {integrity: sha512-IxpibTjyVnmrIQo5aqNpCgoACA/dTKLTlhMHihVHhdkxKyPO1uBBthumT0rdHmcsk9uMonIWS0m4FljWzILh3w==} + engines: {node: '>=18'} + hasBin: true + + esbuild@0.28.0: + resolution: {integrity: sha512-sNR9MHpXSUV/XB4zmsFKN+QgVG82Cc7+/aaxJ8Adi8hyOac+EXptIp45QBPaVyX3N70664wRbTcLTOemCAnyqw==} + engines: {node: '>=18'} + hasBin: true + + escalade@3.2.0: + resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} + engines: {node: '>=6'} + + escape-string-regexp@4.0.0: + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} + engines: {node: '>=10'} + + escape-string-regexp@5.0.0: + resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==} + engines: {node: '>=12'} + + eslint-config-next@16.1.6: + resolution: {integrity: sha512-vKq40io2B0XtkkNDYyleATwblNt8xuh3FWp8SpSz3pt7P01OkBFlKsJZ2mWt5WsCySlDQLckb1zMY9yE9Qy0LA==} + peerDependencies: + eslint: '>=9.0.0' + typescript: '>=3.3.1' + peerDependenciesMeta: + typescript: + optional: true + + eslint-import-resolver-node@0.3.10: + resolution: {integrity: sha512-tRrKqFyCaKict5hOd244sL6EQFNycnMQnBe+j8uqGNXYzsImGbGUU4ibtoaBmv5FLwJwcFJNeg1GeVjQfbMrDQ==} + + eslint-import-resolver-typescript@3.10.1: + resolution: {integrity: sha512-A1rHYb06zjMGAxdLSkN2fXPBwuSaQ0iO5M/hdyS0Ajj1VBaRp0sPD3dn1FhME3c/JluGFbwSxyCfqdSbtQLAHQ==} + engines: {node: ^14.18.0 || >=16.0.0} + peerDependencies: + eslint: '*' + eslint-plugin-import: '*' + eslint-plugin-import-x: '*' + peerDependenciesMeta: + eslint-plugin-import: + optional: true + eslint-plugin-import-x: + optional: true + + eslint-module-utils@2.13.0: + resolution: {integrity: sha512-bLohSkT6469rRs8czj0tLTD8vaeIS/whvPRJVjDr7IuoTT1k5DYDERlNycjDj/HkOlvQdYurmfZ/g3fG5bgeLQ==} + engines: {node: '>=4'} + peerDependencies: + '@typescript-eslint/parser': '*' + eslint: '*' + eslint-import-resolver-node: '*' + eslint-import-resolver-typescript: '*' + eslint-import-resolver-webpack: '*' + peerDependenciesMeta: + '@typescript-eslint/parser': + optional: true + eslint: + optional: true + eslint-import-resolver-node: + optional: true + eslint-import-resolver-typescript: + optional: true + eslint-import-resolver-webpack: + optional: true + + eslint-plugin-import@2.32.0: + resolution: {integrity: sha512-whOE1HFo/qJDyX4SnXzP4N6zOWn79WhnCUY/iDR0mPfQZO8wcYE4JClzI2oZrhBnnMUCBCHZhO6VQyoBU95mZA==} + engines: {node: '>=4'} + peerDependencies: + '@typescript-eslint/parser': '*' + eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9 + peerDependenciesMeta: + '@typescript-eslint/parser': + optional: true + + eslint-plugin-jsx-a11y@6.10.2: + resolution: {integrity: sha512-scB3nz4WmG75pV8+3eRUQOHZlNSUhFNq37xnpgRkCCELU3XMvXAxLk1eqWWyE22Ki4Q01Fnsw9BA3cJHDPgn2Q==} + engines: {node: '>=4.0'} + peerDependencies: + eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9 + + eslint-plugin-react-hooks@7.1.1: + resolution: {integrity: sha512-f2I7Gw6JbvCexzIInuSbZpfdQ44D7iqdWX01FKLvrPgqxoE7oMj8clOfto8U6vYiz4yd5oKu39rRSVOe1zRu0g==} + engines: {node: '>=18'} + peerDependencies: + eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0 || ^10.0.0 + + eslint-plugin-react@7.37.5: + resolution: {integrity: sha512-Qteup0SqU15kdocexFNAJMvCJEfa2xUKNV4CC1xsVMrIIqEy3SQ/rqyxCWNzfrd3/ldy6HMlD2e0JDVpDg2qIA==} + engines: {node: '>=4'} + peerDependencies: + eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7 + + eslint-scope@9.1.2: + resolution: {integrity: sha512-xS90H51cKw0jltxmvmHy2Iai1LIqrfbw57b79w/J7MfvDfkIkFZ+kj6zC3BjtUwh150HsSSdxXZcsuv72miDFQ==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} + + eslint-visitor-keys@3.4.3: + resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + eslint-visitor-keys@5.0.1: + resolution: {integrity: sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} + + eslint@10.4.1: + resolution: {integrity: sha512-AyIKhnOBuOAdueD7RB3xB+YeAWScb9jHsJBgH2Hcde8InP5JYhqrRR6iTMHyTEwgENK54Cp44e4v8BwNhsuHuw==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} + hasBin: true + peerDependencies: + jiti: '*' + peerDependenciesMeta: + jiti: + optional: true + + espree@11.2.0: + resolution: {integrity: sha512-7p3DrVEIopW1B1avAGLuCSh1jubc01H2JHc8B4qqGblmg5gI9yumBgACjWo4JlIc04ufug4xJ3SQI8HkS/Rgzw==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} + + esquery@1.7.0: + resolution: {integrity: sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==} + engines: {node: '>=0.10'} + + esrap@2.2.9: + resolution: {integrity: sha512-4KijP+NxCWthMCUC3qHbE6n4vCjqgJS1uAYKhuT/GWfFTf1Qyive2TgOjep+gzbSzRfnNyaN/UU9YmdOt8Eg0A==} + peerDependencies: + '@typescript-eslint/types': ^8.2.0 + peerDependenciesMeta: + '@typescript-eslint/types': + optional: true + + esrecurse@4.3.0: + resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} + engines: {node: '>=4.0'} + + estraverse@5.3.0: + resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} + engines: {node: '>=4.0'} + + estree-util-attach-comments@3.0.0: + resolution: {integrity: sha512-cKUwm/HUcTDsYh/9FgnuFqpfquUbwIqwKM26BVCGDPVgvaCl/nDCCjUfiLlx6lsEZ3Z4RFxNbOQ60pkaEwFxGw==} + + estree-util-build-jsx@3.0.1: + resolution: {integrity: sha512-8U5eiL6BTrPxp/CHbs2yMgP8ftMhR5ww1eIKoWRMlqvltHF8fZn5LRDvTKuxD3DUn+shRbLGqXemcP51oFCsGQ==} + + estree-util-is-identifier-name@3.0.0: + resolution: {integrity: sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg==} + + estree-util-scope@1.0.0: + resolution: {integrity: sha512-2CAASclonf+JFWBNJPndcOpA8EMJwa0Q8LUFJEKqXLW6+qBvbFZuF5gItbQOs/umBUkjviCSDCbBwU2cXbmrhQ==} + + estree-util-to-js@2.0.0: + resolution: {integrity: sha512-WDF+xj5rRWmD5tj6bIqRi6CkLIXbbNQUcxQHzGysQzvHmdYG2G7p/Tf0J0gpxGgkeMZNTIjT/AoSvC9Xehcgdg==} + + estree-util-value-to-estree@3.5.0: + resolution: {integrity: sha512-aMV56R27Gv3QmfmF1MY12GWkGzzeAezAX+UplqHVASfjc9wNzI/X6hC0S9oxq61WT4aQesLGslWP9tKk6ghRZQ==} + + estree-util-visit@2.0.0: + resolution: {integrity: sha512-m5KgiH85xAhhW8Wta0vShLcUvOsh3LLPI2YVwcbio1l7E09NTLL1EyMZFM1OyWowoH0skScNbhOPl4kcBgzTww==} + + estree-walker@3.0.3: + resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} + + esutils@2.0.3: + resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} + engines: {node: '>=0.10.0'} + + extend@3.0.2: + resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} + + fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + + fast-glob@3.3.1: + resolution: {integrity: sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==} + engines: {node: '>=8.6.0'} + + fast-json-stable-stringify@2.1.0: + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + + fast-levenshtein@2.0.6: + resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + + fastq@1.20.1: + resolution: {integrity: sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==} + + fdir@6.5.0: + resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} + engines: {node: '>=12.0.0'} + peerDependencies: + picomatch: ^3 || ^4 + peerDependenciesMeta: + picomatch: + optional: true + + file-entry-cache@8.0.0: + resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} + engines: {node: '>=16.0.0'} + + fill-range@7.1.1: + resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} + engines: {node: '>=8'} + + find-up@5.0.0: + resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} + engines: {node: '>=10'} + + flat-cache@4.0.1: + resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==} + engines: {node: '>=16'} + + flatted@3.4.2: + resolution: {integrity: sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA==} + + for-each@0.3.5: + resolution: {integrity: sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==} + engines: {node: '>= 0.4'} + + framer-motion@12.40.0: + resolution: {integrity: sha512-uaBd3qC1v3KQqBEjwTUd183K6PbS+j0yR9w9VmEOLWA/tnUcSn8Xa3uck7t4dgpDoUss8xQTcj8W2L07lrnLFg==} + peerDependencies: + '@emotion/is-prop-valid': '*' + react: ^18.0.0 || ^19.0.0 + react-dom: ^18.0.0 || ^19.0.0 + peerDependenciesMeta: + '@emotion/is-prop-valid': + optional: true + react: + optional: true + react-dom: + optional: true + + fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + + fumadocs-core@16.9.3: + resolution: {integrity: sha512-8RVzKnzBJR5o+tJCccY28ntekfMQYBoYiz7alnYb/d9YJc+XpnsINzTl63lQ1eBMZ9gdhm2MqRtgUjh/8rUrbw==} + peerDependencies: + '@mdx-js/mdx': '*' + '@mixedbread/sdk': 0.x.x + '@orama/core': 1.x.x + '@oramacloud/client': 2.x.x + '@tanstack/react-router': 1.x.x + '@types/estree-jsx': '*' + '@types/hast': '*' + '@types/mdast': '*' + '@types/react': '*' + algoliasearch: 5.x.x + flexsearch: '*' + lucide-react: '*' + next: 16.x.x + react: ^19.2.0 + react-dom: ^19.2.0 + react-router: 7.x.x + waku: '*' + zod: 4.x.x + peerDependenciesMeta: + '@mdx-js/mdx': + optional: true + '@mixedbread/sdk': + optional: true + '@orama/core': + optional: true + '@oramacloud/client': + optional: true + '@tanstack/react-router': + optional: true + '@types/estree-jsx': + optional: true + '@types/hast': + optional: true + '@types/mdast': + optional: true + '@types/react': + optional: true + algoliasearch: + optional: true + flexsearch: + optional: true + lucide-react: + optional: true + next: + optional: true + react: + optional: true + react-dom: + optional: true + react-router: + optional: true + waku: + optional: true + zod: + optional: true + + fumadocs-mdx@14.2.9: + resolution: {integrity: sha512-5QbFj3KyNgojjpUsD5Xw2W+ofN9l1WiIxzthwFzGoHOLIoJkdCN4AjHcINC+YSo89d/oZlradrrKRd3uHwVKBA==} + hasBin: true + peerDependencies: + '@fumadocs/mdx-remote': ^1.4.0 + '@types/mdast': '*' + '@types/mdx': '*' + '@types/react': '*' + fumadocs-core: ^15.0.0 || ^16.0.0 + mdast-util-directive: '*' + next: ^15.3.0 || ^16.0.0 + react: '*' + vite: 6.x.x || 7.x.x + peerDependenciesMeta: + '@fumadocs/mdx-remote': + optional: true + '@types/mdast': + optional: true + '@types/mdx': + optional: true + '@types/react': + optional: true + mdast-util-directive: + optional: true + next: + optional: true + react: + optional: true + vite: + optional: true + + fumadocs-openapi@10.9.1: + resolution: {integrity: sha512-9b+dDEaSmgwV6dSLoWgvdz5pnkXul4PN4UBrneztGRkll399Hb+uP+wBZPUkuiQF4vyI+8VrZo2coKgDCKoyog==} + peerDependencies: + '@scalar/api-client-react': 2.0.1 + '@types/react': '*' + fumadocs-core: ^16.9.0 + fumadocs-ui: ^16.9.0 + json-schema-typed: '*' + react: ^19.2.0 + react-dom: ^19.2.0 + peerDependenciesMeta: + '@scalar/api-client-react': + optional: true + '@types/react': + optional: true + json-schema-typed: + optional: true + + fumadocs-ui@16.9.3: + resolution: {integrity: sha512-eoVKj1H+ATut0su+WIoPWBLRqzPMGD0hekIBr4GopWvUg1lS997HL4kP+Leyf+3CYlZtFgyXb6ylbvRLFtEj6Q==} + peerDependencies: + '@takumi-rs/image-response': '*' + '@types/mdx': '*' + '@types/react': '*' + fumadocs-core: 16.9.3 + next: 16.x.x + react: ^19.2.0 + react-dom: ^19.2.0 + peerDependenciesMeta: + '@takumi-rs/image-response': + optional: true + '@types/mdx': + optional: true + '@types/react': + optional: true + next: + optional: true + + function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + + function.prototype.name@1.1.8: + resolution: {integrity: sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==} + engines: {node: '>= 0.4'} + + functions-have-names@1.2.3: + resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} + + generator-function@2.0.1: + resolution: {integrity: sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g==} + engines: {node: '>= 0.4'} + + gensync@1.0.0-beta.2: + resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} + engines: {node: '>=6.9.0'} + + get-intrinsic@1.3.0: + resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} + engines: {node: '>= 0.4'} + + get-nonce@1.0.1: + resolution: {integrity: sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==} + engines: {node: '>=6'} + + get-proto@1.0.1: + resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} + engines: {node: '>= 0.4'} + + get-symbol-description@1.1.0: + resolution: {integrity: sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==} + engines: {node: '>= 0.4'} + + get-tsconfig@4.14.0: + resolution: {integrity: sha512-yTb+8DXzDREzgvYmh6s9vHsSVCHeC0G3PI5bEXNBHtmshPnO+S5O7qgLEOn0I5QvMy6kpZN8K1NKGyilLb93wA==} + + github-slugger@2.0.0: + resolution: {integrity: sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw==} + + glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + + glob-parent@6.0.2: + resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} + engines: {node: '>=10.13.0'} + + globals@16.4.0: + resolution: {integrity: sha512-ob/2LcVVaVGCYN+r14cnwnoDPUufjiYgSqRhiFD0Q1iI4Odora5RE8Iv1D24hAz5oMophRGkGz+yuvQmmUMnMw==} + engines: {node: '>=18'} + + globalthis@1.0.4: + resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==} + engines: {node: '>= 0.4'} + + gopd@1.2.0: + resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} + engines: {node: '>= 0.4'} + + graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + + has-bigints@1.1.0: + resolution: {integrity: sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==} + engines: {node: '>= 0.4'} + + has-property-descriptors@1.0.2: + resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} + + has-proto@1.2.0: + resolution: {integrity: sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==} + engines: {node: '>= 0.4'} + + has-symbols@1.1.0: + resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} + engines: {node: '>= 0.4'} + + has-tostringtag@1.0.2: + resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} + engines: {node: '>= 0.4'} + + hasown@2.0.4: + resolution: {integrity: sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==} + engines: {node: '>= 0.4'} + + hast-util-from-parse5@8.0.3: + resolution: {integrity: sha512-3kxEVkEKt0zvcZ3hCRYI8rqrgwtlIOFMWkbclACvjlDw8Li9S2hk/d51OI0nr/gIpdMHNepwgOKqZ/sy0Clpyg==} + + hast-util-parse-selector@4.0.0: + resolution: {integrity: sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A==} + + hast-util-raw@9.1.0: + resolution: {integrity: sha512-Y8/SBAHkZGoNkpzqqfCldijcuUKh7/su31kEBp67cFY09Wy0mTRgtsLYsiIxMJxlu0f6AA5SUTbDR8K0rxnbUw==} + + hast-util-to-estree@3.1.3: + resolution: {integrity: sha512-48+B/rJWAp0jamNbAAf9M7Uf//UVqAoMmgXhBdxTDJLGKY+LRnZ99qcG+Qjl5HfMpYNzS5v4EAwVEF34LeAj7w==} + + hast-util-to-html@9.0.5: + resolution: {integrity: sha512-OguPdidb+fbHQSU4Q4ZiLKnzWo8Wwsf5bZfbvu7//a9oTYoqD/fWpe96NuHkoS9h0ccGOTe0C4NGXdtS0iObOw==} + + hast-util-to-jsx-runtime@2.3.6: + resolution: {integrity: sha512-zl6s8LwNyo1P9uw+XJGvZtdFF1GdAkOg8ujOw+4Pyb76874fLps4ueHXDhXWdk6YHQ6OgUtinliG7RsYvCbbBg==} + + hast-util-to-parse5@8.0.1: + resolution: {integrity: sha512-MlWT6Pjt4CG9lFCjiz4BH7l9wmrMkfkJYCxFwKQic8+RTZgWPuWxwAfjJElsXkex7DJjfSJsQIt931ilUgmwdA==} + + hast-util-whitespace@3.0.0: + resolution: {integrity: sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==} + + hastscript@9.0.1: + resolution: {integrity: sha512-g7df9rMFX/SPi34tyGCyUBREQoKkapwdY/T04Qn9TDWfHhAYt4/I0gMVirzK5wEzeUqIjEB+LXC/ypb7Aqno5w==} + + hermes-estree@0.25.1: + resolution: {integrity: sha512-0wUoCcLp+5Ev5pDW2OriHC2MJCbwLwuRx+gAqMTOkGKJJiBCLjtrvy4PWUGn6MIVefecRpzoOZ/UV6iGdOr+Cw==} + + hermes-parser@0.25.1: + resolution: {integrity: sha512-6pEjquH3rqaI6cYAXYPcz9MS4rY6R4ngRgrgfDshRptUZIc3lw0MCIJIGDj9++mfySOuPTHB4nrSW99BCvOPIA==} + + html-void-elements@3.0.0: + resolution: {integrity: sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==} + + ignore@5.3.2: + resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} + engines: {node: '>= 4'} + + ignore@7.0.5: + resolution: {integrity: sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==} + engines: {node: '>= 4'} + + imurmurhash@0.1.4: + resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} + engines: {node: '>=0.8.19'} + + inline-style-parser@0.2.7: + resolution: {integrity: sha512-Nb2ctOyNR8DqQoR0OwRG95uNWIC0C1lCgf5Naz5H6Ji72KZ8OcFZLz2P5sNgwlyoJ8Yif11oMuYs5pBQa86csA==} + + internal-slot@1.1.0: + resolution: {integrity: sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==} + engines: {node: '>= 0.4'} + + is-alphabetical@2.0.1: + resolution: {integrity: sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==} + + is-alphanumerical@2.0.1: + resolution: {integrity: sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==} + + is-array-buffer@3.0.5: + resolution: {integrity: sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==} + engines: {node: '>= 0.4'} + + is-async-function@2.1.1: + resolution: {integrity: sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==} + engines: {node: '>= 0.4'} + + is-bigint@1.1.0: + resolution: {integrity: sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==} + engines: {node: '>= 0.4'} + + is-boolean-object@1.2.2: + resolution: {integrity: sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==} + engines: {node: '>= 0.4'} + + is-bun-module@2.0.0: + resolution: {integrity: sha512-gNCGbnnnnFAUGKeZ9PdbyeGYJqewpmc2aKHUEMO5nQPWU9lOmv7jcmQIv+qHD8fXW6W7qfuCwX4rY9LNRjXrkQ==} + + is-callable@1.2.7: + resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} + engines: {node: '>= 0.4'} + + is-core-module@2.16.2: + resolution: {integrity: sha512-evOr8xfXKxE6qSR0hSXL2r3sd7ALj8+7jQEUvPYcm5sgZFdJ+AYzT6yNmJenvIYQBgIGwfwz08sL8zoL7yq2BA==} + engines: {node: '>= 0.4'} + + is-data-view@1.0.2: + resolution: {integrity: sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==} + engines: {node: '>= 0.4'} + + is-date-object@1.1.0: + resolution: {integrity: sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==} + engines: {node: '>= 0.4'} + + is-decimal@2.0.1: + resolution: {integrity: sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==} + + is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + + is-finalizationregistry@1.1.1: + resolution: {integrity: sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==} + engines: {node: '>= 0.4'} + + is-generator-function@1.1.2: + resolution: {integrity: sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA==} + engines: {node: '>= 0.4'} + + is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + + is-hexadecimal@2.0.1: + resolution: {integrity: sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==} + + is-map@2.0.3: + resolution: {integrity: sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==} + engines: {node: '>= 0.4'} + + is-negative-zero@2.0.3: + resolution: {integrity: sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==} + engines: {node: '>= 0.4'} + + is-number-object@1.1.1: + resolution: {integrity: sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==} + engines: {node: '>= 0.4'} + + is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + + is-plain-obj@4.1.0: + resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} + engines: {node: '>=12'} + + is-regex@1.2.1: + resolution: {integrity: sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==} + engines: {node: '>= 0.4'} + + is-set@2.0.3: + resolution: {integrity: sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==} + engines: {node: '>= 0.4'} + + is-shared-array-buffer@1.0.4: + resolution: {integrity: sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==} + engines: {node: '>= 0.4'} + + is-string@1.1.1: + resolution: {integrity: sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==} + engines: {node: '>= 0.4'} + + is-symbol@1.1.1: + resolution: {integrity: sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==} + engines: {node: '>= 0.4'} + + is-typed-array@1.1.15: + resolution: {integrity: sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==} + engines: {node: '>= 0.4'} + + is-weakmap@2.0.2: + resolution: {integrity: sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==} + engines: {node: '>= 0.4'} + + is-weakref@1.1.1: + resolution: {integrity: sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==} + engines: {node: '>= 0.4'} + + is-weakset@2.0.4: + resolution: {integrity: sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==} + engines: {node: '>= 0.4'} + + isarray@2.0.5: + resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} + + isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + + iterator.prototype@1.1.5: + resolution: {integrity: sha512-H0dkQoCa3b2VEeKQBOxFph+JAbcrQdE7KC0UkqwpLmv2EC4P41QXP+rqo9wYodACiG5/WM5s9oDApTU8utwj9g==} + engines: {node: '>= 0.4'} + + jiti@2.7.0: + resolution: {integrity: sha512-AC/7JofJvZGrrneWNaEnJeOLUx+JlGt7tNa0wZiRPT4MY1wmfKjt2+6O2p2uz2+skll8OZZmJMNqeke7kKbNgQ==} + hasBin: true + + js-tokens@4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + + js-yaml@4.2.0: + resolution: {integrity: sha512-ePWsvanv0DWuDRsW8dnt+R4jQ31SCRCQ7hhNcPXZPsoBZiemuZNYGf7adZdqX2D86j6rvKp3RpCxVTSb8WQlOw==} + hasBin: true + + jsesc@3.1.0: + resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==} + engines: {node: '>=6'} + hasBin: true + + json-buffer@3.0.1: + resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} + + json-schema-traverse@0.4.1: + resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + + json-stable-stringify-without-jsonify@1.0.1: + resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} + + json5@1.0.2: + resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==} + hasBin: true + + json5@2.2.3: + resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} + engines: {node: '>=6'} + hasBin: true + + jsx-ast-utils@3.3.5: + resolution: {integrity: sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==} + engines: {node: '>=4.0'} + + keyv@4.5.4: + resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} + + language-subtag-registry@0.3.23: + resolution: {integrity: sha512-0K65Lea881pHotoGEa5gDlMxt3pctLi2RplBb7Ezh4rRdLEOtgi7n4EwK9lamnUCkKBqaeKRVebTq6BAxSkpXQ==} + + language-tags@1.0.9: + resolution: {integrity: sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA==} + engines: {node: '>=0.10'} + + levn@0.4.1: + resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} + engines: {node: '>= 0.8.0'} + + lightningcss-android-arm64@1.32.0: + resolution: {integrity: sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [android] + + lightningcss-darwin-arm64@1.32.0: + resolution: {integrity: sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [darwin] + + lightningcss-darwin-x64@1.32.0: + resolution: {integrity: sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [darwin] + + lightningcss-freebsd-x64@1.32.0: + resolution: {integrity: sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [freebsd] + + lightningcss-linux-arm-gnueabihf@1.32.0: + resolution: {integrity: sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw==} + engines: {node: '>= 12.0.0'} + cpu: [arm] + os: [linux] + + lightningcss-linux-arm64-gnu@1.32.0: + resolution: {integrity: sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [linux] + libc: [glibc] + + lightningcss-linux-arm64-musl@1.32.0: + resolution: {integrity: sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [linux] + libc: [musl] + + lightningcss-linux-x64-gnu@1.32.0: + resolution: {integrity: sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [linux] + libc: [glibc] + + lightningcss-linux-x64-musl@1.32.0: + resolution: {integrity: sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [linux] + libc: [musl] + + lightningcss-win32-arm64-msvc@1.32.0: + resolution: {integrity: sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [win32] + + lightningcss-win32-x64-msvc@1.32.0: + resolution: {integrity: sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [win32] + + lightningcss@1.32.0: + resolution: {integrity: sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==} + engines: {node: '>= 12.0.0'} + + locate-path@6.0.0: + resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} + engines: {node: '>=10'} + + longest-streak@3.1.0: + resolution: {integrity: sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==} + + loose-envify@1.4.0: + resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} + hasBin: true + + lru-cache@5.1.1: + resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} + + lucide-react@0.546.0: + resolution: {integrity: sha512-Z94u6fKT43lKeYHiVyvyR8fT7pwCzDu7RyMPpTvh054+xahSgj4HFQ+NmflvzdXsoAjYGdCguGaFKYuvq0ThCQ==} + peerDependencies: + react: ^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0 + + lucide-react@1.17.0: + resolution: {integrity: sha512-9FA9evdox/JQL5PT57fdA1x/yg8T7knJ98+zjTL3UfKza6pflQUUh3XtaQIHKvnsJw1lmsEyHVlt5jchYxOQ5w==} + peerDependencies: + react: ^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0 + + magic-string@0.30.21: + resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} + + markdown-extensions@2.0.0: + resolution: {integrity: sha512-o5vL7aDWatOTX8LzaS1WMoaoxIiLRQJuIKKe2wAw6IeULDHaqbiqiggmx+pKvZDb1Sj+pE46Sn1T7lCqfFtg1Q==} + engines: {node: '>=16'} + + markdown-table@3.0.4: + resolution: {integrity: sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw==} + + math-intrinsics@1.1.0: + resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} + engines: {node: '>= 0.4'} + + mdast-util-find-and-replace@3.0.2: + resolution: {integrity: sha512-Tmd1Vg/m3Xz43afeNxDIhWRtFZgM2VLyaf4vSTYwudTyeuTneoL3qtWMA5jeLyz/O1vDJmmV4QuScFCA2tBPwg==} + + mdast-util-from-markdown@2.0.3: + resolution: {integrity: sha512-W4mAWTvSlKvf8L6J+VN9yLSqQ9AOAAvHuoDAmPkz4dHf553m5gVj2ejadHJhoJmcmxEnOv6Pa8XJhpxE93kb8Q==} + + mdast-util-gfm-autolink-literal@2.0.1: + resolution: {integrity: sha512-5HVP2MKaP6L+G6YaxPNjuL0BPrq9orG3TsrZ9YXbA3vDw/ACI4MEsnoDpn6ZNm7GnZgtAcONJyPhOP8tNJQavQ==} + + mdast-util-gfm-footnote@2.1.0: + resolution: {integrity: sha512-sqpDWlsHn7Ac9GNZQMeUzPQSMzR6Wv0WKRNvQRg0KqHh02fpTz69Qc1QSseNX29bhz1ROIyNyxExfawVKTm1GQ==} + + mdast-util-gfm-strikethrough@2.0.0: + resolution: {integrity: sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg==} + + mdast-util-gfm-table@2.0.0: + resolution: {integrity: sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg==} + + mdast-util-gfm-task-list-item@2.0.0: + resolution: {integrity: sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ==} + + mdast-util-gfm@3.1.0: + resolution: {integrity: sha512-0ulfdQOM3ysHhCJ1p06l0b0VKlhU0wuQs3thxZQagjcjPrlFRqY215uZGHHJan9GEAXd9MbfPjFJz+qMkVR6zQ==} + + mdast-util-mdx-expression@2.0.1: + resolution: {integrity: sha512-J6f+9hUp+ldTZqKRSg7Vw5V6MqjATc+3E4gf3CFNcuZNWD8XdyI6zQ8GqH7f8169MM6P7hMBRDVGnn7oHB9kXQ==} + + mdast-util-mdx-jsx@3.2.0: + resolution: {integrity: sha512-lj/z8v0r6ZtsN/cGNNtemmmfoLAFZnjMbNyLzBafjzikOM+glrjNHPlf6lQDOTccj9n5b0PPihEBbhneMyGs1Q==} + + mdast-util-mdx@3.0.0: + resolution: {integrity: sha512-JfbYLAW7XnYTTbUsmpu0kdBUVe+yKVJZBItEjwyYJiDJuZ9w4eeaqks4HQO+R7objWgS2ymV60GYpI14Ug554w==} + + mdast-util-mdxjs-esm@2.0.1: + resolution: {integrity: sha512-EcmOpxsZ96CvlP03NghtH1EsLtr0n9Tm4lPUJUBccV9RwUOneqSycg19n5HGzCf+10LozMRSObtVr3ee1WoHtg==} + + mdast-util-phrasing@4.1.0: + resolution: {integrity: sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==} + + mdast-util-to-hast@13.2.1: + resolution: {integrity: sha512-cctsq2wp5vTsLIcaymblUriiTcZd0CwWtCbLvrOzYCDZoWyMNV8sZ7krj09FSnsiJi3WVsHLM4k6Dq/yaPyCXA==} + + mdast-util-to-markdown@2.1.2: + resolution: {integrity: sha512-xj68wMTvGXVOKonmog6LwyJKrYXZPvlwabaryTjLh9LuvovB/KAH+kvi8Gjj+7rJjsFi23nkUxRQv1KqSroMqA==} + + mdast-util-to-string@4.0.0: + resolution: {integrity: sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==} + + merge2@1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} + + micromark-core-commonmark@2.0.3: + resolution: {integrity: sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg==} + + micromark-extension-gfm-autolink-literal@2.1.0: + resolution: {integrity: sha512-oOg7knzhicgQ3t4QCjCWgTmfNhvQbDDnJeVu9v81r7NltNCVmhPy1fJRX27pISafdjL+SVc4d3l48Gb6pbRypw==} + + micromark-extension-gfm-footnote@2.1.0: + resolution: {integrity: sha512-/yPhxI1ntnDNsiHtzLKYnE3vf9JZ6cAisqVDauhp4CEHxlb4uoOTxOCJ+9s51bIB8U1N1FJ1RXOKTIlD5B/gqw==} + + micromark-extension-gfm-strikethrough@2.1.0: + resolution: {integrity: sha512-ADVjpOOkjz1hhkZLlBiYA9cR2Anf8F4HqZUO6e5eDcPQd0Txw5fxLzzxnEkSkfnD0wziSGiv7sYhk/ktvbf1uw==} + + micromark-extension-gfm-table@2.1.1: + resolution: {integrity: sha512-t2OU/dXXioARrC6yWfJ4hqB7rct14e8f7m0cbI5hUmDyyIlwv5vEtooptH8INkbLzOatzKuVbQmAYcbWoyz6Dg==} + + micromark-extension-gfm-tagfilter@2.0.0: + resolution: {integrity: sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg==} + + micromark-extension-gfm-task-list-item@2.1.0: + resolution: {integrity: sha512-qIBZhqxqI6fjLDYFTBIa4eivDMnP+OZqsNwmQ3xNLE4Cxwc+zfQEfbs6tzAo2Hjq+bh6q5F+Z8/cksrLFYWQQw==} + + micromark-extension-gfm@3.0.0: + resolution: {integrity: sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w==} + + micromark-extension-mdx-expression@3.0.1: + resolution: {integrity: sha512-dD/ADLJ1AeMvSAKBwO22zG22N4ybhe7kFIZ3LsDI0GlsNr2A3KYxb0LdC1u5rj4Nw+CHKY0RVdnHX8vj8ejm4Q==} + + micromark-extension-mdx-jsx@3.0.2: + resolution: {integrity: sha512-e5+q1DjMh62LZAJOnDraSSbDMvGJ8x3cbjygy2qFEi7HCeUT4BDKCvMozPozcD6WmOt6sVvYDNBKhFSz3kjOVQ==} + + micromark-extension-mdx-md@2.0.0: + resolution: {integrity: sha512-EpAiszsB3blw4Rpba7xTOUptcFeBFi+6PY8VnJ2hhimH+vCQDirWgsMpz7w1XcZE7LVrSAUGb9VJpG9ghlYvYQ==} + + micromark-extension-mdxjs-esm@3.0.0: + resolution: {integrity: sha512-DJFl4ZqkErRpq/dAPyeWp15tGrcrrJho1hKK5uBS70BCtfrIFg81sqcTVu3Ta+KD1Tk5vAtBNElWxtAa+m8K9A==} + + micromark-extension-mdxjs@3.0.0: + resolution: {integrity: sha512-A873fJfhnJ2siZyUrJ31l34Uqwy4xIFmvPY1oj+Ean5PHcPBYzEsvqvWGaWcfEIr11O5Dlw3p2y0tZWpKHDejQ==} + + micromark-factory-destination@2.0.1: + resolution: {integrity: sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA==} + + micromark-factory-label@2.0.1: + resolution: {integrity: sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg==} + + micromark-factory-mdx-expression@2.0.3: + resolution: {integrity: sha512-kQnEtA3vzucU2BkrIa8/VaSAsP+EJ3CKOvhMuJgOEGg9KDC6OAY6nSnNDVRiVNRqj7Y4SlSzcStaH/5jge8JdQ==} + + micromark-factory-space@2.0.1: + resolution: {integrity: sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==} + + micromark-factory-title@2.0.1: + resolution: {integrity: sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw==} + + micromark-factory-whitespace@2.0.1: + resolution: {integrity: sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ==} + + micromark-util-character@2.1.1: + resolution: {integrity: sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==} + + micromark-util-chunked@2.0.1: + resolution: {integrity: sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA==} + + micromark-util-classify-character@2.0.1: + resolution: {integrity: sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q==} + + micromark-util-combine-extensions@2.0.1: + resolution: {integrity: sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg==} + + micromark-util-decode-numeric-character-reference@2.0.2: + resolution: {integrity: sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw==} + + micromark-util-decode-string@2.0.1: + resolution: {integrity: sha512-nDV/77Fj6eH1ynwscYTOsbK7rR//Uj0bZXBwJZRfaLEJ1iGBR6kIfNmlNqaqJf649EP0F3NWNdeJi03elllNUQ==} + + micromark-util-encode@2.0.1: + resolution: {integrity: sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==} + + micromark-util-events-to-acorn@2.0.3: + resolution: {integrity: sha512-jmsiEIiZ1n7X1Rr5k8wVExBQCg5jy4UXVADItHmNk1zkwEVhBuIUKRu3fqv+hs4nxLISi2DQGlqIOGiFxgbfHg==} + + micromark-util-html-tag-name@2.0.1: + resolution: {integrity: sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA==} + + micromark-util-normalize-identifier@2.0.1: + resolution: {integrity: sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q==} + + micromark-util-resolve-all@2.0.1: + resolution: {integrity: sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg==} + + micromark-util-sanitize-uri@2.0.1: + resolution: {integrity: sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==} + + micromark-util-subtokenize@2.1.0: + resolution: {integrity: sha512-XQLu552iSctvnEcgXw6+Sx75GflAPNED1qx7eBJ+wydBb2KCbRZe+NwvIEEMM83uml1+2WSXpBAcp9IUCgCYWA==} + + micromark-util-symbol@2.0.1: + resolution: {integrity: sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==} + + micromark-util-types@2.0.2: + resolution: {integrity: sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==} + + micromark@4.0.2: + resolution: {integrity: sha512-zpe98Q6kvavpCr1NPVSCMebCKfD7CA2NqZ+rykeNhONIJBpc1tFKt9hucLGwha3jNTNI8lHpctWJWoimVF4PfA==} + + micromatch@4.0.8: + resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} + engines: {node: '>=8.6'} + + minimatch@10.2.5: + resolution: {integrity: sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==} + engines: {node: 18 || 20 || >=22} + + minimatch@3.1.5: + resolution: {integrity: sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==} + + minimist@1.2.8: + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + + motion-dom@12.40.0: + resolution: {integrity: sha512-HxU3ZaBwNPVQUBQf1xxgq+7JrPNZvjLVxgbpEZL7RrWJnsxOf0/OM+yrHG9ogLQ31Do/r57Oz2gQWPK+6q62mg==} + + motion-utils@12.39.0: + resolution: {integrity: sha512-8nadJAJjTtqRkmRF36FoJTrywK9nnFmnPwnSMyxaOCU7GDjN9RTMJIxx9De8ErM+vpPhMccr/6fo5WciyQLnMQ==} + + motion@12.40.0: + resolution: {integrity: sha512-yjrHUrBFW6kQvjJwRsoiPSAhC5tRwRqNGJWmiJ4CrGnbKp0V88AdzkhBmDoqIsIPfarOe0Uddd37Xq43/gIocA==} + peerDependencies: + '@emotion/is-prop-valid': '*' + react: ^18.0.0 || ^19.0.0 + react-dom: ^18.0.0 || ^19.0.0 + peerDependenciesMeta: + '@emotion/is-prop-valid': + optional: true + react: + optional: true + react-dom: + optional: true + + ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + + nanoid@3.3.12: + resolution: {integrity: sha512-ZB9RH/39qpq5Vu6Y+NmUaFhQR6pp+M2Xt76XBnEwDaGcVAqhlvxrl3B2bKS5D3NH3QR76v3aSrKaF/Kiy7lEtQ==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + + napi-postinstall@0.3.4: + resolution: {integrity: sha512-PHI5f1O0EP5xJ9gQmFGMS6IZcrVvTjpXjz7Na41gTE7eE2hK11lg04CECCYEEjdc17EV4DO+fkGEtt7TpTaTiQ==} + engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} + hasBin: true + + natural-compare@1.4.0: + resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + + next-themes@0.4.6: + resolution: {integrity: sha512-pZvgD5L0IEvX5/9GWyHMf3m8BKiVQwsCMHfoFosXtXBMnaS0ZnIJ9ST4b4NqLVKDEm8QBxoNNGNaBv2JNF6XNA==} + peerDependencies: + react: ^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc + react-dom: ^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc + + next@16.1.6: + resolution: {integrity: sha512-hkyRkcu5x/41KoqnROkfTm2pZVbKxvbZRuNvKXLRXxs3VfyO0WhY50TQS40EuKO9SW3rBj/sF3WbVwDACeMZyw==} + engines: {node: '>=20.9.0'} + hasBin: true + peerDependencies: + '@opentelemetry/api': ^1.1.0 + '@playwright/test': ^1.51.1 + babel-plugin-react-compiler: '*' + react: ^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0 + react-dom: ^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0 + sass: ^1.3.0 + peerDependenciesMeta: + '@opentelemetry/api': + optional: true + '@playwright/test': + optional: true + babel-plugin-react-compiler: + optional: true + sass: + optional: true + + node-exports-info@1.6.0: + resolution: {integrity: sha512-pyFS63ptit/P5WqUkt+UUfe+4oevH+bFeIiPPdfb0pFeYEu/1ELnJu5l+5EcTKYL5M7zaAa7S8ddywgXypqKCw==} + engines: {node: '>= 0.4'} + + node-releases@2.0.46: + resolution: {integrity: sha512-GYVXHE2KnrzAfsAjl4uP++evGFCrAU1jta4ubEjIG7YWt/64Gqv66a30yKwWczVjA6j3bM4nBwH7Pk1JmDHaxQ==} + engines: {node: '>=18'} + + object-assign@4.1.1: + resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} + engines: {node: '>=0.10.0'} + + object-inspect@1.13.4: + resolution: {integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==} + engines: {node: '>= 0.4'} + + object-keys@1.1.1: + resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} + engines: {node: '>= 0.4'} + + object.assign@4.1.7: + resolution: {integrity: sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==} + engines: {node: '>= 0.4'} + + object.entries@1.1.9: + resolution: {integrity: sha512-8u/hfXFRBD1O0hPUjioLhoWFHRmt6tKA4/vZPyckBr18l1KE9uHrFaFaUi8MDRTpi4uak2goyPTSNJLXX2k2Hw==} + engines: {node: '>= 0.4'} + + object.fromentries@2.0.8: + resolution: {integrity: sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==} + engines: {node: '>= 0.4'} + + object.groupby@1.0.3: + resolution: {integrity: sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==} + engines: {node: '>= 0.4'} + + object.values@1.2.1: + resolution: {integrity: sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==} + engines: {node: '>= 0.4'} + + oniguruma-parser@0.12.2: + resolution: {integrity: sha512-6HVa5oIrgMC6aA6WF6XyyqbhRPJrKR02L20+2+zpDtO5QAzGHAUGw5TKQvwi5vctNnRHkJYmjAhRVQF2EKdTQw==} + + oniguruma-to-es@4.3.6: + resolution: {integrity: sha512-csuQ9x3Yr0cEIs/Zgx/OEt9iBw9vqIunAPQkx19R/fiMq2oGVTgcMqO/V3Ybqefr1TBvosI6jU539ksaBULJyA==} + + optionator@0.9.4: + resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} + engines: {node: '>= 0.8.0'} + + own-keys@1.0.1: + resolution: {integrity: sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==} + engines: {node: '>= 0.4'} + + p-limit@3.1.0: + resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} + engines: {node: '>=10'} + + p-locate@5.0.0: + resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} + engines: {node: '>=10'} + + parse-entities@4.0.2: + resolution: {integrity: sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw==} + + parse5@7.3.0: + resolution: {integrity: sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==} + + path-exists@4.0.0: + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} + + path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + + path-parse@1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + + picocolors@1.1.1: + resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} + + picomatch@2.3.2: + resolution: {integrity: sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==} + engines: {node: '>=8.6'} + + picomatch@4.0.4: + resolution: {integrity: sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==} + engines: {node: '>=12'} + + possible-typed-array-names@1.1.0: + resolution: {integrity: sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==} + engines: {node: '>= 0.4'} + + postcss@8.4.31: + resolution: {integrity: sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==} + engines: {node: ^10 || ^12 || >=14} + + postcss@8.5.15: + resolution: {integrity: sha512-FfR8sjd4em2T6fb3I2MwAJU7HWVMr9zba+enmQeeWFfCbm+UOC/0X4DS8XtpUTMwWMGbjKYP7xjfNekzyGmB3A==} + engines: {node: ^10 || ^12 || >=14} + + prelude-ls@1.2.1: + resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} + engines: {node: '>= 0.8.0'} + + prop-types@15.8.1: + resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} + + property-information@7.1.0: + resolution: {integrity: sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ==} + + punycode@2.3.1: + resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} + engines: {node: '>=6'} + + queue-microtask@1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + + react-dom@19.2.6: + resolution: {integrity: sha512-0prMI+hvBbPjsWnxDLxlCGyM8PN6UuWjEUCYmZhO67xIV9Xasa/r/vDnq+Xyq4Lo27g8QSbO5YzARu0D1Sps3g==} + peerDependencies: + react: ^19.2.6 + + react-is@16.13.1: + resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} + + react-remove-scroll-bar@2.3.8: + resolution: {integrity: sha512-9r+yi9+mgU33AKcj6IbT9oRCO78WriSj6t/cF8DWBZJ9aOGPOTEDvdUDz1FwKim7QXWwmHqtdHnRJfhAxEG46Q==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': '*' + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + + react-remove-scroll@2.7.2: + resolution: {integrity: sha512-Iqb9NjCCTt6Hf+vOdNIZGdTiH1QSqr27H/Ek9sv/a97gfueI/5h1s3yRi1nngzMUaOOToin5dI1dXKdXiF+u0Q==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': '*' + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + react-style-singleton@2.2.3: + resolution: {integrity: sha512-b6jSvxvVnyptAiLjbkWLE/lOnR4lfTtDAl+eUC7RZy+QQWc6wRzIV2CE6xBuMmDxc2qIihtDCZD5NPOFl7fRBQ==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': '*' + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + react@19.2.6: + resolution: {integrity: sha512-sfWGGfavi0xr8Pg0sVsyHMAOziVYKgPLNrS7ig+ivMNb3wbCBw3KxtflsGBAwD3gYQlE/AEZsTLgToRrSCjb0Q==} + engines: {node: '>=0.10.0'} + + readdirp@5.0.0: + resolution: {integrity: sha512-9u/XQ1pvrQtYyMpZe7DXKv2p5CNvyVwzUB6uhLAnQwHMSgKMBR62lc7AHljaeteeHXn11XTAaLLUVZYVZyuRBQ==} + engines: {node: '>= 20.19.0'} + + recma-build-jsx@1.0.0: + resolution: {integrity: sha512-8GtdyqaBcDfva+GUKDr3nev3VpKAhup1+RvkMvUxURHpW7QyIvk9F5wz7Vzo06CEMSilw6uArgRqhpiUcWp8ew==} + + recma-jsx@1.0.1: + resolution: {integrity: sha512-huSIy7VU2Z5OLv6oFLosQGGDqPqdO1iq6bWNAdhzMxSJP7RAso4fCZ1cKu8j9YHCZf3TPrq4dw3okhrylgcd7w==} + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + + recma-parse@1.0.0: + resolution: {integrity: sha512-OYLsIGBB5Y5wjnSnQW6t3Xg7q3fQ7FWbw/vcXtORTnyaSFscOtABg+7Pnz6YZ6c27fG1/aN8CjfwoUEUIdwqWQ==} + + recma-stringify@1.0.0: + resolution: {integrity: sha512-cjwII1MdIIVloKvC9ErQ+OgAtwHBmcZ0Bg4ciz78FtbT8In39aAYbaA7zvxQ61xVMSPE8WxhLwLbhif4Js2C+g==} + + reflect.getprototypeof@1.0.10: + resolution: {integrity: sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==} + engines: {node: '>= 0.4'} + + regex-recursion@6.0.2: + resolution: {integrity: sha512-0YCaSCq2VRIebiaUviZNs0cBz1kg5kVS2UKUfNIx8YVs1cN3AV7NTctO5FOKBA+UT2BPJIWZauYHPqJODG50cg==} + + regex-utilities@2.3.0: + resolution: {integrity: sha512-8VhliFJAWRaUiVvREIiW2NXXTmHs4vMNnSzuJVhscgmGav3g9VDxLrQndI3dZZVVdp0ZO/5v0xmX516/7M9cng==} + + regex@6.1.0: + resolution: {integrity: sha512-6VwtthbV4o/7+OaAF9I5L5V3llLEsoPyq9P1JVXkedTP33c7MfCG0/5NOPcSJn0TzXcG9YUrR0gQSWioew3LDg==} + + regexp.prototype.flags@1.5.4: + resolution: {integrity: sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==} + engines: {node: '>= 0.4'} + + rehype-raw@7.0.0: + resolution: {integrity: sha512-/aE8hCfKlQeA8LmyeyQvQF3eBiLRGNlfBJEvWH7ivp9sBqs7TNqBL5X3v157rM4IFETqDnIOO+z5M/biZbo9Ww==} + + rehype-recma@1.0.0: + resolution: {integrity: sha512-lqA4rGUf1JmacCNWWZx0Wv1dHqMwxzsDWYMTowuplHF3xH0N/MmrZ/G3BDZnzAkRmxDadujCjaKM2hqYdCBOGw==} + + remark-gfm@4.0.1: + resolution: {integrity: sha512-1quofZ2RQ9EWdeN34S79+KExV1764+wCUGop5CPL1WGdD0ocPpu91lzPGbwWMECpEpd42kJGQwzRfyov9j4yNg==} + + remark-mdx@3.1.1: + resolution: {integrity: sha512-Pjj2IYlUY3+D8x00UJsIOg5BEvfMyeI+2uLPn9VO9Wg4MEtN/VTIq2NEJQfde9PnX15KgtHyl9S0BcTnWrIuWg==} + + remark-parse@11.0.0: + resolution: {integrity: sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==} + + remark-rehype@11.1.2: + resolution: {integrity: sha512-Dh7l57ianaEoIpzbp0PC9UKAdCSVklD8E5Rpw7ETfbTl3FqcOOgq5q2LVDhgGCkaBv7p24JXikPdvhhmHvKMsw==} + + remark-stringify@11.0.0: + resolution: {integrity: sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==} + + remark@15.0.1: + resolution: {integrity: sha512-Eht5w30ruCXgFmxVUSlNWQ9iiimq07URKeFS3hNc8cUWy1llX4KDWfyEDZRycMc+znsN9Ux5/tJ/BFdgdOwA3A==} + + resolve-pkg-maps@1.0.0: + resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} + + resolve@2.0.0-next.7: + resolution: {integrity: sha512-tqt+NBWwyaMgw3zDsnygx4CByWjQEJHOPMdslYhppaQSJUtL/D4JO9CcBBlhPoI8lz9oJIDXkwXfhF4aWqP8xQ==} + engines: {node: '>= 0.4'} + hasBin: true + + reusify@1.1.0: + resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + + run-parallel@1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + + safe-array-concat@1.1.4: + resolution: {integrity: sha512-wtZlHyOje6OZTGqAoaDKxFkgRtkF9CnHAVnCHKfuj200wAgL+bSJhdsCD2l0Qx/2ekEXjPWcyKkfGb5CPboslg==} + engines: {node: '>=0.4'} + + safe-push-apply@1.0.0: + resolution: {integrity: sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==} + engines: {node: '>= 0.4'} + + safe-regex-test@1.1.0: + resolution: {integrity: sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==} + engines: {node: '>= 0.4'} + + scheduler@0.27.0: + resolution: {integrity: sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==} + + scroll-into-view-if-needed@3.1.0: + resolution: {integrity: sha512-49oNpRjWRvnU8NyGVmUaYG4jtTkNonFZI86MmGRDqBphEK2EXT9gdEUoQPZhuBM8yWHxCWbobltqYO5M4XrUvQ==} + + semver@6.3.1: + resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} + hasBin: true + + semver@7.8.1: + resolution: {integrity: sha512-rkVq3IXh+4FDGch+KwzX3aV9W3kO54GyEgpvBzSyctDA6Xtd7RJQV1xmXbeQp5v7+VzLOfVqiutSE6GICgPFvg==} + engines: {node: '>=10'} + hasBin: true + + set-function-length@1.2.2: + resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} + engines: {node: '>= 0.4'} + + set-function-name@2.0.2: + resolution: {integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==} + engines: {node: '>= 0.4'} + + set-proto@1.0.0: + resolution: {integrity: sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==} + engines: {node: '>= 0.4'} + + sharp@0.34.5: + resolution: {integrity: sha512-Ou9I5Ft9WNcCbXrU9cMgPBcCK8LiwLqcbywW3t4oDV37n1pzpuNLsYiAV8eODnjbtQlSDwZ2cUEeQz4E54Hltg==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + + shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + + shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + + shiki@4.1.0: + resolution: {integrity: sha512-l/ABZPUR5v70jI10EzqfMS/I96vjSGv2y0ihUV+WYFzv0EfvW4s54m0Lg8wCrrL+2IkwBzFTuxkZjPf8b2NX9Q==} + engines: {node: '>=20'} + + side-channel-list@1.0.1: + resolution: {integrity: sha512-mjn/0bi/oUURjc5Xl7IaWi/OJJJumuoJFQJfDDyO46+hBWsfaVM65TBHq2eoZBhzl9EchxOijpkbRC8SVBQU0w==} + engines: {node: '>= 0.4'} + + side-channel-map@1.0.1: + resolution: {integrity: sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==} + engines: {node: '>= 0.4'} + + side-channel-weakmap@1.0.2: + resolution: {integrity: sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==} + engines: {node: '>= 0.4'} + + side-channel@1.1.0: + resolution: {integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==} + engines: {node: '>= 0.4'} + + source-map-js@1.2.1: + resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} + engines: {node: '>=0.10.0'} + + source-map@0.7.6: + resolution: {integrity: sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==} + engines: {node: '>= 12'} + + space-separated-tokens@2.0.2: + resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==} + + stable-hash@0.0.5: + resolution: {integrity: sha512-+L3ccpzibovGXFK+Ap/f8LOS0ahMrHTf3xu7mMLSpEGU0EO9ucaysSylKo9eRDFNhWve/y275iPmIZ4z39a9iA==} + + stop-iteration-iterator@1.1.0: + resolution: {integrity: sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==} + engines: {node: '>= 0.4'} + + string.prototype.includes@2.0.1: + resolution: {integrity: sha512-o7+c9bW6zpAdJHTtujeePODAhkuicdAryFsfVKwA+wGw89wJ4GTY484WTucM9hLtDEOpOvI+aHnzqnC5lHp4Rg==} + engines: {node: '>= 0.4'} + + string.prototype.matchall@4.0.12: + resolution: {integrity: sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA==} + engines: {node: '>= 0.4'} + + string.prototype.repeat@1.0.0: + resolution: {integrity: sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==} + + string.prototype.trim@1.2.10: + resolution: {integrity: sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==} + engines: {node: '>= 0.4'} + + string.prototype.trimend@1.0.9: + resolution: {integrity: sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==} + engines: {node: '>= 0.4'} + + string.prototype.trimstart@1.0.8: + resolution: {integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==} + engines: {node: '>= 0.4'} + + stringify-entities@4.0.4: + resolution: {integrity: sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==} + + strip-bom@3.0.0: + resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} + engines: {node: '>=4'} + + style-to-js@1.1.21: + resolution: {integrity: sha512-RjQetxJrrUJLQPHbLku6U/ocGtzyjbJMP9lCNK7Ag0CNh690nSH8woqWH9u16nMjYBAok+i7JO1NP2pOy8IsPQ==} + + style-to-object@1.0.14: + resolution: {integrity: sha512-LIN7rULI0jBscWQYaSswptyderlarFkjQ+t79nzty8tcIAceVomEVlLzH5VP4Cmsv6MtKhs7qaAiwlcp+Mgaxw==} + + styled-jsx@5.1.6: + resolution: {integrity: sha512-qSVyDTeMotdvQYoHWLNGwRFJHC+i+ZvdBRYosOFgC+Wg1vx4frN2/RG/NA7SYqqvKNLf39P2LSRA2pu6n0XYZA==} + engines: {node: '>= 12.0.0'} + peerDependencies: + '@babel/core': '*' + babel-plugin-macros: '*' + react: '>= 16.8.0 || 17.x.x || ^18.0.0-0 || ^19.0.0-0' + peerDependenciesMeta: + '@babel/core': + optional: true + babel-plugin-macros: + optional: true + + supports-preserve-symlinks-flag@1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} + + tailwind-merge@3.6.0: + resolution: {integrity: sha512-uxL7qAVQriqRQPAyK3pj66VqskWqoZ37PW94jwOTwNfq/z9oyu1V+eqrZqtR2+fCiXdYOZe/Modt8GtvqNzu+w==} + + tailwindcss@4.3.0: + resolution: {integrity: sha512-y6nxMGB1nMW9R6k96e5gdIFzcfL/gTJRNaqGes1YvkLnPVXzWgbqFF2yLC0T8G774n24cx3Pe8XrKoniCOAH+Q==} + + tapable@2.3.3: + resolution: {integrity: sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A==} + engines: {node: '>=6'} + + tinyexec@1.2.4: + resolution: {integrity: sha512-SHf/r48b7vOrjve9PxJo3MN5v5yuyjHvdUcrQffT3WXMUfnGmHDVbC4k3sHJaJTgZCwpUplIaAo5ANtMyp3YHg==} + engines: {node: '>=18'} + + tinyglobby@0.2.17: + resolution: {integrity: sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==} + engines: {node: '>=12.0.0'} + + to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + + trim-lines@3.0.1: + resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==} + + trough@2.2.0: + resolution: {integrity: sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==} + + ts-api-utils@2.5.0: + resolution: {integrity: sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA==} + engines: {node: '>=18.12'} + peerDependencies: + typescript: '>=4.8.4' + + tsconfig-paths@3.15.0: + resolution: {integrity: sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==} + + tslib@2.8.1: + resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} + + tsx@4.22.4: + resolution: {integrity: sha512-X8EX+XV4QR5xCsrgxaED954zTDfY8KqlDtskKEL0cHhyS/P8b4IFOvGDQpsC9Q1XnLq915wEfwwY/zzskCtmhg==} + engines: {node: '>=18.0.0'} + hasBin: true + + type-check@0.4.0: + resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} + engines: {node: '>= 0.8.0'} + + typed-array-buffer@1.0.3: + resolution: {integrity: sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==} + engines: {node: '>= 0.4'} + + typed-array-byte-length@1.0.3: + resolution: {integrity: sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==} + engines: {node: '>= 0.4'} + + typed-array-byte-offset@1.0.4: + resolution: {integrity: sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==} + engines: {node: '>= 0.4'} + + typed-array-length@1.0.8: + resolution: {integrity: sha512-phPGCwqr2+Qo0fwniCE8e4pKnGu/yFb5nD5Y8bf0EEeiI5GklnACYA9GFy/DrAeRrKHXvHn+1SUsOWgJp6RO+g==} + engines: {node: '>= 0.4'} + + typescript-eslint@8.60.0: + resolution: {integrity: sha512-9f65qWLZdAW9m1JaxBDUHcqRUfL8bkxxXL7XxEfI+F09q56PkBvIfCjLF3yInsDM/BBmwkqmCQdCZe/RYlIWEw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 + typescript: '>=4.8.4 <6.1.0' + + typescript@5.9.3: + resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==} + engines: {node: '>=14.17'} + hasBin: true + + unbox-primitive@1.1.0: + resolution: {integrity: sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==} + engines: {node: '>= 0.4'} + + undici-types@7.18.2: + resolution: {integrity: sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w==} + + unified@11.0.5: + resolution: {integrity: sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==} + + unist-util-is@6.0.1: + resolution: {integrity: sha512-LsiILbtBETkDz8I9p1dQ0uyRUWuaQzd/cuEeS1hoRSyW5E5XGmTzlwY1OrNzzakGowI9Dr/I8HVaw4hTtnxy8g==} + + unist-util-position-from-estree@2.0.0: + resolution: {integrity: sha512-KaFVRjoqLyF6YXCbVLNad/eS4+OfPQQn2yOd7zF/h5T/CSL2v8NpN6a5TPvtbXthAGw5nG+PuTtq+DdIZr+cRQ==} + + unist-util-position@5.0.0: + resolution: {integrity: sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==} + + unist-util-remove-position@5.0.0: + resolution: {integrity: sha512-Hp5Kh3wLxv0PHj9m2yZhhLt58KzPtEYKQQ4yxfYFEO7EvHwzyDYnduhHnY1mDxoqr7VUwVuHXk9RXKIiYS1N8Q==} + + unist-util-stringify-position@4.0.0: + resolution: {integrity: sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==} + + unist-util-visit-parents@6.0.2: + resolution: {integrity: sha512-goh1s1TBrqSqukSc8wrjwWhL0hiJxgA8m4kFxGlQ+8FYQ3C/m11FcTs4YYem7V664AhHVvgoQLk890Ssdsr2IQ==} + + unist-util-visit@5.1.0: + resolution: {integrity: sha512-m+vIdyeCOpdr/QeQCu2EzxX/ohgS8KbnPDgFni4dQsfSCtpz8UqDyY5GjRru8PDKuYn7Fq19j1CQ+nJSsGKOzg==} + + unrs-resolver@1.12.2: + resolution: {integrity: sha512-dmlRxBJJayXjqTwC+JtF1HhJmgf3ftQ3YejFcZrf4+KKtJv0qDsK1pjqaaVjG7wJ5NJ6UVP1OqRMQ71Z4C3rxQ==} + + update-browserslist-db@1.2.3: + resolution: {integrity: sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + + uri-js@4.4.1: + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + + use-callback-ref@1.3.3: + resolution: {integrity: sha512-jQL3lRnocaFtu3V00JToYz/4QkNWswxijDaCVNZRiRTO3HQDLsdu1ZtmIUvV4yPp+rvWm5j0y0TG/S61cuijTg==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': '*' + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + use-sidecar@1.1.3: + resolution: {integrity: sha512-Fedw0aZvkhynoPYlA5WXrMCAMm+nSWdZt6lzJQ7Ok8S6Q+VsHmHpRWndVRJ8Be0ZbkfPc5LRYH+5XrzXcEeLRQ==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': '*' + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + vfile-location@5.0.3: + resolution: {integrity: sha512-5yXvWDEgqeiYiBe1lbxYF7UMAIm/IcopxMHrMQDq3nvKcjPKIhZklUKL+AE7J7uApI4kwe2snsK+eI6UTj9EHg==} + + vfile-message@4.0.3: + resolution: {integrity: sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw==} + + vfile@6.0.3: + resolution: {integrity: sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==} + + web-namespaces@2.0.1: + resolution: {integrity: sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==} + + which-boxed-primitive@1.1.1: + resolution: {integrity: sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==} + engines: {node: '>= 0.4'} + + which-builtin-type@1.2.1: + resolution: {integrity: sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==} + engines: {node: '>= 0.4'} + + which-collection@1.0.2: + resolution: {integrity: sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==} + engines: {node: '>= 0.4'} + + which-typed-array@1.1.21: + resolution: {integrity: sha512-zbRA8cVm6io/d5W8uIe2hblzN76/Wm3v/yiythQvr+dpBWeqhPSWIDNj4zOyHi4zKbMK6DN34Xsr9jPHJERAEw==} + engines: {node: '>= 0.4'} + + which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + + word-wrap@1.2.5: + resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} + engines: {node: '>=0.10.0'} + + yallist@3.1.1: + resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} + + yocto-queue@0.1.0: + resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} + engines: {node: '>=10'} + + zod-validation-error@4.0.2: + resolution: {integrity: sha512-Q6/nZLe6jxuU80qb/4uJ4t5v2VEZ44lzQjPDhYJNztRQ4wyWc6VF3D3Kb/fAuPetZQnhS3hnajCf9CsWesghLQ==} + engines: {node: '>=18.0.0'} + peerDependencies: + zod: ^3.25.0 || ^4.0.0 + + zod@4.4.3: + resolution: {integrity: sha512-ytENFjIJFl2UwYglde2jchW2Hwm4GJFLDiSXWdTrJQBIN9Fcyp7n4DhxJEiWNAJMV1/BqWfW/kkg71UDcHJyTQ==} + + zwitch@2.0.4: + resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} + +snapshots: + + '@alloc/quick-lru@5.2.0': {} + + '@babel/code-frame@7.29.7': + dependencies: + '@babel/helper-validator-identifier': 7.29.7 + js-tokens: 4.0.0 + picocolors: 1.1.1 + + '@babel/compat-data@7.29.7': {} + + '@babel/core@7.29.7': + dependencies: + '@babel/code-frame': 7.29.7 + '@babel/generator': 7.29.7 + '@babel/helper-compilation-targets': 7.29.7 + '@babel/helper-module-transforms': 7.29.7(@babel/core@7.29.7) + '@babel/helpers': 7.29.7 + '@babel/parser': 7.29.7 + '@babel/template': 7.29.7 + '@babel/traverse': 7.29.7 + '@babel/types': 7.29.7 + '@jridgewell/remapping': 2.3.5 + convert-source-map: 2.0.0 + debug: 4.4.3 + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + '@babel/generator@7.29.7': + dependencies: + '@babel/parser': 7.29.7 + '@babel/types': 7.29.7 + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 + jsesc: 3.1.0 + + '@babel/helper-compilation-targets@7.29.7': + dependencies: + '@babel/compat-data': 7.29.7 + '@babel/helper-validator-option': 7.29.7 + browserslist: 4.28.2 + lru-cache: 5.1.1 + semver: 6.3.1 + + '@babel/helper-globals@7.29.7': {} + + '@babel/helper-module-imports@7.29.7': + dependencies: + '@babel/traverse': 7.29.7 + '@babel/types': 7.29.7 + transitivePeerDependencies: + - supports-color + + '@babel/helper-module-transforms@7.29.7(@babel/core@7.29.7)': + dependencies: + '@babel/core': 7.29.7 + '@babel/helper-module-imports': 7.29.7 + '@babel/helper-validator-identifier': 7.29.7 + '@babel/traverse': 7.29.7 + transitivePeerDependencies: + - supports-color + + '@babel/helper-string-parser@7.29.7': {} + + '@babel/helper-validator-identifier@7.29.7': {} + + '@babel/helper-validator-option@7.29.7': {} + + '@babel/helpers@7.29.7': + dependencies: + '@babel/template': 7.29.7 + '@babel/types': 7.29.7 + + '@babel/parser@7.29.7': + dependencies: + '@babel/types': 7.29.7 + + '@babel/template@7.29.7': + dependencies: + '@babel/code-frame': 7.29.7 + '@babel/parser': 7.29.7 + '@babel/types': 7.29.7 + + '@babel/traverse@7.29.7': + dependencies: + '@babel/code-frame': 7.29.7 + '@babel/generator': 7.29.7 + '@babel/helper-globals': 7.29.7 + '@babel/parser': 7.29.7 + '@babel/template': 7.29.7 + '@babel/types': 7.29.7 + debug: 4.4.3 + transitivePeerDependencies: + - supports-color + + '@babel/types@7.29.7': + dependencies: + '@babel/helper-string-parser': 7.29.7 + '@babel/helper-validator-identifier': 7.29.7 + + '@emnapi/core@1.10.0': + dependencies: + '@emnapi/wasi-threads': 1.2.1 + tslib: 2.8.1 + optional: true + + '@emnapi/runtime@1.10.0': + dependencies: + tslib: 2.8.1 + optional: true + + '@emnapi/wasi-threads@1.2.1': + dependencies: + tslib: 2.8.1 + optional: true + + '@esbuild/aix-ppc64@0.27.7': + optional: true + + '@esbuild/aix-ppc64@0.28.0': + optional: true + + '@esbuild/android-arm64@0.27.7': + optional: true + + '@esbuild/android-arm64@0.28.0': + optional: true + + '@esbuild/android-arm@0.27.7': + optional: true + + '@esbuild/android-arm@0.28.0': + optional: true + + '@esbuild/android-x64@0.27.7': + optional: true + + '@esbuild/android-x64@0.28.0': + optional: true + + '@esbuild/darwin-arm64@0.27.7': + optional: true + + '@esbuild/darwin-arm64@0.28.0': + optional: true + + '@esbuild/darwin-x64@0.27.7': + optional: true + + '@esbuild/darwin-x64@0.28.0': + optional: true + + '@esbuild/freebsd-arm64@0.27.7': + optional: true + + '@esbuild/freebsd-arm64@0.28.0': + optional: true + + '@esbuild/freebsd-x64@0.27.7': + optional: true + + '@esbuild/freebsd-x64@0.28.0': + optional: true + + '@esbuild/linux-arm64@0.27.7': + optional: true + + '@esbuild/linux-arm64@0.28.0': + optional: true + + '@esbuild/linux-arm@0.27.7': + optional: true + + '@esbuild/linux-arm@0.28.0': + optional: true + + '@esbuild/linux-ia32@0.27.7': + optional: true + + '@esbuild/linux-ia32@0.28.0': + optional: true + + '@esbuild/linux-loong64@0.27.7': + optional: true + + '@esbuild/linux-loong64@0.28.0': + optional: true + + '@esbuild/linux-mips64el@0.27.7': + optional: true + + '@esbuild/linux-mips64el@0.28.0': + optional: true + + '@esbuild/linux-ppc64@0.27.7': + optional: true + + '@esbuild/linux-ppc64@0.28.0': + optional: true + + '@esbuild/linux-riscv64@0.27.7': + optional: true + + '@esbuild/linux-riscv64@0.28.0': + optional: true + + '@esbuild/linux-s390x@0.27.7': + optional: true + + '@esbuild/linux-s390x@0.28.0': + optional: true + + '@esbuild/linux-x64@0.27.7': + optional: true + + '@esbuild/linux-x64@0.28.0': + optional: true + + '@esbuild/netbsd-arm64@0.27.7': + optional: true + + '@esbuild/netbsd-arm64@0.28.0': + optional: true + + '@esbuild/netbsd-x64@0.27.7': + optional: true + + '@esbuild/netbsd-x64@0.28.0': + optional: true + + '@esbuild/openbsd-arm64@0.27.7': + optional: true + + '@esbuild/openbsd-arm64@0.28.0': + optional: true + + '@esbuild/openbsd-x64@0.27.7': + optional: true + + '@esbuild/openbsd-x64@0.28.0': + optional: true + + '@esbuild/openharmony-arm64@0.27.7': + optional: true + + '@esbuild/openharmony-arm64@0.28.0': + optional: true + + '@esbuild/sunos-x64@0.27.7': + optional: true + + '@esbuild/sunos-x64@0.28.0': + optional: true + + '@esbuild/win32-arm64@0.27.7': + optional: true + + '@esbuild/win32-arm64@0.28.0': + optional: true + + '@esbuild/win32-ia32@0.27.7': + optional: true + + '@esbuild/win32-ia32@0.28.0': + optional: true + + '@esbuild/win32-x64@0.27.7': + optional: true + + '@esbuild/win32-x64@0.28.0': + optional: true + + '@eslint-community/eslint-utils@4.9.1(eslint@10.4.1(jiti@2.7.0))': + dependencies: + eslint: 10.4.1(jiti@2.7.0) + eslint-visitor-keys: 3.4.3 + + '@eslint-community/regexpp@4.12.2': {} + + '@eslint/config-array@0.23.5': + dependencies: + '@eslint/object-schema': 3.0.5 + debug: 4.4.3 + minimatch: 10.2.5 + transitivePeerDependencies: + - supports-color + + '@eslint/config-helpers@0.6.0': + dependencies: + '@eslint/core': 1.2.1 + + '@eslint/core@1.2.1': + dependencies: + '@types/json-schema': 7.0.15 + + '@eslint/object-schema@3.0.5': {} + + '@eslint/plugin-kit@0.7.2': + dependencies: + '@eslint/core': 1.2.1 + levn: 0.4.1 + + '@floating-ui/core@1.7.5': + dependencies: + '@floating-ui/utils': 0.2.11 + + '@floating-ui/dom@1.7.6': + dependencies: + '@floating-ui/core': 1.7.5 + '@floating-ui/utils': 0.2.11 + + '@floating-ui/react-dom@2.1.8(react-dom@19.2.6(react@19.2.6))(react@19.2.6)': + dependencies: + '@floating-ui/dom': 1.7.6 + react: 19.2.6 + react-dom: 19.2.6(react@19.2.6) + + '@floating-ui/utils@0.2.11': {} + + '@fumadocs/tailwind@0.0.5(@tailwindcss/oxide@4.3.0)(tailwindcss@4.3.0)': + optionalDependencies: + '@tailwindcss/oxide': 4.3.0 + tailwindcss: 4.3.0 + + '@fumari/json-schema-ts@0.0.2(@typescript-eslint/types@8.60.0)': + dependencies: + esrap: 2.2.9(@typescript-eslint/types@8.60.0) + transitivePeerDependencies: + - '@typescript-eslint/types' + + '@fumari/stf@1.0.5(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)': + dependencies: + react: 19.2.6 + react-dom: 19.2.6(react@19.2.6) + optionalDependencies: + '@types/react': 19.2.15 + + '@humanfs/core@0.19.2': + dependencies: + '@humanfs/types': 0.15.0 + + '@humanfs/node@0.16.8': + dependencies: + '@humanfs/core': 0.19.2 + '@humanfs/types': 0.15.0 + '@humanwhocodes/retry': 0.4.3 + + '@humanfs/types@0.15.0': {} + + '@humanwhocodes/module-importer@1.0.1': {} + + '@humanwhocodes/retry@0.4.3': {} + + '@img/colour@1.1.0': + optional: true + + '@img/sharp-darwin-arm64@0.34.5': + optionalDependencies: + '@img/sharp-libvips-darwin-arm64': 1.2.4 + optional: true + + '@img/sharp-darwin-x64@0.34.5': + optionalDependencies: + '@img/sharp-libvips-darwin-x64': 1.2.4 + optional: true + + '@img/sharp-libvips-darwin-arm64@1.2.4': + optional: true + + '@img/sharp-libvips-darwin-x64@1.2.4': + optional: true + + '@img/sharp-libvips-linux-arm64@1.2.4': + optional: true + + '@img/sharp-libvips-linux-arm@1.2.4': + optional: true + + '@img/sharp-libvips-linux-ppc64@1.2.4': + optional: true + + '@img/sharp-libvips-linux-riscv64@1.2.4': + optional: true + + '@img/sharp-libvips-linux-s390x@1.2.4': + optional: true + + '@img/sharp-libvips-linux-x64@1.2.4': + optional: true + + '@img/sharp-libvips-linuxmusl-arm64@1.2.4': + optional: true + + '@img/sharp-libvips-linuxmusl-x64@1.2.4': + optional: true + + '@img/sharp-linux-arm64@0.34.5': + optionalDependencies: + '@img/sharp-libvips-linux-arm64': 1.2.4 + optional: true + + '@img/sharp-linux-arm@0.34.5': + optionalDependencies: + '@img/sharp-libvips-linux-arm': 1.2.4 + optional: true + + '@img/sharp-linux-ppc64@0.34.5': + optionalDependencies: + '@img/sharp-libvips-linux-ppc64': 1.2.4 + optional: true + + '@img/sharp-linux-riscv64@0.34.5': + optionalDependencies: + '@img/sharp-libvips-linux-riscv64': 1.2.4 + optional: true + + '@img/sharp-linux-s390x@0.34.5': + optionalDependencies: + '@img/sharp-libvips-linux-s390x': 1.2.4 + optional: true + + '@img/sharp-linux-x64@0.34.5': + optionalDependencies: + '@img/sharp-libvips-linux-x64': 1.2.4 + optional: true + + '@img/sharp-linuxmusl-arm64@0.34.5': + optionalDependencies: + '@img/sharp-libvips-linuxmusl-arm64': 1.2.4 + optional: true + + '@img/sharp-linuxmusl-x64@0.34.5': + optionalDependencies: + '@img/sharp-libvips-linuxmusl-x64': 1.2.4 + optional: true + + '@img/sharp-wasm32@0.34.5': + dependencies: + '@emnapi/runtime': 1.10.0 + optional: true + + '@img/sharp-win32-arm64@0.34.5': + optional: true + + '@img/sharp-win32-ia32@0.34.5': + optional: true + + '@img/sharp-win32-x64@0.34.5': + optional: true + + '@jridgewell/gen-mapping@0.3.13': + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 + '@jridgewell/trace-mapping': 0.3.31 + + '@jridgewell/remapping@2.3.5': + dependencies: + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 + + '@jridgewell/resolve-uri@3.1.2': {} + + '@jridgewell/sourcemap-codec@1.5.5': {} + + '@jridgewell/trace-mapping@0.3.31': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.5 + + '@mdx-js/mdx@3.1.1': + dependencies: + '@types/estree': 1.0.9 + '@types/estree-jsx': 1.0.5 + '@types/hast': 3.0.4 + '@types/mdx': 2.0.13 + acorn: 8.16.0 + collapse-white-space: 2.1.0 + devlop: 1.1.0 + estree-util-is-identifier-name: 3.0.0 + estree-util-scope: 1.0.0 + estree-walker: 3.0.3 + hast-util-to-jsx-runtime: 2.3.6 + markdown-extensions: 2.0.0 + recma-build-jsx: 1.0.0 + recma-jsx: 1.0.1(acorn@8.16.0) + recma-stringify: 1.0.0 + rehype-recma: 1.0.0 + remark-mdx: 3.1.1 + remark-parse: 11.0.0 + remark-rehype: 11.1.2 + source-map: 0.7.6 + unified: 11.0.5 + unist-util-position-from-estree: 2.0.0 + unist-util-stringify-position: 4.0.0 + unist-util-visit: 5.1.0 + vfile: 6.0.3 + transitivePeerDependencies: + - supports-color + + '@napi-rs/wasm-runtime@1.1.4(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)': + dependencies: + '@emnapi/core': 1.10.0 + '@emnapi/runtime': 1.10.0 + '@tybys/wasm-util': 0.10.2 + optional: true + + '@next/env@16.1.6': {} + + '@next/eslint-plugin-next@16.1.6': + dependencies: + fast-glob: 3.3.1 + + '@next/swc-darwin-arm64@16.1.6': + optional: true + + '@next/swc-darwin-x64@16.1.6': + optional: true + + '@next/swc-linux-arm64-gnu@16.1.6': + optional: true + + '@next/swc-linux-arm64-musl@16.1.6': + optional: true + + '@next/swc-linux-x64-gnu@16.1.6': + optional: true + + '@next/swc-linux-x64-musl@16.1.6': + optional: true + + '@next/swc-win32-arm64-msvc@16.1.6': + optional: true + + '@next/swc-win32-x64-msvc@16.1.6': + optional: true + + '@nodelib/fs.scandir@2.1.5': + dependencies: + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 + + '@nodelib/fs.stat@2.0.5': {} + + '@nodelib/fs.walk@1.2.8': + dependencies: + '@nodelib/fs.scandir': 2.1.5 + fastq: 1.20.1 + + '@nolyfill/is-core-module@1.0.39': {} + + '@orama/orama@3.1.18': {} + + '@radix-ui/number@1.1.1': {} + + '@radix-ui/primitive@1.1.3': {} + + '@radix-ui/react-accordion@1.2.12(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)': + dependencies: + '@radix-ui/primitive': 1.1.3 + '@radix-ui/react-collapsible': 1.1.12(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + '@radix-ui/react-collection': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.15)(react@19.2.6) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.15)(react@19.2.6) + '@radix-ui/react-direction': 1.1.1(@types/react@19.2.15)(react@19.2.6) + '@radix-ui/react-id': 1.1.1(@types/react@19.2.15)(react@19.2.6) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.15)(react@19.2.6) + react: 19.2.6 + react-dom: 19.2.6(react@19.2.6) + optionalDependencies: + '@types/react': 19.2.15 + '@types/react-dom': 19.2.3(@types/react@19.2.15) + + '@radix-ui/react-arrow@1.1.7(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)': + dependencies: + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + react: 19.2.6 + react-dom: 19.2.6(react@19.2.6) + optionalDependencies: + '@types/react': 19.2.15 + '@types/react-dom': 19.2.3(@types/react@19.2.15) + + '@radix-ui/react-collapsible@1.1.12(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)': + dependencies: + '@radix-ui/primitive': 1.1.3 + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.15)(react@19.2.6) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.15)(react@19.2.6) + '@radix-ui/react-id': 1.1.1(@types/react@19.2.15)(react@19.2.6) + '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.15)(react@19.2.6) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.15)(react@19.2.6) + react: 19.2.6 + react-dom: 19.2.6(react@19.2.6) + optionalDependencies: + '@types/react': 19.2.15 + '@types/react-dom': 19.2.3(@types/react@19.2.15) + + '@radix-ui/react-collection@1.1.7(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)': + dependencies: + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.15)(react@19.2.6) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.15)(react@19.2.6) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + '@radix-ui/react-slot': 1.2.3(@types/react@19.2.15)(react@19.2.6) + react: 19.2.6 + react-dom: 19.2.6(react@19.2.6) + optionalDependencies: + '@types/react': 19.2.15 + '@types/react-dom': 19.2.3(@types/react@19.2.15) + + '@radix-ui/react-compose-refs@1.1.2(@types/react@19.2.15)(react@19.2.6)': + dependencies: + react: 19.2.6 + optionalDependencies: + '@types/react': 19.2.15 + + '@radix-ui/react-context@1.1.2(@types/react@19.2.15)(react@19.2.6)': + dependencies: + react: 19.2.6 + optionalDependencies: + '@types/react': 19.2.15 + + '@radix-ui/react-dialog@1.1.15(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)': + dependencies: + '@radix-ui/primitive': 1.1.3 + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.15)(react@19.2.6) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.15)(react@19.2.6) + '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + '@radix-ui/react-focus-guards': 1.1.3(@types/react@19.2.15)(react@19.2.6) + '@radix-ui/react-focus-scope': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + '@radix-ui/react-id': 1.1.1(@types/react@19.2.15)(react@19.2.6) + '@radix-ui/react-portal': 1.1.9(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + '@radix-ui/react-slot': 1.2.3(@types/react@19.2.15)(react@19.2.6) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.15)(react@19.2.6) + aria-hidden: 1.2.6 + react: 19.2.6 + react-dom: 19.2.6(react@19.2.6) + react-remove-scroll: 2.7.2(@types/react@19.2.15)(react@19.2.6) + optionalDependencies: + '@types/react': 19.2.15 + '@types/react-dom': 19.2.3(@types/react@19.2.15) + + '@radix-ui/react-direction@1.1.1(@types/react@19.2.15)(react@19.2.6)': + dependencies: + react: 19.2.6 + optionalDependencies: + '@types/react': 19.2.15 + + '@radix-ui/react-dismissable-layer@1.1.11(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)': + dependencies: + '@radix-ui/primitive': 1.1.3 + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.15)(react@19.2.6) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.15)(react@19.2.6) + '@radix-ui/react-use-escape-keydown': 1.1.1(@types/react@19.2.15)(react@19.2.6) + react: 19.2.6 + react-dom: 19.2.6(react@19.2.6) + optionalDependencies: + '@types/react': 19.2.15 + '@types/react-dom': 19.2.3(@types/react@19.2.15) + + '@radix-ui/react-focus-guards@1.1.3(@types/react@19.2.15)(react@19.2.6)': + dependencies: + react: 19.2.6 + optionalDependencies: + '@types/react': 19.2.15 + + '@radix-ui/react-focus-scope@1.1.7(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)': + dependencies: + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.15)(react@19.2.6) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.15)(react@19.2.6) + react: 19.2.6 + react-dom: 19.2.6(react@19.2.6) + optionalDependencies: + '@types/react': 19.2.15 + '@types/react-dom': 19.2.3(@types/react@19.2.15) + + '@radix-ui/react-id@1.1.1(@types/react@19.2.15)(react@19.2.6)': + dependencies: + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.15)(react@19.2.6) + react: 19.2.6 + optionalDependencies: + '@types/react': 19.2.15 + + '@radix-ui/react-navigation-menu@1.2.14(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)': + dependencies: + '@radix-ui/primitive': 1.1.3 + '@radix-ui/react-collection': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.15)(react@19.2.6) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.15)(react@19.2.6) + '@radix-ui/react-direction': 1.1.1(@types/react@19.2.15)(react@19.2.6) + '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + '@radix-ui/react-id': 1.1.1(@types/react@19.2.15)(react@19.2.6) + '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.15)(react@19.2.6) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.15)(react@19.2.6) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.15)(react@19.2.6) + '@radix-ui/react-use-previous': 1.1.1(@types/react@19.2.15)(react@19.2.6) + '@radix-ui/react-visually-hidden': 1.2.3(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + react: 19.2.6 + react-dom: 19.2.6(react@19.2.6) + optionalDependencies: + '@types/react': 19.2.15 + '@types/react-dom': 19.2.3(@types/react@19.2.15) + + '@radix-ui/react-popover@1.1.15(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)': + dependencies: + '@radix-ui/primitive': 1.1.3 + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.15)(react@19.2.6) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.15)(react@19.2.6) + '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + '@radix-ui/react-focus-guards': 1.1.3(@types/react@19.2.15)(react@19.2.6) + '@radix-ui/react-focus-scope': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + '@radix-ui/react-id': 1.1.1(@types/react@19.2.15)(react@19.2.6) + '@radix-ui/react-popper': 1.2.8(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + '@radix-ui/react-portal': 1.1.9(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + '@radix-ui/react-slot': 1.2.3(@types/react@19.2.15)(react@19.2.6) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.15)(react@19.2.6) + aria-hidden: 1.2.6 + react: 19.2.6 + react-dom: 19.2.6(react@19.2.6) + react-remove-scroll: 2.7.2(@types/react@19.2.15)(react@19.2.6) + optionalDependencies: + '@types/react': 19.2.15 + '@types/react-dom': 19.2.3(@types/react@19.2.15) + + '@radix-ui/react-popper@1.2.8(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)': + dependencies: + '@floating-ui/react-dom': 2.1.8(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + '@radix-ui/react-arrow': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.15)(react@19.2.6) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.15)(react@19.2.6) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.15)(react@19.2.6) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.15)(react@19.2.6) + '@radix-ui/react-use-rect': 1.1.1(@types/react@19.2.15)(react@19.2.6) + '@radix-ui/react-use-size': 1.1.1(@types/react@19.2.15)(react@19.2.6) + '@radix-ui/rect': 1.1.1 + react: 19.2.6 + react-dom: 19.2.6(react@19.2.6) + optionalDependencies: + '@types/react': 19.2.15 + '@types/react-dom': 19.2.3(@types/react@19.2.15) + + '@radix-ui/react-portal@1.1.9(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)': + dependencies: + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.15)(react@19.2.6) + react: 19.2.6 + react-dom: 19.2.6(react@19.2.6) + optionalDependencies: + '@types/react': 19.2.15 + '@types/react-dom': 19.2.3(@types/react@19.2.15) + + '@radix-ui/react-presence@1.1.5(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)': + dependencies: + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.15)(react@19.2.6) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.15)(react@19.2.6) + react: 19.2.6 + react-dom: 19.2.6(react@19.2.6) + optionalDependencies: + '@types/react': 19.2.15 + '@types/react-dom': 19.2.3(@types/react@19.2.15) + + '@radix-ui/react-primitive@2.1.3(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)': + dependencies: + '@radix-ui/react-slot': 1.2.3(@types/react@19.2.15)(react@19.2.6) + react: 19.2.6 + react-dom: 19.2.6(react@19.2.6) + optionalDependencies: + '@types/react': 19.2.15 + '@types/react-dom': 19.2.3(@types/react@19.2.15) + + '@radix-ui/react-roving-focus@1.1.11(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)': + dependencies: + '@radix-ui/primitive': 1.1.3 + '@radix-ui/react-collection': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.15)(react@19.2.6) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.15)(react@19.2.6) + '@radix-ui/react-direction': 1.1.1(@types/react@19.2.15)(react@19.2.6) + '@radix-ui/react-id': 1.1.1(@types/react@19.2.15)(react@19.2.6) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.15)(react@19.2.6) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.15)(react@19.2.6) + react: 19.2.6 + react-dom: 19.2.6(react@19.2.6) + optionalDependencies: + '@types/react': 19.2.15 + '@types/react-dom': 19.2.3(@types/react@19.2.15) + + '@radix-ui/react-scroll-area@1.2.10(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)': + dependencies: + '@radix-ui/number': 1.1.1 + '@radix-ui/primitive': 1.1.3 + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.15)(react@19.2.6) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.15)(react@19.2.6) + '@radix-ui/react-direction': 1.1.1(@types/react@19.2.15)(react@19.2.6) + '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.15)(react@19.2.6) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.15)(react@19.2.6) + react: 19.2.6 + react-dom: 19.2.6(react@19.2.6) + optionalDependencies: + '@types/react': 19.2.15 + '@types/react-dom': 19.2.3(@types/react@19.2.15) + + '@radix-ui/react-select@2.2.6(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)': + dependencies: + '@radix-ui/number': 1.1.1 + '@radix-ui/primitive': 1.1.3 + '@radix-ui/react-collection': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.15)(react@19.2.6) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.15)(react@19.2.6) + '@radix-ui/react-direction': 1.1.1(@types/react@19.2.15)(react@19.2.6) + '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + '@radix-ui/react-focus-guards': 1.1.3(@types/react@19.2.15)(react@19.2.6) + '@radix-ui/react-focus-scope': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + '@radix-ui/react-id': 1.1.1(@types/react@19.2.15)(react@19.2.6) + '@radix-ui/react-popper': 1.2.8(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + '@radix-ui/react-portal': 1.1.9(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + '@radix-ui/react-slot': 1.2.3(@types/react@19.2.15)(react@19.2.6) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.15)(react@19.2.6) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.15)(react@19.2.6) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.15)(react@19.2.6) + '@radix-ui/react-use-previous': 1.1.1(@types/react@19.2.15)(react@19.2.6) + '@radix-ui/react-visually-hidden': 1.2.3(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + aria-hidden: 1.2.6 + react: 19.2.6 + react-dom: 19.2.6(react@19.2.6) + react-remove-scroll: 2.7.2(@types/react@19.2.15)(react@19.2.6) + optionalDependencies: + '@types/react': 19.2.15 + '@types/react-dom': 19.2.3(@types/react@19.2.15) + + '@radix-ui/react-slot@1.2.3(@types/react@19.2.15)(react@19.2.6)': + dependencies: + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.15)(react@19.2.6) + react: 19.2.6 + optionalDependencies: + '@types/react': 19.2.15 + + '@radix-ui/react-slot@1.2.4(@types/react@19.2.15)(react@19.2.6)': + dependencies: + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.15)(react@19.2.6) + react: 19.2.6 + optionalDependencies: + '@types/react': 19.2.15 + + '@radix-ui/react-tabs@1.1.13(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)': + dependencies: + '@radix-ui/primitive': 1.1.3 + '@radix-ui/react-context': 1.1.2(@types/react@19.2.15)(react@19.2.6) + '@radix-ui/react-direction': 1.1.1(@types/react@19.2.15)(react@19.2.6) + '@radix-ui/react-id': 1.1.1(@types/react@19.2.15)(react@19.2.6) + '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + '@radix-ui/react-roving-focus': 1.1.11(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.15)(react@19.2.6) + react: 19.2.6 + react-dom: 19.2.6(react@19.2.6) + optionalDependencies: + '@types/react': 19.2.15 + '@types/react-dom': 19.2.3(@types/react@19.2.15) + + '@radix-ui/react-use-callback-ref@1.1.1(@types/react@19.2.15)(react@19.2.6)': + dependencies: + react: 19.2.6 + optionalDependencies: + '@types/react': 19.2.15 + + '@radix-ui/react-use-controllable-state@1.2.2(@types/react@19.2.15)(react@19.2.6)': + dependencies: + '@radix-ui/react-use-effect-event': 0.0.2(@types/react@19.2.15)(react@19.2.6) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.15)(react@19.2.6) + react: 19.2.6 + optionalDependencies: + '@types/react': 19.2.15 + + '@radix-ui/react-use-effect-event@0.0.2(@types/react@19.2.15)(react@19.2.6)': + dependencies: + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.15)(react@19.2.6) + react: 19.2.6 + optionalDependencies: + '@types/react': 19.2.15 + + '@radix-ui/react-use-escape-keydown@1.1.1(@types/react@19.2.15)(react@19.2.6)': + dependencies: + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.15)(react@19.2.6) + react: 19.2.6 + optionalDependencies: + '@types/react': 19.2.15 + + '@radix-ui/react-use-layout-effect@1.1.1(@types/react@19.2.15)(react@19.2.6)': + dependencies: + react: 19.2.6 + optionalDependencies: + '@types/react': 19.2.15 + + '@radix-ui/react-use-previous@1.1.1(@types/react@19.2.15)(react@19.2.6)': + dependencies: + react: 19.2.6 + optionalDependencies: + '@types/react': 19.2.15 + + '@radix-ui/react-use-rect@1.1.1(@types/react@19.2.15)(react@19.2.6)': + dependencies: + '@radix-ui/rect': 1.1.1 + react: 19.2.6 + optionalDependencies: + '@types/react': 19.2.15 + + '@radix-ui/react-use-size@1.1.1(@types/react@19.2.15)(react@19.2.6)': + dependencies: + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.15)(react@19.2.6) + react: 19.2.6 + optionalDependencies: + '@types/react': 19.2.15 + + '@radix-ui/react-visually-hidden@1.2.3(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)': + dependencies: + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + react: 19.2.6 + react-dom: 19.2.6(react@19.2.6) + optionalDependencies: + '@types/react': 19.2.15 + '@types/react-dom': 19.2.3(@types/react@19.2.15) + + '@radix-ui/rect@1.1.1': {} + + '@rtsao/scc@1.1.0': {} + + '@shikijs/core@4.1.0': + dependencies: + '@shikijs/primitive': 4.1.0 + '@shikijs/types': 4.1.0 + '@shikijs/vscode-textmate': 10.0.2 + '@types/hast': 3.0.4 + hast-util-to-html: 9.0.5 + + '@shikijs/engine-javascript@4.1.0': + dependencies: + '@shikijs/types': 4.1.0 + '@shikijs/vscode-textmate': 10.0.2 + oniguruma-to-es: 4.3.6 + + '@shikijs/engine-oniguruma@4.1.0': + dependencies: + '@shikijs/types': 4.1.0 + '@shikijs/vscode-textmate': 10.0.2 + + '@shikijs/langs@4.1.0': + dependencies: + '@shikijs/types': 4.1.0 + + '@shikijs/primitive@4.1.0': + dependencies: + '@shikijs/types': 4.1.0 + '@shikijs/vscode-textmate': 10.0.2 + '@types/hast': 3.0.4 + + '@shikijs/themes@4.1.0': + dependencies: + '@shikijs/types': 4.1.0 + + '@shikijs/types@4.1.0': + dependencies: + '@shikijs/vscode-textmate': 10.0.2 + '@types/hast': 3.0.4 + + '@shikijs/vscode-textmate@10.0.2': {} + + '@standard-schema/spec@1.1.0': {} + + '@swc/helpers@0.5.15': + dependencies: + tslib: 2.8.1 + + '@tailwindcss/node@4.3.0': + dependencies: + '@jridgewell/remapping': 2.3.5 + enhanced-resolve: 5.22.1 + jiti: 2.7.0 + lightningcss: 1.32.0 + magic-string: 0.30.21 + source-map-js: 1.2.1 + tailwindcss: 4.3.0 + + '@tailwindcss/oxide-android-arm64@4.3.0': + optional: true + + '@tailwindcss/oxide-darwin-arm64@4.3.0': + optional: true + + '@tailwindcss/oxide-darwin-x64@4.3.0': + optional: true + + '@tailwindcss/oxide-freebsd-x64@4.3.0': + optional: true + + '@tailwindcss/oxide-linux-arm-gnueabihf@4.3.0': + optional: true + + '@tailwindcss/oxide-linux-arm64-gnu@4.3.0': + optional: true + + '@tailwindcss/oxide-linux-arm64-musl@4.3.0': + optional: true + + '@tailwindcss/oxide-linux-x64-gnu@4.3.0': + optional: true + + '@tailwindcss/oxide-linux-x64-musl@4.3.0': + optional: true + + '@tailwindcss/oxide-wasm32-wasi@4.3.0': + optional: true + + '@tailwindcss/oxide-win32-arm64-msvc@4.3.0': + optional: true + + '@tailwindcss/oxide-win32-x64-msvc@4.3.0': + optional: true + + '@tailwindcss/oxide@4.3.0': + optionalDependencies: + '@tailwindcss/oxide-android-arm64': 4.3.0 + '@tailwindcss/oxide-darwin-arm64': 4.3.0 + '@tailwindcss/oxide-darwin-x64': 4.3.0 + '@tailwindcss/oxide-freebsd-x64': 4.3.0 + '@tailwindcss/oxide-linux-arm-gnueabihf': 4.3.0 + '@tailwindcss/oxide-linux-arm64-gnu': 4.3.0 + '@tailwindcss/oxide-linux-arm64-musl': 4.3.0 + '@tailwindcss/oxide-linux-x64-gnu': 4.3.0 + '@tailwindcss/oxide-linux-x64-musl': 4.3.0 + '@tailwindcss/oxide-wasm32-wasi': 4.3.0 + '@tailwindcss/oxide-win32-arm64-msvc': 4.3.0 + '@tailwindcss/oxide-win32-x64-msvc': 4.3.0 + + '@tailwindcss/postcss@4.3.0': + dependencies: + '@alloc/quick-lru': 5.2.0 + '@tailwindcss/node': 4.3.0 + '@tailwindcss/oxide': 4.3.0 + postcss: 8.5.15 + tailwindcss: 4.3.0 + + '@tybys/wasm-util@0.10.2': + dependencies: + tslib: 2.8.1 + optional: true + + '@types/debug@4.1.13': + dependencies: + '@types/ms': 2.1.0 + + '@types/esrecurse@4.3.1': {} + + '@types/estree-jsx@1.0.5': + dependencies: + '@types/estree': 1.0.9 + + '@types/estree@1.0.9': {} + + '@types/hast@3.0.4': + dependencies: + '@types/unist': 3.0.3 + + '@types/json-schema@7.0.15': {} + + '@types/json5@0.0.29': {} + + '@types/mdast@4.0.4': + dependencies: + '@types/unist': 3.0.3 + + '@types/mdx@2.0.13': {} + + '@types/ms@2.1.0': {} + + '@types/node@25.3.3': + dependencies: + undici-types: 7.18.2 + + '@types/react-dom@19.2.3(@types/react@19.2.15)': + dependencies: + '@types/react': 19.2.15 + + '@types/react@19.2.15': + dependencies: + csstype: 3.2.3 + + '@types/unist@2.0.11': {} + + '@types/unist@3.0.3': {} + + '@typescript-eslint/eslint-plugin@8.60.0(@typescript-eslint/parser@8.60.0(eslint@10.4.1(jiti@2.7.0))(typescript@5.9.3))(eslint@10.4.1(jiti@2.7.0))(typescript@5.9.3)': + dependencies: + '@eslint-community/regexpp': 4.12.2 + '@typescript-eslint/parser': 8.60.0(eslint@10.4.1(jiti@2.7.0))(typescript@5.9.3) + '@typescript-eslint/scope-manager': 8.60.0 + '@typescript-eslint/type-utils': 8.60.0(eslint@10.4.1(jiti@2.7.0))(typescript@5.9.3) + '@typescript-eslint/utils': 8.60.0(eslint@10.4.1(jiti@2.7.0))(typescript@5.9.3) + '@typescript-eslint/visitor-keys': 8.60.0 + eslint: 10.4.1(jiti@2.7.0) + ignore: 7.0.5 + natural-compare: 1.4.0 + ts-api-utils: 2.5.0(typescript@5.9.3) + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/parser@8.60.0(eslint@10.4.1(jiti@2.7.0))(typescript@5.9.3)': + dependencies: + '@typescript-eslint/scope-manager': 8.60.0 + '@typescript-eslint/types': 8.60.0 + '@typescript-eslint/typescript-estree': 8.60.0(typescript@5.9.3) + '@typescript-eslint/visitor-keys': 8.60.0 + debug: 4.4.3 + eslint: 10.4.1(jiti@2.7.0) + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/project-service@8.60.0(typescript@5.9.3)': + dependencies: + '@typescript-eslint/tsconfig-utils': 8.60.0(typescript@5.9.3) + '@typescript-eslint/types': 8.60.0 + debug: 4.4.3 + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/scope-manager@8.60.0': + dependencies: + '@typescript-eslint/types': 8.60.0 + '@typescript-eslint/visitor-keys': 8.60.0 + + '@typescript-eslint/tsconfig-utils@8.60.0(typescript@5.9.3)': + dependencies: + typescript: 5.9.3 + + '@typescript-eslint/type-utils@8.60.0(eslint@10.4.1(jiti@2.7.0))(typescript@5.9.3)': + dependencies: + '@typescript-eslint/types': 8.60.0 + '@typescript-eslint/typescript-estree': 8.60.0(typescript@5.9.3) + '@typescript-eslint/utils': 8.60.0(eslint@10.4.1(jiti@2.7.0))(typescript@5.9.3) + debug: 4.4.3 + eslint: 10.4.1(jiti@2.7.0) + ts-api-utils: 2.5.0(typescript@5.9.3) + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/types@8.60.0': {} + + '@typescript-eslint/typescript-estree@8.60.0(typescript@5.9.3)': + dependencies: + '@typescript-eslint/project-service': 8.60.0(typescript@5.9.3) + '@typescript-eslint/tsconfig-utils': 8.60.0(typescript@5.9.3) + '@typescript-eslint/types': 8.60.0 + '@typescript-eslint/visitor-keys': 8.60.0 + debug: 4.4.3 + minimatch: 10.2.5 + semver: 7.8.1 + tinyglobby: 0.2.17 + ts-api-utils: 2.5.0(typescript@5.9.3) + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/utils@8.60.0(eslint@10.4.1(jiti@2.7.0))(typescript@5.9.3)': + dependencies: + '@eslint-community/eslint-utils': 4.9.1(eslint@10.4.1(jiti@2.7.0)) + '@typescript-eslint/scope-manager': 8.60.0 + '@typescript-eslint/types': 8.60.0 + '@typescript-eslint/typescript-estree': 8.60.0(typescript@5.9.3) + eslint: 10.4.1(jiti@2.7.0) + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/visitor-keys@8.60.0': + dependencies: + '@typescript-eslint/types': 8.60.0 + eslint-visitor-keys: 5.0.1 + + '@ungap/structured-clone@1.3.1': {} + + '@unrs/resolver-binding-android-arm-eabi@1.12.2': + optional: true + + '@unrs/resolver-binding-android-arm64@1.12.2': + optional: true + + '@unrs/resolver-binding-darwin-arm64@1.12.2': + optional: true + + '@unrs/resolver-binding-darwin-x64@1.12.2': + optional: true + + '@unrs/resolver-binding-freebsd-x64@1.12.2': + optional: true + + '@unrs/resolver-binding-linux-arm-gnueabihf@1.12.2': + optional: true + + '@unrs/resolver-binding-linux-arm-musleabihf@1.12.2': + optional: true + + '@unrs/resolver-binding-linux-arm64-gnu@1.12.2': + optional: true + + '@unrs/resolver-binding-linux-arm64-musl@1.12.2': + optional: true + + '@unrs/resolver-binding-linux-loong64-gnu@1.12.2': + optional: true + + '@unrs/resolver-binding-linux-loong64-musl@1.12.2': + optional: true + + '@unrs/resolver-binding-linux-ppc64-gnu@1.12.2': + optional: true + + '@unrs/resolver-binding-linux-riscv64-gnu@1.12.2': + optional: true + + '@unrs/resolver-binding-linux-riscv64-musl@1.12.2': + optional: true + + '@unrs/resolver-binding-linux-s390x-gnu@1.12.2': + optional: true + + '@unrs/resolver-binding-linux-x64-gnu@1.12.2': + optional: true + + '@unrs/resolver-binding-linux-x64-musl@1.12.2': + optional: true + + '@unrs/resolver-binding-openharmony-arm64@1.12.2': + optional: true + + '@unrs/resolver-binding-wasm32-wasi@1.12.2': + dependencies: + '@emnapi/core': 1.10.0 + '@emnapi/runtime': 1.10.0 + '@napi-rs/wasm-runtime': 1.1.4(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0) + optional: true + + '@unrs/resolver-binding-win32-arm64-msvc@1.12.2': + optional: true + + '@unrs/resolver-binding-win32-ia32-msvc@1.12.2': + optional: true + + '@unrs/resolver-binding-win32-x64-msvc@1.12.2': + optional: true + + acorn-jsx@5.3.2(acorn@8.16.0): + dependencies: + acorn: 8.16.0 + + acorn@8.16.0: {} + + ajv@6.15.0: + dependencies: + fast-deep-equal: 3.1.3 + fast-json-stable-stringify: 2.1.0 + json-schema-traverse: 0.4.1 + uri-js: 4.4.1 + + argparse@2.0.1: {} + + aria-hidden@1.2.6: + dependencies: + tslib: 2.8.1 + + aria-query@5.3.2: {} + + array-buffer-byte-length@1.0.2: + dependencies: + call-bound: 1.0.4 + is-array-buffer: 3.0.5 + + array-includes@3.1.9: + dependencies: + call-bind: 1.0.9 + call-bound: 1.0.4 + define-properties: 1.2.1 + es-abstract: 1.24.2 + es-object-atoms: 1.1.2 + get-intrinsic: 1.3.0 + is-string: 1.1.1 + math-intrinsics: 1.1.0 + + array.prototype.findlast@1.2.5: + dependencies: + call-bind: 1.0.9 + define-properties: 1.2.1 + es-abstract: 1.24.2 + es-errors: 1.3.0 + es-object-atoms: 1.1.2 + es-shim-unscopables: 1.1.0 + + array.prototype.findlastindex@1.2.6: + dependencies: + call-bind: 1.0.9 + call-bound: 1.0.4 + define-properties: 1.2.1 + es-abstract: 1.24.2 + es-errors: 1.3.0 + es-object-atoms: 1.1.2 + es-shim-unscopables: 1.1.0 + + array.prototype.flat@1.3.3: + dependencies: + call-bind: 1.0.9 + define-properties: 1.2.1 + es-abstract: 1.24.2 + es-shim-unscopables: 1.1.0 + + array.prototype.flatmap@1.3.3: + dependencies: + call-bind: 1.0.9 + define-properties: 1.2.1 + es-abstract: 1.24.2 + es-shim-unscopables: 1.1.0 + + array.prototype.tosorted@1.1.4: + dependencies: + call-bind: 1.0.9 + define-properties: 1.2.1 + es-abstract: 1.24.2 + es-errors: 1.3.0 + es-shim-unscopables: 1.1.0 + + arraybuffer.prototype.slice@1.0.4: + dependencies: + array-buffer-byte-length: 1.0.2 + call-bind: 1.0.9 + define-properties: 1.2.1 + es-abstract: 1.24.2 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + is-array-buffer: 3.0.5 + + ast-types-flow@0.0.8: {} + + astring@1.9.0: {} + + async-function@1.0.0: {} + + available-typed-arrays@1.0.7: + dependencies: + possible-typed-array-names: 1.1.0 + + axe-core@4.11.4: {} + + axobject-query@4.1.0: {} + + bail@2.0.2: {} + + balanced-match@1.0.2: {} + + balanced-match@4.0.4: {} + + baseline-browser-mapping@2.10.33: {} + + brace-expansion@1.1.15: + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + + brace-expansion@5.0.6: + dependencies: + balanced-match: 4.0.4 + + braces@3.0.3: + dependencies: + fill-range: 7.1.1 + + browserslist@4.28.2: + dependencies: + baseline-browser-mapping: 2.10.33 + caniuse-lite: 1.0.30001793 + electron-to-chromium: 1.5.364 + node-releases: 2.0.46 + update-browserslist-db: 1.2.3(browserslist@4.28.2) + + call-bind-apply-helpers@1.0.2: + dependencies: + es-errors: 1.3.0 + function-bind: 1.1.2 + + call-bind@1.0.9: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-define-property: 1.0.1 + get-intrinsic: 1.3.0 + set-function-length: 1.2.2 + + call-bound@1.0.4: + dependencies: + call-bind-apply-helpers: 1.0.2 + get-intrinsic: 1.3.0 + + caniuse-lite@1.0.30001793: {} + + ccount@2.0.1: {} + + character-entities-html4@2.1.0: {} + + character-entities-legacy@3.0.0: {} + + character-entities@2.0.2: {} + + character-reference-invalid@2.0.1: {} + + chokidar@5.0.0: + dependencies: + readdirp: 5.0.0 + + class-variance-authority@0.7.1: + dependencies: + clsx: 2.1.1 + + client-only@0.0.1: {} + + clsx@2.1.1: {} + + collapse-white-space@2.1.0: {} + + comma-separated-tokens@2.0.3: {} + + compute-scroll-into-view@3.1.1: {} + + concat-map@0.0.1: {} + + convert-source-map@2.0.0: {} + + cross-spawn@7.0.6: + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + + csstype@3.2.3: {} + + damerau-levenshtein@1.0.8: {} + + data-view-buffer@1.0.2: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + is-data-view: 1.0.2 + + data-view-byte-length@1.0.2: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + is-data-view: 1.0.2 + + data-view-byte-offset@1.0.1: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + is-data-view: 1.0.2 + + debug@3.2.7: + dependencies: + ms: 2.1.3 + + debug@4.4.3: + dependencies: + ms: 2.1.3 + + decode-named-character-reference@1.3.0: + dependencies: + character-entities: 2.0.2 + + deep-is@0.1.4: {} + + define-data-property@1.1.4: + dependencies: + es-define-property: 1.0.1 + es-errors: 1.3.0 + gopd: 1.2.0 + + define-properties@1.2.1: + dependencies: + define-data-property: 1.1.4 + has-property-descriptors: 1.0.2 + object-keys: 1.1.1 + + dequal@2.0.3: {} + + detect-libc@2.1.2: {} + + detect-node-es@1.1.0: {} + + devlop@1.1.0: + dependencies: + dequal: 2.0.3 + + doctrine@2.1.0: + dependencies: + esutils: 2.0.3 + + dunder-proto@1.0.1: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-errors: 1.3.0 + gopd: 1.2.0 + + electron-to-chromium@1.5.364: {} + + emoji-regex@9.2.2: {} + + enhanced-resolve@5.22.1: + dependencies: + graceful-fs: 4.2.11 + tapable: 2.3.3 + + entities@6.0.1: {} + + es-abstract@1.24.2: + dependencies: + array-buffer-byte-length: 1.0.2 + arraybuffer.prototype.slice: 1.0.4 + available-typed-arrays: 1.0.7 + call-bind: 1.0.9 + call-bound: 1.0.4 + data-view-buffer: 1.0.2 + data-view-byte-length: 1.0.2 + data-view-byte-offset: 1.0.1 + es-define-property: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.2 + es-set-tostringtag: 2.1.0 + es-to-primitive: 1.3.0 + function.prototype.name: 1.1.8 + get-intrinsic: 1.3.0 + get-proto: 1.0.1 + get-symbol-description: 1.1.0 + globalthis: 1.0.4 + gopd: 1.2.0 + has-property-descriptors: 1.0.2 + has-proto: 1.2.0 + has-symbols: 1.1.0 + hasown: 2.0.4 + internal-slot: 1.1.0 + is-array-buffer: 3.0.5 + is-callable: 1.2.7 + is-data-view: 1.0.2 + is-negative-zero: 2.0.3 + is-regex: 1.2.1 + is-set: 2.0.3 + is-shared-array-buffer: 1.0.4 + is-string: 1.1.1 + is-typed-array: 1.1.15 + is-weakref: 1.1.1 + math-intrinsics: 1.1.0 + object-inspect: 1.13.4 + object-keys: 1.1.1 + object.assign: 4.1.7 + own-keys: 1.0.1 + regexp.prototype.flags: 1.5.4 + safe-array-concat: 1.1.4 + safe-push-apply: 1.0.0 + safe-regex-test: 1.1.0 + set-proto: 1.0.0 + stop-iteration-iterator: 1.1.0 + string.prototype.trim: 1.2.10 + string.prototype.trimend: 1.0.9 + string.prototype.trimstart: 1.0.8 + typed-array-buffer: 1.0.3 + typed-array-byte-length: 1.0.3 + typed-array-byte-offset: 1.0.4 + typed-array-length: 1.0.8 + unbox-primitive: 1.1.0 + which-typed-array: 1.1.21 + + es-define-property@1.0.1: {} + + es-errors@1.3.0: {} + + es-iterator-helpers@1.3.2: + dependencies: + call-bind: 1.0.9 + call-bound: 1.0.4 + define-properties: 1.2.1 + es-abstract: 1.24.2 + es-errors: 1.3.0 + es-set-tostringtag: 2.1.0 + function-bind: 1.1.2 + get-intrinsic: 1.3.0 + globalthis: 1.0.4 + gopd: 1.2.0 + has-property-descriptors: 1.0.2 + has-proto: 1.2.0 + has-symbols: 1.1.0 + internal-slot: 1.1.0 + iterator.prototype: 1.1.5 + math-intrinsics: 1.1.0 + + es-object-atoms@1.1.2: + dependencies: + es-errors: 1.3.0 + + es-set-tostringtag@2.1.0: + dependencies: + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + has-tostringtag: 1.0.2 + hasown: 2.0.4 + + es-shim-unscopables@1.1.0: + dependencies: + hasown: 2.0.4 + + es-to-primitive@1.3.0: + dependencies: + is-callable: 1.2.7 + is-date-object: 1.1.0 + is-symbol: 1.1.1 + + esast-util-from-estree@2.0.0: + dependencies: + '@types/estree-jsx': 1.0.5 + devlop: 1.1.0 + estree-util-visit: 2.0.0 + unist-util-position-from-estree: 2.0.0 + + esast-util-from-js@2.0.1: + dependencies: + '@types/estree-jsx': 1.0.5 + acorn: 8.16.0 + esast-util-from-estree: 2.0.0 + vfile-message: 4.0.3 + + esbuild@0.27.7: + optionalDependencies: + '@esbuild/aix-ppc64': 0.27.7 + '@esbuild/android-arm': 0.27.7 + '@esbuild/android-arm64': 0.27.7 + '@esbuild/android-x64': 0.27.7 + '@esbuild/darwin-arm64': 0.27.7 + '@esbuild/darwin-x64': 0.27.7 + '@esbuild/freebsd-arm64': 0.27.7 + '@esbuild/freebsd-x64': 0.27.7 + '@esbuild/linux-arm': 0.27.7 + '@esbuild/linux-arm64': 0.27.7 + '@esbuild/linux-ia32': 0.27.7 + '@esbuild/linux-loong64': 0.27.7 + '@esbuild/linux-mips64el': 0.27.7 + '@esbuild/linux-ppc64': 0.27.7 + '@esbuild/linux-riscv64': 0.27.7 + '@esbuild/linux-s390x': 0.27.7 + '@esbuild/linux-x64': 0.27.7 + '@esbuild/netbsd-arm64': 0.27.7 + '@esbuild/netbsd-x64': 0.27.7 + '@esbuild/openbsd-arm64': 0.27.7 + '@esbuild/openbsd-x64': 0.27.7 + '@esbuild/openharmony-arm64': 0.27.7 + '@esbuild/sunos-x64': 0.27.7 + '@esbuild/win32-arm64': 0.27.7 + '@esbuild/win32-ia32': 0.27.7 + '@esbuild/win32-x64': 0.27.7 + + esbuild@0.28.0: + optionalDependencies: + '@esbuild/aix-ppc64': 0.28.0 + '@esbuild/android-arm': 0.28.0 + '@esbuild/android-arm64': 0.28.0 + '@esbuild/android-x64': 0.28.0 + '@esbuild/darwin-arm64': 0.28.0 + '@esbuild/darwin-x64': 0.28.0 + '@esbuild/freebsd-arm64': 0.28.0 + '@esbuild/freebsd-x64': 0.28.0 + '@esbuild/linux-arm': 0.28.0 + '@esbuild/linux-arm64': 0.28.0 + '@esbuild/linux-ia32': 0.28.0 + '@esbuild/linux-loong64': 0.28.0 + '@esbuild/linux-mips64el': 0.28.0 + '@esbuild/linux-ppc64': 0.28.0 + '@esbuild/linux-riscv64': 0.28.0 + '@esbuild/linux-s390x': 0.28.0 + '@esbuild/linux-x64': 0.28.0 + '@esbuild/netbsd-arm64': 0.28.0 + '@esbuild/netbsd-x64': 0.28.0 + '@esbuild/openbsd-arm64': 0.28.0 + '@esbuild/openbsd-x64': 0.28.0 + '@esbuild/openharmony-arm64': 0.28.0 + '@esbuild/sunos-x64': 0.28.0 + '@esbuild/win32-arm64': 0.28.0 + '@esbuild/win32-ia32': 0.28.0 + '@esbuild/win32-x64': 0.28.0 + + escalade@3.2.0: {} + + escape-string-regexp@4.0.0: {} + + escape-string-regexp@5.0.0: {} + + eslint-config-next@16.1.6(@typescript-eslint/parser@8.60.0(eslint@10.4.1(jiti@2.7.0))(typescript@5.9.3))(eslint@10.4.1(jiti@2.7.0))(typescript@5.9.3): + dependencies: + '@next/eslint-plugin-next': 16.1.6 + eslint: 10.4.1(jiti@2.7.0) + eslint-import-resolver-node: 0.3.10 + eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.32.0)(eslint@10.4.1(jiti@2.7.0)) + eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.60.0(eslint@10.4.1(jiti@2.7.0))(typescript@5.9.3))(eslint-import-resolver-typescript@3.10.1)(eslint@10.4.1(jiti@2.7.0)) + eslint-plugin-jsx-a11y: 6.10.2(eslint@10.4.1(jiti@2.7.0)) + eslint-plugin-react: 7.37.5(eslint@10.4.1(jiti@2.7.0)) + eslint-plugin-react-hooks: 7.1.1(eslint@10.4.1(jiti@2.7.0)) + globals: 16.4.0 + typescript-eslint: 8.60.0(eslint@10.4.1(jiti@2.7.0))(typescript@5.9.3) + optionalDependencies: + typescript: 5.9.3 + transitivePeerDependencies: + - '@typescript-eslint/parser' + - eslint-import-resolver-webpack + - eslint-plugin-import-x + - supports-color + + eslint-import-resolver-node@0.3.10: + dependencies: + debug: 3.2.7 + is-core-module: 2.16.2 + resolve: 2.0.0-next.7 + transitivePeerDependencies: + - supports-color + + eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0)(eslint@10.4.1(jiti@2.7.0)): + dependencies: + '@nolyfill/is-core-module': 1.0.39 + debug: 4.4.3 + eslint: 10.4.1(jiti@2.7.0) + get-tsconfig: 4.14.0 + is-bun-module: 2.0.0 + stable-hash: 0.0.5 + tinyglobby: 0.2.17 + unrs-resolver: 1.12.2 + optionalDependencies: + eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.60.0(eslint@10.4.1(jiti@2.7.0))(typescript@5.9.3))(eslint-import-resolver-typescript@3.10.1)(eslint@10.4.1(jiti@2.7.0)) + transitivePeerDependencies: + - supports-color + + eslint-module-utils@2.13.0(@typescript-eslint/parser@8.60.0(eslint@10.4.1(jiti@2.7.0))(typescript@5.9.3))(eslint-import-resolver-node@0.3.10)(eslint-import-resolver-typescript@3.10.1)(eslint@10.4.1(jiti@2.7.0)): + dependencies: + debug: 3.2.7 + optionalDependencies: + '@typescript-eslint/parser': 8.60.0(eslint@10.4.1(jiti@2.7.0))(typescript@5.9.3) + eslint: 10.4.1(jiti@2.7.0) + eslint-import-resolver-node: 0.3.10 + eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.32.0)(eslint@10.4.1(jiti@2.7.0)) + transitivePeerDependencies: + - supports-color + + eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.60.0(eslint@10.4.1(jiti@2.7.0))(typescript@5.9.3))(eslint-import-resolver-typescript@3.10.1)(eslint@10.4.1(jiti@2.7.0)): + dependencies: + '@rtsao/scc': 1.1.0 + array-includes: 3.1.9 + array.prototype.findlastindex: 1.2.6 + array.prototype.flat: 1.3.3 + array.prototype.flatmap: 1.3.3 + debug: 3.2.7 + doctrine: 2.1.0 + eslint: 10.4.1(jiti@2.7.0) + eslint-import-resolver-node: 0.3.10 + eslint-module-utils: 2.13.0(@typescript-eslint/parser@8.60.0(eslint@10.4.1(jiti@2.7.0))(typescript@5.9.3))(eslint-import-resolver-node@0.3.10)(eslint-import-resolver-typescript@3.10.1)(eslint@10.4.1(jiti@2.7.0)) + hasown: 2.0.4 + is-core-module: 2.16.2 + is-glob: 4.0.3 + minimatch: 3.1.5 + object.fromentries: 2.0.8 + object.groupby: 1.0.3 + object.values: 1.2.1 + semver: 6.3.1 + string.prototype.trimend: 1.0.9 + tsconfig-paths: 3.15.0 + optionalDependencies: + '@typescript-eslint/parser': 8.60.0(eslint@10.4.1(jiti@2.7.0))(typescript@5.9.3) + transitivePeerDependencies: + - eslint-import-resolver-typescript + - eslint-import-resolver-webpack + - supports-color + + eslint-plugin-jsx-a11y@6.10.2(eslint@10.4.1(jiti@2.7.0)): + dependencies: + aria-query: 5.3.2 + array-includes: 3.1.9 + array.prototype.flatmap: 1.3.3 + ast-types-flow: 0.0.8 + axe-core: 4.11.4 + axobject-query: 4.1.0 + damerau-levenshtein: 1.0.8 + emoji-regex: 9.2.2 + eslint: 10.4.1(jiti@2.7.0) + hasown: 2.0.4 + jsx-ast-utils: 3.3.5 + language-tags: 1.0.9 + minimatch: 3.1.5 + object.fromentries: 2.0.8 + safe-regex-test: 1.1.0 + string.prototype.includes: 2.0.1 + + eslint-plugin-react-hooks@7.1.1(eslint@10.4.1(jiti@2.7.0)): + dependencies: + '@babel/core': 7.29.7 + '@babel/parser': 7.29.7 + eslint: 10.4.1(jiti@2.7.0) + hermes-parser: 0.25.1 + zod: 4.4.3 + zod-validation-error: 4.0.2(zod@4.4.3) + transitivePeerDependencies: + - supports-color + + eslint-plugin-react@7.37.5(eslint@10.4.1(jiti@2.7.0)): + dependencies: + array-includes: 3.1.9 + array.prototype.findlast: 1.2.5 + array.prototype.flatmap: 1.3.3 + array.prototype.tosorted: 1.1.4 + doctrine: 2.1.0 + es-iterator-helpers: 1.3.2 + eslint: 10.4.1(jiti@2.7.0) + estraverse: 5.3.0 + hasown: 2.0.4 + jsx-ast-utils: 3.3.5 + minimatch: 3.1.5 + object.entries: 1.1.9 + object.fromentries: 2.0.8 + object.values: 1.2.1 + prop-types: 15.8.1 + resolve: 2.0.0-next.7 + semver: 6.3.1 + string.prototype.matchall: 4.0.12 + string.prototype.repeat: 1.0.0 + + eslint-scope@9.1.2: + dependencies: + '@types/esrecurse': 4.3.1 + '@types/estree': 1.0.9 + esrecurse: 4.3.0 + estraverse: 5.3.0 + + eslint-visitor-keys@3.4.3: {} + + eslint-visitor-keys@5.0.1: {} + + eslint@10.4.1(jiti@2.7.0): + dependencies: + '@eslint-community/eslint-utils': 4.9.1(eslint@10.4.1(jiti@2.7.0)) + '@eslint-community/regexpp': 4.12.2 + '@eslint/config-array': 0.23.5 + '@eslint/config-helpers': 0.6.0 + '@eslint/core': 1.2.1 + '@eslint/plugin-kit': 0.7.2 + '@humanfs/node': 0.16.8 + '@humanwhocodes/module-importer': 1.0.1 + '@humanwhocodes/retry': 0.4.3 + '@types/estree': 1.0.9 + ajv: 6.15.0 + cross-spawn: 7.0.6 + debug: 4.4.3 + escape-string-regexp: 4.0.0 + eslint-scope: 9.1.2 + eslint-visitor-keys: 5.0.1 + espree: 11.2.0 + esquery: 1.7.0 + esutils: 2.0.3 + fast-deep-equal: 3.1.3 + file-entry-cache: 8.0.0 + find-up: 5.0.0 + glob-parent: 6.0.2 + ignore: 5.3.2 + imurmurhash: 0.1.4 + is-glob: 4.0.3 + json-stable-stringify-without-jsonify: 1.0.1 + minimatch: 10.2.5 + natural-compare: 1.4.0 + optionator: 0.9.4 + optionalDependencies: + jiti: 2.7.0 + transitivePeerDependencies: + - supports-color + + espree@11.2.0: + dependencies: + acorn: 8.16.0 + acorn-jsx: 5.3.2(acorn@8.16.0) + eslint-visitor-keys: 5.0.1 + + esquery@1.7.0: + dependencies: + estraverse: 5.3.0 + + esrap@2.2.9(@typescript-eslint/types@8.60.0): + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 + optionalDependencies: + '@typescript-eslint/types': 8.60.0 + + esrecurse@4.3.0: + dependencies: + estraverse: 5.3.0 + + estraverse@5.3.0: {} + + estree-util-attach-comments@3.0.0: + dependencies: + '@types/estree': 1.0.9 + + estree-util-build-jsx@3.0.1: + dependencies: + '@types/estree-jsx': 1.0.5 + devlop: 1.1.0 + estree-util-is-identifier-name: 3.0.0 + estree-walker: 3.0.3 + + estree-util-is-identifier-name@3.0.0: {} + + estree-util-scope@1.0.0: + dependencies: + '@types/estree': 1.0.9 + devlop: 1.1.0 + + estree-util-to-js@2.0.0: + dependencies: + '@types/estree-jsx': 1.0.5 + astring: 1.9.0 + source-map: 0.7.6 + + estree-util-value-to-estree@3.5.0: + dependencies: + '@types/estree': 1.0.9 + + estree-util-visit@2.0.0: + dependencies: + '@types/estree-jsx': 1.0.5 + '@types/unist': 3.0.3 + + estree-walker@3.0.3: + dependencies: + '@types/estree': 1.0.9 + + esutils@2.0.3: {} + + extend@3.0.2: {} + + fast-deep-equal@3.1.3: {} + + fast-glob@3.3.1: + dependencies: + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.8 + + fast-json-stable-stringify@2.1.0: {} + + fast-levenshtein@2.0.6: {} + + fastq@1.20.1: + dependencies: + reusify: 1.1.0 + + fdir@6.5.0(picomatch@4.0.4): + optionalDependencies: + picomatch: 4.0.4 + + file-entry-cache@8.0.0: + dependencies: + flat-cache: 4.0.1 + + fill-range@7.1.1: + dependencies: + to-regex-range: 5.0.1 + + find-up@5.0.0: + dependencies: + locate-path: 6.0.0 + path-exists: 4.0.0 + + flat-cache@4.0.1: + dependencies: + flatted: 3.4.2 + keyv: 4.5.4 + + flatted@3.4.2: {} + + for-each@0.3.5: + dependencies: + is-callable: 1.2.7 + + framer-motion@12.40.0(react-dom@19.2.6(react@19.2.6))(react@19.2.6): + dependencies: + motion-dom: 12.40.0 + motion-utils: 12.39.0 + tslib: 2.8.1 + optionalDependencies: + react: 19.2.6 + react-dom: 19.2.6(react@19.2.6) + + fsevents@2.3.3: + optional: true + + fumadocs-core@16.9.3(@mdx-js/mdx@3.1.1)(@types/estree-jsx@1.0.5)(@types/hast@3.0.4)(@types/mdast@4.0.4)(@types/react@19.2.15)(lucide-react@0.546.0(react@19.2.6))(next@16.1.6(@babel/core@7.29.7)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(zod@4.4.3): + dependencies: + '@orama/orama': 3.1.18 + estree-util-value-to-estree: 3.5.0 + github-slugger: 2.0.0 + hast-util-to-estree: 3.1.3 + hast-util-to-jsx-runtime: 2.3.6 + js-yaml: 4.2.0 + mdast-util-mdx: 3.0.0 + mdast-util-to-markdown: 2.1.2 + remark: 15.0.1 + remark-gfm: 4.0.1 + remark-rehype: 11.1.2 + scroll-into-view-if-needed: 3.1.0 + shiki: 4.1.0 + tinyglobby: 0.2.17 + unified: 11.0.5 + unist-util-visit: 5.1.0 + vfile: 6.0.3 + optionalDependencies: + '@mdx-js/mdx': 3.1.1 + '@types/estree-jsx': 1.0.5 + '@types/hast': 3.0.4 + '@types/mdast': 4.0.4 + '@types/react': 19.2.15 + lucide-react: 0.546.0(react@19.2.6) + next: 16.1.6(@babel/core@7.29.7)(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + react: 19.2.6 + react-dom: 19.2.6(react@19.2.6) + zod: 4.4.3 + transitivePeerDependencies: + - supports-color + + fumadocs-mdx@14.2.9(@types/mdast@4.0.4)(@types/mdx@2.0.13)(@types/react@19.2.15)(fumadocs-core@16.9.3(@mdx-js/mdx@3.1.1)(@types/estree-jsx@1.0.5)(@types/hast@3.0.4)(@types/mdast@4.0.4)(@types/react@19.2.15)(lucide-react@0.546.0(react@19.2.6))(next@16.1.6(@babel/core@7.29.7)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(zod@4.4.3))(next@16.1.6(@babel/core@7.29.7)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(react@19.2.6): + dependencies: + '@mdx-js/mdx': 3.1.1 + '@standard-schema/spec': 1.1.0 + chokidar: 5.0.0 + esbuild: 0.27.7 + estree-util-value-to-estree: 3.5.0 + fumadocs-core: 16.9.3(@mdx-js/mdx@3.1.1)(@types/estree-jsx@1.0.5)(@types/hast@3.0.4)(@types/mdast@4.0.4)(@types/react@19.2.15)(lucide-react@0.546.0(react@19.2.6))(next@16.1.6(@babel/core@7.29.7)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(zod@4.4.3) + js-yaml: 4.2.0 + mdast-util-mdx: 3.0.0 + mdast-util-to-markdown: 2.1.2 + picocolors: 1.1.1 + picomatch: 4.0.4 + tinyexec: 1.2.4 + tinyglobby: 0.2.17 + unified: 11.0.5 + unist-util-remove-position: 5.0.0 + unist-util-visit: 5.1.0 + vfile: 6.0.3 + zod: 4.4.3 + optionalDependencies: + '@types/mdast': 4.0.4 + '@types/mdx': 2.0.13 + '@types/react': 19.2.15 + next: 16.1.6(@babel/core@7.29.7)(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + react: 19.2.6 + transitivePeerDependencies: + - supports-color + + fumadocs-openapi@10.9.1(6c397e23616c8e23c2ab5a065a8a1f4c): + dependencies: + '@fumari/json-schema-ts': 0.0.2(@typescript-eslint/types@8.60.0) + '@fumari/stf': 1.0.5(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + '@radix-ui/react-accordion': 1.2.12(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + '@radix-ui/react-dialog': 1.1.15(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + '@radix-ui/react-select': 2.2.6(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + '@radix-ui/react-slot': 1.2.4(@types/react@19.2.15)(react@19.2.6) + chokidar: 5.0.0 + class-variance-authority: 0.7.1 + fumadocs-core: 16.9.3(@mdx-js/mdx@3.1.1)(@types/estree-jsx@1.0.5)(@types/hast@3.0.4)(@types/mdast@4.0.4)(@types/react@19.2.15)(lucide-react@0.546.0(react@19.2.6))(next@16.1.6(@babel/core@7.29.7)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(zod@4.4.3) + fumadocs-ui: 16.9.3(@tailwindcss/oxide@4.3.0)(@types/mdx@2.0.13)(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(fumadocs-core@16.9.3(@mdx-js/mdx@3.1.1)(@types/estree-jsx@1.0.5)(@types/hast@3.0.4)(@types/mdast@4.0.4)(@types/react@19.2.15)(lucide-react@0.546.0(react@19.2.6))(next@16.1.6(@babel/core@7.29.7)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(zod@4.4.3))(next@16.1.6(@babel/core@7.29.7)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(tailwindcss@4.3.0) + github-slugger: 2.0.0 + hast-util-to-jsx-runtime: 2.3.6 + js-yaml: 4.2.0 + lucide-react: 1.17.0(react@19.2.6) + react: 19.2.6 + react-dom: 19.2.6(react@19.2.6) + remark: 15.0.1 + remark-rehype: 11.1.2 + shiki: 4.1.0 + tailwind-merge: 3.6.0 + optionalDependencies: + '@types/react': 19.2.15 + transitivePeerDependencies: + - '@types/react-dom' + - '@typescript-eslint/types' + - supports-color + + fumadocs-ui@16.9.3(@tailwindcss/oxide@4.3.0)(@types/mdx@2.0.13)(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(fumadocs-core@16.9.3(@mdx-js/mdx@3.1.1)(@types/estree-jsx@1.0.5)(@types/hast@3.0.4)(@types/mdast@4.0.4)(@types/react@19.2.15)(lucide-react@0.546.0(react@19.2.6))(next@16.1.6(@babel/core@7.29.7)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(zod@4.4.3))(next@16.1.6(@babel/core@7.29.7)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(tailwindcss@4.3.0): + dependencies: + '@fumadocs/tailwind': 0.0.5(@tailwindcss/oxide@4.3.0)(tailwindcss@4.3.0) + '@radix-ui/react-accordion': 1.2.12(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + '@radix-ui/react-collapsible': 1.1.12(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + '@radix-ui/react-dialog': 1.1.15(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + '@radix-ui/react-direction': 1.1.1(@types/react@19.2.15)(react@19.2.6) + '@radix-ui/react-navigation-menu': 1.2.14(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + '@radix-ui/react-popover': 1.1.15(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + '@radix-ui/react-scroll-area': 1.2.10(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + '@radix-ui/react-slot': 1.2.4(@types/react@19.2.15)(react@19.2.6) + '@radix-ui/react-tabs': 1.1.13(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + class-variance-authority: 0.7.1 + fumadocs-core: 16.9.3(@mdx-js/mdx@3.1.1)(@types/estree-jsx@1.0.5)(@types/hast@3.0.4)(@types/mdast@4.0.4)(@types/react@19.2.15)(lucide-react@0.546.0(react@19.2.6))(next@16.1.6(@babel/core@7.29.7)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(zod@4.4.3) + lucide-react: 1.17.0(react@19.2.6) + motion: 12.40.0(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + next-themes: 0.4.6(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + react: 19.2.6 + react-dom: 19.2.6(react@19.2.6) + react-remove-scroll: 2.7.2(@types/react@19.2.15)(react@19.2.6) + rehype-raw: 7.0.0 + scroll-into-view-if-needed: 3.1.0 + shiki: 4.1.0 + tailwind-merge: 3.6.0 + unist-util-visit: 5.1.0 + optionalDependencies: + '@types/mdx': 2.0.13 + '@types/react': 19.2.15 + next: 16.1.6(@babel/core@7.29.7)(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + transitivePeerDependencies: + - '@emotion/is-prop-valid' + - '@tailwindcss/oxide' + - '@types/react-dom' + - tailwindcss + + function-bind@1.1.2: {} + + function.prototype.name@1.1.8: + dependencies: + call-bind: 1.0.9 + call-bound: 1.0.4 + define-properties: 1.2.1 + functions-have-names: 1.2.3 + hasown: 2.0.4 + is-callable: 1.2.7 + + functions-have-names@1.2.3: {} + + generator-function@2.0.1: {} + + gensync@1.0.0-beta.2: {} + + get-intrinsic@1.3.0: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-define-property: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.2 + function-bind: 1.1.2 + get-proto: 1.0.1 + gopd: 1.2.0 + has-symbols: 1.1.0 + hasown: 2.0.4 + math-intrinsics: 1.1.0 + + get-nonce@1.0.1: {} + + get-proto@1.0.1: + dependencies: + dunder-proto: 1.0.1 + es-object-atoms: 1.1.2 + + get-symbol-description@1.1.0: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + + get-tsconfig@4.14.0: + dependencies: + resolve-pkg-maps: 1.0.0 + + github-slugger@2.0.0: {} + + glob-parent@5.1.2: + dependencies: + is-glob: 4.0.3 + + glob-parent@6.0.2: + dependencies: + is-glob: 4.0.3 + + globals@16.4.0: {} + + globalthis@1.0.4: + dependencies: + define-properties: 1.2.1 + gopd: 1.2.0 + + gopd@1.2.0: {} + + graceful-fs@4.2.11: {} + + has-bigints@1.1.0: {} + + has-property-descriptors@1.0.2: + dependencies: + es-define-property: 1.0.1 + + has-proto@1.2.0: + dependencies: + dunder-proto: 1.0.1 + + has-symbols@1.1.0: {} + + has-tostringtag@1.0.2: + dependencies: + has-symbols: 1.1.0 + + hasown@2.0.4: + dependencies: + function-bind: 1.1.2 + + hast-util-from-parse5@8.0.3: + dependencies: + '@types/hast': 3.0.4 + '@types/unist': 3.0.3 + devlop: 1.1.0 + hastscript: 9.0.1 + property-information: 7.1.0 + vfile: 6.0.3 + vfile-location: 5.0.3 + web-namespaces: 2.0.1 + + hast-util-parse-selector@4.0.0: + dependencies: + '@types/hast': 3.0.4 + + hast-util-raw@9.1.0: + dependencies: + '@types/hast': 3.0.4 + '@types/unist': 3.0.3 + '@ungap/structured-clone': 1.3.1 + hast-util-from-parse5: 8.0.3 + hast-util-to-parse5: 8.0.1 + html-void-elements: 3.0.0 + mdast-util-to-hast: 13.2.1 + parse5: 7.3.0 + unist-util-position: 5.0.0 + unist-util-visit: 5.1.0 + vfile: 6.0.3 + web-namespaces: 2.0.1 + zwitch: 2.0.4 + + hast-util-to-estree@3.1.3: + dependencies: + '@types/estree': 1.0.9 + '@types/estree-jsx': 1.0.5 + '@types/hast': 3.0.4 + comma-separated-tokens: 2.0.3 + devlop: 1.1.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.1 + mdast-util-mdx-jsx: 3.2.0 + mdast-util-mdxjs-esm: 2.0.1 + property-information: 7.1.0 + space-separated-tokens: 2.0.2 + style-to-js: 1.1.21 + unist-util-position: 5.0.0 + zwitch: 2.0.4 + transitivePeerDependencies: + - supports-color + + hast-util-to-html@9.0.5: + dependencies: + '@types/hast': 3.0.4 + '@types/unist': 3.0.3 + ccount: 2.0.1 + comma-separated-tokens: 2.0.3 + hast-util-whitespace: 3.0.0 + html-void-elements: 3.0.0 + mdast-util-to-hast: 13.2.1 + property-information: 7.1.0 + space-separated-tokens: 2.0.2 + stringify-entities: 4.0.4 + zwitch: 2.0.4 + + hast-util-to-jsx-runtime@2.3.6: + dependencies: + '@types/estree': 1.0.9 + '@types/hast': 3.0.4 + '@types/unist': 3.0.3 + comma-separated-tokens: 2.0.3 + devlop: 1.1.0 + estree-util-is-identifier-name: 3.0.0 + hast-util-whitespace: 3.0.0 + mdast-util-mdx-expression: 2.0.1 + mdast-util-mdx-jsx: 3.2.0 + mdast-util-mdxjs-esm: 2.0.1 + property-information: 7.1.0 + space-separated-tokens: 2.0.2 + style-to-js: 1.1.21 + unist-util-position: 5.0.0 + vfile-message: 4.0.3 + transitivePeerDependencies: + - supports-color + + hast-util-to-parse5@8.0.1: + dependencies: + '@types/hast': 3.0.4 + comma-separated-tokens: 2.0.3 + devlop: 1.1.0 + property-information: 7.1.0 + space-separated-tokens: 2.0.2 + web-namespaces: 2.0.1 + zwitch: 2.0.4 + + hast-util-whitespace@3.0.0: + dependencies: + '@types/hast': 3.0.4 + + hastscript@9.0.1: + dependencies: + '@types/hast': 3.0.4 + comma-separated-tokens: 2.0.3 + hast-util-parse-selector: 4.0.0 + property-information: 7.1.0 + space-separated-tokens: 2.0.2 + + hermes-estree@0.25.1: {} + + hermes-parser@0.25.1: + dependencies: + hermes-estree: 0.25.1 + + html-void-elements@3.0.0: {} + + ignore@5.3.2: {} + + ignore@7.0.5: {} + + imurmurhash@0.1.4: {} + + inline-style-parser@0.2.7: {} + + internal-slot@1.1.0: + dependencies: + es-errors: 1.3.0 + hasown: 2.0.4 + side-channel: 1.1.0 + + is-alphabetical@2.0.1: {} + + is-alphanumerical@2.0.1: + dependencies: + is-alphabetical: 2.0.1 + is-decimal: 2.0.1 + + is-array-buffer@3.0.5: + dependencies: + call-bind: 1.0.9 + call-bound: 1.0.4 + get-intrinsic: 1.3.0 + + is-async-function@2.1.1: + dependencies: + async-function: 1.0.0 + call-bound: 1.0.4 + get-proto: 1.0.1 + has-tostringtag: 1.0.2 + safe-regex-test: 1.1.0 + + is-bigint@1.1.0: + dependencies: + has-bigints: 1.1.0 + + is-boolean-object@1.2.2: + dependencies: + call-bound: 1.0.4 + has-tostringtag: 1.0.2 + + is-bun-module@2.0.0: + dependencies: + semver: 7.8.1 + + is-callable@1.2.7: {} + + is-core-module@2.16.2: + dependencies: + hasown: 2.0.4 + + is-data-view@1.0.2: + dependencies: + call-bound: 1.0.4 + get-intrinsic: 1.3.0 + is-typed-array: 1.1.15 + + is-date-object@1.1.0: + dependencies: + call-bound: 1.0.4 + has-tostringtag: 1.0.2 + + is-decimal@2.0.1: {} + + is-extglob@2.1.1: {} + + is-finalizationregistry@1.1.1: + dependencies: + call-bound: 1.0.4 + + is-generator-function@1.1.2: + dependencies: + call-bound: 1.0.4 + generator-function: 2.0.1 + get-proto: 1.0.1 + has-tostringtag: 1.0.2 + safe-regex-test: 1.1.0 + + is-glob@4.0.3: + dependencies: + is-extglob: 2.1.1 + + is-hexadecimal@2.0.1: {} + + is-map@2.0.3: {} + + is-negative-zero@2.0.3: {} + + is-number-object@1.1.1: + dependencies: + call-bound: 1.0.4 + has-tostringtag: 1.0.2 + + is-number@7.0.0: {} + + is-plain-obj@4.1.0: {} + + is-regex@1.2.1: + dependencies: + call-bound: 1.0.4 + gopd: 1.2.0 + has-tostringtag: 1.0.2 + hasown: 2.0.4 + + is-set@2.0.3: {} + + is-shared-array-buffer@1.0.4: + dependencies: + call-bound: 1.0.4 + + is-string@1.1.1: + dependencies: + call-bound: 1.0.4 + has-tostringtag: 1.0.2 + + is-symbol@1.1.1: + dependencies: + call-bound: 1.0.4 + has-symbols: 1.1.0 + safe-regex-test: 1.1.0 + + is-typed-array@1.1.15: + dependencies: + which-typed-array: 1.1.21 + + is-weakmap@2.0.2: {} + + is-weakref@1.1.1: + dependencies: + call-bound: 1.0.4 + + is-weakset@2.0.4: + dependencies: + call-bound: 1.0.4 + get-intrinsic: 1.3.0 + + isarray@2.0.5: {} + + isexe@2.0.0: {} + + iterator.prototype@1.1.5: + dependencies: + define-data-property: 1.1.4 + es-object-atoms: 1.1.2 + get-intrinsic: 1.3.0 + get-proto: 1.0.1 + has-symbols: 1.1.0 + set-function-name: 2.0.2 + + jiti@2.7.0: {} + + js-tokens@4.0.0: {} + + js-yaml@4.2.0: + dependencies: + argparse: 2.0.1 + + jsesc@3.1.0: {} + + json-buffer@3.0.1: {} + + json-schema-traverse@0.4.1: {} + + json-stable-stringify-without-jsonify@1.0.1: {} + + json5@1.0.2: + dependencies: + minimist: 1.2.8 + + json5@2.2.3: {} + + jsx-ast-utils@3.3.5: + dependencies: + array-includes: 3.1.9 + array.prototype.flat: 1.3.3 + object.assign: 4.1.7 + object.values: 1.2.1 + + keyv@4.5.4: + dependencies: + json-buffer: 3.0.1 + + language-subtag-registry@0.3.23: {} + + language-tags@1.0.9: + dependencies: + language-subtag-registry: 0.3.23 + + levn@0.4.1: + dependencies: + prelude-ls: 1.2.1 + type-check: 0.4.0 + + lightningcss-android-arm64@1.32.0: + optional: true + + lightningcss-darwin-arm64@1.32.0: + optional: true + + lightningcss-darwin-x64@1.32.0: + optional: true + + lightningcss-freebsd-x64@1.32.0: + optional: true + + lightningcss-linux-arm-gnueabihf@1.32.0: + optional: true + + lightningcss-linux-arm64-gnu@1.32.0: + optional: true + + lightningcss-linux-arm64-musl@1.32.0: + optional: true + + lightningcss-linux-x64-gnu@1.32.0: + optional: true + + lightningcss-linux-x64-musl@1.32.0: + optional: true + + lightningcss-win32-arm64-msvc@1.32.0: + optional: true + + lightningcss-win32-x64-msvc@1.32.0: + optional: true + + lightningcss@1.32.0: + dependencies: + detect-libc: 2.1.2 + optionalDependencies: + lightningcss-android-arm64: 1.32.0 + lightningcss-darwin-arm64: 1.32.0 + lightningcss-darwin-x64: 1.32.0 + lightningcss-freebsd-x64: 1.32.0 + lightningcss-linux-arm-gnueabihf: 1.32.0 + lightningcss-linux-arm64-gnu: 1.32.0 + lightningcss-linux-arm64-musl: 1.32.0 + lightningcss-linux-x64-gnu: 1.32.0 + lightningcss-linux-x64-musl: 1.32.0 + lightningcss-win32-arm64-msvc: 1.32.0 + lightningcss-win32-x64-msvc: 1.32.0 + + locate-path@6.0.0: + dependencies: + p-locate: 5.0.0 + + longest-streak@3.1.0: {} + + loose-envify@1.4.0: + dependencies: + js-tokens: 4.0.0 + + lru-cache@5.1.1: + dependencies: + yallist: 3.1.1 + + lucide-react@0.546.0(react@19.2.6): + dependencies: + react: 19.2.6 + + lucide-react@1.17.0(react@19.2.6): + dependencies: + react: 19.2.6 + + magic-string@0.30.21: + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 + + markdown-extensions@2.0.0: {} + + markdown-table@3.0.4: {} + + math-intrinsics@1.1.0: {} + + mdast-util-find-and-replace@3.0.2: + dependencies: + '@types/mdast': 4.0.4 + escape-string-regexp: 5.0.0 + unist-util-is: 6.0.1 + unist-util-visit-parents: 6.0.2 + + mdast-util-from-markdown@2.0.3: + dependencies: + '@types/mdast': 4.0.4 + '@types/unist': 3.0.3 + decode-named-character-reference: 1.3.0 + devlop: 1.1.0 + mdast-util-to-string: 4.0.0 + micromark: 4.0.2 + micromark-util-decode-numeric-character-reference: 2.0.2 + micromark-util-decode-string: 2.0.1 + micromark-util-normalize-identifier: 2.0.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + unist-util-stringify-position: 4.0.0 + transitivePeerDependencies: + - supports-color + + mdast-util-gfm-autolink-literal@2.0.1: + dependencies: + '@types/mdast': 4.0.4 + ccount: 2.0.1 + devlop: 1.1.0 + mdast-util-find-and-replace: 3.0.2 + micromark-util-character: 2.1.1 + + mdast-util-gfm-footnote@2.1.0: + dependencies: + '@types/mdast': 4.0.4 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.3 + mdast-util-to-markdown: 2.1.2 + micromark-util-normalize-identifier: 2.0.1 + transitivePeerDependencies: + - supports-color + + mdast-util-gfm-strikethrough@2.0.0: + dependencies: + '@types/mdast': 4.0.4 + mdast-util-from-markdown: 2.0.3 + mdast-util-to-markdown: 2.1.2 + transitivePeerDependencies: + - supports-color + + mdast-util-gfm-table@2.0.0: + dependencies: + '@types/mdast': 4.0.4 + devlop: 1.1.0 + markdown-table: 3.0.4 + mdast-util-from-markdown: 2.0.3 + mdast-util-to-markdown: 2.1.2 + transitivePeerDependencies: + - supports-color + + mdast-util-gfm-task-list-item@2.0.0: + dependencies: + '@types/mdast': 4.0.4 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.3 + mdast-util-to-markdown: 2.1.2 + transitivePeerDependencies: + - supports-color + + mdast-util-gfm@3.1.0: + dependencies: + mdast-util-from-markdown: 2.0.3 + mdast-util-gfm-autolink-literal: 2.0.1 + mdast-util-gfm-footnote: 2.1.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.1.2 + transitivePeerDependencies: + - supports-color + + mdast-util-mdx-expression@2.0.1: + dependencies: + '@types/estree-jsx': 1.0.5 + '@types/hast': 3.0.4 + '@types/mdast': 4.0.4 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.3 + mdast-util-to-markdown: 2.1.2 + transitivePeerDependencies: + - supports-color + + mdast-util-mdx-jsx@3.2.0: + dependencies: + '@types/estree-jsx': 1.0.5 + '@types/hast': 3.0.4 + '@types/mdast': 4.0.4 + '@types/unist': 3.0.3 + ccount: 2.0.1 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.3 + mdast-util-to-markdown: 2.1.2 + parse-entities: 4.0.2 + stringify-entities: 4.0.4 + unist-util-stringify-position: 4.0.0 + vfile-message: 4.0.3 + transitivePeerDependencies: + - supports-color + + mdast-util-mdx@3.0.0: + dependencies: + mdast-util-from-markdown: 2.0.3 + mdast-util-mdx-expression: 2.0.1 + mdast-util-mdx-jsx: 3.2.0 + mdast-util-mdxjs-esm: 2.0.1 + mdast-util-to-markdown: 2.1.2 + transitivePeerDependencies: + - supports-color + + mdast-util-mdxjs-esm@2.0.1: + dependencies: + '@types/estree-jsx': 1.0.5 + '@types/hast': 3.0.4 + '@types/mdast': 4.0.4 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.3 + mdast-util-to-markdown: 2.1.2 + transitivePeerDependencies: + - supports-color + + mdast-util-phrasing@4.1.0: + dependencies: + '@types/mdast': 4.0.4 + unist-util-is: 6.0.1 + + mdast-util-to-hast@13.2.1: + dependencies: + '@types/hast': 3.0.4 + '@types/mdast': 4.0.4 + '@ungap/structured-clone': 1.3.1 + devlop: 1.1.0 + micromark-util-sanitize-uri: 2.0.1 + trim-lines: 3.0.1 + unist-util-position: 5.0.0 + unist-util-visit: 5.1.0 + vfile: 6.0.3 + + mdast-util-to-markdown@2.1.2: + dependencies: + '@types/mdast': 4.0.4 + '@types/unist': 3.0.3 + longest-streak: 3.1.0 + mdast-util-phrasing: 4.1.0 + mdast-util-to-string: 4.0.0 + micromark-util-classify-character: 2.0.1 + micromark-util-decode-string: 2.0.1 + unist-util-visit: 5.1.0 + zwitch: 2.0.4 + + mdast-util-to-string@4.0.0: + dependencies: + '@types/mdast': 4.0.4 + + merge2@1.4.1: {} + + micromark-core-commonmark@2.0.3: + dependencies: + decode-named-character-reference: 1.3.0 + devlop: 1.1.0 + micromark-factory-destination: 2.0.1 + micromark-factory-label: 2.0.1 + micromark-factory-space: 2.0.1 + micromark-factory-title: 2.0.1 + micromark-factory-whitespace: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-chunked: 2.0.1 + micromark-util-classify-character: 2.0.1 + micromark-util-html-tag-name: 2.0.1 + micromark-util-normalize-identifier: 2.0.1 + micromark-util-resolve-all: 2.0.1 + micromark-util-subtokenize: 2.1.0 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-extension-gfm-autolink-literal@2.1.0: + dependencies: + micromark-util-character: 2.1.1 + micromark-util-sanitize-uri: 2.0.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-extension-gfm-footnote@2.1.0: + dependencies: + devlop: 1.1.0 + micromark-core-commonmark: 2.0.3 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-normalize-identifier: 2.0.1 + micromark-util-sanitize-uri: 2.0.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-extension-gfm-strikethrough@2.1.0: + dependencies: + devlop: 1.1.0 + micromark-util-chunked: 2.0.1 + micromark-util-classify-character: 2.0.1 + micromark-util-resolve-all: 2.0.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-extension-gfm-table@2.1.1: + dependencies: + devlop: 1.1.0 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-extension-gfm-tagfilter@2.0.0: + dependencies: + micromark-util-types: 2.0.2 + + micromark-extension-gfm-task-list-item@2.1.0: + dependencies: + devlop: 1.1.0 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-extension-gfm@3.0.0: + dependencies: + micromark-extension-gfm-autolink-literal: 2.1.0 + micromark-extension-gfm-footnote: 2.1.0 + micromark-extension-gfm-strikethrough: 2.1.0 + micromark-extension-gfm-table: 2.1.1 + micromark-extension-gfm-tagfilter: 2.0.0 + micromark-extension-gfm-task-list-item: 2.1.0 + micromark-util-combine-extensions: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-extension-mdx-expression@3.0.1: + dependencies: + '@types/estree': 1.0.9 + devlop: 1.1.0 + micromark-factory-mdx-expression: 2.0.3 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-events-to-acorn: 2.0.3 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-extension-mdx-jsx@3.0.2: + dependencies: + '@types/estree': 1.0.9 + devlop: 1.1.0 + estree-util-is-identifier-name: 3.0.0 + micromark-factory-mdx-expression: 2.0.3 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-events-to-acorn: 2.0.3 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + vfile-message: 4.0.3 + + micromark-extension-mdx-md@2.0.0: + dependencies: + micromark-util-types: 2.0.2 + + micromark-extension-mdxjs-esm@3.0.0: + dependencies: + '@types/estree': 1.0.9 + devlop: 1.1.0 + micromark-core-commonmark: 2.0.3 + micromark-util-character: 2.1.1 + micromark-util-events-to-acorn: 2.0.3 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + unist-util-position-from-estree: 2.0.0 + vfile-message: 4.0.3 + + micromark-extension-mdxjs@3.0.0: + dependencies: + acorn: 8.16.0 + acorn-jsx: 5.3.2(acorn@8.16.0) + micromark-extension-mdx-expression: 3.0.1 + micromark-extension-mdx-jsx: 3.0.2 + micromark-extension-mdx-md: 2.0.0 + micromark-extension-mdxjs-esm: 3.0.0 + micromark-util-combine-extensions: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-factory-destination@2.0.1: + dependencies: + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-factory-label@2.0.1: + dependencies: + devlop: 1.1.0 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-factory-mdx-expression@2.0.3: + dependencies: + '@types/estree': 1.0.9 + devlop: 1.1.0 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-events-to-acorn: 2.0.3 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + unist-util-position-from-estree: 2.0.0 + vfile-message: 4.0.3 + + micromark-factory-space@2.0.1: + dependencies: + micromark-util-character: 2.1.1 + micromark-util-types: 2.0.2 + + micromark-factory-title@2.0.1: + dependencies: + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-factory-whitespace@2.0.1: + dependencies: + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-util-character@2.1.1: + dependencies: + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-util-chunked@2.0.1: + dependencies: + micromark-util-symbol: 2.0.1 + + micromark-util-classify-character@2.0.1: + dependencies: + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-util-combine-extensions@2.0.1: + dependencies: + micromark-util-chunked: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-util-decode-numeric-character-reference@2.0.2: + dependencies: + micromark-util-symbol: 2.0.1 + + micromark-util-decode-string@2.0.1: + dependencies: + decode-named-character-reference: 1.3.0 + micromark-util-character: 2.1.1 + micromark-util-decode-numeric-character-reference: 2.0.2 + micromark-util-symbol: 2.0.1 + + micromark-util-encode@2.0.1: {} + + micromark-util-events-to-acorn@2.0.3: + dependencies: + '@types/estree': 1.0.9 + '@types/unist': 3.0.3 + devlop: 1.1.0 + estree-util-visit: 2.0.0 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + vfile-message: 4.0.3 + + micromark-util-html-tag-name@2.0.1: {} + + micromark-util-normalize-identifier@2.0.1: + dependencies: + micromark-util-symbol: 2.0.1 + + micromark-util-resolve-all@2.0.1: + dependencies: + micromark-util-types: 2.0.2 + + micromark-util-sanitize-uri@2.0.1: + dependencies: + micromark-util-character: 2.1.1 + micromark-util-encode: 2.0.1 + micromark-util-symbol: 2.0.1 + + micromark-util-subtokenize@2.1.0: + dependencies: + devlop: 1.1.0 + micromark-util-chunked: 2.0.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-util-symbol@2.0.1: {} + + micromark-util-types@2.0.2: {} + + micromark@4.0.2: + dependencies: + '@types/debug': 4.1.13 + debug: 4.4.3 + decode-named-character-reference: 1.3.0 + devlop: 1.1.0 + micromark-core-commonmark: 2.0.3 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-chunked: 2.0.1 + micromark-util-combine-extensions: 2.0.1 + micromark-util-decode-numeric-character-reference: 2.0.2 + micromark-util-encode: 2.0.1 + micromark-util-normalize-identifier: 2.0.1 + micromark-util-resolve-all: 2.0.1 + micromark-util-sanitize-uri: 2.0.1 + micromark-util-subtokenize: 2.1.0 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + transitivePeerDependencies: + - supports-color + + micromatch@4.0.8: + dependencies: + braces: 3.0.3 + picomatch: 2.3.2 + + minimatch@10.2.5: + dependencies: + brace-expansion: 5.0.6 + + minimatch@3.1.5: + dependencies: + brace-expansion: 1.1.15 + + minimist@1.2.8: {} + + motion-dom@12.40.0: + dependencies: + motion-utils: 12.39.0 + + motion-utils@12.39.0: {} + + motion@12.40.0(react-dom@19.2.6(react@19.2.6))(react@19.2.6): + dependencies: + framer-motion: 12.40.0(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + tslib: 2.8.1 + optionalDependencies: + react: 19.2.6 + react-dom: 19.2.6(react@19.2.6) + + ms@2.1.3: {} + + nanoid@3.3.12: {} + + napi-postinstall@0.3.4: {} + + natural-compare@1.4.0: {} + + next-themes@0.4.6(react-dom@19.2.6(react@19.2.6))(react@19.2.6): + dependencies: + react: 19.2.6 + react-dom: 19.2.6(react@19.2.6) + + next@16.1.6(@babel/core@7.29.7)(react-dom@19.2.6(react@19.2.6))(react@19.2.6): + dependencies: + '@next/env': 16.1.6 + '@swc/helpers': 0.5.15 + baseline-browser-mapping: 2.10.33 + caniuse-lite: 1.0.30001793 + postcss: 8.4.31 + react: 19.2.6 + react-dom: 19.2.6(react@19.2.6) + styled-jsx: 5.1.6(@babel/core@7.29.7)(react@19.2.6) + optionalDependencies: + '@next/swc-darwin-arm64': 16.1.6 + '@next/swc-darwin-x64': 16.1.6 + '@next/swc-linux-arm64-gnu': 16.1.6 + '@next/swc-linux-arm64-musl': 16.1.6 + '@next/swc-linux-x64-gnu': 16.1.6 + '@next/swc-linux-x64-musl': 16.1.6 + '@next/swc-win32-arm64-msvc': 16.1.6 + '@next/swc-win32-x64-msvc': 16.1.6 + sharp: 0.34.5 + transitivePeerDependencies: + - '@babel/core' + - babel-plugin-macros + + node-exports-info@1.6.0: + dependencies: + array.prototype.flatmap: 1.3.3 + es-errors: 1.3.0 + object.entries: 1.1.9 + semver: 6.3.1 + + node-releases@2.0.46: {} + + object-assign@4.1.1: {} + + object-inspect@1.13.4: {} + + object-keys@1.1.1: {} + + object.assign@4.1.7: + dependencies: + call-bind: 1.0.9 + call-bound: 1.0.4 + define-properties: 1.2.1 + es-object-atoms: 1.1.2 + has-symbols: 1.1.0 + object-keys: 1.1.1 + + object.entries@1.1.9: + dependencies: + call-bind: 1.0.9 + call-bound: 1.0.4 + define-properties: 1.2.1 + es-object-atoms: 1.1.2 + + object.fromentries@2.0.8: + dependencies: + call-bind: 1.0.9 + define-properties: 1.2.1 + es-abstract: 1.24.2 + es-object-atoms: 1.1.2 + + object.groupby@1.0.3: + dependencies: + call-bind: 1.0.9 + define-properties: 1.2.1 + es-abstract: 1.24.2 + + object.values@1.2.1: + dependencies: + call-bind: 1.0.9 + call-bound: 1.0.4 + define-properties: 1.2.1 + es-object-atoms: 1.1.2 + + oniguruma-parser@0.12.2: {} + + oniguruma-to-es@4.3.6: + dependencies: + oniguruma-parser: 0.12.2 + regex: 6.1.0 + regex-recursion: 6.0.2 + + optionator@0.9.4: + dependencies: + deep-is: 0.1.4 + fast-levenshtein: 2.0.6 + levn: 0.4.1 + prelude-ls: 1.2.1 + type-check: 0.4.0 + word-wrap: 1.2.5 + + own-keys@1.0.1: + dependencies: + get-intrinsic: 1.3.0 + object-keys: 1.1.1 + safe-push-apply: 1.0.0 + + p-limit@3.1.0: + dependencies: + yocto-queue: 0.1.0 + + p-locate@5.0.0: + dependencies: + p-limit: 3.1.0 + + parse-entities@4.0.2: + dependencies: + '@types/unist': 2.0.11 + character-entities-legacy: 3.0.0 + character-reference-invalid: 2.0.1 + decode-named-character-reference: 1.3.0 + is-alphanumerical: 2.0.1 + is-decimal: 2.0.1 + is-hexadecimal: 2.0.1 + + parse5@7.3.0: + dependencies: + entities: 6.0.1 + + path-exists@4.0.0: {} + + path-key@3.1.1: {} + + path-parse@1.0.7: {} + + picocolors@1.1.1: {} + + picomatch@2.3.2: {} + + picomatch@4.0.4: {} + + possible-typed-array-names@1.1.0: {} + + postcss@8.4.31: + dependencies: + nanoid: 3.3.12 + picocolors: 1.1.1 + source-map-js: 1.2.1 + + postcss@8.5.15: + dependencies: + nanoid: 3.3.12 + picocolors: 1.1.1 + source-map-js: 1.2.1 + + prelude-ls@1.2.1: {} + + prop-types@15.8.1: + dependencies: + loose-envify: 1.4.0 + object-assign: 4.1.1 + react-is: 16.13.1 + + property-information@7.1.0: {} + + punycode@2.3.1: {} + + queue-microtask@1.2.3: {} + + react-dom@19.2.6(react@19.2.6): + dependencies: + react: 19.2.6 + scheduler: 0.27.0 + + react-is@16.13.1: {} + + react-remove-scroll-bar@2.3.8(@types/react@19.2.15)(react@19.2.6): + dependencies: + react: 19.2.6 + react-style-singleton: 2.2.3(@types/react@19.2.15)(react@19.2.6) + tslib: 2.8.1 + optionalDependencies: + '@types/react': 19.2.15 + + react-remove-scroll@2.7.2(@types/react@19.2.15)(react@19.2.6): + dependencies: + react: 19.2.6 + react-remove-scroll-bar: 2.3.8(@types/react@19.2.15)(react@19.2.6) + react-style-singleton: 2.2.3(@types/react@19.2.15)(react@19.2.6) + tslib: 2.8.1 + use-callback-ref: 1.3.3(@types/react@19.2.15)(react@19.2.6) + use-sidecar: 1.1.3(@types/react@19.2.15)(react@19.2.6) + optionalDependencies: + '@types/react': 19.2.15 + + react-style-singleton@2.2.3(@types/react@19.2.15)(react@19.2.6): + dependencies: + get-nonce: 1.0.1 + react: 19.2.6 + tslib: 2.8.1 + optionalDependencies: + '@types/react': 19.2.15 + + react@19.2.6: {} + + readdirp@5.0.0: {} + + recma-build-jsx@1.0.0: + dependencies: + '@types/estree': 1.0.9 + estree-util-build-jsx: 3.0.1 + vfile: 6.0.3 + + recma-jsx@1.0.1(acorn@8.16.0): + dependencies: + acorn: 8.16.0 + acorn-jsx: 5.3.2(acorn@8.16.0) + estree-util-to-js: 2.0.0 + recma-parse: 1.0.0 + recma-stringify: 1.0.0 + unified: 11.0.5 + + recma-parse@1.0.0: + dependencies: + '@types/estree': 1.0.9 + esast-util-from-js: 2.0.1 + unified: 11.0.5 + vfile: 6.0.3 + + recma-stringify@1.0.0: + dependencies: + '@types/estree': 1.0.9 + estree-util-to-js: 2.0.0 + unified: 11.0.5 + vfile: 6.0.3 + + reflect.getprototypeof@1.0.10: + dependencies: + call-bind: 1.0.9 + define-properties: 1.2.1 + es-abstract: 1.24.2 + es-errors: 1.3.0 + es-object-atoms: 1.1.2 + get-intrinsic: 1.3.0 + get-proto: 1.0.1 + which-builtin-type: 1.2.1 + + regex-recursion@6.0.2: + dependencies: + regex-utilities: 2.3.0 + + regex-utilities@2.3.0: {} + + regex@6.1.0: + dependencies: + regex-utilities: 2.3.0 + + regexp.prototype.flags@1.5.4: + dependencies: + call-bind: 1.0.9 + define-properties: 1.2.1 + es-errors: 1.3.0 + get-proto: 1.0.1 + gopd: 1.2.0 + set-function-name: 2.0.2 + + rehype-raw@7.0.0: + dependencies: + '@types/hast': 3.0.4 + hast-util-raw: 9.1.0 + vfile: 6.0.3 + + rehype-recma@1.0.0: + dependencies: + '@types/estree': 1.0.9 + '@types/hast': 3.0.4 + hast-util-to-estree: 3.1.3 + transitivePeerDependencies: + - supports-color + + remark-gfm@4.0.1: + dependencies: + '@types/mdast': 4.0.4 + mdast-util-gfm: 3.1.0 + micromark-extension-gfm: 3.0.0 + remark-parse: 11.0.0 + remark-stringify: 11.0.0 + unified: 11.0.5 + transitivePeerDependencies: + - supports-color + + remark-mdx@3.1.1: + dependencies: + mdast-util-mdx: 3.0.0 + micromark-extension-mdxjs: 3.0.0 + transitivePeerDependencies: + - supports-color + + remark-parse@11.0.0: + dependencies: + '@types/mdast': 4.0.4 + mdast-util-from-markdown: 2.0.3 + micromark-util-types: 2.0.2 + unified: 11.0.5 + transitivePeerDependencies: + - supports-color + + remark-rehype@11.1.2: + dependencies: + '@types/hast': 3.0.4 + '@types/mdast': 4.0.4 + mdast-util-to-hast: 13.2.1 + unified: 11.0.5 + vfile: 6.0.3 + + remark-stringify@11.0.0: + dependencies: + '@types/mdast': 4.0.4 + mdast-util-to-markdown: 2.1.2 + unified: 11.0.5 + + remark@15.0.1: + dependencies: + '@types/mdast': 4.0.4 + remark-parse: 11.0.0 + remark-stringify: 11.0.0 + unified: 11.0.5 + transitivePeerDependencies: + - supports-color + + resolve-pkg-maps@1.0.0: {} + + resolve@2.0.0-next.7: + dependencies: + es-errors: 1.3.0 + is-core-module: 2.16.2 + node-exports-info: 1.6.0 + object-keys: 1.1.1 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + + reusify@1.1.0: {} + + run-parallel@1.2.0: + dependencies: + queue-microtask: 1.2.3 + + safe-array-concat@1.1.4: + dependencies: + call-bind: 1.0.9 + call-bound: 1.0.4 + get-intrinsic: 1.3.0 + has-symbols: 1.1.0 + isarray: 2.0.5 + + safe-push-apply@1.0.0: + dependencies: + es-errors: 1.3.0 + isarray: 2.0.5 + + safe-regex-test@1.1.0: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + is-regex: 1.2.1 + + scheduler@0.27.0: {} + + scroll-into-view-if-needed@3.1.0: + dependencies: + compute-scroll-into-view: 3.1.1 + + semver@6.3.1: {} + + semver@7.8.1: {} + + set-function-length@1.2.2: + dependencies: + define-data-property: 1.1.4 + es-errors: 1.3.0 + function-bind: 1.1.2 + get-intrinsic: 1.3.0 + gopd: 1.2.0 + has-property-descriptors: 1.0.2 + + set-function-name@2.0.2: + dependencies: + define-data-property: 1.1.4 + es-errors: 1.3.0 + functions-have-names: 1.2.3 + has-property-descriptors: 1.0.2 + + set-proto@1.0.0: + dependencies: + dunder-proto: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.2 + + sharp@0.34.5: + dependencies: + '@img/colour': 1.1.0 + detect-libc: 2.1.2 + semver: 7.8.1 + optionalDependencies: + '@img/sharp-darwin-arm64': 0.34.5 + '@img/sharp-darwin-x64': 0.34.5 + '@img/sharp-libvips-darwin-arm64': 1.2.4 + '@img/sharp-libvips-darwin-x64': 1.2.4 + '@img/sharp-libvips-linux-arm': 1.2.4 + '@img/sharp-libvips-linux-arm64': 1.2.4 + '@img/sharp-libvips-linux-ppc64': 1.2.4 + '@img/sharp-libvips-linux-riscv64': 1.2.4 + '@img/sharp-libvips-linux-s390x': 1.2.4 + '@img/sharp-libvips-linux-x64': 1.2.4 + '@img/sharp-libvips-linuxmusl-arm64': 1.2.4 + '@img/sharp-libvips-linuxmusl-x64': 1.2.4 + '@img/sharp-linux-arm': 0.34.5 + '@img/sharp-linux-arm64': 0.34.5 + '@img/sharp-linux-ppc64': 0.34.5 + '@img/sharp-linux-riscv64': 0.34.5 + '@img/sharp-linux-s390x': 0.34.5 + '@img/sharp-linux-x64': 0.34.5 + '@img/sharp-linuxmusl-arm64': 0.34.5 + '@img/sharp-linuxmusl-x64': 0.34.5 + '@img/sharp-wasm32': 0.34.5 + '@img/sharp-win32-arm64': 0.34.5 + '@img/sharp-win32-ia32': 0.34.5 + '@img/sharp-win32-x64': 0.34.5 + optional: true + + shebang-command@2.0.0: + dependencies: + shebang-regex: 3.0.0 + + shebang-regex@3.0.0: {} + + shiki@4.1.0: + dependencies: + '@shikijs/core': 4.1.0 + '@shikijs/engine-javascript': 4.1.0 + '@shikijs/engine-oniguruma': 4.1.0 + '@shikijs/langs': 4.1.0 + '@shikijs/themes': 4.1.0 + '@shikijs/types': 4.1.0 + '@shikijs/vscode-textmate': 10.0.2 + '@types/hast': 3.0.4 + + side-channel-list@1.0.1: + dependencies: + es-errors: 1.3.0 + object-inspect: 1.13.4 + + side-channel-map@1.0.1: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + object-inspect: 1.13.4 + + side-channel-weakmap@1.0.2: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + object-inspect: 1.13.4 + side-channel-map: 1.0.1 + + side-channel@1.1.0: + dependencies: + es-errors: 1.3.0 + object-inspect: 1.13.4 + side-channel-list: 1.0.1 + side-channel-map: 1.0.1 + side-channel-weakmap: 1.0.2 + + source-map-js@1.2.1: {} + + source-map@0.7.6: {} + + space-separated-tokens@2.0.2: {} + + stable-hash@0.0.5: {} + + stop-iteration-iterator@1.1.0: + dependencies: + es-errors: 1.3.0 + internal-slot: 1.1.0 + + string.prototype.includes@2.0.1: + dependencies: + call-bind: 1.0.9 + define-properties: 1.2.1 + es-abstract: 1.24.2 + + string.prototype.matchall@4.0.12: + dependencies: + call-bind: 1.0.9 + call-bound: 1.0.4 + define-properties: 1.2.1 + es-abstract: 1.24.2 + es-errors: 1.3.0 + es-object-atoms: 1.1.2 + get-intrinsic: 1.3.0 + gopd: 1.2.0 + has-symbols: 1.1.0 + internal-slot: 1.1.0 + regexp.prototype.flags: 1.5.4 + set-function-name: 2.0.2 + side-channel: 1.1.0 + + string.prototype.repeat@1.0.0: + dependencies: + define-properties: 1.2.1 + es-abstract: 1.24.2 + + string.prototype.trim@1.2.10: + dependencies: + call-bind: 1.0.9 + call-bound: 1.0.4 + define-data-property: 1.1.4 + define-properties: 1.2.1 + es-abstract: 1.24.2 + es-object-atoms: 1.1.2 + has-property-descriptors: 1.0.2 + + string.prototype.trimend@1.0.9: + dependencies: + call-bind: 1.0.9 + call-bound: 1.0.4 + define-properties: 1.2.1 + es-object-atoms: 1.1.2 + + string.prototype.trimstart@1.0.8: + dependencies: + call-bind: 1.0.9 + define-properties: 1.2.1 + es-object-atoms: 1.1.2 + + stringify-entities@4.0.4: + dependencies: + character-entities-html4: 2.1.0 + character-entities-legacy: 3.0.0 + + strip-bom@3.0.0: {} + + style-to-js@1.1.21: + dependencies: + style-to-object: 1.0.14 + + style-to-object@1.0.14: + dependencies: + inline-style-parser: 0.2.7 + + styled-jsx@5.1.6(@babel/core@7.29.7)(react@19.2.6): + dependencies: + client-only: 0.0.1 + react: 19.2.6 + optionalDependencies: + '@babel/core': 7.29.7 + + supports-preserve-symlinks-flag@1.0.0: {} + + tailwind-merge@3.6.0: {} + + tailwindcss@4.3.0: {} + + tapable@2.3.3: {} + + tinyexec@1.2.4: {} + + tinyglobby@0.2.17: + dependencies: + fdir: 6.5.0(picomatch@4.0.4) + picomatch: 4.0.4 + + to-regex-range@5.0.1: + dependencies: + is-number: 7.0.0 + + trim-lines@3.0.1: {} + + trough@2.2.0: {} + + ts-api-utils@2.5.0(typescript@5.9.3): + dependencies: + typescript: 5.9.3 + + tsconfig-paths@3.15.0: + dependencies: + '@types/json5': 0.0.29 + json5: 1.0.2 + minimist: 1.2.8 + strip-bom: 3.0.0 + + tslib@2.8.1: {} + + tsx@4.22.4: + dependencies: + esbuild: 0.28.0 + optionalDependencies: + fsevents: 2.3.3 + + type-check@0.4.0: + dependencies: + prelude-ls: 1.2.1 + + typed-array-buffer@1.0.3: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + is-typed-array: 1.1.15 + + typed-array-byte-length@1.0.3: + dependencies: + call-bind: 1.0.9 + for-each: 0.3.5 + gopd: 1.2.0 + has-proto: 1.2.0 + is-typed-array: 1.1.15 + + typed-array-byte-offset@1.0.4: + dependencies: + available-typed-arrays: 1.0.7 + call-bind: 1.0.9 + for-each: 0.3.5 + gopd: 1.2.0 + has-proto: 1.2.0 + is-typed-array: 1.1.15 + reflect.getprototypeof: 1.0.10 + + typed-array-length@1.0.8: + dependencies: + call-bind: 1.0.9 + for-each: 0.3.5 + gopd: 1.2.0 + is-typed-array: 1.1.15 + possible-typed-array-names: 1.1.0 + reflect.getprototypeof: 1.0.10 + + typescript-eslint@8.60.0(eslint@10.4.1(jiti@2.7.0))(typescript@5.9.3): + dependencies: + '@typescript-eslint/eslint-plugin': 8.60.0(@typescript-eslint/parser@8.60.0(eslint@10.4.1(jiti@2.7.0))(typescript@5.9.3))(eslint@10.4.1(jiti@2.7.0))(typescript@5.9.3) + '@typescript-eslint/parser': 8.60.0(eslint@10.4.1(jiti@2.7.0))(typescript@5.9.3) + '@typescript-eslint/typescript-estree': 8.60.0(typescript@5.9.3) + '@typescript-eslint/utils': 8.60.0(eslint@10.4.1(jiti@2.7.0))(typescript@5.9.3) + eslint: 10.4.1(jiti@2.7.0) + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + + typescript@5.9.3: {} + + unbox-primitive@1.1.0: + dependencies: + call-bound: 1.0.4 + has-bigints: 1.1.0 + has-symbols: 1.1.0 + which-boxed-primitive: 1.1.1 + + undici-types@7.18.2: {} + + unified@11.0.5: + dependencies: + '@types/unist': 3.0.3 + bail: 2.0.2 + devlop: 1.1.0 + extend: 3.0.2 + is-plain-obj: 4.1.0 + trough: 2.2.0 + vfile: 6.0.3 + + unist-util-is@6.0.1: + dependencies: + '@types/unist': 3.0.3 + + unist-util-position-from-estree@2.0.0: + dependencies: + '@types/unist': 3.0.3 + + unist-util-position@5.0.0: + dependencies: + '@types/unist': 3.0.3 + + unist-util-remove-position@5.0.0: + dependencies: + '@types/unist': 3.0.3 + unist-util-visit: 5.1.0 + + unist-util-stringify-position@4.0.0: + dependencies: + '@types/unist': 3.0.3 + + unist-util-visit-parents@6.0.2: + dependencies: + '@types/unist': 3.0.3 + unist-util-is: 6.0.1 + + unist-util-visit@5.1.0: + dependencies: + '@types/unist': 3.0.3 + unist-util-is: 6.0.1 + unist-util-visit-parents: 6.0.2 + + unrs-resolver@1.12.2: + dependencies: + napi-postinstall: 0.3.4 + optionalDependencies: + '@unrs/resolver-binding-android-arm-eabi': 1.12.2 + '@unrs/resolver-binding-android-arm64': 1.12.2 + '@unrs/resolver-binding-darwin-arm64': 1.12.2 + '@unrs/resolver-binding-darwin-x64': 1.12.2 + '@unrs/resolver-binding-freebsd-x64': 1.12.2 + '@unrs/resolver-binding-linux-arm-gnueabihf': 1.12.2 + '@unrs/resolver-binding-linux-arm-musleabihf': 1.12.2 + '@unrs/resolver-binding-linux-arm64-gnu': 1.12.2 + '@unrs/resolver-binding-linux-arm64-musl': 1.12.2 + '@unrs/resolver-binding-linux-loong64-gnu': 1.12.2 + '@unrs/resolver-binding-linux-loong64-musl': 1.12.2 + '@unrs/resolver-binding-linux-ppc64-gnu': 1.12.2 + '@unrs/resolver-binding-linux-riscv64-gnu': 1.12.2 + '@unrs/resolver-binding-linux-riscv64-musl': 1.12.2 + '@unrs/resolver-binding-linux-s390x-gnu': 1.12.2 + '@unrs/resolver-binding-linux-x64-gnu': 1.12.2 + '@unrs/resolver-binding-linux-x64-musl': 1.12.2 + '@unrs/resolver-binding-openharmony-arm64': 1.12.2 + '@unrs/resolver-binding-wasm32-wasi': 1.12.2 + '@unrs/resolver-binding-win32-arm64-msvc': 1.12.2 + '@unrs/resolver-binding-win32-ia32-msvc': 1.12.2 + '@unrs/resolver-binding-win32-x64-msvc': 1.12.2 + + update-browserslist-db@1.2.3(browserslist@4.28.2): + dependencies: + browserslist: 4.28.2 + escalade: 3.2.0 + picocolors: 1.1.1 + + uri-js@4.4.1: + dependencies: + punycode: 2.3.1 + + use-callback-ref@1.3.3(@types/react@19.2.15)(react@19.2.6): + dependencies: + react: 19.2.6 + tslib: 2.8.1 + optionalDependencies: + '@types/react': 19.2.15 + + use-sidecar@1.1.3(@types/react@19.2.15)(react@19.2.6): + dependencies: + detect-node-es: 1.1.0 + react: 19.2.6 + tslib: 2.8.1 + optionalDependencies: + '@types/react': 19.2.15 + + vfile-location@5.0.3: + dependencies: + '@types/unist': 3.0.3 + vfile: 6.0.3 + + vfile-message@4.0.3: + dependencies: + '@types/unist': 3.0.3 + unist-util-stringify-position: 4.0.0 + + vfile@6.0.3: + dependencies: + '@types/unist': 3.0.3 + vfile-message: 4.0.3 + + web-namespaces@2.0.1: {} + + which-boxed-primitive@1.1.1: + dependencies: + is-bigint: 1.1.0 + is-boolean-object: 1.2.2 + is-number-object: 1.1.1 + is-string: 1.1.1 + is-symbol: 1.1.1 + + which-builtin-type@1.2.1: + dependencies: + call-bound: 1.0.4 + function.prototype.name: 1.1.8 + has-tostringtag: 1.0.2 + is-async-function: 2.1.1 + is-date-object: 1.1.0 + is-finalizationregistry: 1.1.1 + is-generator-function: 1.1.2 + is-regex: 1.2.1 + is-weakref: 1.1.1 + isarray: 2.0.5 + which-boxed-primitive: 1.1.1 + which-collection: 1.0.2 + which-typed-array: 1.1.21 + + which-collection@1.0.2: + dependencies: + is-map: 2.0.3 + is-set: 2.0.3 + is-weakmap: 2.0.2 + is-weakset: 2.0.4 + + which-typed-array@1.1.21: + dependencies: + available-typed-arrays: 1.0.7 + call-bind: 1.0.9 + call-bound: 1.0.4 + for-each: 0.3.5 + get-proto: 1.0.1 + gopd: 1.2.0 + has-tostringtag: 1.0.2 + + which@2.0.2: + dependencies: + isexe: 2.0.0 + + word-wrap@1.2.5: {} + + yallist@3.1.1: {} + + yocto-queue@0.1.0: {} + + zod-validation-error@4.0.2(zod@4.4.3): + dependencies: + zod: 4.4.3 + + zod@4.4.3: {} + + zwitch@2.0.4: {} diff --git a/public/openapi/management-api.json b/public/openapi/management-api.json deleted file mode 100644 index 7cbaf90..0000000 --- a/public/openapi/management-api.json +++ /dev/null @@ -1,10091 +0,0 @@ -{ - "openapi": "3.1.0", - "info": { - "title": "Management API", - "version": "1.0.0", - "description": "Endpoints for management authentication, user management, study administration, messaging, and participant administration." - }, - "tags": [ - { - "name": "auth", - "description": "Authentication & Session" - }, - { - "name": "studies", - "description": "Study management" - }, - { - "name": "surveys", - "description": "Survey management" - }, - { - "name": "study-rules", - "description": "Study rules" - }, - { - "name": "study-variables", - "description": "Study variables" - }, - { - "name": "study-counters", - "description": "Study counters" - }, - { - "name": "study-permissions", - "description": "Permissions for a study" - }, - { - "name": "notifications", - "description": "Notification subscriptions" - }, - { - "name": "code-lists", - "description": "Study code lists" - }, - { - "name": "participants", - "description": "Participant operations" - }, - { - "name": "reports", - "description": "Participant reports" - }, - { - "name": "responses", - "description": "Response exports & queries" - }, - { - "name": "files", - "description": "File management for studies" - }, - { - "name": "messaging", - "description": "Messaging templates & scheduled emails" - }, - { - "name": "user-management", - "description": "Management user accounts and permissions" - }, - { - "name": "service-accounts", - "description": "Service account management" - }, - { - "name": "app-roles", - "description": "App role templates & assignments" - }, - { - "name": "actions", - "description": "Run actions on participants" - } - ], - "components": { - "securitySchemes": { - "BearerAuth": { - "type": "http", - "scheme": "bearer", - "bearerFormat": "JWT" - } - }, - "responses": { - "Error400": { - "description": "Bad Request", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/Error" - } - } - } - }, - "Error401": { - "description": "Unauthorized", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/Error" - } - } - } - }, - "Error403": { - "description": "Forbidden", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/Error" - } - } - } - }, - "Error404": { - "description": "Not Found", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/Error" - } - } - } - }, - "Error429": { - "description": "Too Many Requests", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/Error" - } - } - } - }, - "Error500": { - "description": "Internal Server Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/Error" - } - } - } - } - }, - "schemas": { - "Message": { - "type": "object", - "properties": { - "message": { - "type": "string" - } - }, - "additionalProperties": false - }, - "Error": { - "type": "object", - "properties": { - "error": { - "type": "string" - } - }, - "additionalProperties": false - }, - "User": { - "type": "object", - "properties": { - "id": { - "type": "string", - "description": "ObjectID" - }, - "account": { - "$ref": "#/components/schemas/Account" - }, - "timestamps": { - "$ref": "#/components/schemas/Timestamps" - }, - "profiles": { - "type": "array", - "items": { - "$ref": "#/components/schemas/Profile" - } - }, - "contactPreferences": { - "$ref": "#/components/schemas/ContactPreferences" - }, - "contactInfos": { - "type": "array", - "items": { - "$ref": "#/components/schemas/ContactInfo" - } - } - }, - "additionalProperties": false - }, - "Account": { - "type": "object", - "properties": { - "type": { - "type": "string" - }, - "accountID": { - "type": "string" - } - }, - "additionalProperties": true - }, - "Timestamps": { - "type": "object", - "properties": { - "lastTokenRefresh": { - "type": "integer" - }, - "lastLogin": { - "type": "integer" - }, - "createdAt": { - "type": "integer" - }, - "updatedAt": { - "type": "integer" - }, - "lastPasswordChange": { - "type": "integer" - }, - "reminderToConfirmSentAt": { - "type": "integer" - }, - "markedForDeletion": { - "type": "integer" - } - }, - "additionalProperties": false - }, - "Profile": { - "type": "object", - "properties": { - "id": { - "type": "string" - }, - "createdAt": { - "type": "integer" - }, - "mainProfile": { - "type": "boolean" - } - }, - "additionalProperties": true - }, - "ContactPreferences": { - "type": "object", - "properties": { - "subscribedToNewsletter": { - "type": "boolean" - }, - "sendNewsletterTo": { - "type": "array", - "items": { - "type": "string" - } - }, - "subscribedToWeekly": { - "type": "boolean" - }, - "receiveWeeklyMessageDayOfWeek": { - "type": "integer" - } - }, - "additionalProperties": false - }, - "ContactInfo": { - "type": "object", - "properties": { - "id": { - "type": "string" - }, - "type": { - "type": "string", - "enum": [ - "email", - "phone" - ] - }, - "confirmedAt": { - "type": "integer" - }, - "confirmationLinkSentAt": { - "type": "integer" - }, - "email": { - "type": "string" - }, - "phone": { - "type": "string" - } - }, - "additionalProperties": false - }, - "Study": { - "type": "object", - "properties": { - "id": { - "type": "string", - "description": "ObjectID", - "example": "64b8f0f2e1b1c8a1d2e3f4g5" - }, - "key": { - "type": "string" - }, - "secretKey": { - "type": "string" - }, - "status": { - "type": "string" - }, - "props": { - "type": "object", - "additionalProperties": true - }, - "configs": { - "type": "object", - "additionalProperties": true - }, - "notificationSubscriptions": { - "type": "array", - "items": { - "type": "object", - "additionalProperties": true - } - }, - "stats": { - "type": "object", - "additionalProperties": true - }, - "nextTimerEvent": { - "type": "integer" - }, - "rules": { - "type": "array", - "items": { - "type": "object", - "additionalProperties": true - } - } - }, - "additionalProperties": false, - "description": "Study object" - }, - "Survey": { - "type": "object", - "properties": { - "id": { - "type": "string", - "description": "ObjectID" - }, - "surveyKey": { - "type": "string" - }, - "props": { - "type": "object", - "additionalProperties": true - }, - "prefillRules": { - "type": "array", - "items": { - "type": "object", - "additionalProperties": true - } - }, - "contextRules": { - "type": "object", - "additionalProperties": true - }, - "maxItemsPerPage": { - "type": "object", - "additionalProperties": true - }, - "availableFor": { - "type": "string" - }, - "requireLoginBeforeSubmission": { - "type": "boolean" - }, - "published": { - "type": "integer" - }, - "unpublished": { - "type": "integer" - }, - "surveyDefinition": { - "type": "object", - "additionalProperties": true - }, - "versionId": { - "type": "string" - }, - "metadata": { - "type": "object", - "additionalProperties": { - "type": "string" - } - } - }, - "additionalProperties": false, - "description": "Survey object" - }, - "StudyVariables": { - "type": "object", - "properties": { - "id": { - "type": "string", - "description": "ObjectID" - }, - "createdAt": { - "type": "string", - "format": "date-time" - }, - "configUpdatedAt": { - "type": "string", - "format": "date-time" - }, - "valueUpdatedAt": { - "type": "string", - "format": "date-time" - }, - "studyKey": { - "type": "string" - }, - "key": { - "type": "string" - }, - "value": { - "oneOf": [ - { - "type": "string" - }, - { - "type": "integer" - }, - { - "type": "number" - }, - { - "type": "boolean" - }, - { - "type": "string", - "format": "date-time" - }, - { - "type": "object", - "additionalProperties": true - }, - { - "type": "array", - "items": {} - }, - { - "type": "null" - } - ] - }, - "type": { - "type": "string", - "enum": [ - "string", - "int", - "float", - "boolean", - "date" - ] - }, - "label": { - "type": "string" - }, - "description": { - "type": "string" - }, - "uiType": { - "type": "string" - }, - "uiPriority": { - "type": "integer" - }, - "configs": { - "type": "object", - "additionalProperties": true - } - }, - "additionalProperties": false, - "description": "Study variable object" - }, - "Permission": { - "type": "object", - "properties": { - "id": { - "type": "string", - "description": "ObjectID" - }, - "subjectId": { - "type": "string" - }, - "subjectType": { - "type": "string" - }, - "resourceType": { - "type": "string" - }, - "resourceKey": { - "type": "string" - }, - "action": { - "type": "string" - }, - "limiter": { - "type": "object", - "additionalProperties": { - "type": "string" - } - } - }, - "additionalProperties": false, - "description": "Permission object" - }, - "AppRoleTemplate": { - "type": "object", - "properties": { - "id": { - "type": "string", - "description": "ObjectID" - }, - "appName": { - "type": "string" - }, - "role": { - "type": "string" - }, - "requiredPermissions": { - "type": "array", - "items": { - "$ref": "#/components/schemas/Permission" - } - }, - "createdAt": { - "type": "string", - "format": "date-time" - }, - "updatedAt": { - "type": "string", - "format": "date-time" - } - }, - "additionalProperties": false, - "description": "App role template object" - }, - "ServiceUser": { - "type": "object", - "properties": { - "id": { - "type": "string", - "description": "ObjectID" - }, - "label": { - "type": "string" - }, - "description": { - "type": "string" - }, - "createdAt": { - "type": "string", - "format": "date-time" - } - }, - "additionalProperties": false - }, - "ServiceUserAPIKey": { - "type": "object", - "properties": { - "id": { - "type": "string" - }, - "serviceUserID": { - "type": "string" - }, - "key": { - "type": "string" - }, - "expiresAt": { - "type": "string", - "format": "date-time" - }, - "createdAt": { - "type": "string", - "format": "date-time" - }, - "lastUsedAt": { - "type": "string", - "format": "date-time" - } - }, - "additionalProperties": false - }, - "StudyRules": { - "type": "object", - "properties": { - "id": { - "type": "string", - "description": "ObjectID" - }, - "studyKey": { - "type": "string" - }, - "uploadedAt": { - "type": "integer" - }, - "uploadedBy": { - "type": "string" - }, - "rules": { - "type": "array", - "items": { - "type": "object", - "additionalProperties": true - } - }, - "serialisedRules": { - "type": "string" - } - }, - "additionalProperties": false, - "description": "Study rules object" - }, - "SurveyInfo": { - "type": "object", - "properties": { - "key": { - "type": "string" - } - } - }, - "StudyCounter": { - "type": "object", - "properties": { - "studyKey": { - "type": "string" - }, - "scope": { - "type": "string" - }, - "value": { - "type": "integer" - } - }, - "additionalProperties": false, - "description": "Study counter object" - }, - "NotificationSubscription": { - "type": "object", - "properties": { - "messageType": { - "type": "string" - }, - "email": { - "type": "string" - } - }, - "additionalProperties": false, - "description": "Notification Subscription object" - }, - "PaginationInfos": { - "type": "object", - "description": "Pagination information", - "properties": { - "totalCount": { - "type": "integer" - }, - "currentPage": { - "type": "integer" - }, - "totalPages": { - "type": "integer" - }, - "pageSize": { - "type": "integer" - } - }, - "additionalProperties": false - }, - "StudyCodeListEntry": { - "type": "object", - "properties": { - "id": { - "type": "string", - "description": "ObjectID" - }, - "studyKey": { - "type": "string" - }, - "listKey": { - "type": "string" - }, - "code": { - "type": "string" - }, - "addedAt": { - "type": "string", - "format": "date-time" - } - }, - "additionalProperties": false, - "description": "Study Code List Entry object" - }, - "EmailTemplate": { - "type": "object", - "properties": { - "id": { - "type": "string", - "description": "ObjectID" - }, - "messageType": { - "type": "string" - }, - "studyKey": { - "type": "string" - }, - "defaultLanguage": { - "type": "string" - }, - "headerOverrides": { - "type": "object", - "additionalProperties": true - }, - "translations": { - "type": "array", - "items": { - "type": "object", - "additionalProperties": true - } - } - }, - "additionalProperties": false, - "description": "Email Template object" - }, - "SmsTemplate": { - "type": "object", - "properties": { - "id": { - "type": "string", - "description": "ObjectID" - }, - "userID": { - "type": "string" - }, - "messageType": { - "type": "string" - }, - "sentAt": { - "type": "string", - "format": "date-time" - }, - "phoneNumber": { - "type": "string" - } - }, - "additionalProperties": false, - "description": "SMS Template object" - }, - "ScheduledEmail": { - "type": "object", - "properties": { - "id": { - "type": "string", - "description": "ObjectID" - }, - "template": { - "$ref": "#/components/schemas/EmailTemplate" - }, - "type": { - "type": "string" - }, - "studyKey": { - "type": "string" - }, - "condition": { - "type": "object", - "additionalProperties": true - }, - "nextTime": { - "type": "integer" - }, - "period": { - "type": "integer" - }, - "label": { - "type": "string" - }, - "until": { - "type": "integer" - } - }, - "additionalProperties": false, - "description": "Scheduled Email object" - }, - "Report": { - "type": "object", - "properties": { - "id": { - "type": "string", - "description": "MongoDB ObjectID as hex string" - }, - "key": { - "type": "string" - }, - "participantID": { - "type": "string" - }, - "responseID": { - "type": "string" - }, - "timestamp": { - "type": "integer", - "description": "Unix timestamp" - }, - "modifiedAt": { - "type": "string", - "format": "date-time" - }, - "data": { - "type": "array", - "items": { - "$ref": "#/components/schemas/ReportData" - } - } - }, - "additionalProperties": false, - "description": "Report object", - "required": [ - "key", - "participantID", - "timestamp" - ] - }, - "ReportData": { - "type": "object", - "properties": { - "key": { "type": "string" }, - "value": { "type": "string" }, - "dtype": { - "type": "string", - "enum": ["date", "float", "int", "string", "rawMessage", "keyList"] - } - }, - "additionalProperties": false - }, - "Task": { - "type": "object", - "properties": { - "id": { - "type": "string" - }, - "createdAt": { - "type": "string", - "format": "date-time" - }, - "createdBy": { - "type": "string" - }, - "updatedAt": { - "type": "string", - "format": "date-time" - }, - "status": { - "type": "string" - }, - "targetCount": { - "type": "integer" - }, - "processedCount": { - "type": "integer" - }, - "resultFile": { - "type": "string" - }, - "fileType": { - "type": "string" - }, - "error": { - "type": "string" - } - }, - "additionalProperties": true - }, - "FileInfo": { - "type": "object", - "properties": { - "id": { - "type": "string", - "description": "ObjectID" - }, - "participantID": { - "type": "string" - }, - "status": { - "type": "string" - }, - "uploadedBy": { - "type": "string" - }, - "path": { - "type": "string" - }, - "previewPath": { - "type": "string" - }, - "submittedAt": { - "type": "integer" - }, - "createdAt": { - "type": "string", - "format": "date-time" - }, - "updatedAt": { - "type": "string", - "format": "date-time" - }, - "fileType": { - "type": "string" - }, - "visibleToParticipant": { - "type": "boolean" - }, - "size": { - "type": "integer" - } - }, - "required": [ - "id", - "participantID", - "path" - ], - "additionalProperties": false, - "description": "File Info object" - }, - "AppRole": { - "type": "object", - "properties": { - "id": { - "type": "string", - "description": "ObjectID" - }, - "subjectId": { - "type": "string" - }, - "subjectType": { - "type": "string" - }, - "appName": { - "type": "string" - }, - "role": { - "type": "string" - }, - "createdAt": { - "type": "string", - "format": "date-time" - } - } - }, - "Participant": { - "type": "object", - "description": "Participant object", - "properties": { - "id": { - "type": "string", - "description": "ObjectID" - }, - "participantId": { - "type": "string" - }, - "currentStudySession": { - "type": "string" - }, - "modifiedAt": { - "type": "integer" - }, - "enteredAt": { - "type": "integer" - }, - "studyStatus": { - "type": "string" - }, - "flags": { - "type": "object", - "additionalProperties": { - "type": "string" - } - }, - "linkingCodes": { - "type": "object", - "additionalProperties": { - "type": "string" - } - }, - "assignedSurveys": { - "type": "array", - "items": { - "$ref": "#/components/schemas/AssignedSurvey" - } - }, - "lastSubmissions": { - "type": "object", - "additionalProperties": { - "type": "integer" - } - }, - "messages": { - "type": "array", - "items": { - "type": "object", - "additionalProperties": true - } - } - }, - "required": [ - "participantId" - ], - "additionalProperties": false - }, - "AssignedSurvey": { - "type": "object", - "description": "Assigned survey object", - "properties": { - "studyKey": { - "type": "string" - }, - "surveyKey": { - "type": "string" - }, - "validFrom": { - "type": "integer" - }, - "validUntil": { - "type": "integer" - }, - "category": { - "type": "string" - }, - "profileID": { - "type": "string" - } - }, - "required": [ - "studyKey", - "surveyKey" - ], - "additionalProperties": false - }, - "SurveyResponse": { - "type": "object", - "description": "Survey response", - "properties": { - "id": { - "type": "string", - "description": "ObjectID" - }, - "key": { - "type": "string" - }, - "participantId": { - "type": "string" - }, - "versionId": { - "type": "string" - }, - "openedAt": { - "type": "integer" - }, - "submittedAt": { - "type": "integer" - }, - "arrivedAt": { - "type": "integer" - }, - "responses": { - "type": "array", - "items": { - "type": "object", - "additionalProperties": true - } - }, - "context": { - "type": "object", - "additionalProperties": { - "type": "string" - } - } - }, - "required": [ - "key" - ], - "additionalProperties": false - }, - "ManagementUser": { - "type": "object", - "properties": { - "id": { - "type": "string", - "description": "MongoDB ObjectID as hex string" - }, - "sub": { - "type": "string" - }, - "email": { - "type": "string", - "format": "email" - }, - "username": { - "type": "string" - }, - "provider": { - "type": "string" - }, - "imageUrl": { - "type": "string", - "format": "uri" - }, - "isAdmin": { - "type": "boolean" - }, - "lastLoginAt": { - "type": "string", - "format": "date-time" - }, - "createdAt": { - "type": "string", - "format": "date-time" - } - }, - "additionalProperties": false, - "description": "Management User object" - } - } - }, - "paths": { - "/v1/auth/signin-with-idp": { - "post": { - "tags": [ - "auth" - ], - "operationId": "auth_signinWithIdp", - "summary": "Sign in with identity provider", - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "sub": { - "type": "string", - "description": "IDP Subject (User ID)" - }, - "roles": { - "type": "array", - "items": { - "type": "string" - } - }, - "name": { - "type": "string" - }, - "provider": { - "type": "string" - }, - "email": { - "type": "string", - "format": "email" - }, - "imageURL": { - "type": "string" - }, - "renewToken": { - "type": "string", - "description": "Token used to renew the session" - }, - "instanceID": { - "type": "string" - } - }, - "required": [ - "sub" - ] - } - } - } - }, - "responses": { - "200": { - "description": "Signed in", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "accessToken": { - "type": "string" - }, - "sessionID": { - "type": "string" - }, - "expiresAt": { - "type": "integer", - "description": "Unix timestamp (seconds)" - }, - "isAdmin": { - "type": "boolean" - } - }, - "required": [ - "accessToken", - "sessionID", - "expiresAt", - "isAdmin" - ] - } - } - } - }, - "400": { - "$ref": "#/components/responses/Error400" - }, - "403": { - "$ref": "#/components/responses/Error403" - }, - "500": { - "$ref": "#/components/responses/Error500" - } - } - } - }, - "/v1/auth/extend-session": { - "post": { - "tags": [ - "auth" - ], - "operationId": "auth_extendSession", - "summary": "Extend session", - "security": [ - { - "BearerAuth": [] - } - ], - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "renewToken": { - "type": "string" - } - }, - "required": [ - "renewToken" - ] - } - } - } - }, - "responses": { - "200": { - "description": "Session extended", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "accessToken": { - "type": "string" - }, - "sessionID": { - "type": "string" - }, - "expiresAt": { - "type": "integer", - "description": "Unix timestamp (seconds)" - }, - "isAdmin": { - "type": "boolean" - } - }, - "required": [ - "accessToken", - "sessionID", - "expiresAt", - "isAdmin" - ] - } - } - } - }, - "400": { - "$ref": "#/components/responses/Error400" - }, - "401": { - "$ref": "#/components/responses/Error401" - }, - "403": { - "$ref": "#/components/responses/Error403" - }, - "500": { - "$ref": "#/components/responses/Error500" - } - } - } - }, - "/v1/auth/renew-token/{sessionID}": { - "get": { - "tags": [ - "auth" - ], - "operationId": "auth_renewToken", - "summary": "Get renew token", - "security": [ - { - "BearerAuth": [] - } - ], - "parameters": [ - { - "name": "sessionID", - "in": "path", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "Renew token", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "renewToken": { - "type": "string" - } - }, - "required": [ - "renewToken" - ] - } - } - } - }, - "400": { - "$ref": "#/components/responses/Error400" - }, - "401": { - "$ref": "#/components/responses/Error401" - }, - "403": { - "$ref": "#/components/responses/Error403" - }, - "500": { - "$ref": "#/components/responses/Error500" - } - } - } - }, - "/v1/auth/permissions": { - "get": { - "tags": [ - "auth" - ], - "operationId": "auth_listPermissions", - "summary": "List permissions and roles", - "security": [ - { - "BearerAuth": [] - } - ], - "responses": { - "200": { - "description": "Permissions", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "isAdmin": { - "type": "boolean" - }, - "permissions": { - "type": "array", - "items": { - "$ref": "#/components/schemas/Permission" - } - }, - "appRoles": { - "type": "array", - "items": { - "$ref": "#/components/schemas/AppRole" - } - } - }, - "required": [ - "isAdmin", - "permissions", - "appRoles" - ] - } - } - } - }, - "400": { - "$ref": "#/components/responses/Error400" - }, - "401": { - "$ref": "#/components/responses/Error401" - }, - "500": { - "$ref": "#/components/responses/Error500" - } - } - } - }, - "/v1/studies/{studyKey}/participants/virtual": { - "post": { - "tags": [ - "participants" - ], - "operationId": "participants_createVirtualParticipant", - "summary": "Create virtual participant", - "security": [ - { - "BearerAuth": [] - } - ], - "parameters": [ - { - "name": "studyKey", - "in": "path", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "Virtual participant created", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "message": { - "type": "string" - }, - "participant": { - "$ref": "#/components/schemas/Participant" - } - }, - "required": [ - "message", - "participant" - ] - } - } - } - }, - "400": { - "$ref": "#/components/responses/Error400" - }, - "401": { - "$ref": "#/components/responses/Error401" - }, - "500": { - "$ref": "#/components/responses/Error500" - } - } - } - }, - "/v1/studies/{studyKey}/participants/{participantID}/responses": { - "get": { - "tags": [ - "participants" - ], - "operationId": "participants_listParticipantResponses", - "summary": "List participant responses", - "security": [ - { - "BearerAuth": [] - } - ], - "parameters": [ - { - "name": "studyKey", - "in": "path", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "participantID", - "in": "path", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "page", - "in": "query", - "schema": { - "type": "integer", - "minimum": 1 - } - }, - { - "name": "limit", - "in": "query", - "schema": { - "type": "integer", - "minimum": 1, - "maximum": 100 - } - }, - { - "name": "filter", - "in": "query", - "description": "bson.M object to filter responses", - "schema": { - "type": "object", - "additionalProperties": { - "type": "object" - } - } - }, - { - "name": "sort", - "in": "query", - "description": "bson.M object to sort responses", - "schema": { - "type": "object", - "additionalProperties": { - "type": "object" - } - } - } - ], - "responses": { - "200": { - "description": "List participant responses", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "responses": { - "type": "array", - "items": { - "$ref": "#/components/schemas/SurveyResponse" - } - }, - "pagination": { - "$ref": "#/components/schemas/PaginationInfos" - } - }, - "required": [ - "responses", - "pagination" - ] - } - } - } - }, - "400": { - "$ref": "#/components/responses/Error400" - }, - "401": { - "$ref": "#/components/responses/Error401" - }, - "500": { - "$ref": "#/components/responses/Error500" - } - } - }, - "post": { - "tags": [ - "participants" - ], - "operationId": "participants_submitParticipantResponse", - "summary": "Submit participant response", - "security": [ - { - "BearerAuth": [] - } - ], - "parameters": [ - { - "name": "studyKey", - "in": "path", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "participantID", - "in": "path", - "required": true, - "schema": { - "type": "string" - } - } - ], - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/SurveyResponse" - } - } - } - }, - "responses": { - "200": { - "description": "Submit participant response", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "message": { - "type": "string" - }, - "result": { - "type": "array", - "items": { - "$ref": "#/components/schemas/AssignedSurvey" - } - }, - "participant": { - "$ref": "#/components/schemas/Participant" - } - }, - "required": [ - "message", - "result", - "participant" - ] - } - } - } - }, - "400": { - "$ref": "#/components/responses/Error400" - }, - "401": { - "$ref": "#/components/responses/Error401" - }, - "500": { - "$ref": "#/components/responses/Error500" - } - } - } - }, - "/v1/studies/{studyKey}/participants/{participantID}/events": { - "post": { - "tags": [ - "participants" - ], - "operationId": "participants_submitParticipantEvent", - "summary": "Submit participant event", - "security": [ - { - "BearerAuth": [] - } - ], - "parameters": [ - { - "name": "studyKey", - "in": "path", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "participantID", - "in": "path", - "required": true, - "schema": { - "type": "string" - } - } - ], - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "eventKey": { - "type": "string" - }, - "payload": { - "type": "object", - "additionalProperties": { - "type": "string" - } - } - }, - "required": [ - "eventKey" - ] - } - } - } - }, - "responses": { - "200": { - "description": "Submit participant event", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "message": { - "type": "string" - }, - "result": { - "type": "array", - "items": { - "$ref": "#/components/schemas/AssignedSurvey" - } - } - }, - "required": [ - "message", - "result" - ] - } - } - } - }, - "400": { - "$ref": "#/components/responses/Error400" - }, - "401": { - "$ref": "#/components/responses/Error401" - }, - "500": { - "$ref": "#/components/responses/Error500" - } - } - } - }, - "/v1/studies/{studyKey}/participants/{participantID}/reports": { - "post": { - "tags": [ - "reports" - ], - "operationId": "participants_submitParticipantReport", - "summary": "Submit participant report", - "security": [ - { - "BearerAuth": [] - } - ], - "parameters": [ - { - "name": "studyKey", - "in": "path", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "participantID", - "in": "path", - "required": true, - "schema": { - "type": "string" - } - } - ], - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/Report" - } - } - } - }, - "responses": { - "200": { - "description": "Submit participant report", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/Message" - } - } - } - }, - "400": { - "$ref": "#/components/responses/Error400" - }, - "401": { - "$ref": "#/components/responses/Error401" - }, - "500": { - "$ref": "#/components/responses/Error500" - } - } - } - }, - "/v1/studies/{studyKey}/participants/{participantID}/reports/{reportID}": { - "put": { - "tags": [ - "reports" - ], - "operationId": "participants_updateParticipantReport", - "summary": "Update participant report", - "security": [ - { - "BearerAuth": [] - } - ], - "parameters": [ - { - "name": "studyKey", - "in": "path", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "participantID", - "in": "path", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "reportID", - "in": "path", - "required": true, - "schema": { - "type": "string" - } - } - ], - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "data": { - "$ref": "#/components/schemas/ReportData" - }, - "mode": { - "type": "object", - "additionalProperties": true - } - }, - "required": [ - "data", - "mode" - ] - } - } - } - }, - "responses": { - "200": { - "description": "Update participant report", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/Message" - } - } - } - }, - "400": { - "$ref": "#/components/responses/Error400" - }, - "401": { - "$ref": "#/components/responses/Error401" - }, - "500": { - "$ref": "#/components/responses/Error500" - } - } - } - }, - "/v1/studies/{studyKey}/participants/merge": { - "post": { - "tags": [ - "participants" - ], - "operationId": "participants_mergeParticipants", - "summary": "Merge participants", - "security": [ - { - "BearerAuth": [] - } - ], - "parameters": [ - { - "name": "studyKey", - "in": "path", - "required": true, - "schema": { - "type": "string" - } - } - ], - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "targetParticipantID": { - "type": "string" - }, - "withParticipantID": { - "type": "string" - } - }, - "required": [ - "targetParticipantID", - "withParticipantID" - ] - } - } - } - }, - "responses": { - "200": { - "description": "Merge participants", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "participant": { - "$ref": "#/components/schemas/Participant" - } - }, - "required": [ - "participant" - ] - } - } - } - }, - "400": { - "$ref": "#/components/responses/Error400" - }, - "401": { - "$ref": "#/components/responses/Error401" - }, - "500": { - "$ref": "#/components/responses/Error500" - } - } - } - }, - "/v1/studies/{studyKey}/participants/{participantID}": { - "put": { - "tags": [ - "participants" - ], - "operationId": "participants_editParticipant", - "summary": "Edit participant", - "security": [ - { - "BearerAuth": [] - } - ], - "parameters": [ - { - "name": "studyKey", - "in": "path", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "participantID", - "in": "path", - "required": true, - "schema": { - "type": "string" - } - } - ], - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/Participant" - } - } - } - }, - "responses": { - "200": { - "description": "Edit participant", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "message": { - "type": "string" - }, - "participant": { - "$ref": "#/components/schemas/Participant" - } - }, - "required": [ - "message", - "participant" - ] - } - } - } - }, - "400": { - "$ref": "#/components/responses/Error400" - }, - "401": { - "$ref": "#/components/responses/Error401" - }, - "500": { - "$ref": "#/components/responses/Error500" - } - } - } - }, - "/v1/messaging/email-templates/global-templates": { - "get": { - "tags": [ - "messaging" - ], - "operationId": "messaging_listGlobalEmailTemplates", - "summary": "List global email templates", - "security": [ - { - "BearerAuth": [] - } - ], - "responses": { - "200": { - "description": "List global templates", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "templates": { - "type": "array", - "items": { - "$ref": "#/components/schemas/EmailTemplate" - } - } - }, - "required": [ - "templates" - ] - } - } - } - }, - "400": { - "$ref": "#/components/responses/Error400" - }, - "401": { - "$ref": "#/components/responses/Error401" - }, - "500": { - "$ref": "#/components/responses/Error500" - } - } - }, - "post": { - "tags": [ - "messaging" - ], - "operationId": "messaging_saveGlobalEmailTemplate", - "summary": "Save global email template", - "security": [ - { - "BearerAuth": [] - } - ], - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/EmailTemplate" - } - } - } - }, - "responses": { - "200": { - "description": "Save global template", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "template": { - "$ref": "#/components/schemas/EmailTemplate" - } - }, - "required": [ - "template" - ] - } - } - } - }, - "400": { - "$ref": "#/components/responses/Error400" - }, - "401": { - "$ref": "#/components/responses/Error401" - }, - "500": { - "$ref": "#/components/responses/Error500" - } - } - } - }, - "/v1/messaging/email-templates/global-templates/{messageType}": { - "get": { - "tags": [ - "messaging" - ], - "operationId": "messaging_getGlobalEmailTemplate", - "summary": "Get global email template by type", - "security": [ - { - "BearerAuth": [] - } - ], - "parameters": [ - { - "name": "messageType", - "in": "path", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "Global template", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "template": { - "$ref": "#/components/schemas/EmailTemplate" - } - }, - "required": [ - "template" - ] - } - } - } - }, - "400": { - "$ref": "#/components/responses/Error400" - }, - "401": { - "$ref": "#/components/responses/Error401" - }, - "500": { - "$ref": "#/components/responses/Error500" - } - } - }, - "delete": { - "tags": [ - "messaging" - ], - "operationId": "messaging_deleteGlobalEmailTemplate", - "summary": "Delete global email template", - "security": [ - { - "BearerAuth": [] - } - ], - "parameters": [ - { - "name": "messageType", - "in": "path", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "Deleted", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/Message" - } - } - } - }, - "400": { - "$ref": "#/components/responses/Error400" - }, - "401": { - "$ref": "#/components/responses/Error401" - }, - "500": { - "$ref": "#/components/responses/Error500" - } - } - } - }, - "/v1/messaging/email-templates/study-templates": { - "get": { - "tags": [ - "messaging" - ], - "operationId": "messaging_listAllStudyEmailTemplates", - "summary": "List all study email templates", - "security": [ - { - "BearerAuth": [] - } - ], - "responses": { - "200": { - "description": "List study templates (all studies)", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "templates": { - "type": "array", - "items": { - "$ref": "#/components/schemas/EmailTemplate" - } - } - }, - "required": [ - "templates" - ] - } - } - } - }, - "400": { - "$ref": "#/components/responses/Error400" - }, - "401": { - "$ref": "#/components/responses/Error401" - }, - "500": { - "$ref": "#/components/responses/Error500" - } - } - } - }, - "/v1/messaging/email-templates/study-templates/{studyKey}": { - "get": { - "tags": [ - "messaging" - ], - "operationId": "messaging_listStudyEmailTemplates", - "summary": "List study email templates", - "security": [ - { - "BearerAuth": [] - } - ], - "parameters": [ - { - "name": "studyKey", - "in": "path", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "List study templates", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "templates": { - "type": "array", - "items": { - "$ref": "#/components/schemas/EmailTemplate" - } - } - }, - "required": [ - "templates" - ] - } - } - } - }, - "400": { - "$ref": "#/components/responses/Error400" - }, - "401": { - "$ref": "#/components/responses/Error401" - }, - "500": { - "$ref": "#/components/responses/Error500" - } - } - }, - "post": { - "tags": [ - "messaging" - ], - "operationId": "messaging_saveStudyEmailTemplate", - "summary": "Save study email template", - "security": [ - { - "BearerAuth": [] - } - ], - "parameters": [ - { - "name": "studyKey", - "in": "path", - "required": true, - "schema": { - "type": "string" - } - } - ], - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/EmailTemplate" - } - } - } - }, - "responses": { - "200": { - "description": "Save study template", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "template": { - "$ref": "#/components/schemas/EmailTemplate" - } - }, - "required": [ - "template" - ] - } - } - } - }, - "400": { - "$ref": "#/components/responses/Error400" - }, - "401": { - "$ref": "#/components/responses/Error401" - }, - "404": { - "$ref": "#/components/responses/Error404" - }, - "500": { - "$ref": "#/components/responses/Error500" - } - } - } - }, - "/v1/messaging/email-templates/study-templates/{studyKey}/{messageType}": { - "get": { - "tags": [ - "messaging" - ], - "operationId": "messaging_getStudyEmailTemplate", - "summary": "Get study email template by type", - "security": [ - { - "BearerAuth": [] - } - ], - "parameters": [ - { - "name": "studyKey", - "in": "path", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "messageType", - "in": "path", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "Study template", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "template": { - "$ref": "#/components/schemas/EmailTemplate" - } - }, - "required": [ - "template" - ] - } - } - } - }, - "400": { - "$ref": "#/components/responses/Error400" - }, - "401": { - "$ref": "#/components/responses/Error401" - }, - "500": { - "$ref": "#/components/responses/Error500" - } - } - }, - "delete": { - "tags": [ - "messaging" - ], - "operationId": "messaging_deleteStudyEmailTemplate", - "summary": "Delete study email template", - "security": [ - { - "BearerAuth": [] - } - ], - "parameters": [ - { - "name": "studyKey", - "in": "path", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "messageType", - "in": "path", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "Deleted", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/Message" - } - } - } - }, - "400": { - "$ref": "#/components/responses/Error400" - }, - "401": { - "$ref": "#/components/responses/Error401" - }, - "500": { - "$ref": "#/components/responses/Error500" - } - } - } - }, - "/v1/messaging/sms-templates/": { - "post": { - "tags": [ - "messaging" - ], - "operationId": "messaging_saveSmsTemplate", - "summary": "Save SMS template", - "security": [ - { - "BearerAuth": [] - } - ], - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/SmsTemplate" - } - } - } - }, - "responses": { - "200": { - "description": "Save SMS template", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "template": { - "$ref": "#/components/schemas/SmsTemplate" - } - }, - "required": [ - "template" - ] - } - } - } - }, - "400": { - "$ref": "#/components/responses/Error400" - }, - "401": { - "$ref": "#/components/responses/Error401" - }, - "500": { - "$ref": "#/components/responses/Error500" - } - } - } - }, - "/v1/messaging/sms-templates/{messageType}": { - "get": { - "tags": [ - "messaging" - ], - "operationId": "messaging_getSmsTemplate", - "summary": "Get SMS template by type", - "security": [ - { - "BearerAuth": [] - } - ], - "parameters": [ - { - "name": "messageType", - "in": "path", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "SMS template", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "template": { - "$ref": "#/components/schemas/SmsTemplate" - } - }, - "required": [ - "template" - ] - } - } - } - }, - "400": { - "$ref": "#/components/responses/Error400" - }, - "401": { - "$ref": "#/components/responses/Error401" - }, - "500": { - "$ref": "#/components/responses/Error500" - } - } - } - }, - "/v1/messaging/scheduled-emails/": { - "get": { - "tags": [ - "messaging" - ], - "operationId": "messaging_listScheduledEmails", - "summary": "List scheduled emails", - "security": [ - { - "BearerAuth": [] - } - ], - "responses": { - "200": { - "description": "List scheduled emails", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "schedules": { - "type": "array", - "items": { - "$ref": "#/components/schemas/ScheduledEmail" - } - } - }, - "required": [ - "schedules" - ] - } - } - } - }, - "400": { - "$ref": "#/components/responses/Error400" - }, - "401": { - "$ref": "#/components/responses/Error401" - }, - "500": { - "$ref": "#/components/responses/Error500" - } - } - }, - "post": { - "tags": [ - "messaging" - ], - "operationId": "messaging_createScheduledEmail", - "summary": "Save scheduled email", - "security": [ - { - "BearerAuth": [] - } - ], - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ScheduledEmail" - } - } - } - }, - "responses": { - "200": { - "description": "Save scheduled email", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "schedule": { - "$ref": "#/components/schemas/ScheduledEmail" - } - }, - "required": [ - "schedule" - ] - } - } - } - }, - "400": { - "$ref": "#/components/responses/Error400" - }, - "401": { - "$ref": "#/components/responses/Error401" - }, - "500": { - "$ref": "#/components/responses/Error500" - } - } - } - }, - "/v1/messaging/scheduled-emails/{id}": { - "get": { - "tags": [ - "messaging" - ], - "operationId": "messaging_getScheduledEmail", - "summary": "Get scheduled email", - "security": [ - { - "BearerAuth": [] - } - ], - "parameters": [ - { - "name": "id", - "in": "path", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "Scheduled email", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "schedule": { - "$ref": "#/components/schemas/ScheduledEmail" - } - }, - "required": [ - "schedule" - ] - } - } - } - }, - "400": { - "$ref": "#/components/responses/Error400" - }, - "401": { - "$ref": "#/components/responses/Error401" - }, - "500": { - "$ref": "#/components/responses/Error500" - } - } - }, - "delete": { - "tags": [ - "messaging" - ], - "operationId": "messaging_deleteScheduledEmail", - "summary": "Delete scheduled email", - "security": [ - { - "BearerAuth": [] - } - ], - "parameters": [ - { - "name": "id", - "in": "path", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "Deleted", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/Message" - } - } - } - }, - "400": { - "$ref": "#/components/responses/Error400" - }, - "401": { - "$ref": "#/components/responses/Error401" - }, - "500": { - "$ref": "#/components/responses/Error500" - } - } - } - }, - "/v1/studies/": { - "get": { - "tags": [ - "studies" - ], - "operationId": "studies_listStudies", - "security": [ - { - "BearerAuth": [] - } - ], - "summary": "List all studies", - "responses": { - "200": { - "description": "List all studies", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "studies": { - "type": "array", - "items": { - "$ref": "#/components/schemas/Study" - } - } - }, - "required": [ - "studies" - ] - } - } - } - }, - "400": { - "$ref": "#/components/responses/Error400" - }, - "401": { - "$ref": "#/components/responses/Error401" - }, - "500": { - "$ref": "#/components/responses/Error500" - } - } - }, - "post": { - "tags": [ - "studies" - ], - "operationId": "studies_createStudy", - "security": [ - { - "BearerAuth": [] - } - ], - "summary": "Create a new study", - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "studyKey": { - "type": "string" - }, - "secretKey": { - "type": "string" - }, - "isSystemDefaultStudy": { - "type": "boolean" - } - }, - "required": [ - "studyKey", - "secretKey" - ], - "additionalProperties": false - } - } - } - }, - "responses": { - "201": { - "description": "Created study", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "study": { - "$ref": "#/components/schemas/Study" - } - }, - "required": [ - "study" - ] - } - } - } - }, - "400": { - "$ref": "#/components/responses/Error400" - }, - "401": { - "$ref": "#/components/responses/Error401" - }, - "500": { - "$ref": "#/components/responses/Error500" - } - } - } - }, - "/v1/studies/{studyKey}/": { - "get": { - "tags": [ - "studies" - ], - "operationId": "studies_getStudy", - "security": [ - { - "BearerAuth": [] - } - ], - "summary": "Get study configuration by key", - "parameters": [ - { - "name": "studyKey", - "in": "path", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "Study config", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "study": { - "$ref": "#/components/schemas/Study" - } - }, - "required": [ - "study" - ] - } - } - } - }, - "400": { - "$ref": "#/components/responses/Error400" - }, - "401": { - "$ref": "#/components/responses/Error401" - }, - "500": { - "$ref": "#/components/responses/Error500" - } - } - }, - "delete": { - "tags": [ - "studies" - ], - "operationId": "studies_deleteStudy", - "security": [ - { - "BearerAuth": [] - } - ], - "summary": "Delete a study by key", - "parameters": [ - { - "name": "studyKey", - "in": "path", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "Deleted", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/Message" - } - } - } - }, - "400": { - "$ref": "#/components/responses/Error400" - }, - "401": { - "$ref": "#/components/responses/Error401" - }, - "500": { - "$ref": "#/components/responses/Error500" - } - } - } - }, - "/v1/studies/{studyKey}/export-config": { - "get": { - "tags": [ - "studies" - ], - "operationId": "studies_exportConfig", - "security": [ - { - "BearerAuth": [] - } - ], - "summary": "Export study configuration, surveys, and rules", - "parameters": [ - { - "name": "studyKey", - "in": "path", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "config", - "in": "query", - "schema": { - "type": "string", - "enum": [ - "true", - "false" - ], - "default": "false" - } - }, - { - "name": "surveys", - "in": "query", - "schema": { - "type": "string", - "enum": [ - "true", - "false" - ], - "default": "false" - } - }, - { - "name": "rules", - "in": "query", - "schema": { - "type": "string", - "enum": [ - "true", - "false" - ], - "default": "false" - } - } - ], - "responses": { - "200": { - "description": "Export", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "exportedAt": { - "type": "string", - "format": "date-time" - }, - "config": { - "$ref": "#/components/schemas/Study" - }, - "rules": { - "$ref": "#/components/schemas/StudyRules" - }, - "surveys": { - "type": "array", - "items": { - "$ref": "#/components/schemas/Survey" - } - } - }, - "additionalProperties": false, - "description": "Stream Export Object" - } - } - } - }, - "400": { - "$ref": "#/components/responses/Error400" - }, - "401": { - "$ref": "#/components/responses/Error401" - }, - "500": { - "$ref": "#/components/responses/Error500" - } - } - } - }, - "/v1/studies/{studyKey}/is-default": { - "put": { - "tags": [ - "studies" - ], - "operationId": "studies_updateIsDefault", - "security": [ - { - "BearerAuth": [] - } - ], - "summary": "Update default status of a study", - "parameters": [ - { - "name": "studyKey", - "in": "path", - "required": true, - "schema": { - "type": "string" - } - } - ], - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "isDefault": { - "type": "boolean" - } - }, - "required": [ - "isDefault" - ], - "additionalProperties": false - } - } - } - }, - "responses": { - "200": { - "description": "Updated", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/Message" - } - } - } - }, - "400": { - "$ref": "#/components/responses/Error400" - }, - "401": { - "$ref": "#/components/responses/Error401" - }, - "500": { - "$ref": "#/components/responses/Error500" - } - } - } - }, - "/v1/studies/{studyKey}/status": { - "put": { - "tags": [ - "studies" - ], - "operationId": "studies_updateStatus", - "security": [ - { - "BearerAuth": [] - } - ], - "summary": "Update status of a study", - "parameters": [ - { - "name": "studyKey", - "in": "path", - "required": true, - "schema": { - "type": "string" - } - } - ], - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "status": { - "type": "string" - } - }, - "required": [ - "status" - ], - "additionalProperties": false - } - } - } - }, - "responses": { - "200": { - "description": "Updated", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/Message" - } - } - } - }, - "400": { - "$ref": "#/components/responses/Error400" - }, - "401": { - "$ref": "#/components/responses/Error401" - }, - "500": { - "$ref": "#/components/responses/Error500" - } - } - } - }, - "/v1/studies/{studyKey}/display-props": { - "put": { - "tags": [ - "studies" - ], - "operationId": "studies_updateDisplayProps", - "security": [ - { - "BearerAuth": [] - } - ], - "summary": "Update display properties of a study", - "parameters": [ - { - "name": "studyKey", - "in": "path", - "required": true, - "schema": { - "type": "string" - } - } - ], - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "name": { - "type": "array", - "items": { - "type": "object", - "additionalProperties": true - } - }, - "description": { - "type": "array", - "items": { - "type": "object", - "additionalProperties": true - } - }, - "tags": { - "type": "array", - "items": { - "type": "object", - "additionalProperties": true - } - } - }, - "additionalProperties": false - } - } - } - }, - "responses": { - "200": { - "description": "Updated", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/Message" - } - } - } - }, - "400": { - "$ref": "#/components/responses/Error400" - }, - "401": { - "$ref": "#/components/responses/Error401" - }, - "500": { - "$ref": "#/components/responses/Error500" - } - } - } - }, - "/v1/studies/{studyKey}/file-upload-config": { - "put": { - "tags": [ - "studies" - ], - "operationId": "studies_updateFileUploadRule", - "security": [ - { - "BearerAuth": [] - } - ], - "summary": "Update file upload configuration of a study", - "parameters": [ - { - "name": "studyKey", - "in": "path", - "required": true, - "schema": { - "type": "string" - } - } - ], - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "simplifiedAllowedUpload": { - "type": "boolean" - }, - "expression": { - "type": "object", - "additionalProperties": true - } - } - } - } - } - }, - "responses": { - "200": { - "description": "Updated", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/Message" - } - } - } - }, - "400": { - "$ref": "#/components/responses/Error400" - }, - "401": { - "$ref": "#/components/responses/Error401" - }, - "500": { - "$ref": "#/components/responses/Error500" - } - } - } - }, - "/v1/studies/{studyKey}/surveys/": { - "get": { - "tags": [ - "surveys" - ], - "operationId": "surveys_listSurveyInfos", - "security": [ - { - "BearerAuth": [] - } - ], - "summary": "List survey infos for a study", - "parameters": [ - { - "name": "studyKey", - "in": "path", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "List survey infos", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "surveys": { - "type": "array", - "items": { - "$ref": "#/components/schemas/SurveyInfo" - } - } - }, - "required": [ - "surveys" - ] - } - } - } - }, - "400": { - "$ref": "#/components/responses/Error400" - }, - "401": { - "$ref": "#/components/responses/Error401" - }, - "500": { - "$ref": "#/components/responses/Error500" - } - } - }, - "post": { - "tags": [ - "surveys" - ], - "operationId": "surveys_createSurvey", - "security": [ - { - "BearerAuth": [] - } - ], - "summary": "Create a new survey in a study", - "parameters": [ - { - "name": "studyKey", - "in": "path", - "required": true, - "schema": { - "type": "string" - } - } - ], - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/Survey" - } - } - } - }, - "responses": { - "201": { - "description": "Created survey", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "survey": { - "$ref": "#/components/schemas/Survey" - } - }, - "required": [ - "survey" - ] - } - } - } - }, - "400": { - "$ref": "#/components/responses/Error400" - }, - "401": { - "$ref": "#/components/responses/Error401" - }, - "500": { - "$ref": "#/components/responses/Error500" - } - } - } - }, - "/v1/studies/{studyKey}/surveys/{surveyKey}": { - "get": { - "tags": [ - "surveys" - ], - "operationId": "surveys_getLatestSurvey", - "security": [ - { - "BearerAuth": [] - } - ], - "summary": "Get latest survey by key", - "parameters": [ - { - "name": "studyKey", - "in": "path", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "surveyKey", - "in": "path", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "Latest survey", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "survey": { - "$ref": "#/components/schemas/Survey" - } - }, - "required": [ - "survey" - ] - } - } - } - }, - "400": { - "$ref": "#/components/responses/Error400" - }, - "401": { - "$ref": "#/components/responses/Error401" - }, - "500": { - "$ref": "#/components/responses/Error500" - } - } - }, - "post": { - "tags": [ - "surveys" - ], - "operationId": "surveys_updateSurvey", - "security": [ - { - "BearerAuth": [] - } - ], - "summary": "Update survey definition", - "parameters": [ - { - "name": "studyKey", - "in": "path", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "surveyKey", - "in": "path", - "required": true, - "schema": { - "type": "string" - } - } - ], - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "survey": { - "$ref": "#/components/schemas/Survey" - } - }, - "required": [ - "survey" - ] - } - } - } - }, - "responses": { - "200": { - "description": "Updated survey", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "survey": { - "$ref": "#/components/schemas/Survey" - } - }, - "required": [ - "survey" - ] - } - } - } - }, - "400": { - "$ref": "#/components/responses/Error400" - }, - "401": { - "$ref": "#/components/responses/Error401" - }, - "500": { - "$ref": "#/components/responses/Error500" - } - } - } - }, - "/v1/studies/{studyKey}/surveys/{surveyKey}/unpublish": { - "post": { - "tags": [ - "surveys" - ], - "operationId": "surveys_unpublishSurvey", - "security": [ - { - "BearerAuth": [] - } - ], - "summary": "Unpublish a survey", - "parameters": [ - { - "name": "studyKey", - "in": "path", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "surveyKey", - "in": "path", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "Unpublished", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/Message" - } - } - } - }, - "400": { - "$ref": "#/components/responses/Error400" - }, - "401": { - "$ref": "#/components/responses/Error401" - }, - "500": { - "$ref": "#/components/responses/Error500" - } - } - } - }, - "/v1/studies/{studyKey}/surveys/{surveyKey}/versions": { - "get": { - "tags": [ - "surveys" - ], - "operationId": "surveys_listSurveyVersions", - "security": [ - { - "BearerAuth": [] - } - ], - "summary": "List all survey versions", - "parameters": [ - { - "name": "studyKey", - "in": "path", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "surveyKey", - "in": "path", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "Versions", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "versions": { - "type": "array", - "items": { - "$ref": "#/components/schemas/Survey" - } - } - }, - "required": [ - "versions" - ] - } - } - } - }, - "400": { - "$ref": "#/components/responses/Error400" - }, - "401": { - "$ref": "#/components/responses/Error401" - }, - "500": { - "$ref": "#/components/responses/Error500" - } - } - } - }, - "/v1/studies/{studyKey}/surveys/{surveyKey}/versions/{versionID}": { - "get": { - "tags": [ - "surveys" - ], - "operationId": "surveys_getSurveyVersion", - "security": [ - { - "BearerAuth": [] - } - ], - "summary": "Get a specific survey version", - "parameters": [ - { - "name": "studyKey", - "in": "path", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "surveyKey", - "in": "path", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "versionID", - "in": "path", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "Version", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "survey": { - "$ref": "#/components/schemas/Survey" - } - }, - "required": [ - "survey" - ] - } - } - } - }, - "400": { - "$ref": "#/components/responses/Error400" - }, - "401": { - "$ref": "#/components/responses/Error401" - }, - "500": { - "$ref": "#/components/responses/Error500" - } - } - }, - "delete": { - "tags": [ - "surveys" - ], - "operationId": "surveys_deleteSurveyVersion", - "security": [ - { - "BearerAuth": [] - } - ], - "summary": "Delete a survey version", - "parameters": [ - { - "name": "studyKey", - "in": "path", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "surveyKey", - "in": "path", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "versionID", - "in": "path", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "Deleted", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/Message" - } - } - } - }, - "400": { - "$ref": "#/components/responses/Error400" - }, - "401": { - "$ref": "#/components/responses/Error401" - }, - "500": { - "$ref": "#/components/responses/Error500" - } - } - } - }, - "/v1/studies/{studyKey}/permissions/": { - "get": { - "tags": [ - "study-permissions" - ], - "operationId": "studyPermissions_listPermissions", - "summary": "List study permissions", - "security": [ - { - "BearerAuth": [] - } - ], - "parameters": [ - { - "name": "studyKey", - "in": "path", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "Permission list", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "permissions": { - "type": "object", - "additionalProperties": { - "type": "object", - "properties": { - "user": { - "type": "object", - "additionalProperties": true - }, - "permissions": { - "type": "array", - "items": { - "$ref": "#/components/schemas/Permission" - } - } - } - } - } - }, - "required": [ - "permissions" - ] - } - } - } - }, - "400": { - "$ref": "#/components/responses/Error400" - }, - "401": { - "$ref": "#/components/responses/Error401" - }, - "500": { - "$ref": "#/components/responses/Error500" - } - } - }, - "post": { - "tags": [ - "study-permissions" - ], - "operationId": "studyPermissions_addPermission", - "summary": "Add a study permission", - "security": [ - { - "BearerAuth": [] - } - ], - "parameters": [ - { - "name": "studyKey", - "in": "path", - "required": true, - "schema": { - "type": "string" - } - } - ], - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/Permission" - } - } - } - }, - "responses": { - "200": { - "description": "Created", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/Message" - } - } - } - }, - "400": { - "$ref": "#/components/responses/Error400" - }, - "401": { - "$ref": "#/components/responses/Error401" - }, - "500": { - "$ref": "#/components/responses/Error500" - } - } - } - }, - "/v1/studies/{studyKey}/permissions/{permissionID}": { - "delete": { - "tags": [ - "study-permissions" - ], - "operationId": "studyPermissions_removePermission", - "summary": "Remove a study permission", - "security": [ - { - "BearerAuth": [] - } - ], - "parameters": [ - { - "name": "studyKey", - "in": "path", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "permissionID", - "in": "path", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "Removed", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/Message" - } - } - } - }, - "400": { - "$ref": "#/components/responses/Error400" - }, - "401": { - "$ref": "#/components/responses/Error401" - }, - "500": { - "$ref": "#/components/responses/Error500" - } - } - } - }, - "/v1/studies/{studyKey}/notification-subscriptions/": { - "get": { - "tags": [ - "notifications" - ], - "operationId": "notifications_getSubscriptions", - "summary": "List notification subscriptions", - "security": [ - { - "BearerAuth": [] - } - ], - "parameters": [ - { - "name": "studyKey", - "in": "path", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "Subscriptions", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "subscriptions": { - "type": "array", - "items": { - "$ref": "#/components/schemas/NotificationSubscription" - } - } - }, - "required": [ - "subscriptions" - ], - "additionalProperties": false - } - } - } - }, - "400": { - "$ref": "#/components/responses/Error400" - }, - "401": { - "$ref": "#/components/responses/Error401" - }, - "500": { - "$ref": "#/components/responses/Error500" - } - } - }, - "put": { - "tags": [ - "notifications" - ], - "operationId": "notifications_updateSubscriptions", - "summary": "Update notification subscriptions", - "security": [ - { - "BearerAuth": [] - } - ], - "parameters": [ - { - "name": "studyKey", - "in": "path", - "required": true, - "schema": { - "type": "string" - } - } - ], - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "subscriptions": { - "type": "array", - "items": { - "$ref": "#/components/schemas/NotificationSubscription" - } - } - }, - "required": [ - "subscriptions" - ], - "additionalProperties": false - } - } - } - }, - "responses": { - "200": { - "description": "Updated", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/Message" - } - } - } - }, - "400": { - "$ref": "#/components/responses/Error400" - }, - "401": { - "$ref": "#/components/responses/Error401" - }, - "500": { - "$ref": "#/components/responses/Error500" - } - } - } - }, - "/v1/studies/{studyKey}/study-code-list/list-keys": { - "get": { - "tags": [ - "code-lists" - ], - "operationId": "codeLists_getListKeys", - "summary": "List code list keys", - "security": [ - { - "BearerAuth": [] - } - ], - "parameters": [ - { - "name": "studyKey", - "in": "path", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "List keys", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "listKeys": { - "type": "array", - "items": { - "type": "string" - } - } - }, - "required": [ - "listKeys" - ], - "additionalProperties": false - } - } - } - }, - "400": { - "$ref": "#/components/responses/Error400" - }, - "401": { - "$ref": "#/components/responses/Error401" - }, - "500": { - "$ref": "#/components/responses/Error500" - } - } - } - }, - "/v1/studies/{studyKey}/study-code-list/codes": { - "get": { - "tags": [ - "code-lists" - ], - "operationId": "codeLists_getCodes", - "summary": "List codes of a study code list", - "security": [ - { - "BearerAuth": [] - } - ], - "parameters": [ - { - "name": "studyKey", - "in": "path", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "listKey", - "in": "query", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "page", - "in": "query", - "description": "page number (starting from 1)", - "schema": { - "type": "integer", - "minimum": 1, - "default": 1 - } - }, - { - "name": "limit", - "in": "query", - "description": "maximum number of codes per page", - "schema": { - "type": "integer", - "minimum": 1, - "default": 10 - } - } - ], - "responses": { - "200": { - "description": "Codes", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "codeList": { - "type": "array", - "items": { - "$ref": "#/components/schemas/StudyCodeListEntry" - } - }, - "pagination": { - "$ref": "#/components/schemas/PaginationInfos" - } - }, - "required": [ - "codeList", - "pagination" - ] - } - } - } - }, - "400": { - "$ref": "#/components/responses/Error400" - }, - "401": { - "$ref": "#/components/responses/Error401" - }, - "500": { - "$ref": "#/components/responses/Error500" - } - } - }, - "post": { - "tags": [ - "code-lists" - ], - "operationId": "codeLists_addCodes", - "summary": "Add codes to a study code list", - "security": [ - { - "BearerAuth": [] - } - ], - "parameters": [ - { - "name": "studyKey", - "in": "path", - "required": true, - "schema": { - "type": "string" - } - } - ], - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "listKey": { - "type": "string" - }, - "codes": { - "type": "array", - "items": { - "type": "string" - } - } - }, - "required": [ - "listKey", - "codes" - ], - "additionalProperties": false - } - } - } - }, - "responses": { - "200": { - "description": "Added", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "errors": { - "type": "array", - "items": { - "type": "string" - } - } - }, - "additionalProperties": false - } - } - } - }, - "400": { - "$ref": "#/components/responses/Error400" - }, - "401": { - "$ref": "#/components/responses/Error401" - } - } - }, - "delete": { - "tags": [ - "code-lists" - ], - "operationId": "codeLists_removeCode", - "summary": "Remove a code from a study code list", - "security": [ - { - "BearerAuth": [] - } - ], - "parameters": [ - { - "name": "studyKey", - "in": "path", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "listKey", - "in": "query", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "code", - "in": "query", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "Removed", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "success": { - "type": "boolean" - } - }, - "required": [ - "success" - ] - } - } - } - }, - "400": { - "$ref": "#/components/responses/Error400" - }, - "401": { - "$ref": "#/components/responses/Error401" - }, - "500": { - "$ref": "#/components/responses/Error500" - } - } - } - }, - "/v1/studies/{studyKey}/study-counters/": { - "get": { - "tags": [ - "study-counters" - ], - "operationId": "studyCounters_listValues", - "security": [ - { - "BearerAuth": [] - } - ], - "summary": "List all study counter values", - "parameters": [ - { - "name": "studyKey", - "in": "path", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "Counter values", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "values": { - "type": "array", - "items": { - "$ref": "#/components/schemas/StudyCounter" - } - } - }, - "required": [ - "values" - ] - } - } - } - }, - "400": { - "$ref": "#/components/responses/Error400" - }, - "401": { - "$ref": "#/components/responses/Error401" - }, - "500": { - "$ref": "#/components/responses/Error500" - } - } - } - }, - "/v1/studies/{studyKey}/study-counters/{scope}": { - "post": { - "tags": [ - "study-counters" - ], - "operationId": "studyCounters_saveValue", - "security": [ - { - "BearerAuth": [] - } - ], - "summary": "Set a study counter value for scope", - "parameters": [ - { - "name": "studyKey", - "in": "path", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "scope", - "in": "path", - "required": true, - "schema": { - "type": "string" - } - } - ], - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "value": { - "type": "integer" - } - }, - "required": [ - "value" - ], - "additionalProperties": false - } - } - } - }, - "responses": { - "200": { - "description": "Saved", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "value": { - "type": "integer" - } - }, - "required": [ - "value" - ], - "additionalProperties": false - } - } - } - }, - "400": { - "$ref": "#/components/responses/Error400" - }, - "401": { - "$ref": "#/components/responses/Error401" - }, - "500": { - "$ref": "#/components/responses/Error500" - } - } - }, - "put": { - "tags": [ - "study-counters" - ], - "operationId": "studyCounters_incrementValue", - "security": [ - { - "BearerAuth": [] - } - ], - "summary": "Increment a study counter value", - "parameters": [ - { - "name": "studyKey", - "in": "path", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "scope", - "in": "path", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "Incremented", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "value": { - "type": "integer" - } - }, - "required": [ - "value" - ], - "additionalProperties": false - } - } - } - }, - "400": { - "$ref": "#/components/responses/Error400" - }, - "401": { - "$ref": "#/components/responses/Error401" - }, - "500": { - "$ref": "#/components/responses/Error500" - } - } - }, - "delete": { - "tags": [ - "study-counters" - ], - "operationId": "studyCounters_removeValue", - "security": [ - { - "BearerAuth": [] - } - ], - "summary": "Remove a study counter value", - "parameters": [ - { - "name": "studyKey", - "in": "path", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "scope", - "in": "path", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "Removed", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "success": { - "type": "boolean" - } - }, - "required": [ - "success" - ] - } - } - } - }, - "400": { - "$ref": "#/components/responses/Error400" - }, - "401": { - "$ref": "#/components/responses/Error401" - }, - "500": { - "$ref": "#/components/responses/Error500" - } - } - } - }, - "/v1/studies/{studyKey}/variables/": { - "get": { - "tags": [ - "study-variables" - ], - "operationId": "studyVariables_listVariables", - "summary": "List study variables", - "security": [ - { - "BearerAuth": [] - } - ], - "parameters": [ - { - "name": "studyKey", - "in": "path", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "Variable list", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "variables": { - "type": "array", - "items": { - "$ref": "#/components/schemas/StudyVariables" - } - } - }, - "additionalProperties": false - } - } - } - }, - "400": { - "$ref": "#/components/responses/Error400" - }, - "401": { - "$ref": "#/components/responses/Error401" - }, - "500": { - "$ref": "#/components/responses/Error500" - } - } - }, - "post": { - "tags": [ - "study-variables" - ], - "operationId": "studyVariables_addVariable", - "summary": "Create a new study variable", - "security": [ - { - "BearerAuth": [] - } - ], - "parameters": [ - { - "name": "studyKey", - "in": "path", - "required": true, - "schema": { - "type": "string" - } - } - ], - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "variableDef": { - "$ref": "#/components/schemas/StudyVariables" - } - }, - "additionalProperties": false - } - } - } - }, - "responses": { - "200": { - "description": "Created variable", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "id": { - "type": "string" - } - }, - "additionalProperties": false, - "required": [ - "id" - ] - } - } - } - }, - "400": { - "$ref": "#/components/responses/Error400" - }, - "401": { - "$ref": "#/components/responses/Error401" - }, - "500": { - "$ref": "#/components/responses/Error500" - } - } - } - }, - "/v1/studies/{studyKey}/variables/{variableKey}": { - "get": { - "tags": [ - "study-variables" - ], - "operationId": "studyVariables_getVariable", - "summary": "Get a study variable by key", - "security": [ - { - "BearerAuth": [] - } - ], - "parameters": [ - { - "name": "studyKey", - "in": "path", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "variableKey", - "in": "path", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "Variable", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "variable": { - "$ref": "#/components/schemas/StudyVariables" - } - }, - "additionalProperties": false, - "required": [ - "variable" - ] - } - } - } - }, - "400": { - "$ref": "#/components/responses/Error400" - }, - "401": { - "$ref": "#/components/responses/Error401" - }, - "500": { - "$ref": "#/components/responses/Error500" - } - } - }, - "put": { - "tags": [ - "study-variables" - ], - "operationId": "studyVariables_updateVariableDef", - "summary": "Update study variable definition", - "security": [ - { - "BearerAuth": [] - } - ], - "parameters": [ - { - "name": "studyKey", - "in": "path", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "variableKey", - "in": "path", - "required": true, - "schema": { - "type": "string" - } - } - ], - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "variableDef": { - "$ref": "#/components/schemas/StudyVariables" - } - }, - "required": [ - "variableDef" - ], - "additionalProperties": false - } - } - } - }, - "responses": { - "200": { - "description": "Updated", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/Message" - } - } - } - }, - "400": { - "$ref": "#/components/responses/Error400" - }, - "401": { - "$ref": "#/components/responses/Error401" - }, - "500": { - "$ref": "#/components/responses/Error500" - } - } - }, - "delete": { - "tags": [ - "study-variables" - ], - "operationId": "studyVariables_deleteVariable", - "summary": "Delete a study variable", - "security": [ - { - "BearerAuth": [] - } - ], - "parameters": [ - { - "name": "studyKey", - "in": "path", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "variableKey", - "in": "path", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "Deleted", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "success": { - "type": "boolean" - } - }, - "required": [ - "success" - ] - } - } - } - }, - "400": { - "$ref": "#/components/responses/Error400" - }, - "401": { - "$ref": "#/components/responses/Error401" - }, - "500": { - "$ref": "#/components/responses/Error500" - } - } - } - }, - "/v1/studies/{studyKey}/variables/{variableKey}/value": { - "put": { - "tags": [ - "study-variables" - ], - "operationId": "studyVariables_updateVariableValue", - "summary": "Update study variable value", - "security": [ - { - "BearerAuth": [] - } - ], - "parameters": [ - { - "name": "studyKey", - "in": "path", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "variableKey", - "in": "path", - "required": true, - "schema": { - "type": "string" - } - } - ], - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "variable": { - "$ref": "#/components/schemas/StudyVariables" - } - }, - "required": [ - "variable" - ], - "additionalProperties": false - } - } - } - }, - "responses": { - "200": { - "description": "Value updated", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/Message" - } - } - } - }, - "400": { - "$ref": "#/components/responses/Error400" - }, - "401": { - "$ref": "#/components/responses/Error401" - }, - "500": { - "$ref": "#/components/responses/Error500" - } - } - } - }, - "/v1/studies/{studyKey}/rules/": { - "get": { - "tags": [ - "study-rules" - ], - "operationId": "studyRules_getCurrent", - "summary": "Get current published study rules", - "security": [ - { - "BearerAuth": [] - } - ], - "parameters": [ - { - "name": "studyKey", - "in": "path", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "Current rules", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "studyRules": { - "$ref": "#/components/schemas/StudyRules" - } - }, - "required": [ - "studyRules" - ] - } - } - } - }, - "400": { - "$ref": "#/components/responses/Error400" - }, - "401": { - "$ref": "#/components/responses/Error401" - }, - "500": { - "$ref": "#/components/responses/Error500" - } - } - }, - "post": { - "tags": [ - "study-rules" - ], - "operationId": "studyRules_publishNewVersion", - "summary": "Publish a new version of study rules", - "security": [ - { - "BearerAuth": [] - } - ], - "parameters": [ - { - "name": "studyKey", - "in": "path", - "required": true, - "schema": { - "type": "string" - } - } - ], - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/StudyRules" - } - } - } - }, - "responses": { - "200": { - "description": "Published", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/Message" - } - } - } - }, - "400": { - "$ref": "#/components/responses/Error400" - }, - "401": { - "$ref": "#/components/responses/Error401" - }, - "500": { - "$ref": "#/components/responses/Error500" - } - } - } - }, - "/v1/studies/{studyKey}/rules/versions": { - "get": { - "tags": [ - "study-rules" - ], - "operationId": "studyRules_listVersions", - "summary": "List all study rules versions", - "security": [ - { - "BearerAuth": [] - } - ], - "parameters": [ - { - "name": "studyKey", - "in": "path", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "Versions", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "versions": { - "type": "array", - "items": { - "$ref": "#/components/schemas/StudyRules" - } - } - }, - "required": [ - "versions" - ] - } - } - } - }, - "400": { - "$ref": "#/components/responses/Error400" - }, - "401": { - "$ref": "#/components/responses/Error401" - }, - "500": { - "$ref": "#/components/responses/Error500" - } - } - } - }, - "/v1/studies/{studyKey}/rules/versions/{id}": { - "get": { - "tags": [ - "study-rules" - ], - "operationId": "studyRules_getVersion", - "summary": "Get a study rules version by ID", - "security": [ - { - "BearerAuth": [] - } - ], - "parameters": [ - { - "name": "studyKey", - "in": "path", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "id", - "in": "path", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "Version", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "studyRules": { - "$ref": "#/components/schemas/StudyRules" - } - }, - "required": [ - "studyRules" - ] - } - } - } - }, - "400": { - "$ref": "#/components/responses/Error400" - }, - "401": { - "$ref": "#/components/responses/Error401" - }, - "500": { - "$ref": "#/components/responses/Error500" - } - } - }, - "delete": { - "tags": [ - "study-rules" - ], - "operationId": "studyRules_deleteVersion", - "summary": "Delete a study rules version", - "security": [ - { - "BearerAuth": [] - } - ], - "parameters": [ - { - "name": "studyKey", - "in": "path", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "id", - "in": "path", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "Deleted", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/Message" - } - } - } - }, - "400": { - "$ref": "#/components/responses/Error400" - }, - "401": { - "$ref": "#/components/responses/Error401" - }, - "500": { - "$ref": "#/components/responses/Error500" - } - } - } - }, - "/v1/studies/{studyKey}/run-actions/participants/{participantID}": { - "post": { - "tags": [ - "actions" - ], - "operationId": "actions_runOnParticipant", - "summary": "Run actions on a participant", - "security": [ - { - "BearerAuth": [] - } - ], - "parameters": [ - { - "name": "studyKey", - "in": "path", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "participantID", - "in": "path", - "required": true, - "schema": { - "type": "string" - } - } - ], - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "rules": { - "type": "array", - "items": { - "type": "object", - "additionalProperties": true - } - } - }, - "required": [ - "rules" - ], - "additionalProperties": false - } - } - } - }, - "responses": { - "200": { - "description": "Task started", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "participantCount": { - "type": "integer" - }, - "duration": { - "type": "integer" - }, - "ruleResults": { - "type": "array", - "items": { - "type": "integer" - } - } - }, - "required": [ - "participantCount", - "duration", - "ruleResults" - ] - } - } - } - }, - "400": { - "$ref": "#/components/responses/Error400" - }, - "401": { - "$ref": "#/components/responses/Error401" - }, - "500": { - "$ref": "#/components/responses/Error500" - } - } - } - }, - "/v1/studies/{studyKey}/run-actions/participants/": { - "post": { - "tags": [ - "actions" - ], - "operationId": "actions_runOnParticipants", - "summary": "Run actions on multiple participants", - "security": [ - { - "BearerAuth": [] - } - ], - "parameters": [ - { - "name": "studyKey", - "in": "path", - "required": true, - "schema": { - "type": "string" - } - } - ], - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "rules": { - "type": "array", - "items": { - "type": "object", - "additionalProperties": true - } - } - }, - "required": [ - "rules" - ], - "additionalProperties": false - } - } - } - }, - "responses": { - "200": { - "description": "Task started", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "task": { - "$ref": "#/components/schemas/Task" - } - }, - "required": [ - "task" - ] - } - } - } - }, - "400": { - "$ref": "#/components/responses/Error400" - }, - "401": { - "$ref": "#/components/responses/Error401" - }, - "500": { - "$ref": "#/components/responses/Error500" - } - } - } - }, - "/v1/studies/{studyKey}/run-actions/participants/task/{taskID}": { - "get": { - "tags": [ - "actions" - ], - "operationId": "actions_getTaskStatus", - "summary": "Get actions task status", - "security": [ - { - "BearerAuth": [] - } - ], - "parameters": [ - { - "name": "studyKey", - "in": "path", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "taskID", - "in": "path", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "Task status", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "task": { - "$ref": "#/components/schemas/Task" - } - }, - "required": [ - "task" - ] - } - } - } - }, - "400": { - "$ref": "#/components/responses/Error400" - }, - "401": { - "$ref": "#/components/responses/Error401" - }, - "403": { - "$ref": "#/components/responses/Error403" - }, - "500": { - "$ref": "#/components/responses/Error500" - } - } - } - }, - "/v1/studies/{studyKey}/run-actions/participants/task/{taskID}/result": { - "get": { - "tags": [ - "actions" - ], - "operationId": "actions_getTaskResult", - "summary": "Get actions task result", - "security": [ - { - "BearerAuth": [] - } - ], - "parameters": [ - { - "name": "studyKey", - "in": "path", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "taskID", - "in": "path", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "Result", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "result": { - "type": "object", - "additionalProperties": { - "type": "object" - } - } - }, - "required": [ - "result" - ] - } - } - } - }, - "400": { - "$ref": "#/components/responses/Error400" - }, - "401": { - "$ref": "#/components/responses/Error401" - }, - "403": { - "$ref": "#/components/responses/Error403" - }, - "404": { - "$ref": "#/components/responses/Error404" - }, - "500": { - "$ref": "#/components/responses/Error500" - } - } - } - }, - "/v1/studies/{studyKey}/run-actions/previous-responses/{participantID}": { - "post": { - "tags": [ - "actions" - ], - "operationId": "actions_runPrevResponsesOnParticipant", - "summary": "Run actions on previous responses for a participant", - "security": [ - { - "BearerAuth": [] - } - ], - "parameters": [ - { - "name": "studyKey", - "in": "path", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "participantID", - "in": "path", - "required": true, - "schema": { - "type": "string" - } - } - ], - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "surveyKeys": { - "type": "array", - "items": { - "type": "string" - } - }, - "from": { - "type": "integer" - }, - "to": { - "type": "integer" - }, - "rules": { - "type": "array", - "items": { - "type": "object", - "additionalProperties": true - } - } - } - } - } - } - }, - "responses": { - "200": { - "description": "Task started", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "participantCount": { - "type": "integer" - }, - "duration": { - "type": "integer" - }, - "ruleResults": { - "type": "array", - "items": { - "type": "integer" - } - } - }, - "required": [ - "participantCount", - "duration", - "ruleResults" - ] - } - } - } - }, - "400": { - "$ref": "#/components/responses/Error400" - }, - "401": { - "$ref": "#/components/responses/Error401" - }, - "500": { - "$ref": "#/components/responses/Error500" - } - } - } - }, - "/v1/studies/{studyKey}/run-actions/previous-responses/": { - "post": { - "tags": [ - "actions" - ], - "operationId": "actions_runPrevResponsesOnParticipants", - "summary": "Run actions on previous responses for multiple participants", - "security": [ - { - "BearerAuth": [] - } - ], - "parameters": [ - { - "name": "studyKey", - "in": "path", - "required": true, - "schema": { - "type": "string" - } - } - ], - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "surveyKeys": { - "type": "array", - "items": { - "type": "string" - } - }, - "from": { - "type": "integer" - }, - "to": { - "type": "integer" - }, - "rules": { - "type": "array", - "items": { - "type": "object", - "additionalProperties": true - } - } - } - } - } - } - }, - "responses": { - "200": { - "description": "Task started", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "task": { - "$ref": "#/components/schemas/Task" - } - }, - "required": [ - "task" - ] - } - } - } - }, - "400": { - "$ref": "#/components/responses/Error400" - }, - "401": { - "$ref": "#/components/responses/Error401" - }, - "500": { - "$ref": "#/components/responses/Error500" - } - } - } - }, - "/v1/studies/{studyKey}/run-actions/previous-responses/task/{taskID}": { - "get": { - "tags": [ - "actions" - ], - "operationId": "actions_getPrevResponsesTaskStatus", - "summary": "Get previous-responses actions task status", - "security": [ - { - "BearerAuth": [] - } - ], - "parameters": [ - { - "name": "studyKey", - "in": "path", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "taskID", - "in": "path", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "Task status", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "task": { - "$ref": "#/components/schemas/Task" - } - }, - "required": [ - "task" - ] - } - } - } - }, - "400": { - "$ref": "#/components/responses/Error400" - }, - "401": { - "$ref": "#/components/responses/Error401" - }, - "403": { - "$ref": "#/components/responses/Error403" - }, - "500": { - "$ref": "#/components/responses/Error500" - } - } - } - }, - "/v1/studies/{studyKey}/run-actions/previous-responses/task/{taskID}/result": { - "get": { - "tags": [ - "actions" - ], - "operationId": "actions_getPrevResponsesTaskResult", - "summary": "Get previous-responses actions task result", - "security": [ - { - "BearerAuth": [] - } - ], - "parameters": [ - { - "name": "studyKey", - "in": "path", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "taskID", - "in": "path", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "Result", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "result": { - "type": "object", - "additionalProperties": { - "type": "object" - } - } - }, - "required": [ - "result" - ] - } - } - } - }, - "400": { - "$ref": "#/components/responses/Error400" - }, - "401": { - "$ref": "#/components/responses/Error401" - }, - "403": { - "$ref": "#/components/responses/Error403" - }, - "404": { - "$ref": "#/components/responses/Error404" - }, - "500": { - "$ref": "#/components/responses/Error500" - } - } - } - }, - "/v1/studies/{studyKey}/data-exporter/survey-info/": { - "get": { - "tags": [ - "responses" - ], - "operationId": "dataExporter_getSurveyInfo", - "summary": "List survey info", - "security": [ - { - "BearerAuth": [] - } - ], - "parameters": [ - { - "name": "studyKey", - "in": "path", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "surveyKey", - "in": "query", - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "File download (JSON or CSV)", - "headers": { - "Content-Disposition": { - "description": "Indicates the filename the client should save.", - "schema": { - "type": "string" - } - } - }, - "content": { - "application/json": { - "schema": { - "type": "string", - "format": "binary" - } - }, - "text/csv": { - "schema": { - "type": "string", - "format": "binary" - } - } - } - }, - "400": { - "$ref": "#/components/responses/Error400" - }, - "401": { - "$ref": "#/components/responses/Error401" - }, - "500": { - "$ref": "#/components/responses/Error500" - } - } - } - }, - "/v1/studies/{studyKey}/data-exporter/responses/count": { - "get": { - "tags": [ - "responses" - ], - "operationId": "dataExporter_getResponsesCount", - "summary": "Get responses count", - "security": [ - { - "BearerAuth": [] - } - ], - "parameters": [ - { - "name": "studyKey", - "in": "path", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "surveyKey", - "in": "query", - "schema": { - "type": "string" - } - }, - { - "name": "filter", - "in": "query", - "description": "bson.M object to filter files", - "schema": { - "type": "object", - "additionalProperties": { - "type": "object" - } - } - } - ], - "responses": { - "200": { - "description": "Count", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "count": { - "type": "integer" - } - }, - "required": [ - "count" - ], - "additionalProperties": false - } - } - } - }, - "400": { - "$ref": "#/components/responses/Error400" - }, - "401": { - "$ref": "#/components/responses/Error401" - }, - "500": { - "$ref": "#/components/responses/Error500" - } - } - } - }, - "/v1/studies/{studyKey}/data-exporter/responses/": { - "post": { - "tags": [ - "responses" - ], - "operationId": "dataExporter_generateResponsesExport", - "summary": "Start responses export task", - "security": [ - { - "BearerAuth": [] - } - ], - "parameters": [ - { - "name": "studyKey", - "in": "path", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "surveyKey", - "in": "query", - "schema": { - "type": "string" - } - }, - { - "name": "page", - "in": "query", - "description": "page number (starting from 1)", - "schema": { - "type": "integer", - "minimum": 1, - "default": 1 - } - }, - { - "name": "limit", - "in": "query", - "description": "maximum number of responses per page", - "schema": { - "type": "integer", - "minimum": 1, - "default": 10 - } - }, - { - "name": "filter", - "in": "query", - "description": "bson.M object to filter responses", - "schema": { - "type": "object", - "additionalProperties": { - "type": "object" - } - } - }, - { - "name": "sort", - "in": "query", - "description": "bson.M object to sort responses", - "schema": { - "type": "object", - "additionalProperties": { - "type": "object" - } - } - }, - { - "name": "shortKeys", - "in": "query", - "description": "return short keys for responses", - "schema": { - "type": "boolean", - "default": false - } - }, - { - "name": "questionOptionSep", - "in": "query", - "description": "separator used in option keys", - "schema": { - "type": "string", - "default": "-" - } - }, - { - "name": "format", - "in": "query", - "description": "response export format", - "schema": { - "type": "string", - "default": "wide", - "enum": [ - "wide", - "long", - "json" - ] - } - }, - { - "name": "extraContextColumns", - "in": "query", - "description": "comma-separated list of extra context columns", - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "Export started", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "task": { - "$ref": "#/components/schemas/Task" - } - }, - "required": [ - "task" - ] - } - } - } - }, - "400": { - "$ref": "#/components/responses/Error400" - }, - "401": { - "$ref": "#/components/responses/Error401" - }, - "500": { - "$ref": "#/components/responses/Error500" - } - } - } - }, - "/v1/studies/{studyKey}/data-exporter/responses/task/{taskID}": { - "get": { - "tags": [ - "responses" - ], - "operationId": "dataExporter_getResponsesTaskStatus", - "summary": "Get responses export task status", - "security": [ - { - "BearerAuth": [] - } - ], - "parameters": [ - { - "name": "studyKey", - "in": "path", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "taskID", - "in": "path", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "Task status", - "content": { - "application/json": { - "type": "object", - "properties": { - "task": { - "$ref": "#/components/schemas/Task" - } - }, - "required": [ - "task" - ] - } - } - }, - "400": { - "$ref": "#/components/responses/Error400" - }, - "401": { - "$ref": "#/components/responses/Error401" - }, - "403": { - "$ref": "#/components/responses/Error403" - }, - "500": { - "$ref": "#/components/responses/Error500" - } - } - } - }, - "/v1/studies/{studyKey}/data-exporter/responses/task/{taskID}/result": { - "get": { - "tags": [ - "responses" - ], - "operationId": "dataExporter_getResponsesTaskResult", - "summary": "Get responses export task result", - "security": [ - { - "BearerAuth": [] - } - ], - "parameters": [ - { - "name": "studyKey", - "in": "path", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "taskID", - "in": "path", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "File download", - "headers": { - "Content-Disposition": { - "description": "Indicates the filename the client should save.", - "schema": { - "type": "string" - } - } - }, - "content": { - "*/*": { - "schema": { - "type": "string", - "format": "binary" - } - } - } - }, - "400": { - "$ref": "#/components/responses/Error400" - }, - "401": { - "$ref": "#/components/responses/Error401" - }, - "403": { - "$ref": "#/components/responses/Error403" - }, - "404": { - "$ref": "#/components/responses/Error404" - }, - "500": { - "$ref": "#/components/responses/Error500" - } - } - } - }, - "/v1/studies/{studyKey}/data-exporter/responses/daily-exports": { - "get": { - "tags": [ - "responses" - ], - "operationId": "dataExporter_listDailyResponseExports", - "summary": "List daily response exports", - "security": [ - { - "BearerAuth": [] - } - ], - "parameters": [ - { - "name": "studyKey", - "in": "path", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "Exports", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "dailyExports": { - "type": "array", - "items": { - "type": "string" - } - } - }, - "required": [ - "dailyExports" - ], - "additionalProperties": false - } - } - } - }, - "400": { - "$ref": "#/components/responses/Error400" - }, - "401": { - "$ref": "#/components/responses/Error401" - }, - "500": { - "$ref": "#/components/responses/Error500" - } - } - } - }, - "/v1/studies/{studyKey}/data-exporter/responses/daily-exports/{exportID}": { - "get": { - "tags": [ - "responses" - ], - "operationId": "dataExporter_getDailyResponseExport", - "summary": "Get daily response export by ID", - "security": [ - { - "BearerAuth": [] - } - ], - "parameters": [ - { - "name": "studyKey", - "in": "path", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "exportID", - "in": "path", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "File download (JSON or CSV)", - "headers": { - "Content-Disposition": { - "description": "Indicates the filename the client should save.", - "schema": { - "type": "string" - } - } - }, - "content": { - "application/json": { - "schema": { - "type": "string", - "format": "binary" - } - }, - "text/csv": { - "schema": { - "type": "string", - "format": "binary" - } - } - } - }, - "401": { - "$ref": "#/components/responses/Error401" - }, - "403": { - "$ref": "#/components/responses/Error403" - }, - "404": { - "$ref": "#/components/responses/Error404" - }, - "500": { - "$ref": "#/components/responses/Error500" - } - } - } - }, - "/v1/studies/{studyKey}/data-exporter/participants/count": { - "get": { - "tags": [ - "participants" - ], - "operationId": "dataExporter_getParticipantsCount", - "summary": "Get participants count", - "security": [ - { - "BearerAuth": [] - } - ], - "parameters": [ - { - "name": "studyKey", - "in": "path", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "filter", - "in": "query", - "description": "bson.M object to filter participants", - "schema": { - "type": "object", - "additionalProperties": { - "type": "object" - } - } - } - ], - "responses": { - "200": { - "description": "Count", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "count": { - "type": "integer" - } - }, - "required": [ - "count" - ], - "additionalProperties": false - } - } - } - }, - "400": { - "$ref": "#/components/responses/Error400" - }, - "401": { - "$ref": "#/components/responses/Error401" - }, - "500": { - "$ref": "#/components/responses/Error500" - } - } - } - }, - "/v1/studies/{studyKey}/data-exporter/participants/": { - "post": { - "tags": [ - "participants" - ], - "operationId": "dataExporter_generateParticipantsExport", - "summary": "Start participants export task", - "security": [ - { - "BearerAuth": [] - } - ], - "parameters": [ - { - "name": "studyKey", - "in": "path", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "filter", - "in": "query", - "description": "bson.M object to filter participants", - "schema": { - "type": "object", - "additionalProperties": { - "type": "object" - } - } - }, - { - "name": "sort", - "in": "query", - "description": "bson.M object to sort participants", - "schema": { - "type": "object", - "additionalProperties": { - "type": "object" - } - } - } - ], - "responses": { - "200": { - "description": "Export started", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "task": { - "$ref": "#/components/schemas/Task" - } - }, - "required": [ - "task" - ] - } - } - } - }, - "400": { - "$ref": "#/components/responses/Error400" - }, - "401": { - "$ref": "#/components/responses/Error401" - }, - "500": { - "$ref": "#/components/responses/Error500" - } - } - } - }, - "/v1/studies/{studyKey}/data-exporter/participants/task/{taskID}": { - "get": { - "tags": [ - "participants" - ], - "operationId": "dataExporter_getParticipantsTaskStatus", - "summary": "Get participants export task status", - "security": [ - { - "BearerAuth": [] - } - ], - "parameters": [ - { - "name": "studyKey", - "in": "path", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "taskID", - "in": "path", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "Task status", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "task": { - "$ref": "#/components/schemas/Task" - } - } - } - } - } - }, - "400": { - "$ref": "#/components/responses/Error400" - }, - "401": { - "$ref": "#/components/responses/Error401" - }, - "403": { - "$ref": "#/components/responses/Error403" - }, - "500": { - "$ref": "#/components/responses/Error500" - } - } - } - }, - "/v1/studies/{studyKey}/data-exporter/participants/task/{taskID}/result": { - "get": { - "tags": [ - "participants" - ], - "operationId": "dataExporter_getParticipantsTaskResult", - "summary": "Get participants export task result", - "security": [ - { - "BearerAuth": [] - } - ], - "parameters": [ - { - "name": "studyKey", - "in": "path", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "taskID", - "in": "path", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "File download", - "headers": { - "Content-Disposition": { - "description": "Indicates the filename the client should save.", - "schema": { - "type": "string" - } - } - }, - "content": { - "*/*": { - "schema": { - "type": "string", - "format": "binary" - } - } - } - }, - "400": { - "$ref": "#/components/responses/Error400" - }, - "401": { - "$ref": "#/components/responses/Error401" - }, - "403": { - "$ref": "#/components/responses/Error403" - }, - "404": { - "$ref": "#/components/responses/Error404" - }, - "500": { - "$ref": "#/components/responses/Error500" - } - } - } - }, - "/v1/studies/{studyKey}/data-exporter/reports/count": { - "get": { - "tags": [ - "reports" - ], - "operationId": "dataExporter_getReportsCount", - "summary": "Get report items count", - "security": [ - { - "BearerAuth": [] - } - ], - "parameters": [ - { - "name": "studyKey", - "in": "path", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "reportKey", - "in": "query", - "description": "filter by report key", - "schema": { - "type": "string" - } - }, - { - "name": "pid", - "in": "query", - "description": "filter by participant ID", - "schema": { - "type": "string" - } - }, - { - "name": "from", - "in": "query", - "description": "filter by timestamp (greater than or equal to this value)", - "schema": { - "type": "integer" - } - }, - { - "name": "until", - "in": "query", - "description": "filter by timestamp (less than or equal to this value)", - "schema": { - "type": "integer" - } - } - ], - "responses": { - "200": { - "description": "Count", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "count": { - "type": "integer" - } - }, - "required": [ - "count" - ], - "additionalProperties": false - } - } - } - }, - "400": { - "$ref": "#/components/responses/Error400" - }, - "401": { - "$ref": "#/components/responses/Error401" - }, - "500": { - "$ref": "#/components/responses/Error500" - } - } - } - }, - "/v1/studies/{studyKey}/data-exporter/reports/": { - "post": { - "tags": [ - "reports" - ], - "operationId": "dataExporter_generateReportsExport", - "summary": "Start report export task", - "security": [ - { - "BearerAuth": [] - } - ], - "parameters": [ - { - "name": "studyKey", - "in": "path", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "reportKey", - "in": "query", - "description": "filter by report key", - "schema": { - "type": "string" - } - }, - { - "name": "pid", - "in": "query", - "description": "filter by participant ID", - "schema": { - "type": "string" - } - }, - { - "name": "from", - "in": "query", - "description": "filter by timestamp (greater than or equal to this value)", - "schema": { - "type": "integer" - } - }, - { - "name": "until", - "in": "query", - "description": "filter by timestamp (less than or equal to this value)", - "schema": { - "type": "integer" - } - }, - { - "name": "type", - "in": "query", - "description": "export type: 'csv' to download as table, 'raw' to export as JSON", - "schema": { - "type": "string", - "enum": ["raw", "csv"], - "default": "raw" - } - } - ], - "responses": { - "200": { - "description": "Export started", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "task": { - "$ref": "#/components/schemas/Task" - } - }, - "required": [ - "task" - ], - "additionalProperties": false - } - } - } - }, - "400": { - "$ref": "#/components/responses/Error400" - }, - "401": { - "$ref": "#/components/responses/Error401" - }, - "500": { - "$ref": "#/components/responses/Error500" - } - } - } - }, - "/v1/studies/{studyKey}/data-exporter/reports/task/{taskID}": { - "get": { - "tags": [ - "reports" - ], - "operationId": "dataExporter_getReportsTaskStatus", - "summary": "Get report export task status", - "security": [ - { - "BearerAuth": [] - } - ], - "parameters": [ - { - "name": "studyKey", - "in": "path", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "taskID", - "in": "path", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "Task status", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "task": { - "$ref": "#/components/schemas/Task" - } - }, - "required": [ - "task" - ] - } - } - } - }, - "400": { - "$ref": "#/components/responses/Error400" - }, - "401": { - "$ref": "#/components/responses/Error401" - }, - "403": { - "$ref": "#/components/responses/Error403" - }, - "500": { - "$ref": "#/components/responses/Error500" - } - } - } - }, - "/v1/studies/{studyKey}/data-exporter/reports/task/{taskID}/result": { - "get": { - "tags": [ - "reports" - ], - "operationId": "dataExporter_getReportsTaskResult", - "summary": "Get report export task result", - "security": [ - { - "BearerAuth": [] - } - ], - "parameters": [ - { - "name": "studyKey", - "in": "path", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "taskID", - "in": "path", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "File download", - "headers": { - "Content-Disposition": { - "description": "Indicates the filename the client should save.", - "schema": { - "type": "string" - } - } - }, - "content": { - "*/*": { - "schema": { - "type": "string", - "format": "binary" - } - } - } - }, - "400": { - "$ref": "#/components/responses/Error400" - }, - "401": { - "$ref": "#/components/responses/Error401" - }, - "403": { - "$ref": "#/components/responses/Error403" - }, - "500": { - "$ref": "#/components/responses/Error500" - } - } - } - }, - "/v1/studies/{studyKey}/data-exporter/confidential-responses/": { - "post": { - "tags": [ - "responses" - ], - "operationId": "dataExporter_getConfidentialResponses", - "summary": "Start confidential responses export task", - "security": [ - { - "BearerAuth": [] - } - ], - "parameters": [ - { - "name": "studyKey", - "in": "path", - "required": true, - "schema": { - "type": "string" - } - } - ], - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "participantIDs": { - "type": "array", - "items": { - "type": "string" - } - }, - "keyFilter": { - "type": "string" - } - }, - "required": [ - "participantIDs" - ] - } - } - } - }, - "responses": { - "200": { - "description": "Export started", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "responses": { - "type": "array", - "items": { - "type": "object", - "additionalProperties": true - }, - "description": "Confidential survey response export entry" - } - }, - "required": [ - "responses" - ] - } - } - } - }, - "400": { - "$ref": "#/components/responses/Error400" - }, - "401": { - "$ref": "#/components/responses/Error401" - }, - "500": { - "$ref": "#/components/responses/Error500" - } - } - }, - "get": { - "tags": [ - "responses" - ], - "operationId": "dataExporter_listConfidentialResponseExports", - "summary": "List confidential response exports", - "security": [ - { - "BearerAuth": [] - } - ], - "parameters": [ - { - "name": "studyKey", - "in": "path", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "Exports", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "availableFiles": { - "type": "array", - "items": { - "type": "string" - } - } - }, - "required": [ - "availableFiles" - ], - "additionalProperties": false - } - } - } - }, - "400": { - "$ref": "#/components/responses/Error400" - }, - "401": { - "$ref": "#/components/responses/Error401" - }, - "500": { - "$ref": "#/components/responses/Error500" - } - } - } - }, - "/v1/studies/{studyKey}/data-exporter/confidential-responses/{exportID}": { - "get": { - "tags": [ - "responses" - ], - "operationId": "dataExporter_getConfidentialResponseExport", - "summary": "Get confidential response export by ID", - "security": [ - { - "BearerAuth": [] - } - ], - "parameters": [ - { - "name": "studyKey", - "in": "path", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "exportID", - "in": "path", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "File download (JSON or CSV)", - "headers": { - "Content-Disposition": { - "description": "Indicates the filename the client should save.", - "schema": { - "type": "string" - } - } - }, - "content": { - "application/json": { - "schema": { - "type": "string", - "format": "binary" - } - }, - "text/csv": { - "schema": { - "type": "string", - "format": "binary" - } - } - } - }, - "400": { - "$ref": "#/components/responses/Error400" - }, - "401": { - "$ref": "#/components/responses/Error401" - }, - "404": { - "$ref": "#/components/responses/Error404" - }, - "500": { - "$ref": "#/components/responses/Error500" - } - } - } - }, - "/v1/studies/{studyKey}/data-explorer/responses/": { - "get": { - "tags": [ - "responses" - ], - "operationId": "dataExplorer_listResponses", - "summary": "List survey responses", - "security": [ - { - "BearerAuth": [] - } - ], - "parameters": [ - { - "name": "studyKey", - "in": "path", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "surveyKey", - "in": "query", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "shortKeys", - "in": "query", - "description": "whether to return short keys for responses", - "required": false, - "schema": { - "type": "boolean", - "default": false - } - }, - { - "name": "questionOptionSep", - "in": "query", - "description": "character used to seperate question options in response", - "required": false, - "schema": { - "type": "string", - "default": "-" - } - }, - { - "name": "format", - "in": "query", - "description": "format for survey responses", - "required": false, - "schema": { - "type": "string", - "default": "wide", - "enum": [ - "wide", - "long", - "json" - ] - } - }, - { - "name": "page", - "in": "query", - "description": "page number (starting from 1)", - "schema": { - "type": "integer", - "minimum": 1, - "default": 1 - } - }, - { - "name": "limit", - "in": "query", - "description": "maximum number of responses per page", - "schema": { - "type": "integer", - "minimum": 1, - "default": 10 - } - }, - { - "name": "filter", - "in": "query", - "description": "bson.M object to filter responses", - "schema": { - "type": "object", - "additionalProperties": { - "type": "object" - } - } - }, - { - "name": "sort", - "in": "query", - "description": "bson.M object to sort responses", - "schema": { - "type": "object", - "additionalProperties": { - "type": "object" - } - } - }, - { - "name": "extraContextColumns", - "in": "query", - "description": "comma-separated list of extra context columns to include in the response", - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "List responses", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "responses": { - "type": "array", - "items": { - "type": "object", - "description": "Responses", - "additionalProperties": { - "type": "object" - } - } - }, - "pagination": { - "$ref": "#/components/schemas/PaginationInfos" - } - }, - "required": [ - "responses", - "pagination" - ], - "additionalProperties": false - } - } - } - }, - "400": { - "$ref": "#/components/responses/Error400" - }, - "401": { - "$ref": "#/components/responses/Error401" - }, - "500": { - "$ref": "#/components/responses/Error500" - } - } - }, - "delete": { - "tags": [ - "responses" - ], - "operationId": "dataExplorer_deleteResponses", - "summary": "Delete survey responses", - "security": [ - { - "BearerAuth": [] - } - ], - "parameters": [ - { - "name": "studyKey", - "in": "path", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "surveyKey", - "in": "query", - "schema": { - "type": "string" - } - }, - { - "name": "controlField", - "in": "query", - "description": "field used to control deletion (should be equal to studyKey)", - "schema": { - "type": "string" - } - }, - { - "name": "filter", - "in": "query", - "description": "bson.M object to filter responses to delete", - "schema": { - "type": "object", - "additionalProperties": { - "type": "object" - } - } - } - ], - "responses": { - "200": { - "description": "Deleted summary", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/Message" - } - } - } - }, - "400": { - "$ref": "#/components/responses/Error400" - }, - "401": { - "$ref": "#/components/responses/Error401" - }, - "500": { - "$ref": "#/components/responses/Error500" - } - } - } - }, - "/v1/studies/{studyKey}/data-explorer/responses/{responseId}": { - "get": { - "tags": [ - "responses" - ], - "operationId": "dataExplorer_getResponse", - "summary": "Get survey response by ID", - "security": [ - { - "BearerAuth": [] - } - ], - "parameters": [ - { - "name": "studyKey", - "in": "path", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "responseId", - "in": "path", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "shortKeys", - "in": "query", - "description": "whether to return short keys for response", - "required": false, - "schema": { - "type": "boolean", - "default": false - } - }, - { - "name": "questionOptionSep", - "in": "query", - "description": "character used to seperate question options in response", - "required": false, - "schema": { - "type": "string", - "default": "-" - } - } - ], - "responses": { - "200": { - "description": "Response", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "response": { - "type": "object", - "description": "Response", - "additionalProperties": { - "type": "object" - } - } - }, - "required": [ - "response" - ], - "additionalProperties": false - } - } - } - }, - "400": { - "$ref": "#/components/responses/Error400" - }, - "401": { - "$ref": "#/components/responses/Error401" - }, - "500": { - "$ref": "#/components/responses/Error500" - } - } - }, - "delete": { - "tags": [ - "responses" - ], - "operationId": "dataExplorer_deleteResponse", - "summary": "Delete survey response", - "security": [ - { - "BearerAuth": [] - } - ], - "parameters": [ - { - "name": "studyKey", - "in": "path", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "responseId", - "in": "path", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "Deleted", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/Message" - } - } - } - }, - "400": { - "$ref": "#/components/responses/Error400" - }, - "401": { - "$ref": "#/components/responses/Error401" - }, - "500": { - "$ref": "#/components/responses/Error500" - } - } - } - }, - "/v1/studies/{studyKey}/data-explorer/participants/": { - "get": { - "tags": [ - "participants" - ], - "operationId": "dataExplorer_listParticipants", - "summary": "List participants", - "security": [ - { - "BearerAuth": [] - } - ], - "parameters": [ - { - "name": "studyKey", - "in": "path", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "page", - "in": "query", - "description": "page number (starting from 1)", - "schema": { - "type": "integer", - "minimum": 1, - "default": 1 - } - }, - { - "name": "limit", - "in": "query", - "description": "maximum number of participants per page", - "schema": { - "type": "integer", - "minimum": 1, - "default": 10 - } - }, - { - "name": "filter", - "in": "query", - "description": "bson.M object to filter participants", - "schema": { - "type": "object", - "additionalProperties": { - "type": "object" - } - } - }, - { - "name": "sort", - "in": "query", - "description": "bson.M object to sort participants", - "schema": { - "type": "object", - "additionalProperties": { - "type": "object" - } - } - } - ], - "responses": { - "200": { - "description": "Participants", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "participants": { - "type": "array", - "items": { - "$ref": "#/components/schemas/Participant" - } - }, - "pagination": { - "$ref": "#/components/schemas/PaginationInfos" - } - }, - "required": [ - "participants", - "pagination" - ], - "additionalProperties": false - } - } - } - }, - "400": { - "$ref": "#/components/responses/Error400" - }, - "401": { - "$ref": "#/components/responses/Error401" - }, - "500": { - "$ref": "#/components/responses/Error500" - } - } - } - }, - "/v1/studies/{studyKey}/data-explorer/participants/{participantID}": { - "get": { - "tags": [ - "participants" - ], - "operationId": "dataExplorer_getParticipant", - "summary": "Get participant", - "security": [ - { - "BearerAuth": [] - } - ], - "parameters": [ - { - "name": "studyKey", - "in": "path", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "participantID", - "in": "path", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "Participant", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "participant": { - "$ref": "#/components/schemas/Participant" - } - }, - "required": [ - "participant" - ], - "additionalProperties": false - } - } - } - }, - "400": { - "$ref": "#/components/responses/Error400" - }, - "401": { - "$ref": "#/components/responses/Error401" - }, - "500": { - "$ref": "#/components/responses/Error500" - } - } - } - }, - "/v1/studies/{studyKey}/data-explorer/reports/keys": { - "get": { - "tags": [ - "reports" - ], - "operationId": "dataExplorer_listReportKeys", - "summary": "List available report keys", - "security": [ - { - "BearerAuth": [] - } - ], - "parameters": [ - { - "name": "studyKey", - "in": "path", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "pid", - "in": "query", - "description": "filter by participant ID", - "schema": { - "type": "string" - } - }, - { - "name": "from", - "in": "query", - "description": "filter by timestamp (greater than or equal to this value)", - "schema": { - "type": "integer" - } - }, - { - "name": "until", - "in": "query", - "description": "filter by timestamp (less than or equal to this value)", - "schema": { - "type": "integer" - } - } - ], - "responses": { - "200": { - "description": "Report keys", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "reportKeys": { - "type": "array", - "items": { - "type": "string" - } - } - }, - "required": [ - "reportKeys" - ], - "additionalProperties": false - } - } - } - }, - "400": { - "$ref": "#/components/responses/Error400" - }, - "401": { - "$ref": "#/components/responses/Error401" - }, - "500": { - "$ref": "#/components/responses/Error500" - } - } - } - }, - "/v1/studies/{studyKey}/data-explorer/reports/": { - "get": { - "tags": [ - "reports" - ], - "operationId": "dataExplorer_listReports", - "summary": "List reports", - "security": [ - { - "BearerAuth": [] - } - ], - "parameters": [ - { - "name": "studyKey", - "in": "path", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "reportKey", - "in": "query", - "description": "filter by report key", - "schema": { - "type": "string" - } - }, - { - "name": "pid", - "in": "query", - "description": "filter by participant ID", - "schema": { - "type": "string" - } - }, - { - "name": "from", - "in": "query", - "description": "filter by timestamp (greater than or equal to this value)", - "schema": { - "type": "integer" - } - }, - { - "name": "until", - "in": "query", - "description": "filter by timestamp (less than or equal to this value)", - "schema": { - "type": "integer" - } - }, - { - "name": "page", - "in": "query", - "description": "page number (starting from 1)", - "schema": { - "type": "integer", - "minimum": 1, - "default": 1 - } - }, - { - "name": "limit", - "in": "query", - "description": "maximum number of reports per page", - "schema": { - "type": "integer", - "minimum": 1, - "default": 10 - } - }, - { - "name": "filter", - "in": "query", - "description": "bson.M object to filter files", - "schema": { - "type": "object", - "additionalProperties": { - "type": "object" - } - } - } - ], - "responses": { - "200": { - "description": "Reports", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "reports": { - "type": "array", - "items": { - "$ref": "#/components/schemas/Report" - } - }, - "pagination": { - "$ref": "#/components/schemas/PaginationInfos" - } - }, - "required": [ - "reports", - "pagination" - ], - "additionalProperties": false - } - } - } - }, - "400": { - "$ref": "#/components/responses/Error400" - }, - "401": { - "$ref": "#/components/responses/Error401" - }, - "500": { - "$ref": "#/components/responses/Error500" - } - } - } - }, - "/v1/studies/{studyKey}/data-explorer/reports/{reportID}": { - "get": { - "tags": [ - "reports" - ], - "operationId": "dataExplorer_getReport", - "summary": "Get report by ID", - "security": [ - { - "BearerAuth": [] - } - ], - "parameters": [ - { - "name": "studyKey", - "in": "path", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "reportID", - "in": "path", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "Report", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "report": { - "$ref": "#/components/schemas/Report" - } - }, - "required": [ - "report" - ] - } - } - } - }, - "400": { - "$ref": "#/components/responses/Error400" - }, - "401": { - "$ref": "#/components/responses/Error401" - }, - "500": { - "$ref": "#/components/responses/Error500" - } - } - } - }, - "/v1/studies/{studyKey}/data-explorer/files/": { - "get": { - "tags": [ - "files" - ], - "operationId": "dataExplorer_listFiles", - "summary": "List files", - "security": [ - { - "BearerAuth": [] - } - ], - "parameters": [ - { - "name": "studyKey", - "in": "path", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "page", - "in": "query", - "description": "page number (starting from 1)", - "schema": { - "type": "integer", - "minimum": 1, - "default": 1 - } - }, - { - "name": "limit", - "in": "query", - "description": "maximum number of files per page", - "schema": { - "type": "integer", - "minimum": 1, - "default": 10 - } - }, - { - "name": "filter", - "in": "query", - "description": "bson.M object to filter files", - "schema": { - "type": "object", - "additionalProperties": { - "type": "object" - } - } - } - ], - "responses": { - "200": { - "description": "Files", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "files": { - "type": "array", - "items": { - "$ref": "#/components/schemas/FileInfo" - } - }, - "pagination": { - "$ref": "#/components/schemas/PaginationInfos" - } - }, - "required": [ - "files", - "pagination" - ], - "additionalProperties": false - } - } - } - }, - "400": { - "$ref": "#/components/responses/Error400" - }, - "401": { - "$ref": "#/components/responses/Error401" - }, - "500": { - "$ref": "#/components/responses/Error500" - } - } - } - }, - "/v1/studies/{studyKey}/data-explorer/files/{fileID}": { - "get": { - "tags": [ - "files" - ], - "operationId": "dataExplorer_getFile", - "summary": "Get file by ID", - "security": [ - { - "BearerAuth": [] - } - ], - "parameters": [ - { - "name": "studyKey", - "in": "path", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "fileID", - "in": "path", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "File", - "content": { - "application/octet-stream": { - "schema": { - "type": "string", - "format": "binary" - } - } - }, - "headers": { - "Content-Disposition": { - "description": "The filename suggested for the download.", - "schema": { - "type": "string" - } - } - } - }, - "400": { - "$ref": "#/components/responses/Error400" - }, - "401": { - "$ref": "#/components/responses/Error401" - }, - "404": { - "$ref": "#/components/responses/Error404" - }, - "500": { - "$ref": "#/components/responses/Error500" - } - } - }, - "delete": { - "tags": [ - "files" - ], - "operationId": "dataExplorer_deleteFile", - "summary": "Delete file", - "security": [ - { - "BearerAuth": [] - } - ], - "parameters": [ - { - "name": "studyKey", - "in": "path", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "fileID", - "in": "path", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "Deleted", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/Message" - } - } - } - }, - "400": { - "$ref": "#/components/responses/Error400" - }, - "401": { - "$ref": "#/components/responses/Error401" - }, - "500": { - "$ref": "#/components/responses/Error500" - } - } - } - }, - "/v1/user-management/management-users": { - "get": { - "tags": [ - "user-management" - ], - "summary": "List management users", - "security": [ - { - "BearerAuth": [] - } - ], - "operationId": "userManagement_listManagementUsers", - "responses": { - "200": { - "description": "List management users", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "users": { - "type": "array", - "items": { - "$ref": "#/components/schemas/ManagementUser" - } - } - }, - "required": [ - "users" - ] - } - } - } - }, - "400": { - "$ref": "#/components/responses/Error400" - }, - "401": { - "$ref": "#/components/responses/Error401" - }, - "500": { - "$ref": "#/components/responses/Error500" - } - } - } - }, - "/v1/user-management/management-users/{userID}": { - "get": { - "tags": [ - "user-management" - ], - "summary": "Get management user", - "security": [ - { - "BearerAuth": [] - } - ], - "operationId": "userManagement_getManagementUser", - "parameters": [ - { - "name": "userID", - "in": "path", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "Management user", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "user": { - "$ref": "#/components/schemas/ManagementUser" - } - }, - "required": [ - "user" - ] - } - } - } - }, - "400": { - "$ref": "#/components/responses/Error400" - }, - "401": { - "$ref": "#/components/responses/Error401" - }, - "500": { - "$ref": "#/components/responses/Error500" - } - } - }, - "delete": { - "tags": [ - "user-management" - ], - "summary": "Delete management user", - "security": [ - { - "BearerAuth": [] - } - ], - "operationId": "userManagement_deleteManagementUser", - "parameters": [ - { - "name": "userID", - "in": "path", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "Deleted management user", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/Message" - } - } - } - }, - "400": { - "$ref": "#/components/responses/Error400" - }, - "401": { - "$ref": "#/components/responses/Error401" - }, - "500": { - "$ref": "#/components/responses/Error500" - } - } - } - }, - "/v1/user-management/management-users/{userID}/permissions": { - "get": { - "tags": [ - "user-management" - ], - "summary": "List user permissions", - "security": [ - { - "BearerAuth": [] - } - ], - "operationId": "userManagement_listUserPermissions", - "parameters": [ - { - "name": "userID", - "in": "path", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "Permissions", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "permissions": { - "type": "array", - "items": { - "$ref": "#/components/schemas/Permission" - } - } - }, - "required": [ - "permissions" - ] - } - } - } - }, - "400": { - "$ref": "#/components/responses/Error400" - }, - "401": { - "$ref": "#/components/responses/Error401" - }, - "500": { - "$ref": "#/components/responses/Error500" - } - } - }, - "post": { - "tags": [ - "user-management" - ], - "summary": "Add permission to user", - "security": [ - { - "BearerAuth": [] - } - ], - "operationId": "userManagement_addPermissionToUser", - "parameters": [ - { - "name": "userID", - "in": "path", - "required": true, - "schema": { - "type": "string" - } - } - ], - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/Permission" - } - } - } - }, - "responses": { - "200": { - "description": "Added permission", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "permission": { - "$ref": "#/components/schemas/Permission" - } - }, - "required": [ - "permission" - ] - } - } - } - }, - "400": { - "$ref": "#/components/responses/Error400" - }, - "401": { - "$ref": "#/components/responses/Error401" - }, - "500": { - "$ref": "#/components/responses/Error500" - } - } - } - }, - "/v1/user-management/management-users/{userID}/permissions/{permissionID}": { - "delete": { - "tags": [ - "user-management" - ], - "summary": "Delete user permission", - "security": [ - { - "BearerAuth": [] - } - ], - "operationId": "userManagement_deleteUserPermission", - "parameters": [ - { - "name": "userID", - "in": "path", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "permissionID", - "in": "path", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "Deleted", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/Message" - } - } - } - }, - "400": { - "$ref": "#/components/responses/Error400" - }, - "401": { - "$ref": "#/components/responses/Error401" - }, - "500": { - "$ref": "#/components/responses/Error500" - } - } - } - }, - "/v1/user-management/management-users/{userID}/permissions/{permissionID}/limiter": { - "put": { - "tags": [ - "user-management" - ], - "summary": "Update permission limiter", - "security": [ - { - "BearerAuth": [] - } - ], - "operationId": "userManagement_updatePermissionLimiter", - "parameters": [ - { - "name": "userID", - "in": "path", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "permissionID", - "in": "path", - "required": true, - "schema": { - "type": "string" - } - } - ], - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/Permission" - } - } - } - }, - "responses": { - "200": { - "description": "Updated limiter", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/Message" - } - } - } - }, - "400": { - "$ref": "#/components/responses/Error400" - }, - "401": { - "$ref": "#/components/responses/Error401" - }, - "500": { - "$ref": "#/components/responses/Error500" - } - } - } - }, - "/v1/user-management/management-users/{userID}/app-roles": { - "get": { - "tags": [ - "app-roles" - ], - "summary": "List app roles for user", - "security": [ - { - "BearerAuth": [] - } - ], - "operationId": "userManagement_listUserAppRoles", - "parameters": [ - { - "name": "userID", - "in": "path", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "App roles", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "appRoles": { - "type": "array", - "items": { - "$ref": "#/components/schemas/AppRole" - } - } - }, - "required": [ - "appRoles" - ], - "additionalProperties": false - } - } - } - }, - "400": { - "$ref": "#/components/responses/Error400" - }, - "401": { - "$ref": "#/components/responses/Error401" - }, - "500": { - "$ref": "#/components/responses/Error500" - } - } - } - }, - "/v1/user-management/management-users/{userID}/app-roles/{appRoleTemplateID}": { - "post": { - "tags": [ - "app-roles" - ], - "summary": "Add app role to user", - "security": [ - { - "BearerAuth": [] - } - ], - "operationId": "userManagement_addAppRoleToUser", - "parameters": [ - { - "name": "userID", - "in": "path", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "appRoleTemplateID", - "in": "path", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "Added app role", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/Message" - } - } - } - }, - "400": { - "$ref": "#/components/responses/Error400" - }, - "401": { - "$ref": "#/components/responses/Error401" - }, - "500": { - "$ref": "#/components/responses/Error500" - } - } - } - }, - "/v1/user-management/management-users/{userID}/app-roles/{appRoleID}": { - "delete": { - "tags": [ - "app-roles" - ], - "summary": "Remove app role from user", - "security": [ - { - "BearerAuth": [] - } - ], - "operationId": "userManagement_removeUserAppRole", - "parameters": [ - { - "name": "userID", - "in": "path", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "appRoleID", - "in": "path", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "Removed role", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/Message" - } - } - } - }, - "400": { - "$ref": "#/components/responses/Error400" - }, - "401": { - "$ref": "#/components/responses/Error401" - }, - "500": { - "$ref": "#/components/responses/Error500" - } - } - } - }, - "/v1/user-management/app-roles/templates/": { - "get": { - "tags": [ - "app-roles" - ], - "summary": "List app role templates", - "security": [ - { - "BearerAuth": [] - } - ], - "operationId": "userManagement_listAppRoleTemplates", - "responses": { - "200": { - "description": "Templates", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "appRoleTemplates": { - "type": "array", - "items": { - "$ref": "#/components/schemas/AppRoleTemplate" - } - } - }, - "required": [ - "appRoleTemplates" - ], - "additionalProperties": false - } - } - } - }, - "400": { - "$ref": "#/components/responses/Error400" - }, - "401": { - "$ref": "#/components/responses/Error401" - }, - "500": { - "$ref": "#/components/responses/Error500" - } - } - }, - "post": { - "tags": [ - "app-roles" - ], - "summary": "Create app role template", - "security": [ - { - "BearerAuth": [] - } - ], - "operationId": "userManagement_createAppRoleTemplate", - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "appName": { - "type": "string" - }, - "role": { - "type": "string" - }, - "requiredPermissions": { - "type": "array", - "items": { - "$ref": "#/components/schemas/Permission" - } - } - }, - "required": [ - "appName", - "role" - ] - } - } - } - }, - "responses": { - "200": { - "description": "Created template", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/Message" - } - } - } - }, - "400": { - "$ref": "#/components/responses/Error400" - }, - "401": { - "$ref": "#/components/responses/Error401" - }, - "500": { - "$ref": "#/components/responses/Error500" - } - } - } - }, - "/v1/user-management/app-roles/templates/{appRoleTemplateID}": { - "get": { - "tags": [ - "app-roles" - ], - "summary": "Get app role template", - "security": [ - { - "BearerAuth": [] - } - ], - "operationId": "userManagement_getAppRoleTemplate", - "parameters": [ - { - "name": "appRoleTemplateID", - "in": "path", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "Template", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "appRoleTemplate": { - "$ref": "#/components/schemas/AppRoleTemplate" - } - }, - "required": [ - "appRoleTemplate" - ] - } - } - } - }, - "400": { - "$ref": "#/components/responses/Error400" - }, - "401": { - "$ref": "#/components/responses/Error401" - }, - "500": { - "$ref": "#/components/responses/Error500" - } - } - }, - "put": { - "tags": [ - "app-roles" - ], - "summary": "Update app role template", - "security": [ - { - "BearerAuth": [] - } - ], - "operationId": "userManagement_updateAppRoleTemplate", - "parameters": [ - { - "name": "appRoleTemplateID", - "in": "path", - "required": true, - "schema": { - "type": "string" - } - } - ], - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "appName": { - "type": "string" - }, - "role": { - "type": "string" - }, - "requiredPermissions": { - "type": "array", - "items": { - "$ref": "#/components/schemas/Permission" - } - } - }, - "required": [ - "appName", - "role" - ] - } - } - } - }, - "responses": { - "200": { - "description": "Updated template", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/Message" - } - } - } - }, - "400": { - "$ref": "#/components/responses/Error400" - }, - "401": { - "$ref": "#/components/responses/Error401" - }, - "500": { - "$ref": "#/components/responses/Error500" - } - } - } - }, - "/v1/user-management/app-roles/templates/delete/{appRoleTemplateID}": { - "delete": { - "tags": [ - "app-roles" - ], - "summary": "Delete app role template", - "security": [ - { - "BearerAuth": [] - } - ], - "operationId": "userManagement_deleteAppRoleTemplate", - "parameters": [ - { - "name": "appRoleTemplateID", - "in": "path", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "Deleted", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/Message" - } - } - } - }, - "400": { - "$ref": "#/components/responses/Error400" - }, - "401": { - "$ref": "#/components/responses/Error401" - }, - "500": { - "$ref": "#/components/responses/Error500" - } - } - } - }, - "/v1/user-management/app-roles/templates/delete-for-app/{appName}": { - "delete": { - "tags": [ - "app-roles" - ], - "summary": "Delete app role templates for app", - "security": [ - { - "BearerAuth": [] - } - ], - "operationId": "userManagement_deleteAppRoleTemplatesForApp", - "parameters": [ - { - "name": "appName", - "in": "path", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "Deleted templates", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/Message" - } - } - } - }, - "400": { - "$ref": "#/components/responses/Error400" - }, - "401": { - "$ref": "#/components/responses/Error401" - }, - "500": { - "$ref": "#/components/responses/Error500" - } - } - } - }, - "/v1/user-management/app-roles/": { - "get": { - "tags": [ - "app-roles" - ], - "summary": "List app roles", - "security": [ - { - "BearerAuth": [] - } - ], - "operationId": "userManagement_listAppRoles", - "responses": { - "200": { - "description": "App roles", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "appRoles": { - "type": "array", - "items": { - "$ref": "#/components/schemas/AppRole" - } - } - }, - "required": [ - "appRoles" - ], - "additionalProperties": false - } - } - } - }, - "400": { - "$ref": "#/components/responses/Error400" - }, - "401": { - "$ref": "#/components/responses/Error401" - }, - "500": { - "$ref": "#/components/responses/Error500" - } - } - } - }, - "/v1/user-management/app-roles/delete/{appName}": { - "delete": { - "tags": [ - "app-roles" - ], - "summary": "Delete app roles for app", - "security": [ - { - "BearerAuth": [] - } - ], - "operationId": "userManagement_deleteAppRolesForApp", - "parameters": [ - { - "name": "appName", - "in": "path", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "Deleted app roles", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/Message" - } - } - } - }, - "400": { - "$ref": "#/components/responses/Error400" - }, - "401": { - "$ref": "#/components/responses/Error401" - }, - "500": { - "$ref": "#/components/responses/Error500" - } - } - } - }, - "/v1/user-management/participant-users/request-deletion": { - "post": { - "tags": [ - "user-management" - ], - "summary": "Request participant user deletion", - "security": [ - { - "BearerAuth": [] - } - ], - "operationId": "userManagement_requestParticipantUserDeletion", - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "email": { - "type": "string", - "format": "email" - } - }, - "required": [ - "email" - ] - } - } - } - }, - "responses": { - "200": { - "description": "Deletion requested", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/Message" - } - } - } - }, - "400": { - "$ref": "#/components/responses/Error400" - }, - "401": { - "$ref": "#/components/responses/Error401" - }, - "500": { - "$ref": "#/components/responses/Error500" - } - } - } - }, - "/v1/user-management/service-accounts/": { - "get": { - "tags": [ - "service-accounts" - ], - "summary": "List service accounts", - "security": [ - { - "BearerAuth": [] - } - ], - "operationId": "userManagement_listServiceAccounts", - "responses": { - "200": { - "description": "Service accounts", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "serviceAccounts": { - "type": "array", - "items": { - "$ref": "#/components/schemas/ServiceUser" - } - } - }, - "required": [ - "serviceAccounts" - ], - "additionalProperties": false - } - } - } - }, - "400": { - "$ref": "#/components/responses/Error400" - }, - "401": { - "$ref": "#/components/responses/Error401" - }, - "500": { - "$ref": "#/components/responses/Error500" - } - } - }, - "post": { - "tags": [ - "service-accounts" - ], - "summary": "Create service account", - "security": [ - { - "BearerAuth": [] - } - ], - "operationId": "userManagement_createServiceAccount", - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "label": { - "type": "string" - }, - "description": { - "type": "string" - } - }, - "additionalProperties": false, - "required": [ - "label", - "description" - ] - } - } - } - }, - "responses": { - "200": { - "description": "Created service account", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "serviceAccount": { - "$ref": "#/components/schemas/ServiceUser" - } - }, - "required": [ - "serviceAccount" - ] - } - } - } - }, - "400": { - "$ref": "#/components/responses/Error400" - }, - "401": { - "$ref": "#/components/responses/Error401" - }, - "500": { - "$ref": "#/components/responses/Error500" - } - } - } - }, - "/v1/user-management/service-accounts/{serviceAccountID}": { - "get": { - "tags": [ - "service-accounts" - ], - "summary": "Get service account", - "security": [ - { - "BearerAuth": [] - } - ], - "operationId": "userManagement_getServiceAccount", - "parameters": [ - { - "name": "serviceAccountID", - "in": "path", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "Service account", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "serviceAccount": { - "$ref": "#/components/schemas/ServiceUser" - } - }, - "required": [ - "serviceAccount" - ] - } - } - } - }, - "400": { - "$ref": "#/components/responses/Error400" - }, - "401": { - "$ref": "#/components/responses/Error401" - }, - "500": { - "$ref": "#/components/responses/Error500" - } - } - }, - "put": { - "tags": [ - "service-accounts" - ], - "summary": "Update service account", - "security": [ - { - "BearerAuth": [] - } - ], - "operationId": "userManagement_updateServiceAccount", - "parameters": [ - { - "name": "serviceAccountID", - "in": "path", - "required": true, - "schema": { - "type": "string" - } - } - ], - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "label": { - "type": "string" - }, - "description": { - "type": "string" - } - }, - "additionalProperties": false, - "required": [ - "label", - "description" - ] - } - } - } - }, - "responses": { - "200": { - "description": "Updated service account", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "serviceAccount": { - "$ref": "#/components/schemas/ServiceUser" - } - }, - "required": [ - "serviceAccount" - ] - } - } - } - }, - "400": { - "$ref": "#/components/responses/Error400" - }, - "401": { - "$ref": "#/components/responses/Error401" - }, - "500": { - "$ref": "#/components/responses/Error500" - } - } - }, - "delete": { - "tags": [ - "service-accounts" - ], - "summary": "Delete service account", - "operationId": "userManagement_deleteServiceAccount", - "security": [ - { - "BearerAuth": [] - } - ], - "parameters": [ - { - "name": "serviceAccountID", - "in": "path", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "Deleted service account", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "success": { - "type": "boolean" - } - }, - "required": [ - "success" - ], - "additionalProperties": false - } - } - } - }, - "400": { - "$ref": "#/components/responses/Error400" - }, - "401": { - "$ref": "#/components/responses/Error401" - }, - "500": { - "$ref": "#/components/responses/Error500" - } - } - } - }, - "/v1/user-management/service-accounts/{serviceAccountID}/api-keys": { - "get": { - "tags": [ - "service-accounts" - ], - "summary": "List service account API keys", - "security": [ - { - "BearerAuth": [] - } - ], - "operationId": "userManagement_listServiceAccountAPIKeys", - "parameters": [ - { - "name": "serviceAccountID", - "in": "path", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "API keys", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "apiKeys": { - "type": "array", - "items": { - "$ref": "#/components/schemas/ServiceUserAPIKey" - } - } - }, - "required": [ - "apiKeys" - ], - "additionalProperties": false - } - } - } - }, - "400": { - "$ref": "#/components/responses/Error400" - }, - "401": { - "$ref": "#/components/responses/Error401" - }, - "500": { - "$ref": "#/components/responses/Error500" - } - } - }, - "post": { - "tags": [ - "service-accounts" - ], - "summary": "Create service account API key", - "security": [ - { - "BearerAuth": [] - } - ], - "operationId": "userManagement_createServiceAccountAPIKey", - "parameters": [ - { - "name": "serviceAccountID", - "in": "path", - "required": true, - "schema": { - "type": "string" - } - } - ], - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "expiresAt": { - "type": "integer" - } - }, - "additionalProperties": false - } - } - } - }, - "responses": { - "200": { - "description": "Created API key", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "success": { - "type": "boolean" - } - }, - "required": [ - "success" - ] - } - } - } - }, - "400": { - "$ref": "#/components/responses/Error400" - }, - "401": { - "$ref": "#/components/responses/Error401" - }, - "500": { - "$ref": "#/components/responses/Error500" - } - } - } - }, - "/v1/user-management/service-accounts/{serviceAccountID}/api-keys/{apiKeyID}": { - "delete": { - "tags": [ - "service-accounts" - ], - "summary": "Delete service account API key", - "security": [ - { - "BearerAuth": [] - } - ], - "operationId": "userManagement_deleteServiceAccountAPIKey", - "parameters": [ - { - "name": "serviceAccountID", - "in": "path", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "apiKeyID", - "in": "path", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "Deleted API key", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "success": { - "type": "boolean" - } - }, - "required": [ - "success" - ] - } - } - } - }, - "400": { - "$ref": "#/components/responses/Error400" - }, - "401": { - "$ref": "#/components/responses/Error401" - }, - "500": { - "$ref": "#/components/responses/Error500" - } - } - } - }, - "/v1/user-management/service-accounts/{serviceAccountID}/permissions": { - "get": { - "tags": [ - "service-accounts" - ], - "summary": "List service account permissions", - "security": [ - { - "BearerAuth": [] - } - ], - "operationId": "userManagement_listServiceAccountPermissions", - "parameters": [ - { - "name": "serviceAccountID", - "in": "path", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "Permissions", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "permissions": { - "type": "array", - "items": { - "$ref": "#/components/schemas/Permission" - } - } - }, - "required": [ - "permissions" - ], - "additionalProperties": false - } - } - } - }, - "400": { - "$ref": "#/components/responses/Error400" - }, - "401": { - "$ref": "#/components/responses/Error401" - }, - "500": { - "$ref": "#/components/responses/Error500" - } - } - }, - "post": { - "tags": [ - "service-accounts" - ], - "summary": "Add permission to service account", - "security": [ - { - "BearerAuth": [] - } - ], - "operationId": "userManagement_addPermissionToServiceAccount", - "parameters": [ - { - "name": "serviceAccountID", - "in": "path", - "required": true, - "schema": { - "type": "string" - } - } - ], - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/Permission" - } - } - } - }, - "responses": { - "200": { - "description": "Added permission", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "permission": { - "$ref": "#/components/schemas/Permission" - } - }, - "required": [ - "permission" - ] - } - } - } - }, - "400": { - "$ref": "#/components/responses/Error400" - }, - "401": { - "$ref": "#/components/responses/Error401" - }, - "500": { - "$ref": "#/components/responses/Error500" - } - } - } - }, - "/v1/user-management/service-accounts/{serviceAccountID}/permissions/{permissionID}": { - "delete": { - "tags": [ - "service-accounts" - ], - "summary": "Delete service account permission", - "security": [ - { - "BearerAuth": [] - } - ], - "operationId": "userManagement_deleteServiceAccountPermission", - "parameters": [ - { - "name": "serviceAccountID", - "in": "path", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "permissionID", - "in": "path", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "Deleted", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/Message" - } - } - } - }, - "400": { - "$ref": "#/components/responses/Error400" - }, - "401": { - "$ref": "#/components/responses/Error401" - }, - "500": { - "$ref": "#/components/responses/Error500" - } - } - } - }, - "/v1/user-management/service-accounts/{serviceAccountID}/permissions/{permissionID}/limiter": { - "put": { - "tags": [ - "service-accounts" - ], - "summary": "Update service account permission limiter", - "operationId": "userManagement_updateServiceAccountPermissionLimiter", - "security": [ - { - "BearerAuth": [] - } - ], - "parameters": [ - { - "name": "serviceAccountID", - "in": "path", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "permissionID", - "in": "path", - "required": true, - "schema": { - "type": "string" - } - } - ], - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/Permission" - } - } - } - }, - "responses": { - "200": { - "description": "Updated permission limiter", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/Message" - } - } - } - }, - "400": { - "$ref": "#/components/responses/Error400" - }, - "401": { - "$ref": "#/components/responses/Error401" - }, - "500": { - "$ref": "#/components/responses/Error500" - } - } - } - } - } -} diff --git a/public/openapi/participant-api.json b/public/openapi/participant-api.json deleted file mode 100644 index af4c7dd..0000000 --- a/public/openapi/participant-api.json +++ /dev/null @@ -1,4054 +0,0 @@ -{ - "openapi": "3.1.0", - "info": { - "title": "Participant API", - "version": "1.0.0", - "description": "Endpoints for participant authentication, user management, and study interactions." - }, - "paths": { - "/": { - "get": { - "summary": "Health check", - "operationId": "getHealth", - "tags": [ - "misc" - ], - "responses": { - "200": { - "description": "Service is healthy", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HealthStatus" - }, - "examples": { - "ok": { - "value": { - "status": "ok" - } - } - } - } - } - } - } - } - }, - "/v1/auth/login": { - "post": { - "tags": [ - "auth" - ], - "summary": "Login with email and password", - "operationId": "loginWithEmail", - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "email": { - "type": "string", - "format": "email" - }, - "password": { - "type": "string" - }, - "instanceId": { - "type": "string" - } - }, - "required": [ - "email", - "password", - "instanceId" - ], - "additionalProperties": false - } - } - } - }, - "responses": { - "200": { - "description": "Access and refresh tokens with user", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "token": { - "$ref": "#/components/schemas/TokenEnvelope" - }, - "user": { - "$ref": "#/components/schemas/User" - } - }, - "required": [ - "token", - "user" - ] - } - } - } - }, - "400": { - "$ref": "#/components/responses/Error400" - }, - "401": { - "$ref": "#/components/responses/Error401" - }, - "500": { - "$ref": "#/components/responses/Error500" - } - } - } - }, - "/v1/auth/signup": { - "post": { - "tags": [ - "auth" - ], - "summary": "Sign up with email", - "operationId": "signupWithEmail", - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "email": { - "type": "string", - "format": "email" - }, - "password": { - "type": "string" - }, - "instanceId": { - "type": "string" - }, - "infoCheck": { - "type": "string" - }, - "preferredLanguage": { - "type": "string" - }, - "withAttributes": { - "type": "object", - "properties": { - "type": { - "type": "string" - }, - "attributes": { - "type": "object", - "additionalProperties": true - } - } - } - }, - "required": [ - "email", - "password", - "instanceId" - ], - "additionalProperties": false - } - } - } - }, - "responses": { - "200": { - "description": "Access and refresh tokens with user", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "token": { - "$ref": "#/components/schemas/TokenEnvelope" - }, - "user": { - "$ref": "#/components/schemas/User" - } - }, - "required": [ - "token", - "user" - ] - } - } - } - }, - "400": { - "$ref": "#/components/responses/Error400" - }, - "401": { - "$ref": "#/components/responses/Error401" - }, - "429": { - "$ref": "#/components/responses/Error429" - }, - "500": { - "$ref": "#/components/responses/Error500" - } - } - } - }, - "/v1/auth/login-with-temptoken": { - "post": { - "tags": [ - "auth" - ], - "summary": "Login using a temporary token (optionally with password or access token)", - "operationId": "loginWithTempToken", - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "tempToken": { - "type": "string" - }, - "accessToken": { - "type": "string" - }, - "password": { - "type": "string" - } - }, - "required": [ - "tempToken" - ], - "additionalProperties": false, - "description": "Provide either accessToken or password along with tempToken." - } - } - } - }, - "responses": { - "200": { - "description": "Access and refresh tokens with user", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "token": { - "$ref": "#/components/schemas/TokenEnvelopeWithLastOTP" - }, - "user": { - "$ref": "#/components/schemas/User" - } - }, - "required": [ - "token", - "user" - ] - } - } - } - }, - "400": { - "$ref": "#/components/responses/Error400" - }, - "401": { - "$ref": "#/components/responses/Error401" - }, - "500": { - "$ref": "#/components/responses/Error500" - } - } - } - }, - "/v1/auth/temptoken-info": { - "post": { - "tags": [ - "auth" - ], - "summary": "Get info for a temporary token", - "operationId": "getTempTokenInfo", - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "instanceId": { - "type": "string" - }, - "tempToken": { - "type": "string" - } - }, - "required": [ - "instanceId", - "tempToken" - ], - "additionalProperties": false - } - } - } - }, - "responses": { - "200": { - "description": "Info returned", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "userID": { - "type": "string" - }, - "email": { - "type": "string", - "format": "email" - } - }, - "required": [ - "userID", - "email" - ], - "additionalProperties": false - } - } - } - }, - "400": { - "$ref": "#/components/responses/Error400" - }, - "500": { - "$ref": "#/components/responses/Error500" - } - } - } - }, - "/v1/auth/token/renew": { - "post": { - "tags": [ - "auth" - ], - "summary": "Renew access token", - "security": [ - { - "BearerAuth": [] - } - ], - "operationId": "renewToken", - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "refreshToken": { - "type": "string" - } - }, - "required": [ - "refreshToken" - ], - "additionalProperties": false - } - } - } - }, - "responses": { - "200": { - "description": "Access and refresh tokens with user", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "token": { - "$ref": "#/components/schemas/TokenEnvelopeWithLastOTP" - }, - "user": { - "$ref": "#/components/schemas/User" - } - }, - "required": [ - "token", - "user" - ] - } - } - } - }, - "400": { - "$ref": "#/components/responses/Error400" - }, - "401": { - "$ref": "#/components/responses/Error401" - }, - "500": { - "$ref": "#/components/responses/Error500" - } - } - } - }, - "/v1/auth/token/validate": { - "get": { - "tags": [ - "auth" - ], - "summary": "Validate access token", - "security": [ - { - "BearerAuth": [] - } - ], - "operationId": "validateToken", - "responses": { - "200": { - "description": "Token valid", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "tokenInfos": { - "type": "object", - "description": "Decoded participant user JWT claims", - "additionalProperties": true - } - }, - "required": [ - "tokenInfos" - ] - } - } - } - }, - "400": { - "$ref": "#/components/responses/Error400" - }, - "401": { - "$ref": "#/components/responses/Error401" - } - } - } - }, - "/v1/auth/token/revoke": { - "get": { - "tags": [ - "auth" - ], - "summary": "Revoke refresh tokens for user", - "security": [ - { - "BearerAuth": [] - } - ], - "operationId": "revokeTokens", - "responses": { - "200": { - "description": "Revoked", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/Message" - } - } - } - }, - "400": { - "$ref": "#/components/responses/Error400" - }, - "401": { - "$ref": "#/components/responses/Error401" - }, - "500": { - "$ref": "#/components/responses/Error500" - } - } - } - }, - "/v1/auth/resend-email-verification": { - "post": { - "tags": [ - "auth" - ], - "summary": "Resend email verification", - "security": [ - { - "BearerAuth": [] - } - ], - "operationId": "resendEmailVerification", - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "email": { - "type": "string", - "format": "email" - } - }, - "required": [ - "email" - ] - } - } - } - }, - "responses": { - "200": { - "$ref": "#/components/responses/MessageOk" - }, - "400": { - "$ref": "#/components/responses/Error400" - }, - "401": { - "$ref": "#/components/responses/Error401" - }, - "429": { - "$ref": "#/components/responses/Error429" - }, - "500": { - "$ref": "#/components/responses/Error500" - } - } - } - }, - "/v1/auth/verify-email": { - "post": { - "tags": [ - "auth" - ], - "summary": "Verify email by token", - "operationId": "verifyEmail", - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "token": { - "type": "string" - } - }, - "required": [ - "token" - ] - } - } - } - }, - "responses": { - "200": { - "description": "User returned", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "user": { - "$ref": "#/components/schemas/User" - } - }, - "required": [ - "user" - ] - } - } - } - }, - "400": { - "$ref": "#/components/responses/Error400" - }, - "500": { - "$ref": "#/components/responses/Error500" - } - } - } - }, - "/v1/auth/logout": { - "post": { - "tags": [ - "auth" - ], - "summary": "Logout user (invalidate current session)", - "security": [ - { - "BearerAuth": [] - } - ], - "operationId": "logout", - "responses": { - "200": { - "description": "User logged out", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "message": { - "type": "string" - }, - "tokensRevoked": { - "type": "integer" - } - }, - "required": [ - "message", - "tokensRevoked" - ], - "additionalProperties": false - } - } - } - }, - "400": { - "$ref": "#/components/responses/Error400" - }, - "401": { - "$ref": "#/components/responses/Error401" - }, - "500": { - "$ref": "#/components/responses/Error500" - } - } - } - }, - "/v1/auth/otp": { - "get": { - "tags": [ - "auth" - ], - "summary": "Request OTP (email by default)", - "security": [ - { - "BearerAuth": [] - } - ], - "operationId": "requestOTP", - "parameters": [ - { - "name": "type", - "in": "query", - "schema": { - "type": "string", - "enum": [ - "email", - "sms" - ], - "default": "email" - } - } - ], - "responses": { - "200": { - "$ref": "#/components/responses/MessageOk" - }, - "400": { - "$ref": "#/components/responses/Error400" - }, - "401": { - "$ref": "#/components/responses/Error401" - }, - "500": { - "$ref": "#/components/responses/Error500" - } - } - } - }, - "/v1/auth/otp/verify": { - "post": { - "tags": [ - "auth" - ], - "summary": "Verify OTP code", - "security": [ - { - "BearerAuth": [] - } - ], - "operationId": "verifyOTP", - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "code": { - "type": "string" - } - }, - "required": [ - "code" - ], - "additionalProperties": false - } - } - } - }, - "responses": { - "200": { - "description": "Access and refresh tokens with user", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "token": { - "$ref": "#/components/schemas/TokenEnvelopeWithLastOTP" - }, - "user": { - "$ref": "#/components/schemas/User" - } - }, - "required": [ - "token", - "user" - ] - } - } - } - }, - "400": { - "$ref": "#/components/responses/Error400" - }, - "401": { - "$ref": "#/components/responses/Error401" - }, - "500": { - "$ref": "#/components/responses/Error500" - } - } - } - }, - "/v1/password-reset/initiate": { - "post": { - "tags": ["password"], - "summary": "Initiate password reset", - "operationId": "initiatePasswordReset", - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "email": { - "type": "string", - "format": "email" - }, - "instanceID": { - "type": "string" - } - }, - "required": [ - "email", - "instanceID" - ], - "additionalProperties": false - } - } - } - }, - "responses": { - "200": { - "$ref": "#/components/responses/MessageOk" - }, - "400": { - "$ref": "#/components/responses/Error400" - }, - "401": { - "$ref": "#/components/responses/Error401" - }, - "429": { - "$ref": "#/components/responses/Error429" - }, - "500": { - "$ref": "#/components/responses/Error500" - } - } - } - }, - "/v1/password-reset/get-infos": { - "post": { - "tags": ["password"], - "summary": "Get info for a password reset token", - "operationId": "getPasswordResetInfos", - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "token": { - "type": "string" - } - }, - "required": [ - "token" - ] - } - } - } - }, - "responses": { - "200": { - "description": "Account ID returned", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "accountId": { - "type": "string" - } - }, - "required": [ - "accountId" - ] - } - } - } - }, - "400": { - "$ref": "#/components/responses/Error400" - }, - "500": { - "$ref": "#/components/responses/Error500" - } - } - } - }, - "/v1/password-reset/reset": { - "post": { - "tags": ["password"], - "summary": "Reset password", - "operationId": "resetPassword", - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "token": { - "type": "string" - }, - "newPassword": { - "type": "string" - } - }, - "required": [ - "token", - "newPassword" - ], - "additionalProperties": false - } - } - } - }, - "responses": { - "200": { - "$ref": "#/components/responses/MessageOk" - }, - "400": { - "$ref": "#/components/responses/Error400" - }, - "500": { - "$ref": "#/components/responses/Error500" - } - } - } - }, - "/v1/study-service/studies/": { - "get": { - "tags": ["studies"], - "summary": "List studies by status", - "operationId": "getStudiesByStatus", - "parameters": [ - { - "name": "instanceID", - "in": "query", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "status", - "in": "query", - "required": false, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "OK", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "studies": { - "type": "array", - "items": { - "type": "object", - "properties": { - "key": { - "type": "string" - }, - "status": { - "type": "string" - }, - "props": { - "type": "object", - "additionalProperties": true - }, - "stats": { - "type": "object", - "additionalProperties": true - } - }, - "required": [ - "key", - "status", - "props", - "stats" - ] - } - } - }, - "required": [ - "studies" - ] - } - } - } - }, - "401": { - "$ref": "#/components/responses/Error401" - }, - "500": { - "$ref": "#/components/responses/Error500" - } - } - } - }, - "/v1/study-service/studies/{studyKey}": { - "get": { - "tags": ["studies"], - "summary": "Get study by key", - "operationId": "getStudy", - "parameters": [ - { - "name": "studyKey", - "in": "path", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "instanceID", - "in": "query", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "OK", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "study": { - "type": "object", - "properties": { - "key": { - "type": "string" - }, - "status": { - "type": "string" - }, - "props": { - "type": "object", - "additionalProperties": true - }, - "stats": { - "type": "object", - "additionalProperties": true - } - }, - "required": [ - "key", - "status", - "props", - "stats" - ] - } - } - } - } - } - }, - "401": { - "$ref": "#/components/responses/Error401" - }, - "400": { - "$ref": "#/components/responses/Error400" - }, - "500": { - "$ref": "#/components/responses/Error500" - } - } - } - }, - "/v1/study-service/studies/{studyKey}/code-lists/has-code": { - "get": { - "tags": ["studies"], - "summary": "Check if a code exists in a code list", - "operationId": "studyHasCodeListCode", - "parameters": [ - { - "name": "studyKey", - "in": "path", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "instanceID", - "in": "query", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "listKey", - "in": "query", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "code", - "in": "query", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "OK", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "exists": { - "type": "boolean" - } - }, - "required": [ - "exists" - ] - } - } - } - }, - "400": { - "$ref": "#/components/responses/Error400" - }, - "401": { - "$ref": "#/components/responses/Error401" - }, - "500": { - "$ref": "#/components/responses/Error500" - } - } - } - }, - "/v1/study-service/studies/{studyKey}/code-lists/available-count": { - "get": { - "tags": ["studies"], - "summary": "Count available codes in a code list", - "operationId": "getStudyCodeListAvailableCount", - "parameters": [ - { - "name": "studyKey", - "in": "path", - "required": true, - "schema": { "type": "string" } - }, - { - "name": "listKey", - "in": "query", - "required": true, - "schema": { "type": "string" } - }, - { - "name": "instanceID", - "in": "query", - "required": true, - "schema": { "type": "string" } - } - ], - "responses": { - "200": { - "description": "OK", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "availableCount": { - "type": "integer" - } - }, - "required": [ - "availableCount" - ] - } - } - } - }, - "400": { - "$ref": "#/components/responses/Error400" - }, - "401": { - "$ref": "#/components/responses/Error401" - }, - "500": { - "$ref": "#/components/responses/Error500" - } - } - } - }, - "/v1/study-service/studies/{studyKey}/variables": { - "get": { - "tags": ["studies"], - "summary": "List variables for a study", - "operationId": "getStudyVariables", - "parameters": [ - { - "name": "studyKey", - "in": "path", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "instanceID", - "in": "query", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "OK", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "variables": { - "type": "array", - "items": { - "$ref": "#/components/schemas/StudyVariables" - } - } - }, - "required": [ - "variables" - ] - } - } - } - }, - "400": { - "$ref": "#/components/responses/Error400" - }, - "401": { - "$ref": "#/components/responses/Error401" - }, - "500": { - "$ref": "#/components/responses/Error500" - } - } - } - }, - "/v1/study-service/studies/{studyKey}/variables/{variableKey}": { - "get": { - "tags": ["studies"], - "summary": "Get a study variable", - "operationId": "getStudyVariable", - "parameters": [ - { - "name": "studyKey", - "in": "path", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "variableKey", - "in": "path", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "instanceID", - "in": "query", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "OK", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "variable": { - "$ref": "#/components/schemas/StudyVariables" - } - }, - "required": [ - "variable" - ] - } - } - } - }, - "400": { - "$ref": "#/components/responses/Error400" - }, - "401": { - "$ref": "#/components/responses/Error401" - }, - "500": { - "$ref": "#/components/responses/Error500" - } - } - } - }, - "/v1/study-service/studies/participating": { - "get": { - "tags": ["studies"], - "summary": "List studies the user participates in", - "security": [ - { - "BearerAuth": [] - } - ], - "operationId": "getParticipatingStudies", - "responses": { - "200": { - "description": "OK", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "studies": { - "type": "array", - "items": { - "$ref": "#/components/schemas/StudyInfo" - } - } - }, - "required": [ - "studies" - ] - } - } - } - }, - "400": { - "$ref": "#/components/responses/Error400" - }, - "401": { - "$ref": "#/components/responses/Error401" - }, - "500": { - "$ref": "#/components/responses/Error500" - } - } - } - }, - "/v1/study-service/events/{studyKey}/enter": { - "post": { - "tags": ["events"], - "summary": "Enter a study", - "security": [ - { - "BearerAuth": [] - } - ], - "operationId": "enterStudy", - "parameters": [ - { - "name": "studyKey", - "in": "path", - "required": true, - "schema": { - "type": "string" - } - } - ], - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "profileID": { - "type": "string" - } - }, - "required": [ - "profileID" - ] - } - } - } - }, - "responses": { - "200": { - "description": "Assigned surveys returned", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "assignedSurveys": { - "type": "array", - "items": { - "$ref": "#/components/schemas/AssignedSurvey" - } - } - }, - "required": [ - "assignedSurveys" - ] - } - } - } - }, - "400": { - "$ref": "#/components/responses/Error400" - }, - "401": { - "$ref": "#/components/responses/Error401" - }, - "500": { - "$ref": "#/components/responses/Error500" - } - } - } - }, - "/v1/study-service/events/{studyKey}/custom": { - "post": { - "tags": ["events"], - "summary": "Trigger a custom study event", - "security": [ - { - "BearerAuth": [] - } - ], - "operationId": "customStudyEvent", - "parameters": [ - { - "name": "studyKey", - "in": "path", - "required": true, - "schema": { - "type": "string" - } - } - ], - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "eventKey": { - "type": "string" - }, - "profileID": { - "type": "string" - }, - "payload": { - "type": "object", - "additionalProperties": true - } - }, - "required": [ - "eventKey", - "profileID" - ] - } - } - } - }, - "responses": { - "200": { - "description": "Assigned surveys returned", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "assignedSurveys": { - "type": "array", - "items": { - "$ref": "#/components/schemas/AssignedSurvey" - } - } - }, - "required": [ - "assignedSurveys" - ] - } - } - } - }, - "400": { - "$ref": "#/components/responses/Error400" - }, - "401": { - "$ref": "#/components/responses/Error401" - }, - "500": { - "$ref": "#/components/responses/Error500" - } - } - } - }, - "/v1/study-service/events/{studyKey}/submit": { - "post": { - "tags": ["events"], - "summary": "Submit survey response", - "security": [ - { - "BearerAuth": [] - } - ], - "operationId": "submitSurveyEvent", - "parameters": [ - { - "name": "studyKey", - "in": "path", - "required": true, - "schema": { - "type": "string" - } - } - ], - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "profileID": { - "type": "string" - }, - "response": { - "type": "object", - "description": "SurveyResponse", - "additionalProperties": true - } - }, - "required": [ - "profileID", - "response" - ] - } - } - } - }, - "responses": { - "200": { - "description": "Assigned surveys returned", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "assignedSurveys": { - "type": "array", - "items": { - "$ref": "#/components/schemas/AssignedSurvey" - } - } - }, - "required": [ - "assignedSurveys" - ] - } - } - } - }, - "400": { - "$ref": "#/components/responses/Error400" - }, - "401": { - "$ref": "#/components/responses/Error401" - }, - "500": { - "$ref": "#/components/responses/Error500" - } - } - } - }, - "/v1/study-service/events/{studyKey}/leave": { - "post": { - "tags": ["events"], - "summary": "Leave a study", - "security": [ - { - "BearerAuth": [] - } - ], - "operationId": "leaveStudyEvent", - "parameters": [ - { - "name": "studyKey", - "in": "path", - "required": true, - "schema": { - "type": "string" - } - } - ], - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "profileID": { - "type": "string" - } - }, - "required": [ - "profileID" - ] - } - } - } - }, - "responses": { - "200": { - "description": "Assigned surveys returned", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "assignedSurveys": { - "type": "array", - "items": { - "$ref": "#/components/schemas/AssignedSurvey" - } - } - }, - "required": [ - "assignedSurveys" - ] - } - } - } - }, - "400": { - "$ref": "#/components/responses/Error400" - }, - "401": { - "$ref": "#/components/responses/Error401" - }, - "500": { - "$ref": "#/components/responses/Error500" - } - } - } - }, - "/v1/study-service/events/{studyKey}/merge-temporary-participant": { - "post": { - "tags": ["events"], - "summary": "Merge temporary participant into user profile", - "security": [ - { - "BearerAuth": [] - } - ], - "operationId": "mergeTempParticipant", - "parameters": [ - { - "name": "studyKey", - "in": "path", - "required": true, - "schema": { - "type": "string" - } - } - ], - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "profileID": { - "type": "string" - }, - "temporaryParticipantID": { - "type": "string" - } - }, - "required": [ - "profileID", - "temporaryParticipantID" - ] - } - } - } - }, - "responses": { - "200": { - "description": "Assigned surveys of participant returned", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "assignedSurveys": { - "type": "array", - "items": { - "$ref": "#/components/schemas/AssignedSurvey" - } - } - }, - "required": [ - "assignedSurveys" - ] - } - } - } - }, - "400": { - "$ref": "#/components/responses/Error400" - }, - "401": { - "$ref": "#/components/responses/Error401" - }, - "500": { - "$ref": "#/components/responses/Error500" - } - } - } - }, - "/v1/study-service/events/{studyKey}/merge-virtual-participant": { - "post": { - "tags": ["events"], - "summary": "Merge a virtual participant into user profile by linking code", - "security": [ - { - "BearerAuth": [] - } - ], - "operationId": "mergeVirtualParticipant", - "parameters": [ - { - "name": "studyKey", - "in": "path", - "required": true, - "schema": { - "type": "string" - } - } - ], - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "profileID": { - "type": "string" - }, - "virtualParticipantID": { - "type": "string" - }, - "linkingCodeKey": { - "type": "string" - }, - "linkingCodeValue": { - "type": "string" - } - }, - "required": [ - "profileID", - "virtualParticipantID", - "linkingCodeKey", - "linkingCodeValue" - ], - "additionalProperties": false - } - } - } - }, - "responses": { - "200": { - "description": "Assigned surveys of merged participant returned", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "assignedSurveys": { - "type": "array", - "items": { - "$ref": "#/components/schemas/AssignedSurvey" - } - } - }, - "required": [ - "assignedSurveys" - ] - } - } - } - }, - "400": { - "$ref": "#/components/responses/Error400" - }, - "401": { - "$ref": "#/components/responses/Error401" - }, - "500": { - "$ref": "#/components/responses/Error500" - } - } - } - }, - "/v1/study-service/participant-data/{studyKey}/surveys": { - "get": { - "tags": ["participant-data"], - "summary": "Get assigned surveys for profiles", - "security": [ - { - "BearerAuth": [] - } - ], - "operationId": "getAssignedSurveys", - "parameters": [ - { - "name": "studyKey", - "in": "path", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "pids", - "in": "query", - "required": true, - "description": "Comma-separated profile IDs", - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "Assigned surveys with survey infos returned", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/AssignedSurveysWithInfos" - } - } - } - }, - "400": { - "$ref": "#/components/responses/Error400" - }, - "401": { - "$ref": "#/components/responses/Error401" - }, - "500": { - "$ref": "#/components/responses/Error500" - } - } - } - }, - "/v1/study-service/participant-data/{studyKey}/survey/{surveyKey}": { - "get": { - "tags": ["participant-data"], - "summary": "Get a specific survey with context", - "security": [ - { - "BearerAuth": [] - } - ], - "operationId": "getSurveyWithContext", - "parameters": [ - { - "name": "studyKey", - "in": "path", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "surveyKey", - "in": "path", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "pid", - "in": "query", - "required": true, - "description": "Profile ID", - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "Survey with context returned", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "surveyWithContext": { - "$ref": "#/components/schemas/AssignedSurveyWithContext" - } - }, - "required": [ - "surveyWithContext" - ] - } - } - } - }, - "400": { - "$ref": "#/components/responses/Error400" - }, - "401": { - "$ref": "#/components/responses/Error401" - }, - "500": { - "$ref": "#/components/responses/Error500" - } - } - } - }, - "/v1/study-service/participant-data/{studyKey}/participant-state": { - "get": { - "tags": ["participant-data"], - "summary": "Get participant state", - "security": [ - { - "BearerAuth": [] - } - ], - "operationId": "getParticipantState", - "parameters": [ - { - "name": "studyKey", - "in": "path", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "pid", - "in": "query", - "required": true, - "description": "Profile ID", - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "Participant state returned", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "participant": { - "$ref": "#/components/schemas/Participant" - } - }, - "required": [ - "participant" - ] - } - } - } - }, - "400": { - "$ref": "#/components/responses/Error400" - }, - "401": { - "$ref": "#/components/responses/Error401" - }, - "500": { - "$ref": "#/components/responses/Error500" - } - } - } - }, - "/v1/study-service/participant-data/{studyKey}/linking-code": { - "get": { - "tags": ["participant-data"], - "summary": "Get a linking code by key", - "security": [ - { - "BearerAuth": [] - } - ], - "operationId": "getLinkingCode", - "parameters": [ - { - "name": "studyKey", - "in": "path", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "pid", - "in": "query", - "required": true, - "description": "Profile ID", - "schema": { - "type": "string" - } - }, - { - "name": "key", - "in": "query", - "required": true, - "description": "Key for linking code", - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "Linking code returned", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "linkingCode": { - "type": "string" - } - }, - "required": [ - "linkingCode" - ] - } - } - } - }, - "400": { - "$ref": "#/components/responses/Error400" - }, - "401": { - "$ref": "#/components/responses/Error401" - }, - "500": { - "$ref": "#/components/responses/Error500" - } - } - } - }, - "/v1/study-service/participant-data/{studyKey}/responses": { - "get": { - "tags": ["participant-data"], - "summary": "Get survey responses for a profile", - "security": [ - { - "BearerAuth": [] - } - ], - "operationId": "getStudyResponsesForProfile", - "parameters": [ - { - "name": "studyKey", - "in": "path", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "pid", - "in": "query", - "required": false, - "description": "Profile ID", - "schema": { - "type": "string" - } - }, - { - "name": "surveyKey", - "in": "query", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "page", - "in": "query", - "description": "page number (starting from 1)", - "schema": { - "type": "integer", - "minimum": 1, - "default": 1 - } - }, - { - "name": "limit", - "in": "query", - "description": "maximum number of responses per page", - "schema": { - "type": "integer", - "minimum": 1, - "default": 10 - } - }, - { - "name": "filter", - "in": "query", - "description": "bson.M object to filter responses", - "schema": { - "type": "object", - "additionalProperties": { - "type": "object" - } - } - }, - { - "name": "sort", - "in": "query", - "description": "bson.M object to sort responses", - "schema": { - "type": "object", - "additionalProperties": { - "type": "object" - } - } - }, - { - "name": "shortKeys", - "in": "query", - "description": "whether to return short keys for responses", - "schema": { - "type": "boolean", - "default": false - } - }, - { - "name": "questionOptionSep", - "in": "query", - "description": "character used to seperate slot keys in response", - "schema": { - "type": "string", - "default": "-" - } - }, - { - "name": "format", - "in": "query", - "description": "format for survey responses", - "schema": { - "type": "string", - "default": "wide", - "enum": ["wide", "long", "json"] - } - }, - { - "name": "extraContextColumns", - "in": "query", - "description": "comma-separated list of extra context columns to include in the response", - "schema": { - "type": "string" - } - } - - ], - "responses": { - "200": { - "description": "Responses returned", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "responses": { - "type": "array", - "items": { - "type": "object", - "description": "Responses", - "additionalProperties": { - "type": "object" - } - } - }, - "pagination": { - "$ref": "#/components/schemas/PaginationInfos" - } - }, - "required": [ - "responses", - "pagination" - ] - } - } - } - }, - "400": { - "$ref": "#/components/responses/Error400" - }, - "401": { - "$ref": "#/components/responses/Error401" - }, - "500": { - "$ref": "#/components/responses/Error500" - } - } - } - }, - "/v1/study-service/participant-data/{studyKey}/confidential-response": { - "get": { - "tags": ["participant-data"], - "summary": "Get confidential responses by key", - "security": [ - { - "BearerAuth": [] - } - ], - "operationId": "getConfidentialResponse", - "parameters": [ - { - "name": "studyKey", - "in": "path", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "pid", - "in": "query", - "required": true, - "description": "Profile ID", - "schema": { - "type": "string" - } - }, - { - "name": "key", - "in": "query", - "required": true, - "description": "Key for confidential responses", - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "Confidential responses returned", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "confidentialResponse": { - "type": "array", - "items": { - "type": "object", - "description": "Confidential survey response export entry", - "additionalProperties": true - } - } - }, - "required": [ - "confidentialResponse" - ] - } - } - } - }, - "400": { - "$ref": "#/components/responses/Error400" - }, - "401": { - "$ref": "#/components/responses/Error401" - }, - "500": { - "$ref": "#/components/responses/Error500" - } - } - } - }, - "/v1/study-service/participant-data/{studyKey}/submission-history": { - "get": { - "tags": ["participant-data"], - "summary": "Get submission history for profiles", - "security": [ - { - "BearerAuth": [] - } - ], - "operationId": "getSubmissionHistory", - "parameters": [ - { - "name": "studyKey", - "in": "path", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "pids", - "in": "query", - "required": true, - "description": "Comma-separated profile IDs", - "schema": { - "type": "string" - } - }, - { - "name": "limit", - "in": "query", - "required": false, - "description": "Maximum number of submissions per page", - "schema": { - "type": "integer", - "default": 100, - "minimum": 1 - } - } - ], - "responses": { - "200": { - "description": "Submission history returned", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "submissionHistory": { - "$ref": "#/components/schemas/SubmissionHistory" - } - }, - "required": [ - "submissionHistory" - ] - } - } - } - }, - "400": { - "$ref": "#/components/responses/Error400" - }, - "401": { - "$ref": "#/components/responses/Error401" - }, - "500": { - "$ref": "#/components/responses/Error500" - } - } - } - }, - "/v1/study-service/participant-data/{studyKey}/reports": { - "get": { - "tags": ["participant-data"], - "summary": "Get reports for a profile", - "security": [ - { - "BearerAuth": [] - } - ], - "operationId": "getReports", - "parameters": [ - { - "name": "studyKey", - "in": "path", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "pid", - "in": "query", - "required": true, - "description": "Profile ID", - "schema": { - "type": "string" - } - }, - { - "name": "page", - "in": "query", - "description": "page number (starting from 1)", - "schema": { - "type": "integer", - "minimum": 1, - "default": 1 - } - }, - { - "name": "limit", - "in": "query", - "description": "maximum number of reports per page", - "schema": { - "type": "integer", - "minimum": 1, - "default": 10 - } - }, - { - "name": "filter", - "in": "query", - "description": "bson.M object to filter reports", - "schema": { - "type": "object", - "additionalProperties": { - "type": "object" - } - } - } - ], - "responses": { - "200": { - "description": "Reports returned", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "reports": { - "type": "array", - "items": { - "$ref": "#/components/schemas/Report" - } - }, - "pagination": { - "$ref": "#/components/schemas/PaginationInfos" - } - }, - "required": [ - "reports", - "pagination" - ] - } - } - } - }, - "400": { - "$ref": "#/components/responses/Error400" - }, - "401": { - "$ref": "#/components/responses/Error401" - }, - "500": { - "$ref": "#/components/responses/Error500" - } - } - } - }, - "/v1/study-service/temp-participant/register": { - "post": { - "tags": ["events"], - "summary": "Register a temporary participant", - "operationId": "registerTempParticipant", - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "instanceId": { - "type": "string" - }, - "studyKey": { - "type": "string" - } - }, - "required": [ - "instanceId", - "studyKey" - ] - } - } - } - }, - "responses": { - "200": { - "description": "Temporary participant returned", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "participant": { - "$ref": "#/components/schemas/Participant" - } - }, - "required": [ - "participant" - ] - } - } - } - }, - "400": { - "$ref": "#/components/responses/Error400" - }, - "401": { - "$ref": "#/components/responses/Error401" - }, - "500": { - "$ref": "#/components/responses/Error500" - } - } - } - }, - "/v1/study-service/temp-participant/surveys": { - "get": { - "tags": ["participant-data"], - "summary": "Get assigned surveys for a temporary participant", - "operationId": "getTempParticipantSurveys", - "parameters": [ - { - "name": "instanceID", - "in": "query", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "studyKey", - "in": "query", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "pid", - "in": "query", - "required": true, - "description": "Profile ID", - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "Assigned surveys with survey infos returned", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/AssignedSurveysWithInfos" - } - } - } - }, - "400": { - "$ref": "#/components/responses/Error400" - }, - "401": { - "$ref": "#/components/responses/Error401" - }, - "500": { - "$ref": "#/components/responses/Error500" - } - } - } - }, - "/v1/study-service/temp-participant/survey": { - "get": { - "tags": ["participant-data"], - "summary": "Get a survey with context for a temporary participant", - "operationId": "getTempParticipantSurveyWithContext", - "parameters": [ - { - "name": "instanceID", - "in": "query", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "studyKey", - "in": "query", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "surveyKey", - "in": "query", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "pid", - "in": "query", - "required": false, - "description": "Profile ID", - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "Survey with context returned", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "surveyWithContext": { - "$ref": "#/components/schemas/AssignedSurveyWithContext" - } - }, - "required": [ - "surveyWithContext" - ] - } - } - } - }, - "400": { - "$ref": "#/components/responses/Error400" - }, - "401": { - "$ref": "#/components/responses/Error401" - }, - "500": { - "$ref": "#/components/responses/Error500" - } - } - } - }, - "/v1/study-service/temp-participant/submit-response": { - "post": { - "tags": ["events"], - "summary": "Submit a survey response for a temporary participant", - "operationId": "submitTempParticipantResponse", - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "instanceId": { - "type": "string" - }, - "studyKey": { - "type": "string" - }, - "pid": { - "type": "string" - }, - "response": { - "type": "object", - "additionalProperties": true - } - }, - "required": [ - "instanceId", - "studyKey", - "pid", - "response" - ] - } - } - } - }, - "responses": { - "200": { - "description": "Assigned surveys returned", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "assignedSurveys": { - "type": "array", - "items": { - "$ref": "#/components/schemas/AssignedSurvey" - } - } - }, - "required": [ - "assignedSurveys" - ] - } - } - } - }, - "400": { - "$ref": "#/components/responses/Error400" - }, - "401": { - "$ref": "#/components/responses/Error401" - }, - "500": { - "$ref": "#/components/responses/Error500" - } - } - } - }, - "/v1/study-service/virtual-participants/{studyKey}/": { - "get": { - "tags": ["participant-data"], - "summary": "Get virtual participants by linking code", - "security": [ - { - "BearerAuth": [] - } - ], - "operationId": "getVirtualParticipantsByLinkingCode", - "parameters": [ - { - "name": "studyKey", - "in": "path", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "key", - "in": "query", - "required": true, - "description": "Linking code key", - "schema": { - "type": "string" - } - }, - { - "name": "value", - "in": "query", - "required": true, - "description": "Linking code value", - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "Participants returned", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "participants": { - "type": "array", - "items": { - "$ref": "#/components/schemas/Participant" - } - } - }, - "required": [ - "participants" - ] - } - } - } - }, - "400": { - "$ref": "#/components/responses/Error400" - }, - "401": { - "$ref": "#/components/responses/Error401" - }, - "500": { - "$ref": "#/components/responses/Error500" - } - } - } - }, - "/v1/study-service/participant-data/{studyKey}/files": { - "post": { - "tags": ["participant-data"], - "summary": "Upload participant file", - "security": [ { "BearerAuth": [] } ], - "operationId": "uploadParticipantFile", - "parameters": [ - { - "name": "studyKey", - "in": "path", - "required": true, - "schema": { "type": "string" } - } - ], - "requestBody": { - "required": true, - "content": { - "multipart/form-data": { - "schema": { - "type": "object", - "properties": { - "profileID": { - "type": "string", - "description": "ID of the profile" - }, - "file": { - "type": "string", - "format": "binary", - "description": "File to upload. Only 'image/jpeg' and 'image/png' are allowed." - } - }, - "required": ["profileID", "file"] - } - } - } - }, - "responses": { - "200": { - "description": "File uploaded", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "id": { "type": "string", "description": "object ID of the uploaded file" }, - "path": { "type": "string" }, - "status": { "type": "string", "const": "ready" } - }, - "required": ["id", "path", "status"], - "additionalProperties": false - } - } - } - }, - "400": { "$ref": "#/components/responses/Error400" }, - "401": { "$ref": "#/components/responses/Error401" }, - "403": { "$ref": "#/components/responses/Error403" }, - "500": { "$ref": "#/components/responses/Error500" } - } - }, - "get": { - "tags": ["participant-data"], - "summary": "List participant files", - "security": [ { "BearerAuth": [] } ], - "operationId": "listParticipantFiles", - "parameters": [ - { "name": "studyKey", "in": "path", "required": true, "schema": { "type": "string" } }, - { "name": "pid", "in": "query", "required": true, "description": "Profile ID", "schema": { "type": "string" } }, - { "name": "page", "in": "query", "description": "page number (starting from 1)", "schema": { "type": "integer", "minimum": 1, "default": 1 } }, - { "name": "limit", "in": "query", "description": "maximum number of files per page", "schema": { "type": "integer", "minimum": 1, "default": 10 } } - ], - "responses": { - "200": { - "description": "Files returned", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "fileInfos": { "type": "array", "items": { "$ref": "#/components/schemas/FileInfo" } }, - "pagination": { "$ref": "#/components/schemas/PaginationInfos" } - }, - "required": ["fileInfos", "pagination"], - "additionalProperties": false - } - } - } - }, - "400": { "$ref": "#/components/responses/Error400" }, - "401": { "$ref": "#/components/responses/Error401" }, - "500": { "$ref": "#/components/responses/Error500" } - } - } - }, - "/v1/study-service/participant-data/{studyKey}/files/{fileID}": { - "get": { - "tags": ["participant-data"], - "summary": "Download participant file", - "security": [ { "BearerAuth": [] } ], - "operationId": "getParticipantFile", - "parameters": [ - { "name": "studyKey", "in": "path", "required": true, "schema": { "type": "string" } }, - { "name": "fileID", "in": "path", "required": true, "schema": { "type": "string" } }, - { "name": "pid", "in": "query", "required": true, "description": "Profile ID", "schema": { "type": "string" } } - ], - "responses": { - "200": { - "description": "File", - "content": { - "application/octet-stream": { - "schema": { "type": "string", "format": "binary" } - } - } - }, - "400": { "$ref": "#/components/responses/Error400" }, - "401": { "$ref": "#/components/responses/Error401" }, - "404": { "$ref": "#/components/responses/Error404" }, - "500": { "$ref": "#/components/responses/Error500" } - } - }, - "delete": { - "tags": ["participant-data"], - "summary": "Delete participant file", - "security": [ { "BearerAuth": [] } ], - "operationId": "deleteParticipantFile", - "parameters": [ - { "name": "studyKey", "in": "path", "required": true, "schema": { "type": "string" } }, - { "name": "fileID", "in": "path", "required": true, "schema": { "type": "string" } }, - { "name": "pid", "in": "query", "required": true, "description": "Profile ID", "schema": { "type": "string" } } - ], - "responses": { - "200": { "description": "Deleted", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Message" } } } }, - "400": { "$ref": "#/components/responses/Error400" }, - "401": { "$ref": "#/components/responses/Error401" }, - "404": { "$ref": "#/components/responses/Error404" }, - "500": { "$ref": "#/components/responses/Error500" } - } - } - }, - "/v1/user/": { - "get": { - "tags": ["user"], - "summary": "Get current user", - "security": [ - { - "BearerAuth": [] - } - ], - "operationId": "getUser", - "responses": { - "200": { - "description": "User returned", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "user": { - "$ref": "#/components/schemas/User" - } - }, - "required": [ - "user" - ] - } - } - } - }, - "400": { - "$ref": "#/components/responses/Error400" - }, - "401": { - "$ref": "#/components/responses/Error401" - }, - "500": { - "$ref": "#/components/responses/Error500" - } - } - }, - "delete": { - "tags": ["user"], - "summary": "Delete current user", - "security": [ - { - "BearerAuth": [] - } - ], - "operationId": "deleteUser", - "requestBody": { - "required": false, - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "exitSurveyResponse": { - "type": "object", - "additionalProperties": true - } - } - } - } - } - }, - "responses": { - "200": { - "$ref": "#/components/responses/MessageOk" - }, - "400": { - "$ref": "#/components/responses/Error400" - }, - "401": { - "$ref": "#/components/responses/Error401" - }, - "500": { - "$ref": "#/components/responses/Error500" - } - } - } - }, - "/v1/user/preferred-language": { - "put": { - "summary": "Update the account's preferred language", - "tags": ["user"], - "security": [ - { - "BearerAuth": [] - } - ], - "operationId": "updatePreferredLanguage", - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "newLocale": { "type": "string", "description": "language code, e.g., en, de-DE" } - }, - "required": ["newLocale"], - "additionalProperties": false - } - } - } - }, - "responses": { - "200": { - "$ref": "#/components/responses/MessageOk" - }, - "400": { - "$ref": "#/components/responses/Error400" - }, - "401": { - "$ref": "#/components/responses/Error401" - }, - "500": { - "$ref": "#/components/responses/Error500" - } - } - } - }, - "/v1/user/profiles": { - "post": { - "tags": ["user"], - "summary": "Add new profile", - "security": [ - { - "BearerAuth": [] - } - ], - "operationId": "addProfile", - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "profile": { - "$ref": "#/components/schemas/Profile" - } - }, - "required": [ - "profile" - ] - } - } - } - }, - "responses": { - "200": { - "description": "Profile added", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "profile": { - "$ref": "#/components/schemas/Profile" - } - }, - "required": [ - "profile" - ] - } - } - } - }, - "400": { - "$ref": "#/components/responses/Error400" - }, - "401": { - "$ref": "#/components/responses/Error401" - }, - "500": { - "$ref": "#/components/responses/Error500" - } - } - }, - "put": { - "tags": ["user"], - "summary": "Update profile", - "security": [ - { - "BearerAuth": [] - } - ], - "operationId": "updateProfile", - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "profile": { - "$ref": "#/components/schemas/Profile" - } - }, - "required": [ - "profile" - ] - } - } - } - }, - "responses": { - "200": { - "description": "Profile updated", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "profile": { - "$ref": "#/components/schemas/Profile" - } - }, - "required": [ - "profile" - ] - } - } - } - }, - "400": { - "$ref": "#/components/responses/Error400" - }, - "401": { - "$ref": "#/components/responses/Error401" - }, - "500": { - "$ref": "#/components/responses/Error500" - } - } - } - }, - "/v1/user/profiles/remove": { - "post": { - "tags": ["user"], - "summary": "Remove a profile", - "security": [ - { - "BearerAuth": [] - } - ], - "operationId": "removeProfile", - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "profileId": { - "type": "string" - }, - "exitSurveyResponse": { - "type": "object", - "additionalProperties": true - } - }, - "required": [ - "profileId" - ] - } - } - } - }, - "responses": { - "200": { - "$ref": "#/components/responses/MessageOk" - }, - "400": { - "$ref": "#/components/responses/Error400" - }, - "401": { - "$ref": "#/components/responses/Error401" - }, - "500": { - "$ref": "#/components/responses/Error500" - } - } - } - }, - "/v1/user/password": { - "post": { - "tags": ["user"], - "summary": "Change password", - "security": [ - { - "BearerAuth": [] - } - ], - "operationId": "changePassword", - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "oldPassword": { - "type": "string" - }, - "newPassword": { - "type": "string" - } - }, - "required": [ - "oldPassword", - "newPassword" - ] - } - } - } - }, - "responses": { - "200": { - "$ref": "#/components/responses/MessageOk" - }, - "400": { - "$ref": "#/components/responses/Error400" - }, - "401": { - "$ref": "#/components/responses/Error401" - }, - "500": { - "$ref": "#/components/responses/Error500" - } - } - } - }, - "/v1/user/change-account-email": { - "post": { - "tags": ["user"], - "summary": "Change account email", - "security": [ - { - "BearerAuth": [] - } - ], - "operationId": "changeAccountEmail", - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "email": { - "type": "string", - "format": "email" - }, - "password": { - "type": "string" - } - }, - "required": [ - "email", - "password" - ] - } - } - } - }, - "responses": { - "200": { - "$ref": "#/components/responses/MessageOk" - }, - "400": { - "$ref": "#/components/responses/Error400" - }, - "401": { - "$ref": "#/components/responses/Error401" - }, - "500": { - "$ref": "#/components/responses/Error500" - } - } - } - }, - "/v1/user/change-phone-number": { - "post": { - "tags": ["user"], - "summary": "Change phone number", - "security": [ - { - "BearerAuth": [] - } - ], - "operationId": "changePhoneNumber", - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "newPhoneNumber": { - "type": "string" - }, - "password": { - "type": "string" - } - }, - "required": [ - "newPhoneNumber", - "password" - ] - } - } - } - }, - "responses": { - "200": { - "$ref": "#/components/responses/MessageOk" - }, - "400": { - "$ref": "#/components/responses/Error400" - }, - "401": { - "$ref": "#/components/responses/Error401" - }, - "429": { - "$ref": "#/components/responses/Error429" - }, - "500": { - "$ref": "#/components/responses/Error500" - } - } - } - }, - "/v1/user/request-phone-number-verification": { - "get": { - "tags": ["user"], - "summary": "Request phone number verification code via SMS", - "security": [ - { - "BearerAuth": [] - } - ], - "operationId": "requestPhoneNumberVerification", - "responses": { - "200": { - "$ref": "#/components/responses/MessageOk" - }, - "400": { - "$ref": "#/components/responses/Error400" - }, - "401": { - "$ref": "#/components/responses/Error401" - }, - "429": { - "$ref": "#/components/responses/Error429" - }, - "500": { - "$ref": "#/components/responses/Error500" - } - } - } - }, - "/v1/user/attributes": { - "get": { - "tags": ["user"], - "summary": "Get user attributes", - "security": [ - { - "BearerAuth": [] - } - ], - "operationId": "getUserAttributes", - "responses": { - "200": { - "description": "Attributes returned", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "attributes": { - "type": "array", - "items": { - "$ref": "#/components/schemas/UserAttributes" - } - } - }, - "required": [ - "attributes" - ] - } - } - } - }, - "400": { - "$ref": "#/components/responses/Error400" - }, - "401": { - "$ref": "#/components/responses/Error401" - }, - "500": { - "$ref": "#/components/responses/Error500" - } - } - }, - "post": { - "tags": ["user"], - "summary": "Create or update a user attribute", - "security": [ - { - "BearerAuth": [] - } - ], - "operationId": "setUserAttribute", - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "type": { - "type": "string" - }, - "attributes": { - "type": "object", - "additionalProperties": true - } - }, - "required": [ - "type", - "attributes" - ] - } - } - } - }, - "responses": { - "200": { - "$ref": "#/components/responses/MessageOk" - }, - "400": { - "$ref": "#/components/responses/Error400" - }, - "401": { - "$ref": "#/components/responses/Error401" - }, - "500": { - "$ref": "#/components/responses/Error500" - } - } - } - }, - "/v1/user/attributes/{attributeID}": { - "delete": { - "tags": ["user"], - "summary": "Delete a user attribute", - "security": [ - { - "BearerAuth": [] - } - ], - "operationId": "deleteUserAttribute", - "parameters": [ - { - "name": "attributeID", - "in": "path", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "$ref": "#/components/responses/MessageOk" - }, - "400": { - "$ref": "#/components/responses/Error400" - }, - "401": { - "$ref": "#/components/responses/Error401" - }, - "500": { - "$ref": "#/components/responses/Error500" - } - } - } - }, - "/v1/user/contact-preferences": { - "put": { - "tags": ["user"], - "summary": "Update contact preferences", - "description": "Update the user's newsletter and weekly subscription preferences.", - "security": [ - { "BearerAuth": [] } - ], - "operationId": "updateContactPreferences", - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "subscribedToNewsletter": { - "type": "boolean" - }, - "toggleWeeklySubscription": { - "type": "boolean" - } - }, - "required": [ - "subscribedToNewsletter", - "toggleWeeklySubscription" - ] - } - } - } - }, - "responses": { - "200": { "$ref": "#/components/responses/MessageOk"}, - "400": { "$ref": "#/components/responses/Error400" }, - "401": { "$ref": "#/components/responses/Error401" }, - "500": { "$ref": "#/components/responses/Error500" } - } - } - }, - "/v1/unsubscribe-newsletter": { - "post": { - "tags": ["misc"], - "summary": "Unsubscribe user from newsletter (via token)", - "operationId": "unsubscribeNewsletter", - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "token": { - "type": "string" - } - }, - "required": [ - "token" - ] - } - } - } - }, - "responses": { - "200": { - "$ref": "#/components/responses/MessageOk" - }, - "400": { - "$ref": "#/components/responses/Error400" - }, - "500": { - "$ref": "#/components/responses/Error500" - } - } - } - } - }, - "components": { - "securitySchemes": { - "BearerAuth": { - "type": "http", - "scheme": "bearer", - "bearerFormat": "JWT" - } - }, - "responses": { - "MessageOk": { - "description": "Generic OK message", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/Message" - } - } - } - }, - "Error400": { - "description": "Bad request", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/Error" - } - } - } - }, - "Error401": { - "description": "Unauthorized", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/Error" - } - } - } - }, - "Error403": { - "description": "Forbidden", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/Error" - } - } - } - }, - "Error404": { - "description": "Not Found", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/Error" - } - } - } - }, - "Error429": { - "description": "Too many requests", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/Error" - } - } - } - }, - "Error500": { - "description": "Internal Server Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/Error" - } - } - } - } - }, - "schemas": { - "HealthStatus": { - "type": "object", - "properties": { - "status": { - "type": "string" - } - }, - "required": [ - "status" - ], - "additionalProperties": false - }, - "Message": { - "type": "object", - "properties": { - "message": { - "type": "string" - } - }, - "required": [ - "message" - ], - "additionalProperties": false - }, - "Error": { - "type": "object", - "properties": { - "error": { - "type": "string" - } - }, - "required": [ - "error" - ], - "additionalProperties": false - }, - "TokenEnvelope": { - "type": "object", - "properties": { - "accessToken": { - "type": "string" - }, - "refreshToken": { - "type": "string" - }, - "expiresIn": { - "type": "number" - }, - "selectedProfile": { - "type": "string" - } - }, - "required": [ - "accessToken", - "refreshToken", - "expiresIn", - "selectedProfile" - ], - "additionalProperties": false - }, - "TokenEnvelopeWithLastOTP": { - "type": "object", - "properties": { - "accessToken": { - "type": "string" - }, - "refreshToken": { - "type": "string" - }, - "expiresIn": { - "type": "number" - }, - "selectedProfile": { - "type": "string" - }, - "lastOTP": { - "type": "object", - "additionalProperties": { - "type": "integer" - } - } - }, - "required": [ - "accessToken", - "refreshToken", - "expiresIn", - "selectedProfile", - "lastOTP" - ], - "additionalProperties": false - }, - "AssignedSurvey": { - "type": "object", - "description": "Assigned survey object", - "additionalProperties": true - }, - "AssignedSurveysWithInfos": { - "type": "object", - "description": "Assigned surveys object with survey infos", - "properties": { - "surveys": { - "type": "array", - "items": { - "type": "object", - "additionalProperties": true - } - }, - "surveyInfos": { - "type": "array", - "items": { - "type": "object", - "additionalProperties": true - } - } - }, - "required": [ - "surveys", - "surveyInfos" - ], - "additionalProperties": false - }, - "AssignedSurveyWithContext": { - "type": "object", - "description": "Assigned survey object with optional context and prefill survey response", - "properties": { - "survey": { - "type": "object", - "additionalProperties": true - }, - "context": { - "type": "object", - "additionalProperties": true - }, - "prefill": { - "type": "object", - "additionalProperties": true - } - }, - "required": [ - "survey" - ], - "additionalProperties": false - }, - "FileInfo": { - "type": "object", - "properties": { - "id": { - "type": "string", - "description": "ObjectID" - }, - "participantID": { - "type": "string" - }, - "status": { - "type": "string" - }, - "uploadedBy": { - "type": "string" - }, - "path": { - "type": "string" - }, - "previewPath": { - "type": "string" - }, - "submittedAt": { - "type": "integer" - }, - "createdAt": { - "type": "string", - "format": "date-time" - }, - "updatedAt": { - "type": "string", - "format": "date-time" - }, - "fileType": { - "type": "string" - }, - "visibleToParticipant": { - "type": "boolean" - }, - "size": { - "type": "integer" - } - }, - "required": [ - "id", - "participantID", - "path" - ], - "additionalProperties": false, - "description": "File Info object" - }, - "PaginationInfos": { - "type": "object", - "description": "Pagination information", - "properties": { - "totalCount": { - "type": "integer" - }, - "currentPage": { - "type": "integer" - }, - "totalPages": { - "type": "integer" - }, - "pageSize": { - "type": "integer" - } - }, - "additionalProperties": false - }, - "SubmissionHistory": { - "type": "object", - "description": "Submission history", - "additionalProperties": true - }, - "Report": { - "type": "object", - "description": "Report object", - "properties": { - "id": { - "type": "string", - "description": "MongoDB ObjectID as hex string" - }, - "key": { - "type": "string" - }, - "participantID": { - "type": "string" - }, - "responseID": { - "type": "string" - }, - "timestamp": { - "type": "integer", - "description": "Unix timestamp" - }, - "modifiedAt": { - "type": "string", - "format": "date-time" - }, - "data": { - "type": "array", - "items": { - "type": "object", - "properties": { - "key": { "type": "string" }, - "value": { "type": "string" }, - "dtype": { - "type": "string", - "enum": ["date", "float", "int", "string", "rawMessage", "keyList"] - } - }, - "additionalProperties": false - } - } - }, - "required": [ - "key", - "participantID", - "timestamp" - ], - "additionalProperties": false - }, - "Participant": { - "type": "object", - "description": "Participant defines the datamodel for current state of the participant in a study as stored in the database", - "additionalProperties": true - }, - "User": { - "type": "object", - "description": "User object", - "additionalProperties": true - }, - "Profile": { - "type": "object", - "description": "User profile object", - "additionalProperties": true - }, - "UserAttributes": { - "type": "object", - "description": "User attributes object", - "additionalProperties": true - }, - "StudyInfo": { - "type": "object", - "properties": { - "key": { - "type": "string" - }, - "status": { - "type": "string" - }, - "props": { - "type": "object", - "additionalProperties": true - }, - "stats": { - "type": "object", - "additionalProperties": true - }, - "profileIds": { - "type": "array", - "items": { - "type": "string" - }, - "description": "ProfileIDs only required in study info objects related to participants" - } - }, - "required": [ - "key", - "status", - "props", - "stats", - "profileIds" - ], - "additionalProperties": false - }, - "StudyVariables": { - "type": "object", - "properties": { - "id": { - "type": "string", - "description": "MongoDB ObjectID", - "example": "64e4b2f2c2a4e2b1a1c2d3e4" - }, - "createdAt": { - "type": "string", - "format": "date-time" - }, - "configUpdatedAt": { - "type": "string", - "format": "date-time" - }, - "valueUpdatedAt": { - "type": "string", - "format": "date-time" - }, - "studyKey": { - "type": "string" - }, - "key": { - "type": "string" - }, - "value": { - "description": "Value of the study variable, type depends on 'type'", - "oneOf": [ - { "type": "string" }, - { "type": "integer" }, - { "type": "number", "format": "float" }, - { "type": "boolean" }, - { "type": "string", "format": "date-time" } - ] - }, - "type": { - "type": "string", - "enum": ["string", "int", "float", "boolean", "date"] - }, - "label": { - "type": "string" - }, - "description": { - "type": "string" - }, - "uiType": { - "type": "string" - }, - "uiPriority": { - "type": "integer" - }, - "configs": { - "type": "object", - "additionalProperties": true - } - }, - "required": [ - "createdAt", - "configUpdatedAt", - "valueUpdatedAt", - "studyKey", - "key", - "value", - "type" - ] - }, - } - }, - "tags": [ - { - "name": "auth", - "description": "Authentication endpoints" - }, - { - "name": "password", - "description": "Password endpoints" - }, - { - "name": "events", - "description": "Study service events endpoints" - }, - { - "name": "participant-data", - "description": "Endpoints getting participant data in study service" - }, - { - "name": "studies", - "description": "Endpoints getting study data in study service" - }, - { - "name": "user", - "description": "User endpoints" - }, - { - "name": "misc", - "description": "Miscellaneous" - } - ] -} \ No newline at end of file diff --git a/public/openapi/smtp-bridge.json b/public/openapi/smtp-bridge.json deleted file mode 100644 index b5ae6df..0000000 --- a/public/openapi/smtp-bridge.json +++ /dev/null @@ -1,243 +0,0 @@ -{ - "openapi": "3.1.0", - "info": { - "title": "SMTP Bridge API", - "version": "1.0.0", - "description": "Simple bridge for sending emails via configured SMTP servers." - }, - "paths": { - "/": { - "get": { - "summary": "Health check", - "operationId": "getHealth", - "responses": { - "200": { - "description": "Service is healthy", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HealthStatus" - }, - "examples": { - "ok": { - "value": { - "status": "ok" - } - } - } - } - } - } - } - } - }, - "/send-email": { - "post": { - "summary": "Send an email", - "operationId": "sendEmail", - "security": [ - { - "ApiKeyAuth": [] - } - ], - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/SendEmailRequest" - }, - "examples": { - "basic": { - "value": { - "to": [ - "user@example.com" - ], - "subject": "Hello", - "content": "

Hi there

", - "highPrio": false - } - }, - "withHeaderOverrides": { - "value": { - "to": [ - "user@example.com" - ], - "subject": "Important", - "content": "Text body", - "highPrio": true, - "headerOverrides": { - "from": "\"System Notifications\" ", - "sender": "system@example.com", - "replyTo": [ - "support@example.com" - ], - "noReplyTo": false - } - } - } - } - } - } - }, - "responses": { - "200": { - "description": "Email accepted for sending", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/SuccessMessage" - }, - "examples": { - "sent": { - "value": { - "message": "email sent" - } - } - } - } - } - }, - "400": { - "description": "Bad request", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/Error" - }, - "examples": { - "missingApiKey": { - "value": { - "error": "A valid API key missing" - } - }, - "missingTo": { - "value": { - "error": "missing 'to' field" - } - } - } - } - } - }, - "500": { - "description": "Failed to send after retries", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/Error" - }, - "examples": { - "sendFailed": { - "value": { - "error": "failed to send email" - } - } - } - } - } - } - } - } - } - }, - "components": { - "securitySchemes": { - "ApiKeyAuth": { - "type": "apiKey", - "in": "header", - "name": "Api-Key", - "description": "Provide a valid API key in the 'Api-Key' header" - } - }, - "schemas": { - "HealthStatus": { - "type": "object", - "properties": { - "status": { - "type": "string" - } - }, - "required": [ - "status" - ], - "additionalProperties": false - }, - "SuccessMessage": { - "type": "object", - "properties": { - "message": { - "type": "string" - } - }, - "required": [ - "message" - ], - "additionalProperties": false - }, - "Error": { - "type": "object", - "properties": { - "error": { - "type": "string" - } - }, - "required": [ - "error" - ], - "additionalProperties": false - }, - "HeaderOverrides": { - "type": "object", - "properties": { - "from": { - "type": "string" - }, - "sender": { - "type": "string" - }, - "replyTo": { - "type": "array", - "items": { - "type": "string", - "format": "email" - } - }, - "noReplyTo": { - "type": "boolean" - } - }, - "additionalProperties": false - }, - "SendEmailRequest": { - "type": "object", - "properties": { - "to": { - "type": "array", - "items": { - "type": "string", - "format": "email" - }, - "minItems": 1 - }, - "subject": { - "type": "string" - }, - "content": { - "type": "string" - }, - "highPrio": { - "type": "boolean" - }, - "headerOverrides": { - "$ref": "#/components/schemas/HeaderOverrides" - } - }, - "required": [ - "to" - ], - "additionalProperties": false - } - } - } -} \ No newline at end of file diff --git a/scripts/doc-profiles.ts b/scripts/doc-profiles.ts new file mode 100644 index 0000000..46e4982 --- /dev/null +++ b/scripts/doc-profiles.ts @@ -0,0 +1,39 @@ +export type DocsProfile = { + id: string; + input: string; + outputDir: string; + baseUrl: string; + groupByTag: boolean; +}; + +export const docsProfiles: DocsProfile[] = [ + { + id: 'management-api', + input: './openapi/management-api.yaml', + outputDir: 'content/tech-docs/management-api/api', + baseUrl: '/tech-docs/management-api/api', + groupByTag: true, + }, + { + id: 'participant-api', + input: './openapi/participant-api.yaml', + outputDir: 'content/tech-docs/participant-api/api', + baseUrl: '/tech-docs/participant-api/api', + groupByTag: true, + }, + { + id: 'smtp-bridge', + input: './openapi/smtp-bridge.yaml', + outputDir: 'content/tech-docs/smtp-bridge/api', + baseUrl: '/tech-docs/smtp-bridge/api', + groupByTag: false, + }, +]; + +export function getDocsProfile(profileId: string): DocsProfile | undefined { + return docsProfiles.find((profile) => profile.id === profileId); +} + +export function getDefaultDocsProfile(): DocsProfile { + return docsProfiles[0]; +} diff --git a/scripts/generate-docs.ts b/scripts/generate-docs.ts new file mode 100644 index 0000000..1138715 --- /dev/null +++ b/scripts/generate-docs.ts @@ -0,0 +1,229 @@ +import { createDocsOpenAPI } from '@/lib/openapi'; +import { generateFiles } from 'fumadocs-openapi'; +import fs from 'node:fs/promises'; +import { docsProfiles, DocsProfile, getDefaultDocsProfile, getDocsProfile } from './doc-profiles'; + +const requestedProfileId = process.argv[2] ?? process.env.DOCS_PROFILE; + +if (requestedProfileId === '--list') { + console.log(docsProfiles.map((profile) => profile.id).join('\n')); + process.exit(0); +} + +const runAllProfiles = requestedProfileId === '--all'; + +const selectedProfile = requestedProfileId + ? (runAllProfiles ? getDefaultDocsProfile() : getDocsProfile(requestedProfileId)) + : getDefaultDocsProfile(); + +if (!selectedProfile) { + console.error(`Unknown docs profile: ${requestedProfileId}`); + console.error(`Available profiles: ${docsProfiles.map((profile) => profile.id).join(', ')}`); + process.exit(1); +} + +type GeneratedLeafEntry = { + type: 'operation' | 'webhook'; + path: string; + info: { + title: string; + description?: string; + }; + item: { + method: string; + tags?: string[]; + }; + schemaId?: string; +}; + +type GeneratedGroupEntry = { + type: 'group'; + info?: { + title?: string; + description?: string; + }; + tag?: { + name?: string; + description?: string; + }; + path?: string; + schemaId?: string; + entries: GeneratedEntry[]; +}; + +type GeneratedEntry = GeneratedLeafEntry | GeneratedGroupEntry; + +const methodBadgeClass: Record = { + GET: 'text-emerald-600', + POST: 'text-blue-600', + PUT: 'text-amber-600', + PATCH: 'text-orange-600', + DELETE: 'text-red-600', +}; + +async function generateForProfile(profile: DocsProfile) { + const outputDir = profile.outputDir; + const baseUrl = profile.baseUrl; + const openapi = createDocsOpenAPI(profile.input); + const groupByTag = profile.groupByTag; + + console.log(`Generating docs for profile: ${profile.id}`); + + // Remove stale files from previous generation modes (flat vs grouped). + await fs.rm(outputDir, { recursive: true, force: true }); + + const schemas = await openapi.getSchemas(); + const primarySchema = Object.values(schemas)[0]; + const indexTitle = primarySchema?.dereferenced.info?.title ?? 'API'; + const indexDescription = primarySchema?.dereferenced.info?.description ?? 'All available pages'; + const declaredTags = Array.isArray(primarySchema?.dereferenced.tags) + ? primarySchema.dereferenced.tags + : []; + const tagOrderMap = new Map(); + + declaredTags.forEach((tag, index) => { + if (tag && typeof tag === 'object' && 'name' in tag && typeof (tag as { name?: unknown }).name === 'string') { + tagOrderMap.set((tag as { name: string }).name, index); + } + }); + + await generateFiles({ + per: 'operation', + groupBy: groupByTag ? 'tag' : undefined, + meta: true, + index: { + // for generating `href` + url: { + baseUrl, + // paths produced by generateFiles are relative to `output` + contentDir: '.', + }, + items: (ctx) => { + const only = Object.values(ctx.generated) + .flat() + .map((file) => file.path); + + return [ + { + // output path + path: 'index.mdx', + // optional: set frontmatter + description: indexDescription, + only, + }, + ]; + }, + }, + input: openapi, + output: outputDir, + includeDescription: true, + beforeWrite(files) { + const indexFile = files.find((file) => file.path === 'index.mdx'); + if (!indexFile) return; + + const topEntries = Object.values(this.generatedEntries) + .flat() as GeneratedEntry[]; + + const collectLeafEntries = (entry: GeneratedEntry): GeneratedLeafEntry[] => { + if (entry.type === 'group') { + return entry.entries.flatMap((child) => collectLeafEntries(child)); + } + + return [entry]; + }; + + const renderCard = (entry: GeneratedLeafEntry): string => { + const method = entry.item.method.toUpperCase(); + const methodClass = methodBadgeClass[method] ?? 'text-fd-muted-foreground'; + const href = `${baseUrl}/${entry.path.replace(/\.mdx$/, '')}`; + const description = entry.info.description + ? `description={${JSON.stringify(entry.info.description)}}` + : ''; + + return `${entry.info.title} ${method}} ${description} />`; + }; + + const groupedEntries = topEntries + .filter((entry): entry is GeneratedGroupEntry => entry.type === 'group') + .sort((left, right) => { + const leftTag = left.tag?.name ?? ''; + const rightTag = right.tag?.name ?? ''; + const leftOrder = tagOrderMap.get(leftTag); + const rightOrder = tagOrderMap.get(rightTag); + + if (leftOrder !== undefined && rightOrder !== undefined) { + return leftOrder - rightOrder; + } + + if (leftOrder !== undefined) return -1; + if (rightOrder !== undefined) return 1; + + const leftTitle = left.info?.title ?? left.tag?.name ?? 'Untagged'; + const rightTitle = right.info?.title ?? right.tag?.name ?? 'Untagged'; + return leftTitle.localeCompare(rightTitle); + }); + + const groupSections = groupedEntries.map((entry) => { + const groupTitle = entry.info?.title ?? entry.tag?.name ?? 'Untagged'; + const groupDescription = entry.info?.description + ? `\n\n${entry.info.description}` + : ''; + const cards = collectLeafEntries(entry).map(renderCard); + + return `\n### ${groupTitle}${groupDescription}\n\n\n${cards.join('\n')}\n`; + }).filter(Boolean); + + const orderedGroupPageIds = groupedEntries + .map((entry) => entry.path ?? entry.tag?.name) + .filter((value): value is string => Boolean(value)); + + const topLevelMetaFile = files.find((file) => file.path === 'meta.json'); + if (topLevelMetaFile) { + try { + const parsed = JSON.parse(topLevelMetaFile.content) as { pages?: unknown }; + const existingPages = Array.isArray(parsed.pages) + ? parsed.pages.filter((value): value is string => typeof value === 'string') + : []; + + const orderedPages = [ + ...orderedGroupPageIds.filter((page) => existingPages.includes(page)), + ...existingPages.filter((page) => !orderedGroupPageIds.includes(page)), + ]; + + parsed.pages = orderedPages; + topLevelMetaFile.content = `${JSON.stringify(parsed, null, 2)}\n`; + } catch { + // keep generated meta as-is when unexpected content shape is encountered + } + } + + const ungroupedCards = topEntries + .filter((entry): entry is GeneratedLeafEntry => entry.type !== 'group') + .map(renderCard); + + const endpointSection = [ + groupByTag && groupSections.length > 0 ? `${groupSections.join('\n')}` : '', + !groupByTag && ungroupedCards.length > 0 + ? `\n${ungroupedCards.join('\n')}\n` + : '', + ungroupedCards.length > 0 + && groupByTag + ? `## Other Endpoints\n\n\n${ungroupedCards.join('\n')}\n` + : '', + ].filter(Boolean).join('\n\n'); + + indexFile.content = `---\ntitle: ${indexTitle}\ndescription: ${indexDescription}\n---\n\n{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */}\n\n${endpointSection}`; + }, + }); +} + +void (async () => { + if (runAllProfiles) { + for (const profile of docsProfiles) { + await generateForProfile(profile); + } + return; + } + + await generateForProfile(selectedProfile); +})(); diff --git a/tsconfig.json b/tsconfig.json index 4fd260f..078f4b0 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,8 +1,11 @@ { "compilerOptions": { - "baseUrl": ".", "target": "ESNext", - "lib": ["dom", "dom.iterable", "esnext"], + "lib": [ + "dom", + "dom.iterable", + "esnext" + ], "allowJs": true, "skipLibCheck": true, "strict": true, @@ -13,11 +16,18 @@ "moduleResolution": "bundler", "resolveJsonModule": true, "isolatedModules": true, - "jsx": "preserve", + "jsx": "react-jsx", "incremental": true, "paths": { - "@/.source": ["./.source/index.ts"], - "@/*": ["./*"] + "fumadocs-mdx:collections/*": [ + "./.source/*" + ], + "@/.source": [ + "./.source/index.ts" + ], + "@/*": [ + "./*" + ] }, "plugins": [ { @@ -25,6 +35,14 @@ } ] }, - "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"], - "exclude": ["node_modules"] -} + "include": [ + "next-env.d.ts", + "**/*.ts", + "**/*.tsx", + ".next/types/**/*.ts", + ".next/dev/types/**/*.ts" + ], + "exclude": [ + "node_modules" + ] +} \ No newline at end of file