diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 86f4dda0a7ac..a7e2ffe5e921 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -7,5 +7,8 @@ # documentation /docs @discdiver @cicdw @desertaxle @zzstoatzz # imports -/src/prefect/__init__.py @aaazzam @chrisguidry @cicdw @desertaxle @zzstoatzz -/src/prefect/main.py @aaazzam @chrisguidry @cicdw @desertaxle @zzstoatzz +/src/prefect/__init__.py @aaazzam @chrisguidry @cicdw @desertaxle @zzstoatzz +/src/prefect/main.py @aaazzam @chrisguidry @cicdw @desertaxle @zzstoatzz + +# UI Replatform +/ui-v2 @aaazzam @cicdw @desertaxle @zzstoatzz diff --git a/.github/workflows/python-tests.yaml b/.github/workflows/python-tests.yaml index 7cd3e4500161..26d344a44641 100644 --- a/.github/workflows/python-tests.yaml +++ b/.github/workflows/python-tests.yaml @@ -159,6 +159,11 @@ jobs: echo "COVERAGE_FILE=${COVERAGE_FILE}" >> $GITHUB_ENV echo "artifact_name=coverage-data-${sanitized_test_type}-${{ matrix.python-version }}-${sanitized_database}" >> $GITHUB_OUTPUT + - name: Set coverage core + if: ${{ matrix.python-version == '3.12' }} + run: | + echo "COVERAGE_CORE=sysmon" >> $GITHUB_ENV + - name: Run tests run: | echo "Using COVERAGE_FILE=$COVERAGE_FILE" @@ -344,6 +349,11 @@ jobs: echo "COVERAGE_FILE=${COVERAGE_FILE}" >> $GITHUB_ENV echo "artifact_name=coverage-data-docker-${{ matrix.python-version }}-${sanitized_database}" >> $GITHUB_OUTPUT + - name: Set coverage core + if: ${{ matrix.python-version == '3.12' }} + run: | + echo "COVERAGE_CORE=sysmon" >> $GITHUB_ENV + - name: Run tests run: | echo "Using COVERAGE_FILE=$COVERAGE_FILE" diff --git a/.github/workflows/ui-v2-checks.yml b/.github/workflows/ui-v2-checks.yml new file mode 100644 index 000000000000..2dda297b98ec --- /dev/null +++ b/.github/workflows/ui-v2-checks.yml @@ -0,0 +1,56 @@ +name: UI v2 Checks + +on: + pull_request: + paths: + - .github/workflows/ui-v2-checks.yml + - ui-v2/** + - .nvmrc + push: + branches: + - main + +permissions: + contents: read + +# Limit concurrency by workflow/branch combination. +# +# For pull request builds, pushing additional changes to the +# branch will cancel prior in-progress and pending builds. +# +# For builds triggered on a branch push, additional changes +# will wait for prior builds to complete before starting. +# +# https://docs.github.com/en/actions/using-jobs/using-concurrency +concurrency: + group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }} + cancel-in-progress: ${{ github.event_name == 'pull_request' }} + +jobs: + build-ui: + name: Build ui + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v4 + + - uses: actions/setup-node@v4 + with: + node-version-file: ".nvmrc" + cache-dependency-path: "**/package-lock.json" + + - name: Install UI dependencies + working-directory: ./ui-v2 + run: npm ci install + + - name: Check formatting + working-directory: ./ui-v2 + run: npm run format:check + + - name: Lint + working-directory: ./ui-v2 + run: npm run lint + + - name: Build UI + working-directory: ./ui-v2 + run: npm run build diff --git a/docs/3.0/develop/settings-and-profiles.mdx b/docs/3.0/develop/settings-and-profiles.mdx index 5ef64687ad33..62091c2b5873 100644 --- a/docs/3.0/develop/settings-and-profiles.mdx +++ b/docs/3.0/develop/settings-and-profiles.mdx @@ -13,7 +13,7 @@ Specifically, settings enable: - **Runtime Flexibility**: Quickly adjust things like retry attempts or logging levels without having to modify and redeploy your workflows. -## Getting Started with Settings +## Get started with settings The simplest way declare settings is by creating a `prefect.toml` file in your project directory. For example: @@ -23,12 +23,18 @@ The simplest way declare settings is by creating a `prefect.toml` file in your p level = "DEBUG" ``` + +To use `prefect.toml` or `pyproject.toml` for configuration, `prefect>=3.1` must be installed. + +To use a `.env` file for configuration, `prefect>=3.0.5` must be installed. + + Most editors have plugins for TOML that provide syntax highlighting, linting, and autocomplete for `prefect.toml` files. If you use VSCode, we recommend the [Even Better TOML extension](https://marketplace.visualstudio.com/items?itemName=tamasfe.even-better-toml). **Writing TOML** -TOML is a simple configuration language that is easy to read and write. If you're new to TOML, you can learn more about the syntax in the [official documentation](https://toml.io/en/). +TOML is a simple configuration language. If you're new to TOML, learn more about the syntax in the [official documentation](https://toml.io/en/). In particular, note that TOML uses square brackets to denote [tables](https://toml.io/en/v1.0.0#table), which are analogous to dictionaries in Python. @@ -37,7 +43,7 @@ In particular, note that TOML uses square brackets to denote [tables](https://to You can configure settings via the following sources (highest to lowest precedence): -- **Environment Variables**: Environment variables are useful for temporarily overriding settings or configuring the runtime environment of a single workflow run. +- **Environment variables**: Environment variables are useful for temporarily overriding settings or configuring the runtime environment of a single workflow run. - **`.env` file**: `.env` files are useful for declaring local settings that you want to apply across multiple runs. @@ -95,7 +101,7 @@ PREFECT_LOGGING_LEVEL="DEBUG" Any flows run in the same directory as this `.env` file will use the `DEBUG` logging level, even if they are run in different shell sessions. -You can see supported environment variables for each setting in the [settings reference documentation](/3.0/develop/settings-ref). +View supported environment variables for each setting in the [settings reference documentation](/3.0/develop/settings-ref). ### `prefect.toml` file @@ -136,6 +142,7 @@ Profiles are stored in a [TOML](https://toml.io/en/) file located at `~/.prefect One and only one profile can be active at any time. Immediately after installation, the `ephemeral` profile will be used, which only has 1 setting configured: + ```bash ยป docker run -it prefecthq/prefect:3-latest ___ ___ ___ ___ ___ ___ _____ @@ -168,6 +175,7 @@ The `prefect profile` CLI commands enable you to create, review, and manage prof | `populate-defaults` | Populate your `profiles.toml` file with opinionated stock profiles. | ... or you may edit your `profiles.toml` file directly: + ```bash vim ~/.prefect/profiles.toml ``` diff --git a/docs/3.0/develop/settings-ref.mdx b/docs/3.0/develop/settings-ref.mdx index 7dab8869af9d..f9d6c62d96c4 100644 --- a/docs/3.0/develop/settings-ref.mdx +++ b/docs/3.0/develop/settings-ref.mdx @@ -3,6 +3,7 @@ title: Settings reference description: Reference for all available settings for Prefect. --- {/* This page is generated by `scripts/generate_settings_ref.py`. Update the generation script to update this page. */} +To use `prefect.toml` or `pyproject.toml` for configuration, `prefect>=3.1` must be installed. ## Root Settings ### `home` The path to the Prefect home directory. Defaults to ~/.prefect @@ -53,7 +54,6 @@ If True, enables debug mode which may provide additional logging and debugging f **TOML dotted key path**: `cli` ### `client` -Settings for for controlling API client behavior **Type**: [ClientSettings](#clientsettings) @@ -164,38 +164,6 @@ The URL of the Prefect UI. If not set, the client will attempt to infer it. **Supported environment variables**: `PREFECT_SILENCE_API_URL_MISCONFIGURATION` -### `experimental_warn` -If `True`, warn on usage of experimental features. - -**Type**: `boolean` - -**Default**: `True` - -**TOML dotted key path**: `experimental_warn` - -**Supported environment variables**: -`PREFECT_EXPERIMENTAL_WARN` - -### `async_fetch_state_result` - - Determines whether `State.result()` fetches results automatically or not. - In Prefect 2.6.0, the `State.result()` method was updated to be async - to facilitate automatic retrieval of results from storage which means when - writing async code you must `await` the call. For backwards compatibility, - the result is not retrieved by default for async users. You may opt into this - per call by passing `fetch=True` or toggle this setting to change the behavior - globally. - - -**Type**: `boolean` - -**Default**: `False` - -**TOML dotted key path**: `async_fetch_state_result` - -**Supported environment variables**: -`PREFECT_ASYNC_FETCH_STATE_RESULT` - --- ## APISettings Settings for interacting with the Prefect API @@ -224,7 +192,7 @@ The API key used for authentication with the Prefect API. Should be kept secret. `PREFECT_API_KEY` ### `tls_insecure_skip_verify` -If `True`, disables SSL checking to allow insecure requests. This is recommended only during development, e.g. when using self-signed certificates. +If `True`, disables SSL checking to allow insecure requests. Setting to False is recommended only during development. For example, when using self-signed certificates. **Type**: `boolean` @@ -475,6 +443,18 @@ The default Docker namespace to use when building images. --- ## ExperimentsSettings Settings for configuring experimental features +### `warn` +If `True`, warn on usage of experimental features. + +**Type**: `boolean` + +**Default**: `True` + +**TOML dotted key path**: `experiments.warn` + +**Supported environment variables**: +`PREFECT_EXPERIMENTS_WARN`, `PREFECT_EXPERIMENTAL_WARN` + ### `worker_logging_to_api_enabled` Enables the logging of worker logs to Prefect Cloud. @@ -1363,7 +1343,7 @@ Which message broker implementation to use for the messaging system, should poin `PREFECT_SERVER_EVENTS_MESSAGING_BROKER`, `PREFECT_MESSAGING_BROKER` ### `messaging_cache` -Which cache implementation to use for the events system. Should point to a module that exports a Cache class. +Which cache implementation to use for the events system. Should point to a module that exports a Cache class. **Type**: `string` @@ -2236,6 +2216,18 @@ This value sets the default retry delay seconds for all tasks. **Supported environment variables**: `PREFECT_TASKS_DEFAULT_RETRY_DELAY_SECONDS`, `PREFECT_TASK_DEFAULT_RETRY_DELAY_SECONDS` +### `default_persist_result` +If `True`, results will be persisted by default for all tasks. Set to `False` to disable persistence by default. Note that setting to `False` will override the behavior set by a parent flow or task. + +**Type**: `boolean | None` + +**Default**: `None` + +**TOML dotted key path**: `tasks.default_persist_result` + +**Supported environment variables**: +`PREFECT_TASKS_DEFAULT_PERSIST_RESULT` + ### `runner` Settings for controlling task runner behavior diff --git a/docs/3.0/manage/cloud/manage-users/manage-roles.mdx b/docs/3.0/manage/cloud/manage-users/manage-roles.mdx index 3058e763fddf..d9b380268b50 100644 --- a/docs/3.0/manage/cloud/manage-users/manage-roles.mdx +++ b/docs/3.0/manage/cloud/manage-users/manage-roles.mdx @@ -46,8 +46,7 @@ The following built-in roles have permissions within a given workspace in Prefec | Viewer | - View flow runs within a workspace.
- View deployments within a workspace.
- View all work pools within a workspace.
- View all blocks within a workspace.
- View all automations within a workspace.
- View workspace handle and description. | | Runner | All Viewer abilities, _plus_:
- Run deployments within a workspace. | | Developer | All Runner abilities, _plus_:
- Run flows within a workspace.
- Delete flow runs within a workspace.
- Create, edit, and delete deployments within a workspace.
- Create, edit, and delete work pools within a workspace.
- Create, edit, and delete all blocks and their secrets within a workspace.
- Create, edit, and delete automations within a workspace.
- View all workspace settings. | - -| Owner | All Developer abilities, _plus_:
- Add and remove account members, and set their role within a workspace.
- Set the workspace's default workspace role for all users in the account.
- Set, view, edit workspace settings. | +| Owner | All Developer abilities, _plus_:
- Add and remove account members, and set their role within a workspace.
- Set the workspace's default workspace role for all users in the account.
- Set, view, edit workspace settings. | | Worker | The minimum scopes required for a worker to poll for and submit work.| ## Custom workspace roles diff --git a/docs/images/prefect-dbt-summary-artifact.png b/docs/images/prefect-dbt-summary-artifact.png new file mode 100644 index 000000000000..bcab86389f39 Binary files /dev/null and b/docs/images/prefect-dbt-summary-artifact.png differ diff --git a/docs/integrations/prefect-dbt/index.mdx b/docs/integrations/prefect-dbt/index.mdx index e72f1b7f505e..1cc510929288 100644 --- a/docs/integrations/prefect-dbt/index.mdx +++ b/docs/integrations/prefect-dbt/index.mdx @@ -2,17 +2,17 @@ title: prefect-dbt --- -With `prefect-dbt`, you can trigger and observe dbt Cloud jobs, execute dbt Core CLI commands, and incorporate other tools, such as [Snowflake](integrations/prefect-snowflake/index), into your dbt runs. +With `prefect-dbt`, you can trigger and observe dbt Cloud jobs, execute dbt Core CLI commands, and incorporate other tools, such as [Snowflake](/integrations/prefect-snowflake/index), into your dbt runs. Prefect provides a global view of the state of your workflows and allows you to take action based on state changes. -Prefect integrations may provide pre-built [blocks](/latest/develop/blocks), [flows](/latest/develop/flows), or [tasks](/latest/develop/tasks) for interacting with external systems. +Prefect integrations may provide pre-built [blocks](/latest/develop/blocks), [flows](/latest/develop/write-flows), or [tasks](/latest/develop/write-tasks) for interacting with external systems. Block types in this library allow you to do things such as run a dbt Cloud job or execute a dbt Core command. ## Getting started ### Prerequisites -- A [dbt Cloud account](https://cloud.getdbt.com/signup) if using dbt Cloud. +- A [dbt Cloud account](https://cloud.getdbt.com/) if using dbt Cloud. ### Install `prefect-dbt` @@ -31,12 +31,6 @@ pip install -U "prefect[dbt]" If necessary, see [additional installation options for dbt Core with BigQuery, Snowflake, and Postgres](#additional-installation-options). -To install with all additional capabilities, use the following command: - - -```bash -pip install -U "prefect-dbt[all_extras]" -``` ### Register newly installed blocks types @@ -48,28 +42,8 @@ prefect block register -m prefect_dbt ## dbt Cloud -If you have an existing dbt Cloud job, use the pre-built flow `run_dbt_cloud_job` to trigger a job run and wait until the job run is finished. - -If some nodes fail, `run_dbt_cloud_job` efficiently retries the unsuccessful nodes. - -Prior to running this flow, [save your dbt Cloud credentials to a DbtCloudCredentials block](#save-dbt-cloud-credentials-to-a-block): - -```python -from prefect import flow -from prefect_dbt.cloud import DbtCloudJob -from prefect_dbt.cloud.jobs import run_dbt_cloud_job - +If you have an existing dbt Cloud job, use the pre-built flow `run_dbt_cloud_job` to trigger a job run and wait until the job run is finished. If some nodes fail, `run_dbt_cloud_job` can efficiently retry the unsuccessful nodes. Prior to running this flow, save your dbt Cloud credentials to a DbtCloudCredentials block and create a dbt Cloud Job block: -@flow -def run_dbt_job_flow(): - result = run_dbt_cloud_job( - dbt_cloud_job=DbtCloudJob.load("my-block-name"), - targeted_retries=5, - ) - return result - -run_dbt_job_flow() -``` ### Save dbt Cloud credentials to a block @@ -77,13 +51,11 @@ Blocks can be [created through code](/latest/develop/blocks) or through the UI. To create a dbt Cloud Credentials block: -1. Go to your [dbt Cloud profile](https://cloud.getdbt.com/settings/profile). -2. Log in to your dbt Cloud account. -3. Scroll to **API** or click **API Access** on the sidebar. -4. Copy the API Key. -5. Click **Projects** on the sidebar. -6. Copy the account ID from the URL: `https://cloud.getdbt.com/settings/accounts/`. -7. Create and run the following script, replacing the placeholders: +1. Log into your [dbt Cloud account](https://cloud.getdbt.com/settings/profile). +2. Click **API Tokens** on the sidebar. +3. Copy a Service Token. +4. Copy the account ID from the URL: `https://cloud.getdbt.com/settings/accounts/`. +5. Create and run the following script, replacing the placeholders: ```python from prefect_dbt.cloud import DbtCloudCredentials @@ -95,13 +67,12 @@ DbtCloudCredentials( ).save("CREDENTIALS-BLOCK-NAME-PLACEHOLDER") ``` -Then, create a dbt Cloud job block: +### Create a dbt Cloud job block -1. Navigate to your [dbt home page](https://cloud.getdbt.com/). -2. On the top nav bar, click on **Deploy** -> **Jobs**. -3. Select a job. -4. Copy the job ID from the URL: `https://cloud.getdbt.com/deploy//projects//jobs/` -5. Create and run the following script, replacing the placeholders. +1. In dbt Cloud, click on **Deploy** -> **Jobs**. +2. Select a job. +3. Copy the job ID from the URL: `https://cloud.getdbt.com/deploy//projects//jobs/` +4. Create and run the following script, replacing the placeholders. ```python from prefect_dbt.cloud import DbtCloudCredentials, DbtCloudJob @@ -113,20 +84,30 @@ dbt_cloud_job = DbtCloudJob( job_id="JOB-ID-PLACEHOLDER" ).save("JOB-BLOCK-NAME-PLACEHOLDER") ``` - -Load the saved block, which can access your credentials: +### Run a dbt Cloud job and wait for completion ```python +from prefect import flow from prefect_dbt.cloud import DbtCloudJob +from prefect_dbt.cloud.jobs import run_dbt_cloud_job +import asyncio +@flow +async def run_dbt_job_flow(): + result = await run_dbt_cloud_job( + dbt_cloud_job = await DbtCloudJob.load("JOB-BLOCK-NAME-PLACEHOLDER"), + targeted_retries = 0, + ) + return await result -DbtCloudJob.load("JOB-BLOCK-NAME-PLACEHOLDER") +if __name__ == "__main__": + asyncio.run(run_dbt_job_flow()) ``` ## dbt Core -Prefect-dbt supports execution of dbt Core CLI commands. -If you don't have a `DbtCoreOperation` block saved, create one and set the commands that you want to run. +`prefect-dbt` supports a couple of ways to run dbt Core commands. +A `DbtCoreOperation` block will run the commands as shell commands, while other tasks use dbt's [Programmatic Invocation](#programmatic-invocation). Optionally, specify the `project_dir`. If `profiles_dir` is not set, the `DBT_PROFILES_DIR` environment variable will be used. @@ -190,43 +171,9 @@ profile: ``` -### Programmatic Invocation - -`prefect-dbt` has some pre-built tasks that use dbt's [programmatic invocation](https://docs.getdbt.com/reference/programmatic-invocations). -For example: - -```python -from prefect import flow -from prefect_dbt.cli.tasks import from prefect import flow -from prefect_dbt.cli.commands import trigger_dbt_cli_command, dbt_build_task - - -@flow -def dbt_build_flow(): - trigger_dbt_cli_command( - command="dbt deps", project_dir="/Users/test/my_dbt_project_dir", - ) - dbt_build_task( - project_dir="/Users/test/my_dbt_project_dir", - create_summary_artifact: bool = True, - summary_artifact_key: str = "dbt-build-task-summary", - extra_command_args=["--model", "foo_model"] - ) - - -if __name__ == "__main__": - dbt_build_flow() -``` - -See the [SDK docs](https://prefect-python-sdk-docs.netlify.app/prefect_dbt/) for other pre-built tasks. - -### Create a summary artifact +### Create a new `profiles.yml` file with blocks -These pre-built tasks can also create artifacts. These artifacts have extra information about dbt Core runs, such as messages and compiled code for nodes that fail or have errors. - -### Create a new profile with blocks - -Use a DbtCliProfile block to create `profiles.yml`. +If you don't have a `profiles.yml` file, you can use a DbtCliProfile block to create `profiles.yml`. Then, specify `profiles_dir` where `profiles.yml` will be written. Here's example code with placeholders: @@ -266,7 +213,44 @@ Visit the SDK reference in the side navigation to see other built-in `TargetConf If the desired service profile is not available, you can build one from the generic `TargetConfigs` class. -#### BigQuery profile example +### Programmatic Invocation + +`prefect-dbt` has some pre-built tasks that use dbt's [programmatic invocation](https://docs.getdbt.com/reference/programmatic-invocations). + +For example: + +```python +from prefect import flow +from prefect_dbt.cli.tasks import from prefect import flow +from prefect_dbt.cli.commands import trigger_dbt_cli_command, dbt_build_task + + +@flow +def dbt_build_flow(): + trigger_dbt_cli_command( + command="dbt deps", project_dir="/Users/test/my_dbt_project_dir", + ) + dbt_build_task( + project_dir = "/Users/test/my_dbt_project_dir", + create_summary_artifact = True, + summary_artifact_key = "dbt-build-task-summary", + extra_command_args=["--select", "foo_model"] + ) + + +if __name__ == "__main__": + dbt_build_flow() +``` + +See the [SDK docs](https://prefect-python-sdk-docs.netlify.app/prefect_dbt/) for other pre-built tasks. + +#### Create a summary artifact + +These pre-built tasks can also create artifacts. These artifacts have extra information about dbt Core runs, such as messages and compiled code for nodes that fail or have errors. + +![prefect-dbt Summary Artifact](/images/prefect-dbt-summary-artifact.png) + +### BigQuery CLI profile block example To create dbt Core target config and profile blocks for BigQuery: 1. Save and load a `GcpCredentials` block. @@ -354,3 +338,9 @@ pip install "prefect-dbt[bigquery]" ```bash pip install "prefect-dbt[postgres]" ``` + +Or, install all of the extras. + +```bash +pip install -U "prefect-dbt[all_extras]" +``` \ No newline at end of file diff --git a/schemas/settings.schema.json b/schemas/settings.schema.json index bc9da01b481b..8e71911cf200 100644 --- a/schemas/settings.schema.json +++ b/schemas/settings.schema.json @@ -39,7 +39,7 @@ }, "tls_insecure_skip_verify": { "default": false, - "description": "If `True`, disables SSL checking to allow insecure requests. This is recommended only during development, e.g. when using self-signed certificates.", + "description": "If `True`, disables SSL checking to allow insecure requests. Setting to False is recommended only during development. For example, when using self-signed certificates.", "supported_environment_variables": [ "PREFECT_API_TLS_INSECURE_SKIP_VERIFY" ], @@ -309,6 +309,16 @@ "ExperimentsSettings": { "description": "Settings for configuring experimental features", "properties": { + "warn": { + "default": true, + "description": "If `True`, warn on usage of experimental features.", + "supported_environment_variables": [ + "PREFECT_EXPERIMENTS_WARN", + "PREFECT_EXPERIMENTAL_WARN" + ], + "title": "Warn", + "type": "boolean" + }, "worker_logging_to_api_enabled": { "default": false, "description": "Enables the logging of worker logs to Prefect Cloud.", @@ -1166,7 +1176,7 @@ }, "messaging_cache": { "default": "prefect.server.utilities.messaging.memory", - "description": "Which cache implementation to use for the events system. Should point to a module that exports a Cache class.", + "description": "Which cache implementation to use for the events system. Should point to a module that exports a Cache class.", "supported_environment_variables": [ "PREFECT_SERVER_EVENTS_MESSAGING_CACHE", "PREFECT_MESSAGING_CACHE" @@ -1961,6 +1971,22 @@ ], "title": "Default Retry Delay Seconds" }, + "default_persist_result": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], + "default": null, + "description": "If `True`, results will be persisted by default for all tasks. Set to `False` to disable persistence by default. Note that setting to `False` will override the behavior set by a parent flow or task.", + "supported_environment_variables": [ + "PREFECT_TASKS_DEFAULT_PERSIST_RESULT" + ], + "title": "Default Persist Result" + }, "runner": { "$ref": "#/$defs/TasksRunnerSettings", "description": "Settings for controlling task runner behavior", @@ -2137,7 +2163,6 @@ }, "client": { "$ref": "#/$defs/ClientSettings", - "description": "Settings for for controlling API client behavior", "supported_environment_variables": [] }, "cloud": { @@ -2217,24 +2242,6 @@ ], "title": "Silence Api Url Misconfiguration", "type": "boolean" - }, - "experimental_warn": { - "default": true, - "description": "If `True`, warn on usage of experimental features.", - "supported_environment_variables": [ - "PREFECT_EXPERIMENTAL_WARN" - ], - "title": "Experimental Warn", - "type": "boolean" - }, - "async_fetch_state_result": { - "default": false, - "description": "\n Determines whether `State.result()` fetches results automatically or not.\n In Prefect 2.6.0, the `State.result()` method was updated to be async\n to facilitate automatic retrieval of results from storage which means when\n writing async code you must `await` the call. For backwards compatibility,\n the result is not retrieved by default for async users. You may opt into this\n per call by passing `fetch=True` or toggle this setting to change the behavior\n globally.\n ", - "supported_environment_variables": [ - "PREFECT_ASYNC_FETCH_STATE_RESULT" - ], - "title": "Async Fetch State Result", - "type": "boolean" } }, "title": "Prefect Settings", diff --git a/scripts/generate_mintlify_openapi_docs.py b/scripts/generate_mintlify_openapi_docs.py index c9f9afaf976f..bed01d170b41 100755 --- a/scripts/generate_mintlify_openapi_docs.py +++ b/scripts/generate_mintlify_openapi_docs.py @@ -7,7 +7,6 @@ from packaging.version import Version -import prefect from prefect.server.api.server import create_app Mint = dict[str, Any] @@ -32,7 +31,9 @@ def current_version() -> str: Return a high-level version string for the current Prefect version, such as "3.1" or "3.1rc". """ - version = Version(prefect.__version__) + # TODO: Handle versioned docs + # version = Version(prefect.__version__) + version = Version("3.0.0") return f"{version.major}.{version.minor}{version.pre[0] if version.pre else ''}" diff --git a/scripts/generate_oss_openapi_schema.py b/scripts/generate_oss_openapi_schema.py index e453e0124635..78847e0434e7 100644 --- a/scripts/generate_oss_openapi_schema.py +++ b/scripts/generate_oss_openapi_schema.py @@ -1,8 +1,13 @@ +# /// script +# dependencies = [ +# "prefect @ file:${PROJECT_ROOT}/../", +# ] +# /// import json -from prefect.server.api.server import create_app +from prefect.server.api.server import create_api_app -app = create_app() +app = create_api_app() openapi_schema = app.openapi() with open("oss_schema.json", "w") as f: diff --git a/scripts/generate_settings_ref.py b/scripts/generate_settings_ref.py index cc918b4966b9..4a1225de070f 100644 --- a/scripts/generate_settings_ref.py +++ b/scripts/generate_settings_ref.py @@ -163,6 +163,7 @@ def main(): "description: Reference for all available settings for Prefect.", "---", "{/* This page is generated by `scripts/generate_settings_ref.py`. Update the generation script to update this page. */}", + "To use `prefect.toml` or `pyproject.toml` for configuration, `prefect>=3.1` must be installed.", "## Root Settings", ] diff --git a/src/integrations/prefect-dask/prefect_dask/task_runners.py b/src/integrations/prefect-dask/prefect_dask/task_runners.py index f4edbab25295..60066faaf870 100644 --- a/src/integrations/prefect-dask/prefect_dask/task_runners.py +++ b/src/integrations/prefect-dask/prefect_dask/task_runners.py @@ -319,7 +319,7 @@ def submit( self, task: "Task[P, Coroutine[Any, Any, R]]", parameters: Dict[str, Any], - wait_for: Optional[Iterable[PrefectFuture]] = None, + wait_for: Optional[Iterable[PrefectDaskFuture[R]]] = None, dependencies: Optional[Dict[str, Set[TaskRunInput]]] = None, ) -> PrefectDaskFuture[R]: ... @@ -329,26 +329,26 @@ def submit( self, task: "Task[Any, R]", parameters: Dict[str, Any], - wait_for: Optional[Iterable[PrefectFuture]] = None, + wait_for: Optional[Iterable[PrefectDaskFuture[R]]] = None, dependencies: Optional[Dict[str, Set[TaskRunInput]]] = None, ) -> PrefectDaskFuture[R]: ... def submit( self, - task: Task, + task: "Union[Task[P, R], Task[P, Coroutine[Any, Any, R]]]", parameters: Dict[str, Any], - wait_for: Optional[Iterable[PrefectFuture]] = None, + wait_for: Optional[Iterable[PrefectDaskFuture[R]]] = None, dependencies: Optional[Dict[str, Set[TaskRunInput]]] = None, - ) -> PrefectDaskFuture: + ) -> PrefectDaskFuture[R]: if not self._started: raise RuntimeError( "The task runner must be started before submitting work." ) - # unpack the upstream call in order to cast Prefect futures to Dask futures - # where possible to optimize Dask task scheduling + # Convert both parameters and wait_for futures to Dask futures parameters = self._optimize_futures(parameters) + wait_for = self._optimize_futures(wait_for) if wait_for else None future = self._client.submit( task, @@ -357,7 +357,9 @@ def submit( dependencies=dependencies, return_type="state", ) - return PrefectDaskFuture(wrapped_future=future, task_run_id=future.task_run_id) + return PrefectDaskFuture[R]( + wrapped_future=future, task_run_id=future.task_run_id + ) @overload def map( diff --git a/src/integrations/prefect-dask/tests/conftest.py b/src/integrations/prefect-dask/tests/conftest.py index 7292781b3329..338bc8fdae28 100644 --- a/src/integrations/prefect-dask/tests/conftest.py +++ b/src/integrations/prefect-dask/tests/conftest.py @@ -4,7 +4,6 @@ import pytest -from prefect.settings import PREFECT_ASYNC_FETCH_STATE_RESULT, temporary_settings from prefect.testing.utilities import prefect_test_harness @@ -46,9 +45,3 @@ def event_loop(request): # Workaround for failures in pytest_asyncio 0.17; # see https://github.com/pytest-dev/pytest-asyncio/issues/257 policy.set_event_loop(loop) - - -@pytest.fixture(autouse=True) -def fetch_state_result(): - with temporary_settings(updates={PREFECT_ASYNC_FETCH_STATE_RESULT: True}): - yield diff --git a/src/integrations/prefect-dask/tests/test_task_runners.py b/src/integrations/prefect-dask/tests/test_task_runners.py index 748de299c65e..d1bc5c8bec0b 100644 --- a/src/integrations/prefect-dask/tests/test_task_runners.py +++ b/src/integrations/prefect-dask/tests/test_task_runners.py @@ -452,3 +452,49 @@ def umbrella_flow(): return future.result() assert umbrella_flow() == "nested task" + + def test_state_dependencies_via_wait_for(self, task_runner): + @task + def task_a(): + return time.time() + + @task + def task_b(): + return time.time() + + @flow(task_runner=task_runner) + def test_flow() -> tuple[float, float]: + a = task_a.submit() + b = task_b.submit(wait_for=[a]) + return a.result(), b.result() + + a_time, b_time = test_flow() + + assert b_time > a_time, "task_b timestamp should be after task_a timestamp" + + def test_state_dependencies_via_wait_for_disparate_upstream_tasks( + self, task_runner + ): + @task + def task_a(): + return time.time() + + @task + def task_b(): + return time.time() + + @task + def task_c(): + return time.time() + + @flow(task_runner=task_runner) + def test_flow() -> tuple[float, float, float]: + a = task_a.submit() + b = task_b.submit() + c = task_c.submit(wait_for=[a, b]) + + return a.result(), b.result(), c.result() + + a_time, b_time, c_time = test_flow() + + assert c_time > a_time and c_time > b_time diff --git a/src/integrations/prefect-kubernetes/prefect_kubernetes/settings.py b/src/integrations/prefect-kubernetes/prefect_kubernetes/settings.py new file mode 100644 index 000000000000..4dbada798b57 --- /dev/null +++ b/src/integrations/prefect-kubernetes/prefect_kubernetes/settings.py @@ -0,0 +1,53 @@ +from typing import Optional + +from pydantic import AliasChoices, AliasPath, Field + +from prefect.settings.base import PrefectBaseSettings, _build_settings_config + + +class KubernetesWorkerSettings(PrefectBaseSettings): + model_config = _build_settings_config(("integrations", "kubernetes", "worker")) + + api_key_secret_name: Optional[str] = Field( + default=None, + description="The name of the secret the worker's API key is stored in.", + ) + + create_secret_for_api_key: bool = Field( + default=False, + description="If `True`, the worker will create a secret in the same namespace as created Kubernetes jobs to store the Prefect API key.", + validation_alias=AliasChoices( + AliasPath("create_secret_for_api_key"), + "prefect_integrations_kubernetes_worker_create_secret_for_api_key", + "prefect_kubernetes_worker_store_prefect_api_in_secret", + ), + ) + + add_tcp_keepalive: bool = Field( + default=True, + description="If `True`, the worker will add TCP keepalive to the Kubernetes client.", + validation_alias=AliasChoices( + AliasPath("add_tcp_keepalive"), + "prefect_integrations_kubernetes_worker_add_tcp_keepalive", + "prefect_kubernetes_worker_add_tcp_keepalive", + ), + ) + + +class KubernetesSettings(PrefectBaseSettings): + model_config = _build_settings_config(("integrations", "kubernetes")) + + cluster_uid: Optional[str] = Field( + default=None, + description="A unique identifier for the current cluster being used.", + validation_alias=AliasChoices( + AliasPath("cluster_uid"), + "prefect_integrations_kubernetes_cluster_uid", + "prefect_kubernetes_cluster_uid", + ), + ) + + worker: KubernetesWorkerSettings = Field( + description="Settings for controlling Kubernetes worker behavior.", + default_factory=KubernetesWorkerSettings, + ) diff --git a/src/integrations/prefect-kubernetes/prefect_kubernetes/worker.py b/src/integrations/prefect-kubernetes/prefect_kubernetes/worker.py index e51e66667fe8..d23c64f5897e 100644 --- a/src/integrations/prefect-kubernetes/prefect_kubernetes/worker.py +++ b/src/integrations/prefect-kubernetes/prefect_kubernetes/worker.py @@ -14,11 +14,11 @@ ### Securing your Prefect Cloud API key If you are using Prefect Cloud and would like to pass your Prefect Cloud API key to created jobs via a Kubernetes secret, set the -`PREFECT_KUBERNETES_WORKER_STORE_PREFECT_API_IN_SECRET` environment variable before +`PREFECT_INTEGRATIONS_KUBERNETES_WORKER_CREATE_SECRET_FOR_API_KEY` environment variable before starting your worker: ```bash -export PREFECT_KUBERNETES_WORKER_STORE_PREFECT_API_IN_SECRET="true" +export PREFECT_INTEGRATIONS_KUBERNETES_WORKER_CREATE_SECRET_FOR_API_KEY="true" prefect worker start --pool 'my-work-pool' --type kubernetes ``` @@ -105,7 +105,6 @@ import enum import json import logging -import os import shlex from contextlib import asynccontextmanager from datetime import datetime @@ -160,6 +159,7 @@ ) from prefect_kubernetes.credentials import KubernetesClusterConfig from prefect_kubernetes.events import KubernetesEventsReplicator +from prefect_kubernetes.settings import KubernetesSettings from prefect_kubernetes.utilities import ( KeepAliveClientRequest, _slugify_label_key, @@ -650,6 +650,7 @@ async def _get_configured_kubernetes_client( Returns a configured Kubernetes client. """ client = None + settings = KubernetesSettings() if configuration.cluster_config: config_dict = configuration.cluster_config.config @@ -667,9 +668,7 @@ async def _get_configured_kubernetes_client( # If in-cluster config fails, load the local kubeconfig client = await config.new_client_from_config() - if os.environ.get( - "PREFECT_KUBERNETES_WORKER_ADD_TCP_KEEPALIVE", "TRUE" - ).strip().lower() in ("true", "1"): + if settings.worker.add_tcp_keepalive: client.rest_client.pool_manager._request_class = KeepAliveClientRequest try: @@ -678,7 +677,10 @@ async def _get_configured_kubernetes_client( await client.close() async def _replace_api_key_with_secret( - self, configuration: KubernetesWorkerJobConfiguration, client: "ApiClient" + self, + configuration: KubernetesWorkerJobConfiguration, + client: "ApiClient", + secret_name: Optional[str] = None, ): """Replaces the PREFECT_API_KEY environment variable with a Kubernetes secret""" manifest_env = configuration.job_manifest["spec"]["template"]["spec"][ @@ -693,7 +695,7 @@ async def _replace_api_key_with_secret( {}, ) api_key = manifest_api_key_env.get("value") - if api_key: + if api_key and not secret_name: secret_name = f"prefect-{_slugify_name(self.name)}-api-key" secret = await self._upsert_secret( name=secret_name, @@ -706,6 +708,7 @@ async def _replace_api_key_with_secret( self._created_secrets[ (secret.metadata.name, secret.metadata.namespace) ] = configuration + if secret_name: new_api_env_entry = { "name": "PREFECT_API_KEY", "valueFrom": {"secretKeyRef": {"name": secret_name, "key": "value"}}, @@ -733,9 +736,14 @@ async def _create_job( """ Creates a Kubernetes job from a job manifest. """ - if os.environ.get( - "PREFECT_KUBERNETES_WORKER_STORE_PREFECT_API_IN_SECRET", "" - ).strip().lower() in ("true", "1"): + settings = KubernetesSettings() + if settings.worker.api_key_secret_name: + await self._replace_api_key_with_secret( + configuration=configuration, + client=client, + secret_name=settings.worker.api_key_secret_name, + ) + elif settings.worker.create_secret_for_api_key: await self._replace_api_key_with_secret( configuration=configuration, client=client ) @@ -838,8 +846,9 @@ async def _get_cluster_uid(self, client: "ApiClient") -> str: See https://github.com/kubernetes/kubernetes/issues/44954 """ + settings = KubernetesSettings() # Default to an environment variable - env_cluster_uid = os.environ.get("PREFECT_KUBERNETES_CLUSTER_UID") + env_cluster_uid = settings.cluster_uid if env_cluster_uid: return env_cluster_uid diff --git a/src/integrations/prefect-kubernetes/pyproject.toml b/src/integrations/prefect-kubernetes/pyproject.toml index 37245b5e0fec..530e5827d134 100644 --- a/src/integrations/prefect-kubernetes/pyproject.toml +++ b/src/integrations/prefect-kubernetes/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta" [project] dependencies = [ - "prefect>=3.0.0rc1", + "prefect>=3.1.0", "kubernetes-asyncio>=29.0.0", "tenacity>=8.2.3", "exceptiongroup", diff --git a/src/integrations/prefect-kubernetes/tests/test_settings.py b/src/integrations/prefect-kubernetes/tests/test_settings.py new file mode 100644 index 000000000000..1f808d5c005a --- /dev/null +++ b/src/integrations/prefect-kubernetes/tests/test_settings.py @@ -0,0 +1,111 @@ +import os + +import toml +from prefect_kubernetes.settings import KubernetesSettings + + +def test_set_values_via_environment_variables(monkeypatch): + monkeypatch.setenv( + "PREFECT_INTEGRATIONS_KUBERNETES_WORKER_API_KEY_SECRET_NAME", "test-secret" + ) + monkeypatch.setenv( + "PREFECT_INTEGRATIONS_KUBERNETES_WORKER_CREATE_SECRET_FOR_API_KEY", "true" + ) + monkeypatch.setenv( + "PREFECT_INTEGRATIONS_KUBERNETES_WORKER_ADD_TCP_KEEPALIVE", "false" + ) + monkeypatch.setenv( + "PREFECT_INTEGRATIONS_KUBERNETES_CLUSTER_UID", "test-cluster-uid" + ) + + settings = KubernetesSettings() + + assert settings.worker.api_key_secret_name == "test-secret" + assert settings.worker.create_secret_for_api_key is True + assert settings.worker.add_tcp_keepalive is False + assert settings.cluster_uid == "test-cluster-uid" + + +def test_set_values_via_dot_env_file(tmp_path): + dot_env_path = tmp_path / ".env" + with open(dot_env_path, "w") as f: + f.write( + "PREFECT_INTEGRATIONS_KUBERNETES_WORKER_API_KEY_SECRET_NAME=test-secret\n" + "PREFECT_INTEGRATIONS_KUBERNETES_WORKER_CREATE_SECRET_FOR_API_KEY=true\n" + "PREFECT_INTEGRATIONS_KUBERNETES_WORKER_ADD_TCP_KEEPALIVE=false\n" + "PREFECT_INTEGRATIONS_KUBERNETES_CLUSTER_UID=test-cluster-uid\n" + ) + + original_dir = os.getcwd() + try: + os.chdir(tmp_path) + settings = KubernetesSettings() + finally: + os.chdir(original_dir) + + assert settings.worker.api_key_secret_name == "test-secret" + assert settings.worker.create_secret_for_api_key is True + assert settings.worker.add_tcp_keepalive is False + assert settings.cluster_uid == "test-cluster-uid" + + +def test_set_values_via_prefect_toml_file(tmp_path): + toml_path = tmp_path / "prefect.toml" + toml_data = { + "integrations": { + "kubernetes": { + "worker": { + "api_key_secret_name": "test-secret", + "create_secret_for_api_key": True, + "add_tcp_keepalive": False, + }, + "cluster_uid": "test-cluster-uid", + }, + }, + } + toml_path.write_text(toml.dumps(toml_data)) + + original_dir = os.getcwd() + try: + os.chdir(tmp_path) + settings = KubernetesSettings() + finally: + os.chdir(original_dir) + + assert settings.worker.api_key_secret_name == "test-secret" + assert settings.worker.create_secret_for_api_key is True + assert settings.worker.add_tcp_keepalive is False + assert settings.cluster_uid == "test-cluster-uid" + + +def test_set_values_via_pyproject_toml_file(tmp_path): + pyproject_toml_path = tmp_path / "pyproject.toml" + pyproject_toml_data = { + "tool": { + "prefect": { + "integrations": { + "kubernetes": { + "cluster_uid": "test-cluster-uid", + "worker": { + "api_key_secret_name": "test-secret", + "create_secret_for_api_key": True, + "add_tcp_keepalive": False, + }, + }, + }, + }, + }, + } + pyproject_toml_path.write_text(toml.dumps(pyproject_toml_data)) + + original_dir = os.getcwd() + try: + os.chdir(tmp_path) + settings = KubernetesSettings() + finally: + os.chdir(original_dir) + + assert settings.worker.api_key_secret_name == "test-secret" + assert settings.worker.create_secret_for_api_key is True + assert settings.worker.add_tcp_keepalive is False + assert settings.cluster_uid == "test-cluster-uid" diff --git a/src/integrations/prefect-kubernetes/tests/test_worker.py b/src/integrations/prefect-kubernetes/tests/test_worker.py index 993841e0c23c..04deb4ce2c5a 100644 --- a/src/integrations/prefect-kubernetes/tests/test_worker.py +++ b/src/integrations/prefect-kubernetes/tests/test_worker.py @@ -188,7 +188,17 @@ async def mock_stream(*args, **kwargs): @pytest.fixture def enable_store_api_key_in_secret(monkeypatch): - monkeypatch.setenv("PREFECT_KUBERNETES_WORKER_STORE_PREFECT_API_IN_SECRET", "true") + monkeypatch.setenv( + "PREFECT_INTEGRATIONS_KUBERNETES_WORKER_CREATE_SECRET_FOR_API_KEY", "true" + ) + + +@pytest.fixture +def mock_api_key_secret_name(monkeypatch): + monkeypatch.setenv( + "PREFECT_INTEGRATIONS_KUBERNETES_WORKER_API_KEY_SECRET_NAME", "test-secret" + ) + return "test-secret" from_template_and_values_cases = [ @@ -1609,6 +1619,104 @@ async def test_store_api_key_in_existing_secret( ), ) + async def test_use_existing_secret_name( + self, + flow_run, + mock_core_client, + mock_watch, + mock_pods_stream_that_returns_running_pod, + mock_batch_client, + mock_api_key_secret_name, + ): + mock_watch.return_value.stream = mock_pods_stream_that_returns_running_pod + + configuration = await KubernetesWorkerJobConfiguration.from_template_and_values( + KubernetesWorker.get_default_base_job_template(), {"image": "foo"} + ) + with temporary_settings(updates={PREFECT_API_KEY: "fake"}): + async with KubernetesWorker(work_pool_name="test") as k8s_worker: + mock_core_client.return_value.read_namespaced_secret.return_value = ( + V1Secret( + api_version="v1", + kind="Secret", + metadata=V1ObjectMeta( + name=f"prefect-{_slugify_name(k8s_worker.name)}-api-key", + namespace=configuration.namespace, + ), + data={ + "value": base64.b64encode("fake".encode("utf-8")).decode( + "utf-8" + ) + }, + ) + ) + + configuration.prepare_for_flow_run(flow_run=flow_run) + await k8s_worker.run(flow_run, configuration) + mock_batch_client.return_value.create_namespaced_job.assert_called_once() + env = mock_batch_client.return_value.create_namespaced_job.call_args[0][ + 1 + ]["spec"]["template"]["spec"]["containers"][0]["env"] + assert { + "name": "PREFECT_API_KEY", + "valueFrom": { + "secretKeyRef": { + "name": mock_api_key_secret_name, + "key": "value", + } + }, + } in env + + async def test_existing_secret_name_takes_precedence( + self, + flow_run, + mock_core_client, + mock_watch, + mock_pods_stream_that_returns_running_pod, + mock_batch_client, + mock_api_key_secret_name, + enable_store_api_key_in_secret, + ): + mock_watch.return_value.stream = mock_pods_stream_that_returns_running_pod + + configuration = await KubernetesWorkerJobConfiguration.from_template_and_values( + KubernetesWorker.get_default_base_job_template(), {"image": "foo"} + ) + with temporary_settings(updates={PREFECT_API_KEY: "fake"}): + async with KubernetesWorker(work_pool_name="test") as k8s_worker: + mock_core_client.return_value.read_namespaced_secret.return_value = ( + V1Secret( + api_version="v1", + kind="Secret", + metadata=V1ObjectMeta( + name=f"prefect-{_slugify_name(k8s_worker.name)}-api-key", + namespace=configuration.namespace, + ), + data={ + "value": base64.b64encode("fake".encode("utf-8")).decode( + "utf-8" + ) + }, + ) + ) + + configuration.prepare_for_flow_run(flow_run=flow_run) + await k8s_worker.run(flow_run, configuration) + mock_batch_client.return_value.create_namespaced_job.assert_called_once() + env = mock_batch_client.return_value.create_namespaced_job.call_args[0][ + 1 + ]["spec"]["template"]["spec"]["containers"][0]["env"] + assert { + "name": "PREFECT_API_KEY", + "valueFrom": { + "secretKeyRef": { + "name": mock_api_key_secret_name, + "key": "value", + } + }, + } in env + mock_core_client.return_value.replace_namespaced_secret.assert_not_called() + async def test_create_job_failure( self, flow_run, diff --git a/src/integrations/prefect-ray/tests/conftest.py b/src/integrations/prefect-ray/tests/conftest.py index fe650e4b8b90..3723fce5f3d5 100644 --- a/src/integrations/prefect-ray/tests/conftest.py +++ b/src/integrations/prefect-ray/tests/conftest.py @@ -1,6 +1,5 @@ import pytest -from prefect.settings import PREFECT_ASYNC_FETCH_STATE_RESULT, temporary_settings from prefect.testing.utilities import prefect_test_harness @@ -8,9 +7,3 @@ def prefect_db(): with prefect_test_harness(): yield - - -@pytest.fixture(autouse=True) -def fetch_state_result(): - with temporary_settings(updates={PREFECT_ASYNC_FETCH_STATE_RESULT: True}): - yield diff --git a/src/integrations/prefect-sqlalchemy/tests/conftest.py b/src/integrations/prefect-sqlalchemy/tests/conftest.py index 70ecf5f1c256..a06c90e85232 100644 --- a/src/integrations/prefect-sqlalchemy/tests/conftest.py +++ b/src/integrations/prefect-sqlalchemy/tests/conftest.py @@ -1,6 +1,5 @@ import pytest -from prefect.settings import PREFECT_ASYNC_FETCH_STATE_RESULT, temporary_settings from prefect.testing.utilities import prefect_test_harness @@ -11,9 +10,3 @@ def prefect_db(): """ with prefect_test_harness(): yield - - -@pytest.fixture(autouse=True) -def fetch_state_result(): - with temporary_settings(updates={PREFECT_ASYNC_FETCH_STATE_RESULT: True}): - yield diff --git a/src/prefect/_internal/compatibility/async_dispatch.py b/src/prefect/_internal/compatibility/async_dispatch.py new file mode 100644 index 000000000000..f9aa1b367393 --- /dev/null +++ b/src/prefect/_internal/compatibility/async_dispatch.py @@ -0,0 +1,73 @@ +import asyncio +import inspect +from functools import wraps +from typing import Any, Callable, Coroutine, Protocol, TypeVar, Union + +from typing_extensions import ParamSpec + +R = TypeVar("R") +P = ParamSpec("P") + + +class AsyncDispatchable(Protocol[P, R]): + """Protocol for functions decorated with async_dispatch.""" + + def __call__( + self, *args: P.args, **kwargs: P.kwargs + ) -> Union[R, Coroutine[Any, Any, R]]: + ... + + aio: Callable[P, Coroutine[Any, Any, R]] + sync: Callable[P, R] + + +def is_in_async_context() -> bool: + """Check if we're in an async context.""" + try: + # First check if we're in a coroutine + if asyncio.current_task() is not None: + return True + + # Check if we have a loop and it's running + loop = asyncio.get_event_loop() + return loop.is_running() + except RuntimeError: + return False + + +def async_dispatch( + async_impl: Callable[P, Coroutine[Any, Any, R]], +) -> Callable[[Callable[P, R]], AsyncDispatchable[P, R]]: + """ + Decorator that adds async compatibility to a sync function. + + The decorated function will: + - Return a coroutine when in an async context (detected via running event loop) + - Run synchronously when in a sync context + - Provide .aio for explicit async access + - Provide .sync for explicit sync access + + Args: + async_impl: The async implementation to dispatch to when async execution + is needed + """ + if not inspect.iscoroutinefunction(async_impl): + raise TypeError( + "async_impl must be an async function to dispatch in async contexts" + ) + + def decorator(sync_fn: Callable[P, R]) -> AsyncDispatchable[P, R]: + @wraps(sync_fn) + def wrapper( + *args: P.args, **kwargs: P.kwargs + ) -> Union[R, Coroutine[Any, Any, R]]: + if is_in_async_context(): + return async_impl(*args, **kwargs) + return sync_fn(*args, **kwargs) + + # Attach both async and sync implementations directly + wrapper.aio = async_impl + wrapper.sync = sync_fn + return wrapper # type: ignore + + return decorator diff --git a/src/prefect/cli/config.py b/src/prefect/cli/config.py index 16358c47a0a5..aa9b7255ae4e 100644 --- a/src/prefect/cli/config.py +++ b/src/prefect/cli/config.py @@ -251,7 +251,7 @@ def _process_toml_settings( _process_setting(setting, env_value, "env") # Process settings from .env file - for key, value in dotenv_values().items(): + for key, value in dotenv_values(".env").items(): if key in VALID_SETTING_NAMES: setting = _get_settings_fields(prefect.settings.Settings)[key] if setting.name in processed_settings or value is None: diff --git a/src/prefect/client/orchestration.py b/src/prefect/client/orchestration.py index 1668bd02df14..cd0ccec4c948 100644 --- a/src/prefect/client/orchestration.py +++ b/src/prefect/client/orchestration.py @@ -99,6 +99,7 @@ TaskRunResult, Variable, Worker, + WorkerMetadata, WorkPool, WorkQueue, WorkQueueStatusDetail, @@ -2596,6 +2597,7 @@ async def send_worker_heartbeat( worker_name: str, heartbeat_interval_seconds: Optional[float] = None, get_worker_id: bool = False, + worker_metadata: Optional[WorkerMetadata] = None, ) -> Optional[UUID]: """ Sends a worker heartbeat for a given work pool. @@ -2604,20 +2606,20 @@ async def send_worker_heartbeat( work_pool_name: The name of the work pool to heartbeat against. worker_name: The name of the worker sending the heartbeat. return_id: Whether to return the worker ID. Note: will return `None` if the connected server does not support returning worker IDs, even if `return_id` is `True`. + worker_metadata: Metadata about the worker to send to the server. """ - + params = { + "name": worker_name, + "heartbeat_interval_seconds": heartbeat_interval_seconds, + } + if worker_metadata: + params["worker_metadata"] = worker_metadata.model_dump(mode="json") if get_worker_id: - return_dict = {"return_id": get_worker_id} - else: - return_dict = {} + params["return_id"] = get_worker_id resp = await self._client.post( f"/work_pools/{work_pool_name}/workers/heartbeat", - json={ - "name": worker_name, - "heartbeat_interval_seconds": heartbeat_interval_seconds, - } - | return_dict, + json=params, ) if ( diff --git a/src/prefect/client/schemas/objects.py b/src/prefect/client/schemas/objects.py index 61fc07daa6cd..b4f2fc31cbee 100644 --- a/src/prefect/client/schemas/objects.py +++ b/src/prefect/client/schemas/objects.py @@ -32,6 +32,7 @@ from pydantic_extra_types.pendulum_dt import DateTime from typing_extensions import Literal, Self, TypeVar +from prefect._internal.compatibility import deprecated from prefect._internal.compatibility.migration import getattr_migration from prefect._internal.schemas.bases import ObjectBaseModel, PrefectBaseModel from prefect._internal.schemas.fields import CreatedBy, UpdatedBy @@ -220,10 +221,17 @@ def result(self: "State[R]", raise_on_failure: bool = True) -> R: def result(self: "State[R]", raise_on_failure: bool = False) -> Union[R, Exception]: ... + @deprecated.deprecated_parameter( + "fetch", + when=lambda fetch: fetch is not True, + start_date="Oct 2024", + end_date="Jan 2025", + help="Please ensure you are awaiting the call to `result()` when calling in an async context.", + ) def result( self, raise_on_failure: bool = True, - fetch: Optional[bool] = None, + fetch: bool = True, retry_result_failure: bool = True, ) -> Union[R, Exception]: """ @@ -248,22 +256,6 @@ def result( The result of the run Examples: - >>> from prefect import flow, task - >>> @task - >>> def my_task(x): - >>> return x - - Get the result from a task future in a flow - - >>> @flow - >>> def my_flow(): - >>> future = my_task("hello") - >>> state = future.wait() - >>> result = state.result() - >>> print(result) - >>> my_flow() - hello - Get the result from a flow state >>> @flow @@ -307,7 +299,7 @@ def result( >>> raise ValueError("oh no!") >>> my_flow.deploy("my_deployment/my_flow") >>> flow_run = run_deployment("my_deployment/my_flow") - >>> await flow_run.state.result(raise_on_failure=True, fetch=True) # Raises `ValueError("oh no!")` + >>> await flow_run.state.result(raise_on_failure=True) # Raises `ValueError("oh no!")` """ from prefect.states import get_state_result @@ -1697,3 +1689,24 @@ class CsrfToken(ObjectBaseModel): __getattr__ = getattr_migration(__name__) + + +class Integration(PrefectBaseModel): + """A representation of an installed Prefect integration.""" + + name: str = Field(description="The name of the Prefect integration.") + version: str = Field(description="The version of the Prefect integration.") + + +class WorkerMetadata(PrefectBaseModel): + """ + Worker metadata. + + We depend on the structure of `integrations`, but otherwise, worker classes + should support flexible metadata. + """ + + integrations: List[Integration] = Field( + default=..., description="Prefect integrations installed in the worker." + ) + model_config = ConfigDict(extra="allow") diff --git a/src/prefect/context.py b/src/prefect/context.py index f9eb82db01c1..f4ae26606196 100644 --- a/src/prefect/context.py +++ b/src/prefect/context.py @@ -38,7 +38,11 @@ from prefect.client.schemas import FlowRun, TaskRun from prefect.events.worker import EventsWorker from prefect.exceptions import MissingContextError -from prefect.results import ResultStore, get_default_persist_setting +from prefect.results import ( + ResultStore, + get_default_persist_setting, + get_default_persist_setting_for_tasks, +) from prefect.settings import Profile, Settings from prefect.settings.legacy import _get_settings_fields from prefect.states import State @@ -397,7 +401,7 @@ class TaskRunContext(RunContext): # Result handling result_store: ResultStore - persist_result: bool = Field(default_factory=get_default_persist_setting) + persist_result: bool = Field(default_factory=get_default_persist_setting_for_tasks) __var__ = ContextVar("task_run") diff --git a/src/prefect/logging/handlers.py b/src/prefect/logging/handlers.py index 863cac5a8cda..743040ff37ca 100644 --- a/src/prefect/logging/handlers.py +++ b/src/prefect/logging/handlers.py @@ -32,6 +32,7 @@ PREFECT_LOGGING_TO_API_BATCH_SIZE, PREFECT_LOGGING_TO_API_MAX_LOG_SIZE, PREFECT_LOGGING_TO_API_WHEN_MISSING_FLOW, + get_current_settings, ) @@ -236,6 +237,44 @@ def _get_payload_size(self, log: Dict[str, Any]) -> int: return len(json.dumps(log).encode()) +class WorkerAPILogHandler(APILogHandler): + def emit(self, record: logging.LogRecord): + if get_current_settings().experiments.worker_logging_to_api_enabled: + super().emit(record) + else: + return + + def prepare(self, record: logging.LogRecord) -> Dict[str, Any]: + """ + Convert a `logging.LogRecord` to the API `LogCreate` schema and serialize. + + This will add in the worker id to the log. + + Logs exceeding the maximum size will be dropped. + """ + + worker_id = getattr(record, "worker_id", None) + + log = LogCreate( + worker_id=worker_id, + name=record.name, + level=record.levelno, + timestamp=pendulum.from_timestamp( + getattr(record, "created", None) or time.time() + ), + message=self.format(record), + ).model_dump(mode="json") + + log_size = log["__payload_size__"] = self._get_payload_size(log) + if log_size > PREFECT_LOGGING_TO_API_MAX_LOG_SIZE.value(): + raise ValueError( + f"Log of size {log_size} is greater than the max size of " + f"{PREFECT_LOGGING_TO_API_MAX_LOG_SIZE.value()}" + ) + + return log + + class PrefectConsoleHandler(logging.StreamHandler): def __init__( self, diff --git a/src/prefect/logging/loggers.py b/src/prefect/logging/loggers.py index 724574402860..b321d2f1aee3 100644 --- a/src/prefect/logging/loggers.py +++ b/src/prefect/logging/loggers.py @@ -19,6 +19,7 @@ from prefect.context import RunContext from prefect.flows import Flow from prefect.tasks import Task + from prefect.workers.base import BaseWorker class PrefectLogAdapter(logging.LoggerAdapter): @@ -205,6 +206,29 @@ def task_run_logger( ) +def get_worker_logger(worker: "BaseWorker", name: Optional[str] = None): + """ + Create a worker logger with the worker's metadata attached. + + If the worker has a backend_id, it will be attached to the log records. + If the worker does not have a backend_id a basic logger will be returned. + If the worker does not have a backend_id attribute, a basic logger will be returned. + """ + + worker_log_name = name or f"workers.{worker.__class__.type}.{worker.name.lower()}" + + worker_id = getattr(worker, "backend_id", None) + if worker_id: + return PrefectLogAdapter( + get_logger(worker_log_name), + extra={ + "worker_id": str(worker.backend_id), + }, + ) + else: + return get_logger(worker_log_name) + + @contextmanager def disable_logger(name: str): """ diff --git a/src/prefect/logging/logging.yml b/src/prefect/logging/logging.yml index 08ff56643826..c38d740c5622 100644 --- a/src/prefect/logging/logging.yml +++ b/src/prefect/logging/logging.yml @@ -69,6 +69,10 @@ handlers: class: logging.StreamHandler formatter: debug + worker_api: + level: 0 + class: prefect.logging.handlers.WorkerAPILogHandler + loggers: prefect: level: "${PREFECT_LOGGING_LEVEL}" @@ -86,6 +90,10 @@ loggers: level: NOTSET handlers: [api] + prefect.workers: + level: NOTSET + handlers: [worker_api] + prefect.server: level: "${PREFECT_SERVER_LOGGING_LEVEL}" diff --git a/src/prefect/results.py b/src/prefect/results.py index d0a5cdc1ea71..dd17f614953d 100644 --- a/src/prefect/results.py +++ b/src/prefect/results.py @@ -56,13 +56,7 @@ from prefect.locking.protocol import LockManager from prefect.logging import get_logger from prefect.serializers import PickleSerializer, Serializer -from prefect.settings import ( - PREFECT_DEFAULT_RESULT_STORAGE_BLOCK, - PREFECT_LOCAL_STORAGE_PATH, - PREFECT_RESULTS_DEFAULT_SERIALIZER, - PREFECT_RESULTS_PERSIST_BY_DEFAULT, - PREFECT_TASK_SCHEDULING_DEFAULT_STORAGE_BLOCK, -) +from prefect.settings.context import get_current_settings from prefect.utilities.annotations import NotSet from prefect.utilities.asyncutils import sync_compatible from prefect.utilities.pydantic import get_dispatch_key, lookup_type, register_base_type @@ -94,8 +88,9 @@ async def get_default_result_storage() -> WritableFileSystem: """ Generate a default file system for result storage. """ - default_block = PREFECT_DEFAULT_RESULT_STORAGE_BLOCK.value() - basepath = PREFECT_LOCAL_STORAGE_PATH.value() + settings = get_current_settings() + default_block = settings.results.default_storage_block + basepath = settings.results.local_storage_path cache_key = (str(default_block), str(basepath)) @@ -169,13 +164,14 @@ async def get_or_create_default_task_scheduling_storage() -> ResultStorage: """ Generate a default file system for background task parameter/result storage. """ - default_block = PREFECT_TASK_SCHEDULING_DEFAULT_STORAGE_BLOCK.value() + settings = get_current_settings() + default_block = settings.tasks.scheduling.default_storage_block if default_block is not None: return await Block.load(default_block) # otherwise, use the local file system - basepath = PREFECT_LOCAL_STORAGE_PATH.value() + basepath = settings.results.local_storage_path return LocalFileSystem(basepath=basepath) @@ -183,22 +179,36 @@ def get_default_result_serializer() -> Serializer: """ Generate a default file system for result storage. """ - return resolve_serializer(PREFECT_RESULTS_DEFAULT_SERIALIZER.value()) + settings = get_current_settings() + return resolve_serializer(settings.results.default_serializer) def get_default_persist_setting() -> bool: """ - Return the default option for result persistence (False). + Return the default option for result persistence. + """ + settings = get_current_settings() + return settings.results.persist_by_default + + +def get_default_persist_setting_for_tasks() -> bool: + """ + Return the default option for result persistence for tasks. """ - return PREFECT_RESULTS_PERSIST_BY_DEFAULT.value() + settings = get_current_settings() + return ( + settings.tasks.default_persist_result + if settings.tasks.default_persist_result is not None + else settings.results.persist_by_default + ) def should_persist_result() -> bool: """ Return the default option for result persistence determined by the current run context. - If there is no current run context, the default value set by - `PREFECT_RESULTS_PERSIST_BY_DEFAULT` will be returned. + If there is no current run context, the value of `results.persist_by_default` on the + current settings will be returned. """ from prefect.context import FlowRunContext, TaskRunContext @@ -209,7 +219,7 @@ def should_persist_result() -> bool: if flow_run_context is not None: return flow_run_context.persist_result - return PREFECT_RESULTS_PERSIST_BY_DEFAULT.value() + return get_default_persist_setting() def _format_user_supplied_storage_key(key: str) -> str: diff --git a/src/prefect/settings/models/api.py b/src/prefect/settings/models/api.py index 899b73214b1c..2ece448009a4 100644 --- a/src/prefect/settings/models/api.py +++ b/src/prefect/settings/models/api.py @@ -25,7 +25,7 @@ class APISettings(PrefectBaseSettings): ) tls_insecure_skip_verify: bool = Field( default=False, - description="If `True`, disables SSL checking to allow insecure requests. This is recommended only during development, e.g. when using self-signed certificates.", + description="If `True`, disables SSL checking to allow insecure requests. Setting to False is recommended only during development. For example, when using self-signed certificates.", ) ssl_cert_file: Optional[str] = Field( default=os.environ.get("SSL_CERT_FILE"), diff --git a/src/prefect/settings/models/experiments.py b/src/prefect/settings/models/experiments.py index e0e6f7a33ea0..e5617cf3c1cf 100644 --- a/src/prefect/settings/models/experiments.py +++ b/src/prefect/settings/models/experiments.py @@ -1,4 +1,4 @@ -from pydantic import Field +from pydantic import AliasChoices, AliasPath, Field from prefect.settings.base import PrefectBaseSettings, _build_settings_config @@ -10,6 +10,14 @@ class ExperimentsSettings(PrefectBaseSettings): model_config = _build_settings_config(("experiments",)) + warn: bool = Field( + default=True, + description="If `True`, warn on usage of experimental features.", + validation_alias=AliasChoices( + AliasPath("warn"), "prefect_experiments_warn", "prefect_experimental_warn" + ), + ) + worker_logging_to_api_enabled: bool = Field( default=False, description="Enables the logging of worker logs to Prefect Cloud.", diff --git a/src/prefect/settings/models/logging.py b/src/prefect/settings/models/logging.py index 8793e99b79fb..c653bae43039 100644 --- a/src/prefect/settings/models/logging.py +++ b/src/prefect/settings/models/logging.py @@ -1,11 +1,18 @@ +from functools import partial from pathlib import Path from typing import Annotated, Literal, Optional, Union -from pydantic import AfterValidator, AliasChoices, AliasPath, Field, model_validator +from pydantic import ( + AliasChoices, + AliasPath, + BeforeValidator, + Field, + model_validator, +) from typing_extensions import Self from prefect.settings.base import PrefectBaseSettings, _build_settings_config -from prefect.types import LogLevel +from prefect.types import LogLevel, validate_set_T_from_delim_string def max_log_size_smaller_than_batch_size(values): @@ -97,7 +104,7 @@ class LoggingSettings(PrefectBaseSettings): extra_loggers: Annotated[ Union[str, list[str], None], - AfterValidator(lambda v: [n.strip() for n in v.split(",")] if v else []), + BeforeValidator(partial(validate_set_T_from_delim_string, type_=str)), ] = Field( default=None, description="Additional loggers to attach to Prefect logging at runtime.", diff --git a/src/prefect/settings/models/root.py b/src/prefect/settings/models/root.py index fa701ca45284..75d5d7caa11d 100644 --- a/src/prefect/settings/models/root.py +++ b/src/prefect/settings/models/root.py @@ -72,7 +72,7 @@ class Settings(PrefectBaseSettings): client: ClientSettings = Field( default_factory=ClientSettings, - description="Settings for for controlling API client behavior", + description="Settings for controlling API client behavior", ) cloud: CloudSettings = Field( @@ -149,25 +149,6 @@ class Settings(PrefectBaseSettings): """, ) - experimental_warn: bool = Field( - default=True, - description="If `True`, warn on usage of experimental features.", - ) - - # this setting needs to be removed - async_fetch_state_result: bool = Field( - default=False, - description=""" - Determines whether `State.result()` fetches results automatically or not. - In Prefect 2.6.0, the `State.result()` method was updated to be async - to facilitate automatic retrieval of results from storage which means when - writing async code you must `await` the call. For backwards compatibility, - the result is not retrieved by default for async users. You may opt into this - per call by passing `fetch=True` or toggle this setting to change the behavior - globally. - """, - ) - ########################################################################### # allow deprecated access to PREFECT_SOME_SETTING_NAME diff --git a/src/prefect/settings/models/server/events.py b/src/prefect/settings/models/server/events.py index f4776e4eee06..321ff8321976 100644 --- a/src/prefect/settings/models/server/events.py +++ b/src/prefect/settings/models/server/events.py @@ -128,7 +128,7 @@ class ServerEventsSettings(PrefectBaseSettings): messaging_cache: str = Field( default="prefect.server.utilities.messaging.memory", - description="Which cache implementation to use for the events system. Should point to a module that exports a Cache class.", + description="Which cache implementation to use for the events system. Should point to a module that exports a Cache class.", validation_alias=AliasChoices( AliasPath("messaging_cache"), "prefect_server_events_messaging_cache", diff --git a/src/prefect/settings/models/tasks.py b/src/prefect/settings/models/tasks.py index 48e1666ff29e..86b8e20e08ba 100644 --- a/src/prefect/settings/models/tasks.py +++ b/src/prefect/settings/models/tasks.py @@ -73,6 +73,12 @@ class TasksSettings(PrefectBaseSettings): ), ) + default_persist_result: Optional[bool] = Field( + default=None, + description="If `True`, results will be persisted by default for all tasks. Set to `False` to disable persistence by default. " + "Note that setting to `False` will override the behavior set by a parent flow or task.", + ) + runner: TasksRunnerSettings = Field( default_factory=TasksRunnerSettings, description="Settings for controlling task runner behavior", diff --git a/src/prefect/states.py b/src/prefect/states.py index 2780d9b6d42c..3ef1a98f7006 100644 --- a/src/prefect/states.py +++ b/src/prefect/states.py @@ -12,6 +12,7 @@ import pendulum from typing_extensions import TypeGuard +from prefect._internal.compatibility import deprecated from prefect.client.schemas import State as State from prefect.client.schemas import StateDetails, StateType from prefect.exceptions import ( @@ -32,7 +33,6 @@ ResultRecordMetadata, ResultStore, ) -from prefect.settings import PREFECT_ASYNC_FETCH_STATE_RESULT from prefect.utilities.annotations import BaseAnnotation from prefect.utilities.asyncutils import in_async_main_thread, sync_compatible from prefect.utilities.collections import ensure_iterable @@ -40,10 +40,17 @@ logger = get_logger("states") +@deprecated.deprecated_parameter( + "fetch", + when=lambda fetch: fetch is not True, + start_date="Oct 2024", + end_date="Jan 2025", + help="Please ensure you are awaiting the call to `result()` when calling in an async context.", +) def get_state_result( state: State[R], raise_on_failure: bool = True, - fetch: Optional[bool] = None, + fetch: bool = True, retry_result_failure: bool = True, ) -> R: """ @@ -52,23 +59,17 @@ def get_state_result( See `State.result()` """ - if fetch is None and ( - PREFECT_ASYNC_FETCH_STATE_RESULT or not in_async_main_thread() - ): - # Fetch defaults to `True` for sync users or async users who have opted in - fetch = True - if not fetch: - if fetch is None and in_async_main_thread(): - warnings.warn( - ( - "State.result() was called from an async context but not awaited. " - "This method will be updated to return a coroutine by default in " - "the future. Pass `fetch=True` and `await` the call to get rid of " - "this warning." - ), - DeprecationWarning, - stacklevel=2, - ) + if not fetch and in_async_main_thread(): + warnings.warn( + ( + "State.result() was called from an async context but not awaited. " + "This method will be updated to return a coroutine by default in " + "the future. Pass `fetch=True` and `await` the call to get rid of " + "this warning." + ), + DeprecationWarning, + stacklevel=2, + ) return state.data else: @@ -256,10 +257,10 @@ async def exception_to_failed_state( if write_result: try: await result_store.apersist_result_record(data) - except Exception as exc: + except Exception as nested_exc: local_logger.warning( "Failed to write result: %s Execution will continue, but the result has not been written", - exc, + nested_exc, ) else: # Attach the exception for local usage, will not be available when retrieved diff --git a/src/prefect/task_engine.py b/src/prefect/task_engine.py index ad984b2bfa2d..43238d1cbc6c 100644 --- a/src/prefect/task_engine.py +++ b/src/prefect/task_engine.py @@ -67,6 +67,7 @@ PREFECT_DEBUG_MODE, PREFECT_TASKS_REFRESH_CACHE, ) +from prefect.settings.context import get_current_settings from prefect.states import ( AwaitingRetry, Completed, @@ -604,6 +605,8 @@ def setup_run_context(self, client: Optional[SyncPrefectClient] = None): should_log_prints, ) + settings = get_current_settings() + if client is None: client = self.client if not self.task_run: @@ -612,6 +615,12 @@ def setup_run_context(self, client: Optional[SyncPrefectClient] = None): with ExitStack() as stack: if log_prints := should_log_prints(self.task): stack.enter_context(patch_print()) + if self.task.persist_result is not None: + persist_result = self.task.persist_result + elif settings.tasks.default_persist_result is not None: + persist_result = settings.tasks.default_persist_result + else: + persist_result = should_persist_result() stack.enter_context( TaskRunContext( task=self.task, @@ -622,9 +631,7 @@ def setup_run_context(self, client: Optional[SyncPrefectClient] = None): self.task, _sync=True ), client=client, - persist_result=self.task.persist_result - if self.task.persist_result is not None - else should_persist_result(), + persist_result=persist_result, ) ) stack.enter_context(ConcurrencyContextV1()) @@ -1106,6 +1113,8 @@ async def setup_run_context(self, client: Optional[PrefectClient] = None): should_log_prints, ) + settings = get_current_settings() + if client is None: client = self.client if not self.task_run: @@ -1114,6 +1123,12 @@ async def setup_run_context(self, client: Optional[PrefectClient] = None): with ExitStack() as stack: if log_prints := should_log_prints(self.task): stack.enter_context(patch_print()) + if self.task.persist_result is not None: + persist_result = self.task.persist_result + elif settings.tasks.default_persist_result is not None: + persist_result = settings.tasks.default_persist_result + else: + persist_result = should_persist_result() stack.enter_context( TaskRunContext( task=self.task, @@ -1124,9 +1139,7 @@ async def setup_run_context(self, client: Optional[PrefectClient] = None): self.task, _sync=False ), client=client, - persist_result=self.task.persist_result - if self.task.persist_result is not None - else should_persist_result(), + persist_result=persist_result, ) ) stack.enter_context(ConcurrencyContext()) diff --git a/src/prefect/types/__init__.py b/src/prefect/types/__init__.py index ed20547cb095..bd1c8bf83ae5 100644 --- a/src/prefect/types/__init__.py +++ b/src/prefect/types/__init__.py @@ -7,7 +7,6 @@ from pydantic import ( BeforeValidator, Field, - SecretStr, StrictBool, StrictFloat, StrictInt, @@ -110,7 +109,7 @@ def validate_set_T_from_delim_string( T_adapter = TypeAdapter(type_) delim = delim or "," if isinstance(value, str): - return {T_adapter.validate_strings(s) for s in value.split(delim)} + return {T_adapter.validate_strings(s.strip()) for s in value.split(delim)} errors = [] try: return {T_adapter.validate_python(value)} diff --git a/src/prefect/workers/base.py b/src/prefect/workers/base.py index cb640e2ea365..6e35918f3294 100644 --- a/src/prefect/workers/base.py +++ b/src/prefect/workers/base.py @@ -8,7 +8,9 @@ import anyio import anyio.abc +import httpx import pendulum +from importlib_metadata import distributions from pydantic import BaseModel, Field, PrivateAttr, field_validator from pydantic.json_schema import GenerateJsonSchema from typing_extensions import Literal @@ -18,7 +20,12 @@ from prefect.client.base import ServerType from prefect.client.orchestration import PrefectClient, get_client from prefect.client.schemas.actions import WorkPoolCreate, WorkPoolUpdate -from prefect.client.schemas.objects import StateType, WorkPool +from prefect.client.schemas.objects import ( + Integration, + StateType, + WorkerMetadata, + WorkPool, +) from prefect.client.utilities import inject_client from prefect.events import Event, RelatedResource, emit_event from prefect.events.related import object_as_related_resource, tags_as_related_resources @@ -26,7 +33,11 @@ Abort, ObjectNotFound, ) -from prefect.logging.loggers import PrefectLogAdapter, flow_run_logger, get_logger +from prefect.logging.loggers import ( + PrefectLogAdapter, + flow_run_logger, + get_worker_logger, +) from prefect.plugins import load_prefect_collections from prefect.settings import ( PREFECT_API_URL, @@ -407,7 +418,8 @@ def __init__( raise ValueError("Worker name cannot contain '/' or '%'") self.name = name or f"{self.__class__.__name__} {uuid4()}" self._started_event: Optional[Event] = None - self._logger = get_logger(f"worker.{self.__class__.type}.{self.name.lower()}") + self.backend_id: Optional[UUID] = None + self._logger = get_worker_logger(self) self.is_setup = False self._create_pool_if_not_found = create_pool_if_not_found @@ -422,7 +434,6 @@ def __init__( heartbeat_interval_seconds or PREFECT_WORKER_HEARTBEAT_SECONDS.value() ) - self.backend_id: Optional[UUID] = None self._work_pool: Optional[WorkPool] = None self._exit_stack: AsyncExitStack = AsyncExitStack() self._runs_task_group: Optional[anyio.abc.TaskGroup] = None @@ -433,6 +444,7 @@ def __init__( self._submitting_flow_run_ids = set() self._cancelling_flow_run_ids = set() self._scheduled_task_scopes = set() + self._worker_metadata_sent = False @classmethod def get_documentation_url(cls) -> str: @@ -712,54 +724,97 @@ async def _update_local_work_pool_info(self): self._work_pool = work_pool - async def _send_worker_heartbeat( - self, get_worker_id: bool = False - ) -> Optional[UUID]: + async def _worker_metadata(self) -> Optional[WorkerMetadata]: """ - Sends a heartbeat to the API. - - If `get_worker_id` is True, the worker ID will be retrieved from the API. + Returns metadata about installed Prefect collections for the worker. """ - if self._work_pool: - return await self._client.send_worker_heartbeat( - work_pool_name=self._work_pool_name, - worker_name=self.name, - heartbeat_interval_seconds=self.heartbeat_interval_seconds, - get_worker_id=get_worker_id, - ) + installed_integrations = load_prefect_collections().keys() - async def sync_with_backend(self): + integration_versions = [ + Integration(name=dist.metadata["Name"], version=dist.version) + for dist in distributions() + # PyPI packages often use dashes, but Python package names use underscores + # because they must be valid identifiers. + if dist.metadata.get("Name").replace("_", "-") in installed_integrations + ] + + if integration_versions: + return WorkerMetadata(integrations=integration_versions) + return None + + async def _send_worker_heartbeat(self) -> Optional[UUID]: """ - Updates the worker's local information about it's current work pool and - queues. Sends a worker heartbeat to the API. + Sends a heartbeat to the API. """ - await self._update_local_work_pool_info() - # Only do this logic if we've enabled the experiment, are connected to cloud and we don't have an ID. + if not self._client: + self._logger.warning("Client has not been initialized; skipping heartbeat.") + return None + if not self._work_pool: + self._logger.debug("Worker has no work pool; skipping heartbeat.") + return None + + should_get_worker_id = self._should_get_worker_id() + + params = { + "work_pool_name": self._work_pool_name, + "worker_name": self.name, + "heartbeat_interval_seconds": self.heartbeat_interval_seconds, + "get_worker_id": should_get_worker_id, + } if ( - get_current_settings().experiments.worker_logging_to_api_enabled - and ( - self._client.server_type == ServerType.CLOUD - or get_current_settings().testing.test_mode - ) - and self.backend_id is None + self._client.server_type == ServerType.CLOUD + and not self._worker_metadata_sent ): - get_worker_id = True - else: - get_worker_id = False + worker_metadata = await self._worker_metadata() + if worker_metadata: + params["worker_metadata"] = worker_metadata + self._worker_metadata_sent = True - remote_id = await self._send_worker_heartbeat(get_worker_id=get_worker_id) + worker_id = None + try: + worker_id = await self._client.send_worker_heartbeat(**params) + except httpx.HTTPStatusError as e: + if e.response.status_code == 422 and should_get_worker_id: + self._logger.warning( + "Failed to retrieve worker ID from the Prefect API server." + ) + params["get_worker_id"] = False + worker_id = await self._client.send_worker_heartbeat(**params) + else: + raise e - if get_worker_id and remote_id is None: + if should_get_worker_id and worker_id is None: self._logger.warning( "Failed to retrieve worker ID from the Prefect API server." ) - else: + + return worker_id + + async def sync_with_backend(self): + """ + Updates the worker's local information about it's current work pool and + queues. Sends a worker heartbeat to the API. + """ + await self._update_local_work_pool_info() + + remote_id = await self._send_worker_heartbeat() + if remote_id: self.backend_id = remote_id + self._logger = get_worker_logger(self) self._logger.debug( f"Worker synchronized with the Prefect API server. Remote ID: {self.backend_id}" ) + def _should_get_worker_id(self): + """Determines if the worker should request an ID from the API server.""" + return ( + get_current_settings().experiments.worker_logging_to_api_enabled + and self._client + and self._client.server_type == ServerType.CLOUD + and self.backend_id is None + ) + async def _get_scheduled_flow_runs( self, ) -> List["WorkerFlowRunResponse"]: diff --git a/tests/_internal/compatibility/test_async_dispatch.py b/tests/_internal/compatibility/test_async_dispatch.py new file mode 100644 index 000000000000..7c1ec5daabad --- /dev/null +++ b/tests/_internal/compatibility/test_async_dispatch.py @@ -0,0 +1,201 @@ +import asyncio + +import pytest + +from prefect._internal.compatibility.async_dispatch import ( + async_dispatch, + is_in_async_context, +) +from prefect.utilities.asyncutils import run_sync_in_worker_thread + + +class TestAsyncDispatchBasicUsage: + def test_async_compatible_fn_in_sync_context(self): + data = [] + + async def my_function_async(): + data.append("async") + + @async_dispatch(my_function_async) + def my_function(): + data.append("sync") + + my_function() + assert data == ["sync"] + + async def test_async_compatible_fn_in_async_context(self): + data = [] + + async def my_function_async(): + data.append("async") + + @async_dispatch(my_function_async) + def my_function(): + data.append("sync") + + await my_function() + assert data == ["async"] + + +class TestAsyncDispatchExplicitUsage: + async def test_async_compatible_fn_explicit_async_usage(self): + """Verify .aio property works as expected""" + data = [] + + async def my_function_async(): + data.append("async") + + @async_dispatch(my_function_async) + def my_function(): + data.append("sync") + + await my_function.aio() + assert data == ["async"] + + def test_async_compatible_fn_explicit_async_usage_with_asyncio_run(self): + """Verify .aio property works as expected with asyncio.run""" + data = [] + + async def my_function_async(): + data.append("async") + + @async_dispatch(my_function_async) + def my_function(): + data.append("sync") + + asyncio.run(my_function.aio()) + assert data == ["async"] + + async def test_async_compatible_fn_explicit_sync_usage(self): + """Verify .sync property works as expected in async context""" + data = [] + + async def my_function_async(): + data.append("async") + + @async_dispatch(my_function_async) + def my_function(): + data.append("sync") + + # Even though we're in async context, .sync should force sync execution + my_function.sync() + assert data == ["sync"] + + def test_async_compatible_fn_explicit_sync_usage_in_sync_context(self): + """Verify .sync property works as expected in sync context""" + data = [] + + async def my_function_async(): + data.append("async") + + @async_dispatch(my_function_async) + def my_function(): + data.append("sync") + + my_function.sync() + assert data == ["sync"] + + +class TestAsyncDispatchValidation: + def test_async_compatible_requires_async_implementation(self): + """Verify we properly reject non-async implementations""" + + def not_async(): + pass + + with pytest.raises(TypeError, match="async_impl must be an async function"): + + @async_dispatch(not_async) + def my_function(): + pass + + async def test_async_compatible_fn_attributes_exist(self): + """Verify both .sync and .aio attributes are present""" + + async def my_function_async(): + pass + + @async_dispatch(my_function_async) + def my_function(): + pass + + assert hasattr(my_function, "sync"), "Should have .sync attribute" + assert hasattr(my_function, "aio"), "Should have .aio attribute" + assert ( + my_function.sync is my_function.__wrapped__ + ), "Should reference original sync function" + assert ( + my_function.aio is my_function_async + ), "Should reference original async function" + + +class TestAsyncCompatibleFnCannotBeUsedWithAsyncioRun: + def test_async_compatible_fn_in_sync_context_errors_with_asyncio_run(self): + """this is here to illustrate the expected behavior""" + data = [] + + async def my_function_async(): + data.append("async") + + @async_dispatch(my_function_async) + def my_function(): + data.append("sync") + + with pytest.raises(ValueError, match="coroutine was expected, got None"): + asyncio.run(my_function()) + + async def test_async_compatible_fn_in_async_context_fails_with_asyncio_run(self): + """this is here to illustrate the expected behavior""" + data = [] + + async def my_function_async(): + data.append("async") + + @async_dispatch(my_function_async) + def my_function(): + data.append("sync") + + with pytest.raises( + RuntimeError, match="cannot be called from a running event loop" + ): + asyncio.run(my_function()) + + +class TestIsInAsyncContext: + async def test_is_in_async_context_from_coroutine(self): + """Verify detection inside a coroutine""" + assert is_in_async_context() is True + + def test_is_in_async_context_from_sync(self): + """Verify detection in pure sync context""" + assert is_in_async_context() is False + + async def test_is_in_async_context_with_nested_sync_in_worker_thread(self): + def sync_func(): + return is_in_async_context() + + assert await run_sync_in_worker_thread(sync_func) is False + + def test_is_in_async_context_with_running_loop(self): + """Verify detection with just a running event loop""" + loop = asyncio.new_event_loop() + asyncio.set_event_loop(loop) + result = None + + def check_context(): + nonlocal result + result = is_in_async_context() + loop.stop() + + try: + loop.call_soon(check_context) + loop.run_forever() + assert ( + result is True + ), "the result we captured while loop was running should be True" + finally: + loop.close() + asyncio.set_event_loop(None) + assert ( + is_in_async_context() is False + ), "the loop should be closed and not considered an async context" diff --git a/tests/cli/test_config.py b/tests/cli/test_config.py index a2704f833cc9..76ce8b8e9e17 100644 --- a/tests/cli/test_config.py +++ b/tests/cli/test_config.py @@ -29,7 +29,7 @@ FROM_DEFAULT = "(from defaults)" FROM_ENV = "(from env)" FROM_PROFILE = "(from profile)" -FROM_DOT_ENV = "(from .env)" +FROM_DOT_ENV = "(from .env file)" FROM_PREFECT_TOML = "(from prefect.toml)" FROM_PYPROJECT_TOML = "(from pyproject.toml)" @@ -552,6 +552,48 @@ def test_view_shows_secrets(monkeypatch, command): assert f"PREFECT_API_DATABASE_PASSWORD='None' {FROM_DEFAULT}" in lines +def test_view_with_env_file(tmp_path): + with tmpchdir(tmp_path): + with open(".env", "w") as f: + f.write("PREFECT_CLIENT_RETRY_EXTRA_CODES=300\n") + + res = invoke_and_assert(["config", "view"]) + + assert "PREFECT_CLIENT_RETRY_EXTRA_CODES='300'" in res.stdout + assert FROM_DOT_ENV in res.stdout + + +def test_view_with_env_file_and_env_var(monkeypatch, tmp_path): + monkeypatch.setenv("PREFECT_CLIENT_RETRY_EXTRA_CODES", "400") + + with tmpchdir(tmp_path): + with open(".env", "w") as f: + f.write("PREFECT_CLIENT_RETRY_EXTRA_CODES=300\n") + + res = invoke_and_assert(["config", "view"]) + + assert "PREFECT_CLIENT_RETRY_EXTRA_CODES='400'" in res.stdout + assert FROM_DOT_ENV not in res.stdout + + +def test_view_with_env_file_and_profile(tmp_path): + with tmpchdir(tmp_path): + with open(".env", "w") as f: + f.write("PREFECT_CLIENT_RETRY_EXTRA_CODES=300\n") + + with prefect.context.use_profile( + prefect.settings.Profile( + name="foo", + settings={PREFECT_CLIENT_RETRY_EXTRA_CODES: [400]}, + ), + include_current_context=False, + ): + res = invoke_and_assert(["config", "view"]) + + assert "PREFECT_CLIENT_RETRY_EXTRA_CODES='300'" in res.stdout + assert FROM_DOT_ENV in res.stdout + + def test_view_with_prefect_toml_file(tmp_path): with tmpchdir(tmp_path): toml_data = {"client": {"retry_extra_codes": "300"}} diff --git a/tests/client/test_prefect_client.py b/tests/client/test_prefect_client.py index dad4fadd9b8a..daf3fae6da21 100644 --- a/tests/client/test_prefect_client.py +++ b/tests/client/test_prefect_client.py @@ -3,6 +3,7 @@ from contextlib import asynccontextmanager from datetime import timedelta from typing import Generator, List +from unittest import mock from unittest.mock import ANY, MagicMock, Mock from uuid import UUID, uuid4 @@ -55,9 +56,11 @@ Flow, FlowRunNotificationPolicy, FlowRunPolicy, + Integration, StateType, TaskRun, Variable, + WorkerMetadata, WorkQueue, ) from prefect.client.schemas.responses import ( @@ -69,6 +72,7 @@ from prefect.client.utilities import inject_client from prefect.events import AutomationCore, EventTrigger, Posture from prefect.server.api.server import create_app +from prefect.server.database.orm_models import WorkPool from prefect.settings import ( PREFECT_API_DATABASE_MIGRATE_ON_START, PREFECT_API_KEY, @@ -2698,3 +2702,59 @@ def test_raise_for_api_version_mismatch_with_incompatible_versions( f"Found incompatible versions: client: {client_version}, server: {api_version}. " in str(e.value) ) + + +class TestPrefectClientWorkerHeartbeat: + async def test_worker_heartbeat( + self, prefect_client: PrefectClient, work_pool: WorkPool + ): + work_pool_name = str(work_pool.name) + await prefect_client.send_worker_heartbeat( + work_pool_name=work_pool_name, + worker_name="test-worker", + heartbeat_interval_seconds=10, + ) + workers = await prefect_client.read_workers_for_work_pool(work_pool_name) + assert len(workers) == 1 + assert workers[0].name == "test-worker" + assert workers[0].heartbeat_interval_seconds == 10 + + async def test_worker_heartbeat_sends_metadata_if_passed( + self, prefect_client: PrefectClient + ): + with mock.patch( + "prefect.client.orchestration.PrefectHttpxAsyncClient.post", + return_value=httpx.Response(status_code=204), + ) as mock_post: + await prefect_client.send_worker_heartbeat( + work_pool_name="work-pool", + worker_name="test-worker", + heartbeat_interval_seconds=10, + worker_metadata=WorkerMetadata( + integrations=[Integration(name="prefect-aws", version="1.0.0")] + ), + ) + assert mock_post.call_args[1]["json"] == { + "name": "test-worker", + "heartbeat_interval_seconds": 10, + "worker_metadata": { + "integrations": [{"name": "prefect-aws", "version": "1.0.0"}] + }, + } + + async def test_worker_heartbeat_does_not_send_metadata_if_not_passed( + self, prefect_client: PrefectClient + ): + with mock.patch( + "prefect.client.orchestration.PrefectHttpxAsyncClient.post", + return_value=httpx.Response(status_code=204), + ) as mock_post: + await prefect_client.send_worker_heartbeat( + work_pool_name="work-pool", + worker_name="test-worker", + heartbeat_interval_seconds=10, + ) + assert mock_post.call_args[1]["json"] == { + "name": "test-worker", + "heartbeat_interval_seconds": 10, + } diff --git a/tests/conftest.py b/tests/conftest.py index 74166e9b3ca9..1d1209df32b8 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -51,7 +51,6 @@ PREFECT_API_SERVICES_TASK_RUN_RECORDER_ENABLED, PREFECT_API_SERVICES_TRIGGERS_ENABLED, PREFECT_API_URL, - PREFECT_ASYNC_FETCH_STATE_RESULT, PREFECT_CLI_COLORS, PREFECT_CLI_WRAP_LINES, PREFECT_HOME, @@ -323,7 +322,6 @@ def pytest_sessionstart(session): PREFECT_CLI_COLORS: False, PREFECT_CLI_WRAP_LINES: False, # Enable future change - PREFECT_ASYNC_FETCH_STATE_RESULT: True, # Enable debug logging PREFECT_LOGGING_LEVEL: "DEBUG", PREFECT_LOGGING_INTERNAL_LEVEL: "DEBUG", diff --git a/tests/results/test_result_fetch.py b/tests/results/test_result_fetch.py index 1e0cd8ceb871..643f2c8f165d 100644 --- a/tests/results/test_result_fetch.py +++ b/tests/results/test_result_fetch.py @@ -1,21 +1,6 @@ -import pytest - from prefect import flow, task -from prefect.settings import PREFECT_ASYNC_FETCH_STATE_RESULT, temporary_settings - - -@pytest.fixture(autouse=True) -def disable_fetch_by_default(): - """ - The test suite defaults to the future behavior. - - For these tests, we enable the default user behavior. - """ - with temporary_settings({PREFECT_ASYNC_FETCH_STATE_RESULT: False}): - yield -@pytest.mark.skip(reason="This test is flaky and needs to be fixed") async def test_async_result_warnings_are_not_raised_by_engine(): # Since most of our tests are run with the opt-in globally enabled, this test # covers a bunch of features to cover remaining cases where we may internally @@ -92,8 +77,7 @@ async def foo(): return 1 state = await foo(return_state=True) - with temporary_settings({PREFECT_ASYNC_FETCH_STATE_RESULT: True}): - coro = state.result(fetch=True) + coro = state.result() assert await coro == 1 diff --git a/tests/results/test_result_store.py b/tests/results/test_result_store.py index 513d186410a8..f516af249c9d 100644 --- a/tests/results/test_result_store.py +++ b/tests/results/test_result_store.py @@ -16,6 +16,7 @@ PREFECT_LOCAL_STORAGE_PATH, PREFECT_RESULTS_DEFAULT_SERIALIZER, PREFECT_RESULTS_PERSIST_BY_DEFAULT, + PREFECT_TASKS_DEFAULT_PERSIST_RESULT, temporary_settings, ) from prefect.testing.utilities import assert_blocks_equal @@ -440,6 +441,55 @@ def bar(): assert persist_result is True + with temporary_settings({PREFECT_TASKS_DEFAULT_PERSIST_RESULT: True}): + persist_result = bar() + + assert persist_result is True + + +async def test_task_can_opt_out_of_result_persistence_with_setting(): + with temporary_settings({PREFECT_TASKS_DEFAULT_PERSIST_RESULT: True}): + + @task(persist_result=False) + def bar(): + return should_persist_result() + + persist_result = bar() + assert persist_result is False + + async def abar(): + return should_persist_result() + + persist_result = await abar() + assert persist_result is False + + +async def test_can_opt_out_of_result_persistence_with_setting_when_flow_uses_feature(): + with temporary_settings({PREFECT_TASKS_DEFAULT_PERSIST_RESULT: False}): + + @flow(persist_result=True) + def foo(): + return bar() + + @task + def bar(): + return should_persist_result() + + persist_result = foo() + + assert persist_result is False + + @flow(persist_result=True) + async def afoo(): + return await abar() + + @task + async def abar(): + return should_persist_result() + + persist_result = await afoo() + assert persist_result is False + def test_nested_flow_custom_persist_setting(): @flow(persist_result=True) diff --git a/tests/test_logging.py b/tests/test_logging.py index 7248dc004a64..98e0d0d86866 100644 --- a/tests/test_logging.py +++ b/tests/test_logging.py @@ -6,6 +6,7 @@ from contextlib import nullcontext from functools import partial from io import StringIO +from typing import Type from unittest.mock import ANY, MagicMock import pendulum @@ -30,7 +31,12 @@ ) from prefect.logging.filters import ObfuscateApiKeyFilter from prefect.logging.formatters import JsonFormatter -from prefect.logging.handlers import APILogHandler, APILogWorker, PrefectConsoleHandler +from prefect.logging.handlers import ( + APILogHandler, + APILogWorker, + PrefectConsoleHandler, + WorkerAPILogHandler, +) from prefect.logging.highlighters import PrefectConsoleHighlighter from prefect.logging.loggers import ( PrefectLogAdapter, @@ -39,12 +45,14 @@ flow_run_logger, get_logger, get_run_logger, + get_worker_logger, patch_print, task_run_logger, ) from prefect.server.schemas.actions import LogCreate from prefect.settings import ( PREFECT_API_KEY, + PREFECT_EXPERIMENTS_WORKER_LOGGING_TO_API_ENABLED, PREFECT_LOGGING_COLORS, PREFECT_LOGGING_LEVEL, PREFECT_LOGGING_MARKUP, @@ -60,6 +68,7 @@ from prefect.testing.cli import temporary_console_width from prefect.testing.utilities import AsyncMock from prefect.utilities.names import obfuscate +from prefect.workers.base import BaseJobConfiguration, BaseWorker @pytest.fixture @@ -627,6 +636,86 @@ def test_handler_knows_how_large_logs_are(self): assert handler._get_payload_size(dict_log) == log_size +class TestWorkerLogging: + class WorkerTestImpl(BaseWorker): + type: str = "logging_test" + job_configuration: Type[BaseJobConfiguration] = BaseJobConfiguration + + async def _send_worker_heartbeat(self, *_, **__): + return "test_backend_id" + + async def run(self, *_, **__): + pass + + @pytest.fixture + def experiment_enabled(self): + with temporary_settings( + updates={PREFECT_EXPERIMENTS_WORKER_LOGGING_TO_API_ENABLED: True} + ): + yield + + @pytest.fixture + def logging_to_api_enabled(self): + with temporary_settings(updates={PREFECT_LOGGING_TO_API_ENABLED: True}): + yield + + @pytest.fixture + def worker_handler(self): + yield WorkerAPILogHandler() + + @pytest.fixture + def logger(self, worker_handler): + logger = logging.getLogger(__name__) + logger.setLevel(logging.DEBUG) + logger.addHandler(worker_handler) + yield logger + logger.removeHandler(worker_handler) + + async def test_get_worker_logger_works_with_no_backend_id(self, experiment_enabled): + async with self.WorkerTestImpl( + name="test", work_pool_name="test-work-pool" + ) as worker: + logger = get_worker_logger(worker) + assert logger.name == "prefect.workers.logging_test.test" + + async def test_get_worker_logger_works_with_backend_id(self, experiment_enabled): + async with self.WorkerTestImpl( + name="test", work_pool_name="test-work-pool" + ) as worker: + await worker.sync_with_backend() + logger = get_worker_logger(worker) + assert logger.name == "prefect.workers.logging_test.test" + assert logger.extra["worker_id"] == "test_backend_id" + + async def test_worker_emits_logs_with_worker_id(self, caplog, experiment_enabled): + async with self.WorkerTestImpl( + name="test", work_pool_name="test-work-pool" + ) as worker: + await worker.sync_with_backend() + worker._logger.info("testing_with_extras") + + record_with_extras = [ + r for r in caplog.records if "testing_with_extras" in r.message + ] + + assert "testing_with_extras" in caplog.text + assert record_with_extras[0].worker_id == worker.backend_id + assert worker._logger.extra["worker_id"] == worker.backend_id + + def test_worker_logger_sends_log_to_api_worker( + self, logger, mock_log_worker, experiment_enabled, logging_to_api_enabled + ): + logger.info("test-worker-log") + + mock_log_worker.instance().send.assert_called_once() + assert len(mock_log_worker.instance().send.call_args_list) == 1 + + log_statement = mock_log_worker.instance().send.call_args.args[0] + assert log_statement["name"] == logger.name + assert log_statement["level"] == 20 + assert log_statement["message"] == "test-worker-log" + + class TestAPILogWorker: @pytest.fixture async def worker(self): diff --git a/tests/test_settings.py b/tests/test_settings.py index 2a0984aba880..cbf877dd9d3a 100644 --- a/tests/test_settings.py +++ b/tests/test_settings.py @@ -178,7 +178,6 @@ "PREFECT_API_TASK_CACHE_KEY_MAX_LENGTH": {"test_value": 10, "legacy": True}, "PREFECT_API_TLS_INSECURE_SKIP_VERIFY": {"test_value": True}, "PREFECT_API_URL": {"test_value": "https://api.prefect.io"}, - "PREFECT_ASYNC_FETCH_STATE_RESULT": {"test_value": True}, "PREFECT_CLIENT_CSRF_SUPPORT_ENABLED": {"test_value": True}, "PREFECT_CLIENT_ENABLE_METRICS": {"test_value": True, "legacy": True}, "PREFECT_CLIENT_MAX_RETRIES": {"test_value": 3}, @@ -227,7 +226,8 @@ "legacy": True, }, "PREFECT_EVENTS_WEBSOCKET_BACKFILL_PAGE_SIZE": {"test_value": 10, "legacy": True}, - "PREFECT_EXPERIMENTAL_WARN": {"test_value": True}, + "PREFECT_EXPERIMENTAL_WARN": {"test_value": True, "legacy": True}, + "PREFECT_EXPERIMENTS_WARN": {"test_value": True}, "PREFECT_EXPERIMENTS_WORKER_LOGGING_TO_API_ENABLED": {"test_value": False}, "PREFECT_FLOW_DEFAULT_RETRIES": {"test_value": 10, "legacy": True}, "PREFECT_FLOWS_DEFAULT_RETRIES": {"test_value": 10}, @@ -389,6 +389,7 @@ "PREFECT_SILENCE_API_URL_MISCONFIGURATION": {"test_value": True}, "PREFECT_SQLALCHEMY_MAX_OVERFLOW": {"test_value": 10, "legacy": True}, "PREFECT_SQLALCHEMY_POOL_SIZE": {"test_value": 10, "legacy": True}, + "PREFECT_TASKS_DEFAULT_PERSIST_RESULT": {"test_value": True}, "PREFECT_TASKS_DEFAULT_RETRIES": {"test_value": 10}, "PREFECT_TASKS_DEFAULT_RETRY_DELAY_SECONDS": {"test_value": 10}, "PREFECT_TASKS_REFRESH_CACHE": {"test_value": True}, @@ -596,8 +597,8 @@ def test_settings_to_environment_roundtrip(self, exclude_unset, monkeypatch): assert settings.model_dump() == new_settings.model_dump() def test_settings_hash_key(self): - settings = Settings(testing=dict(test_mode=True)) - diff_settings = Settings(testing=dict(test_mode=False)) + settings = Settings(testing=dict(test_mode=True)) # type: ignore + diff_settings = Settings(testing=dict(test_mode=False)) # type: ignore assert settings.hash_key() == settings.hash_key() @@ -728,17 +729,26 @@ def test_settings_in_truthy_statements_use_value(self): @pytest.mark.parametrize( "value,expected", [ + (None, []), ("foo", ["foo"]), ("foo,bar", ["foo", "bar"]), ("foo, bar, foobar ", ["foo", "bar", "foobar"]), + (["foo", "bar"], ["foo", "bar"]), + ], + ids=[ + "none", + "string", + "comma_separated", + "comma_separated_with_spaces", + "python_list", ], ) def test_extra_loggers(self, value, expected): settings = Settings(logging=LoggingSettings(extra_loggers=value)) - assert PREFECT_LOGGING_EXTRA_LOGGERS.value_from(settings) == expected + assert set(PREFECT_LOGGING_EXTRA_LOGGERS.value_from(settings)) == set(expected) def test_prefect_home_expands_tilde_in_path(self): - settings = Settings(home="~/test") + settings = Settings(home="~/test") # type: ignore assert PREFECT_HOME.value_from(settings) == Path("~/test").expanduser() @pytest.mark.parametrize( @@ -1370,7 +1380,7 @@ def test_save_profiles_additional_profiles(self, temporary_profiles_path): class TestProfile: def test_init_casts_names_to_setting_types(self): - profile = Profile(name="test", settings={"PREFECT_DEBUG_MODE": 1}) + profile = Profile(name="test", settings={"PREFECT_DEBUG_MODE": 1}) # type: ignore assert profile.settings == {PREFECT_DEBUG_MODE: 1} def test_validate_settings(self): diff --git a/tests/workers/test_base_worker.py b/tests/workers/test_base_worker.py index 2d9081496a9a..f7eb56577489 100644 --- a/tests/workers/test_base_worker.py +++ b/tests/workers/test_base_worker.py @@ -1,5 +1,6 @@ import uuid from typing import Any, Dict, Optional, Type +from unittest import mock from unittest.mock import MagicMock import httpx @@ -12,8 +13,10 @@ import prefect import prefect.client.schemas as schemas from prefect.blocks.core import Block +from prefect.client.base import ServerType from prefect.client.orchestration import PrefectClient, get_client from prefect.client.schemas import FlowRun +from prefect.client.schemas.objects import WorkerMetadata from prefect.exceptions import ( CrashedRun, ObjectNotFound, @@ -172,10 +175,11 @@ async def test_worker_sends_heartbeat_messages( assert second_heartbeat > first_heartbeat -async def test_worker_sends_heartbeat_gets_id(experimental_logging_enabled, respx_mock): +async def test_worker_sends_heartbeat_gets_id(respx_mock): work_pool_name = "test-work-pool" test_worker_id = uuid.UUID("028EC481-5899-49D7-B8C5-37A2726E9840") async with WorkerTestImpl(name="test", work_pool_name=work_pool_name) as worker: + setattr(worker, "_should_get_worker_id", lambda: True) # Pass through the non-relevant paths respx_mock.get(f"api/work_pools/{work_pool_name}").pass_through() respx_mock.get("api/csrf-token?").pass_through() @@ -193,10 +197,9 @@ async def test_worker_sends_heartbeat_gets_id(experimental_logging_enabled, resp assert worker.backend_id == test_worker_id -async def test_worker_sends_heartbeat_only_gets_id_once( - experimental_logging_enabled, -): +async def test_worker_sends_heartbeat_only_gets_id_once(experimental_logging_enabled): async with WorkerTestImpl(name="test", work_pool_name="test-work-pool") as worker: + worker._client.server_type = ServerType.CLOUD mock = AsyncMock(return_value="test") setattr(worker._client, "send_worker_heartbeat", mock) await worker.sync_with_backend() @@ -1845,3 +1848,107 @@ async def test_env_merge_logic_is_deep( for key, value in expected_env.items(): assert config.env[key] == value + + +class TestBaseWorkerHeartbeat: + async def test_worker_heartbeat_sends_integrations( + self, work_pool, hosted_api_server, experimental_logging_enabled + ): + async with WorkerTestImpl(work_pool_name=work_pool.name) as worker: + await worker.start(run_once=True) + with mock.patch( + "prefect.workers.base.load_prefect_collections" + ) as mock_load_prefect_collections, mock.patch( + "prefect.client.orchestration.PrefectHttpxAsyncClient.post" + ) as mock_send_worker_heartbeat_post, mock.patch( + "prefect.workers.base.distributions" + ) as mock_distributions: + mock_load_prefect_collections.return_value = { + "prefect-aws": "1.0.0", + } + mock_distributions.return_value = [ + mock.MagicMock( + metadata={"Name": "prefect_aws"}, + version="1.0.0", + ) + ] + + async with get_client() as client: + worker._client = client + worker._client.server_type = ServerType.CLOUD + await worker.sync_with_backend() + + mock_send_worker_heartbeat_post.assert_called_once_with( + f"/work_pools/{work_pool.name}/workers/heartbeat", + json={ + "name": worker.name, + "heartbeat_interval_seconds": worker.heartbeat_interval_seconds, + "worker_metadata": { + "integrations": [ + {"name": "prefect_aws", "version": "1.0.0"} + ] + }, + "return_id": True, + }, + ) + + assert worker._worker_metadata_sent + + async def test_custom_worker_can_send_arbitrary_metadata( + self, work_pool, hosted_api_server, experimental_logging_enabled + ): + class CustomWorker(BaseWorker): + type: str = "test-custom-metadata" + job_configuration: Type[BaseJobConfiguration] = BaseJobConfiguration + + async def run(self): + pass + + async def _worker_metadata(self) -> WorkerMetadata: + return WorkerMetadata( + **{ + "integrations": [{"name": "prefect-aws", "version": "1.0.0"}], + "custom_field": "heya", + } + ) + + async with CustomWorker(work_pool_name=work_pool.name) as worker: + await worker.start(run_once=True) + with mock.patch( + "prefect.workers.base.load_prefect_collections" + ) as mock_load_prefect_collections, mock.patch( + "prefect.client.orchestration.PrefectHttpxAsyncClient.post" + ) as mock_send_worker_heartbeat_post, mock.patch( + "prefect.workers.base.distributions" + ) as mock_distributions: + mock_load_prefect_collections.return_value = { + "prefect-aws": "1.0.0", + } + mock_distributions.return_value = [ + mock.MagicMock( + metadata={"Name": "prefect-aws"}, + version="1.0.0", + ) + ] + + async with get_client() as client: + worker._client = client + worker._client.server_type = ServerType.CLOUD + await worker.sync_with_backend() + + mock_send_worker_heartbeat_post.assert_called_once_with( + f"/work_pools/{work_pool.name}/workers/heartbeat", + json={ + "name": worker.name, + "heartbeat_interval_seconds": worker.heartbeat_interval_seconds, + "worker_metadata": { + "integrations": [ + {"name": "prefect-aws", "version": "1.0.0"} + ], + "custom_field": "heya", + }, + "return_id": True, + }, + ) + + assert worker._worker_metadata_sent diff --git a/ui-v2/.gitignore b/ui-v2/.gitignore new file mode 100644 index 000000000000..3b65fee6e850 --- /dev/null +++ b/ui-v2/.gitignore @@ -0,0 +1,28 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +node_modules +dist +dist-ssr +*.local + +# Editor directories and files +.vscode/* +!.vscode/extensions.json +.idea +.DS_Store +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? + +# Generated files +oss_schema.json +*.tsbuildinfo \ No newline at end of file diff --git a/ui-v2/README.md b/ui-v2/README.md new file mode 100644 index 000000000000..917233551f94 --- /dev/null +++ b/ui-v2/README.md @@ -0,0 +1,73 @@ +# Prefect UI + +## Project setup + +``` +npm ci +``` + +### Compiles and hot-reloads for development + +``` +npm run dev +``` + +### Compiles and minifies for production + +``` +npm run build +``` + +### Lints and fixes files + +``` +npm run lint +``` +This template provides a minimal setup to get React working in Vite with HMR and some ESLint rules. + +Currently, two official plugins are available: + +- [@vitejs/plugin-react](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react/README.md) uses [Babel](https://babeljs.io/) for Fast Refresh +- [@vitejs/plugin-react-swc](https://github.com/vitejs/vite-plugin-react-swc) uses [SWC](https://swc.rs/) for Fast Refresh + +## Expanding the ESLint configuration + +If you are developing a production application, we recommend updating the configuration to enable type aware lint rules: + +- Configure the top-level `parserOptions` property like this: + +```js +export default tseslint.config({ + languageOptions: { + // other options... + parserOptions: { + project: ['./tsconfig.node.json', './tsconfig.app.json'], + tsconfigRootDir: import.meta.dirname, + }, + }, +}) +``` + +- Replace `tseslint.configs.recommended` to `tseslint.configs.recommendedTypeChecked` or `tseslint.configs.strictTypeChecked` +- Optionally add `...tseslint.configs.stylisticTypeChecked` +- Install [eslint-plugin-react](https://github.com/jsx-eslint/eslint-plugin-react) and update the config: + +```js +// eslint.config.js +import react from 'eslint-plugin-react' + +export default tseslint.config({ + // Set the react version + settings: { react: { version: '18.3' } }, + plugins: { + // Add the react plugin + react, + }, + rules: { + // other rules... + // Enable its recommended rules + ...react.configs.recommended.rules, + ...react.configs['jsx-runtime'].rules, + }, +}) +``` diff --git a/ui-v2/biome.json b/ui-v2/biome.json new file mode 100644 index 000000000000..4af4c5e34f5c --- /dev/null +++ b/ui-v2/biome.json @@ -0,0 +1,30 @@ +{ + "$schema": "https://biomejs.dev/schemas/1.9.4/schema.json", + "vcs": { + "enabled": false, + "clientKind": "git", + "useIgnoreFile": false + }, + "files": { + "ignoreUnknown": false, + "ignore": [] + }, + "formatter": { + "enabled": true, + "indentStyle": "tab" + }, + "organizeImports": { + "enabled": true + }, + "linter": { + "enabled": false, + "rules": { + "recommended": true + } + }, + "javascript": { + "formatter": { + "quoteStyle": "double" + } + } +} diff --git a/ui-v2/components.json b/ui-v2/components.json new file mode 100644 index 000000000000..eaa263eb3e76 --- /dev/null +++ b/ui-v2/components.json @@ -0,0 +1,20 @@ +{ + "$schema": "https://ui.shadcn.com/schema.json", + "style": "new-york", + "rsc": false, + "tsx": true, + "tailwind": { + "config": "tailwind.config.js", + "css": "src/index.css", + "baseColor": "neutral", + "cssVariables": true, + "prefix": "" + }, + "aliases": { + "components": "@/components", + "utils": "@/lib/utils", + "ui": "@/components/ui", + "lib": "@/lib", + "hooks": "@/hooks" + } +} diff --git a/ui-v2/eslint.config.js b/ui-v2/eslint.config.js new file mode 100644 index 000000000000..7a289db021ad --- /dev/null +++ b/ui-v2/eslint.config.js @@ -0,0 +1,46 @@ +import js from "@eslint/js"; +import pluginRouter from "@tanstack/eslint-plugin-router"; +import react from "eslint-plugin-react"; +import reactHooks from "eslint-plugin-react-hooks"; +import reactRefresh from "eslint-plugin-react-refresh"; +import globals from "globals"; +import tseslint from "typescript-eslint"; + +export default tseslint.config( + { ignores: ["dist", "src/api/prefect.tsx"] }, + { + extends: [ + js.configs.recommended, + ...tseslint.configs.recommendedTypeChecked, + ], + files: ["**/*.{ts,tsx}"], + languageOptions: { + ecmaVersion: 2020, + globals: globals.browser, + parserOptions: { + project: ["./tsconfig.node.json", "./tsconfig.app.json"], + tsconfigRootDir: import.meta.dirname, + }, + }, + settings: { + react: { + version: "18.3", + }, + }, + plugins: { + react, + "react-hooks": reactHooks, + "react-refresh": reactRefresh, + }, + rules: { + ...reactHooks.configs.recommended.rules, + "react-refresh/only-export-components": [ + "warn", + { allowConstantExport: true }, + ], + ...react.configs.recommended.rules, + ...react.configs["jsx-runtime"].rules, + }, + }, + ...pluginRouter.configs["flat/recommended"], +); diff --git a/ui-v2/index.html b/ui-v2/index.html new file mode 100644 index 000000000000..e382063add67 --- /dev/null +++ b/ui-v2/index.html @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + Prefect Server + + +
+ + + diff --git a/ui-v2/package-lock.json b/ui-v2/package-lock.json new file mode 100644 index 000000000000..11fedca0b665 --- /dev/null +++ b/ui-v2/package-lock.json @@ -0,0 +1,7994 @@ +{ + "name": "prefect-ui", + "version": "0.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "prefect-ui", + "version": "0.0.0", + "dependencies": { + "@radix-ui/react-avatar": "^1.1.1", + "@radix-ui/react-checkbox": "^1.1.2", + "@radix-ui/react-dropdown-menu": "^2.1.2", + "@radix-ui/react-hover-card": "^1.1.2", + "@radix-ui/react-icons": "^1.3.0", + "@radix-ui/react-label": "^2.1.0", + "@radix-ui/react-popover": "^1.1.2", + "@radix-ui/react-scroll-area": "^1.2.0", + "@radix-ui/react-select": "^2.1.2", + "@radix-ui/react-slot": "^1.1.0", + "@radix-ui/react-tabs": "^1.1.1", + "@radix-ui/react-toast": "^1.2.2", + "@radix-ui/react-tooltip": "^1.1.3", + "@tanstack/react-query": "^5.56.2", + "@tanstack/react-table": "^8.20.5", + "@tanstack/router-zod-adapter": "^1.58.16", + "class-variance-authority": "^0.7.0", + "clsx": "^2.1.1", + "date-fns": "^3.6.0", + "date-fns-tz": "^3.2.0", + "lucide-react": "^0.447.0", + "openapi-fetch": "^0.12.2", + "react": "^18.3.1", + "react-day-picker": "^8.10.1", + "react-dom": "^18.3.1", + "recharts": "^2.12.7", + "tailwind-merge": "^2.5.2", + "tailwindcss-animate": "^1.0.7", + "zod": "^3.23.8" + }, + "devDependencies": { + "@biomejs/biome": "1.9.4", + "@eslint/js": "^9.12.0", + "@tanstack/eslint-plugin-router": "^1.77.7", + "@tanstack/router-devtools": "^1.58.15", + "@tanstack/router-plugin": "^1.58.12", + "@types/node": "^22.7.4", + "@types/react": "^18.3.3", + "@types/react-dom": "^18.3.0", + "@vitejs/plugin-react-swc": "^3.5.0", + "autoprefixer": "^10.4.20", + "eslint": "^9.12.0", + "eslint-plugin-react": "^7.37.1", + "eslint-plugin-react-hooks": "^5.1.0-rc.0", + "eslint-plugin-react-refresh": "^0.4.9", + "eslint-plugin-unused-imports": "^4.1.4", + "globals": "^15.10.0", + "postcss": "^8.4.47", + "tailwindcss": "^3.4.13", + "typescript": "^5.5.3", + "typescript-eslint": "^8.8.1", + "vite": "^5.4.1" + } + }, + "node_modules/@alloc/quick-lru": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", + "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@ampproject/remapping": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", + "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.26.2", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.2.tgz", + "integrity": "sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.25.9", + "js-tokens": "^4.0.0", + "picocolors": "^1.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.26.2", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.26.2.tgz", + "integrity": "sha512-Z0WgzSEa+aUcdiJuCIqgujCshpMWgUpgOxXotrYPSA53hA3qopNaqcJpyr0hVb1FeWdnqFA35/fUtXgBK8srQg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.26.0.tgz", + "integrity": "sha512-i1SLeK+DzNnQ3LL/CswPCa/E5u4lh1k6IAEphON8F+cXt0t9euTshDru0q7/IqMa1PMPz5RnHuHscF8/ZJsStg==", + "dev": true, + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.26.0", + "@babel/generator": "^7.26.0", + "@babel/helper-compilation-targets": "^7.25.9", + "@babel/helper-module-transforms": "^7.26.0", + "@babel/helpers": "^7.26.0", + "@babel/parser": "^7.26.0", + "@babel/template": "^7.25.9", + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.26.0", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/generator": { + "version": "7.26.2", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.26.2.tgz", + "integrity": "sha512-zevQbhbau95nkoxSq3f/DC/SC+EEOUZd3DYqfSkMhY2/wfSeaHV1Ew4vk8e+x8lja31IbyuUa2uQ3JONqKbysw==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.26.2", + "@babel/types": "^7.26.0", + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25", + "jsesc": "^3.0.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.9.tgz", + "integrity": "sha512-j9Db8Suy6yV/VHa4qzrj9yZfZxhLWQdVnRlXxmKLYlhWUVB1sB2G5sxuWYXk/whHD9iW76PmNzxZ4UCnTQTVEQ==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.25.9", + "@babel/helper-validator-option": "^7.25.9", + "browserslist": "^4.24.0", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.25.9.tgz", + "integrity": "sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==", + "dev": true, + "dependencies": { + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.26.0.tgz", + "integrity": "sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==", + "dev": true, + "dependencies": { + "@babel/helper-module-imports": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9", + "@babel/traverse": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.25.9.tgz", + "integrity": "sha512-kSMlyUVdWe25rEsRGviIgOWnoT/nfABVWlqt9N19/dIPWViAOW2s9wznP5tURbs/IDuNk4gPy3YdYRgH3uxhBw==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz", + "integrity": "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz", + "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.25.9.tgz", + "integrity": "sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.26.0.tgz", + "integrity": "sha512-tbhNuIxNcVb21pInl3ZSjksLCvgdZy9KwJ8brv993QtIVKJBBkYXz4q4ZbAv31GdnC+R90np23L5FbEBlthAEw==", + "dev": true, + "dependencies": { + "@babel/template": "^7.25.9", + "@babel/types": "^7.26.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.26.2", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.2.tgz", + "integrity": "sha512-DWMCZH9WA4Maitz2q21SRKHo9QXZxkDsbNZoVD62gusNtNBBqDg9i7uOhASfTfIGNzW+O+r7+jAlM8dwphcJKQ==", + "dev": true, + "dependencies": { + "@babel/types": "^7.26.0" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-syntax-jsx": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.25.9.tgz", + "integrity": "sha512-ld6oezHQMZsZfp6pWtbjaNDF2tiiCYYDqQszHt5VV437lewP9aSi2Of99CK0D0XB21k7FLgnLcmQKyKzynfeAA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-typescript": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.25.9.tgz", + "integrity": "sha512-hjMgRy5hb8uJJjUcdWunWVcoi9bGpJp8p5Ol1229PoN6aytsLwNMgmdftO23wnCLMfVmTwZDWMPNq/D1SY60JQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/runtime": { + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.26.0.tgz", + "integrity": "sha512-FDSOghenHTiToteC/QRlv2q3DhPZ/oOXTBoirfWNx1Cx3TMVcGWQtMMmQcSvb/JjpNeGzx8Pq/b4fKEJuWm1sw==", + "dependencies": { + "regenerator-runtime": "^0.14.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/template": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.9.tgz", + "integrity": "sha512-9DGttpmPvIxBb/2uwpVo3dqJ+O6RooAFOS+lB+xDqoE2PVCE8nfoHMdZLpfCQRLwvohzXISPZcgxt80xLfsuwg==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.25.9", + "@babel/parser": "^7.25.9", + "@babel/types": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.25.9.tgz", + "integrity": "sha512-ZCuvfwOwlz/bawvAuvcj8rrithP2/N55Tzz342AkTvq4qaWbGfmCk/tKhNaV2cthijKrPAA8SRJV5WWe7IBMJw==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.25.9", + "@babel/generator": "^7.25.9", + "@babel/parser": "^7.25.9", + "@babel/template": "^7.25.9", + "@babel/types": "^7.25.9", + "debug": "^4.3.1", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse/node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/types": { + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.0.tgz", + "integrity": "sha512-Z/yiTPj+lDVnF7lWeKCIJzaIkI0vYO87dMpZ4bg4TDrFe4XXLFWL1TbXU27gBP3QccxV9mZICCrnjnYlJjXHOA==", + "dev": true, + "dependencies": { + "@babel/helper-string-parser": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@biomejs/biome": { + "version": "1.9.4", + "resolved": "https://registry.npmjs.org/@biomejs/biome/-/biome-1.9.4.tgz", + "integrity": "sha512-1rkd7G70+o9KkTn5KLmDYXihGoTaIGO9PIIN2ZB7UJxFrWw04CZHPYiMRjYsaDvVV7hP1dYNRLxSANLaBFGpog==", + "dev": true, + "hasInstallScript": true, + "bin": { + "biome": "bin/biome" + }, + "engines": { + "node": ">=14.21.3" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/biome" + }, + "optionalDependencies": { + "@biomejs/cli-darwin-arm64": "1.9.4", + "@biomejs/cli-darwin-x64": "1.9.4", + "@biomejs/cli-linux-arm64": "1.9.4", + "@biomejs/cli-linux-arm64-musl": "1.9.4", + "@biomejs/cli-linux-x64": "1.9.4", + "@biomejs/cli-linux-x64-musl": "1.9.4", + "@biomejs/cli-win32-arm64": "1.9.4", + "@biomejs/cli-win32-x64": "1.9.4" + } + }, + "node_modules/@biomejs/cli-darwin-arm64": { + "version": "1.9.4", + "resolved": "https://registry.npmjs.org/@biomejs/cli-darwin-arm64/-/cli-darwin-arm64-1.9.4.tgz", + "integrity": "sha512-bFBsPWrNvkdKrNCYeAp+xo2HecOGPAy9WyNyB/jKnnedgzl4W4Hb9ZMzYNbf8dMCGmUdSavlYHiR01QaYR58cw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=14.21.3" + } + }, + "node_modules/@biomejs/cli-darwin-x64": { + "version": "1.9.4", + "resolved": "https://registry.npmjs.org/@biomejs/cli-darwin-x64/-/cli-darwin-x64-1.9.4.tgz", + "integrity": "sha512-ngYBh/+bEedqkSevPVhLP4QfVPCpb+4BBe2p7Xs32dBgs7rh9nY2AIYUL6BgLw1JVXV8GlpKmb/hNiuIxfPfZg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=14.21.3" + } + }, + "node_modules/@biomejs/cli-linux-arm64": { + "version": "1.9.4", + "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-arm64/-/cli-linux-arm64-1.9.4.tgz", + "integrity": "sha512-fJIW0+LYujdjUgJJuwesP4EjIBl/N/TcOX3IvIHJQNsAqvV2CHIogsmA94BPG6jZATS4Hi+xv4SkBBQSt1N4/g==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=14.21.3" + } + }, + "node_modules/@biomejs/cli-linux-arm64-musl": { + "version": "1.9.4", + "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-arm64-musl/-/cli-linux-arm64-musl-1.9.4.tgz", + "integrity": "sha512-v665Ct9WCRjGa8+kTr0CzApU0+XXtRgwmzIf1SeKSGAv+2scAlW6JR5PMFo6FzqqZ64Po79cKODKf3/AAmECqA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=14.21.3" + } + }, + "node_modules/@biomejs/cli-linux-x64": { + "version": "1.9.4", + "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-x64/-/cli-linux-x64-1.9.4.tgz", + "integrity": "sha512-lRCJv/Vi3Vlwmbd6K+oQ0KhLHMAysN8lXoCI7XeHlxaajk06u7G+UsFSO01NAs5iYuWKmVZjmiOzJ0OJmGsMwg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=14.21.3" + } + }, + "node_modules/@biomejs/cli-linux-x64-musl": { + "version": "1.9.4", + "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-x64-musl/-/cli-linux-x64-musl-1.9.4.tgz", + "integrity": "sha512-gEhi/jSBhZ2m6wjV530Yy8+fNqG8PAinM3oV7CyO+6c3CEh16Eizm21uHVsyVBEB6RIM8JHIl6AGYCv6Q6Q9Tg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=14.21.3" + } + }, + "node_modules/@biomejs/cli-win32-arm64": { + "version": "1.9.4", + "resolved": "https://registry.npmjs.org/@biomejs/cli-win32-arm64/-/cli-win32-arm64-1.9.4.tgz", + "integrity": "sha512-tlbhLk+WXZmgwoIKwHIHEBZUwxml7bRJgk0X2sPyNR3S93cdRq6XulAZRQJ17FYGGzWne0fgrXBKpl7l4M87Hg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=14.21.3" + } + }, + "node_modules/@biomejs/cli-win32-x64": { + "version": "1.9.4", + "resolved": "https://registry.npmjs.org/@biomejs/cli-win32-x64/-/cli-win32-x64-1.9.4.tgz", + "integrity": "sha512-8Y5wMhVIPaWe6jw2H+KlEm4wP/f7EW3810ZLmDlrEEy5KvBsb9ECEfu/kMWD484ijfQ8+nIi0giMgu9g1UAuuA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=14.21.3" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.23.1.tgz", + "integrity": "sha512-6VhYk1diRqrhBAqpJEdjASR/+WVRtfjpqKuNw11cLiaWpAT/Uu+nokB+UJnevzy/P9C/ty6AOe0dwueMrGh/iQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.23.1.tgz", + "integrity": "sha512-uz6/tEy2IFm9RYOyvKl88zdzZfwEfKZmnX9Cj1BHjeSGNuGLuMD1kR8y5bteYmwqKm1tj8m4cb/aKEorr6fHWQ==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.23.1.tgz", + "integrity": "sha512-xw50ipykXcLstLeWH7WRdQuysJqejuAGPd30vd1i5zSyKK3WE+ijzHmLKxdiCMtH1pHz78rOg0BKSYOSB/2Khw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.23.1.tgz", + "integrity": "sha512-nlN9B69St9BwUoB+jkyU090bru8L0NA3yFvAd7k8dNsVH8bi9a8cUAUSEcEEgTp2z3dbEDGJGfP6VUnkQnlReg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.23.1.tgz", + "integrity": "sha512-YsS2e3Wtgnw7Wq53XXBLcV6JhRsEq8hkfg91ESVadIrzr9wO6jJDMZnCQbHm1Guc5t/CdDiFSSfWP58FNuvT3Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.23.1.tgz", + "integrity": "sha512-aClqdgTDVPSEGgoCS8QDG37Gu8yc9lTHNAQlsztQ6ENetKEO//b8y31MMu2ZaPbn4kVsIABzVLXYLhCGekGDqw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.23.1.tgz", + "integrity": "sha512-h1k6yS8/pN/NHlMl5+v4XPfikhJulk4G+tKGFIOwURBSFzE8bixw1ebjluLOjfwtLqY0kewfjLSrO6tN2MgIhA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.23.1.tgz", + "integrity": "sha512-lK1eJeyk1ZX8UklqFd/3A60UuZ/6UVfGT2LuGo3Wp4/z7eRTRYY+0xOu2kpClP+vMTi9wKOfXi2vjUpO1Ro76g==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.23.1.tgz", + "integrity": "sha512-CXXkzgn+dXAPs3WBwE+Kvnrf4WECwBdfjfeYHpMeVxWE0EceB6vhWGShs6wi0IYEqMSIzdOF1XjQ/Mkm5d7ZdQ==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.23.1.tgz", + "integrity": "sha512-/93bf2yxencYDnItMYV/v116zff6UyTjo4EtEQjUBeGiVpMmffDNUyD9UN2zV+V3LRV3/on4xdZ26NKzn6754g==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.23.1.tgz", + "integrity": "sha512-VTN4EuOHwXEkXzX5nTvVY4s7E/Krz7COC8xkftbbKRYAl96vPiUssGkeMELQMOnLOJ8k3BY1+ZY52tttZnHcXQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.23.1.tgz", + "integrity": "sha512-Vx09LzEoBa5zDnieH8LSMRToj7ir/Jeq0Gu6qJ/1GcBq9GkfoEAoXvLiW1U9J1qE/Y/Oyaq33w5p2ZWrNNHNEw==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.23.1.tgz", + "integrity": "sha512-nrFzzMQ7W4WRLNUOU5dlWAqa6yVeI0P78WKGUo7lg2HShq/yx+UYkeNSE0SSfSure0SqgnsxPvmAUu/vu0E+3Q==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.23.1.tgz", + "integrity": "sha512-dKN8fgVqd0vUIjxuJI6P/9SSSe/mB9rvA98CSH2sJnlZ/OCZWO1DJvxj8jvKTfYUdGfcq2dDxoKaC6bHuTlgcw==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.23.1.tgz", + "integrity": "sha512-5AV4Pzp80fhHL83JM6LoA6pTQVWgB1HovMBsLQ9OZWLDqVY8MVobBXNSmAJi//Csh6tcY7e7Lny2Hg1tElMjIA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.23.1.tgz", + "integrity": "sha512-9ygs73tuFCe6f6m/Tb+9LtYxWR4c9yg7zjt2cYkjDbDpV/xVn+68cQxMXCjUpYwEkze2RcU/rMnfIXNRFmSoDw==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.23.1.tgz", + "integrity": "sha512-EV6+ovTsEXCPAp58g2dD68LxoP/wK5pRvgy0J/HxPGB009omFPv3Yet0HiaqvrIrgPTBuC6wCH1LTOY91EO5hQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.23.1.tgz", + "integrity": "sha512-aevEkCNu7KlPRpYLjwmdcuNz6bDFiE7Z8XC4CPqExjTvrHugh28QzUXVOZtiYghciKUacNktqxdpymplil1beA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.23.1.tgz", + "integrity": "sha512-3x37szhLexNA4bXhLrCC/LImN/YtWis6WXr1VESlfVtVeoFJBRINPJ3f0a/6LV8zpikqoUg4hyXw0sFBt5Cr+Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.23.1.tgz", + "integrity": "sha512-aY2gMmKmPhxfU+0EdnN+XNtGbjfQgwZj43k8G3fyrDM/UdZww6xrWxmDkuz2eCZchqVeABjV5BpildOrUbBTqA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.23.1.tgz", + "integrity": "sha512-RBRT2gqEl0IKQABT4XTj78tpk9v7ehp+mazn2HbUeZl1YMdaGAQqhapjGTCe7uw7y0frDi4gS0uHzhvpFuI1sA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.23.1.tgz", + "integrity": "sha512-4O+gPR5rEBe2FpKOVyiJ7wNDPA8nGzDuJ6gN4okSA1gEOYZ67N8JPk58tkWtdtPeLz7lBnY6I5L3jdsr3S+A6A==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.23.1.tgz", + "integrity": "sha512-BcaL0Vn6QwCwre3Y717nVHZbAa4UBEigzFm6VdsVdT/MbZ38xoj1X9HPkZhbmaBGUD1W8vxAfffbDe8bA6AKnQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.23.1.tgz", + "integrity": "sha512-BHpFFeslkWrXWyUPnbKm+xYYVYruCinGcftSBaa8zoF9hZO4BcSCFUvHVTtzpIY6YzUnYtuEhZ+C9iEXjxnasg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.1.tgz", + "integrity": "sha512-s3O3waFUrMV8P/XaF/+ZTp1X9XBZW1a4B97ZnjQF2KYWaFD2A8KyFBsrsfSjEmjn3RGWAIuvlneuZm3CUK3jbA==", + "dev": true, + "dependencies": { + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.12.1", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz", + "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==", + "dev": true, + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/config-array": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.18.0.tgz", + "integrity": "sha512-fTxvnS1sRMu3+JjXwJG0j/i4RT9u4qJ+lqS/yCGap4lH4zZGzQ7tu+xZqQmcMZq5OBZDL4QRxQzRjkWcGt8IVw==", + "dev": true, + "dependencies": { + "@eslint/object-schema": "^2.1.4", + "debug": "^4.3.1", + "minimatch": "^3.1.2" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/core": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.7.0.tgz", + "integrity": "sha512-xp5Jirz5DyPYlPiKat8jaq0EmYvDXKKpzTbxXMpT9eqlRJkRKIz9AGMdlvYjih+im+QlhWrpvVjl8IPC/lHlUw==", + "dev": true, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.1.0.tgz", + "integrity": "sha512-4Bfj15dVJdoy3RfZmmo86RK1Fwzn6SstsvK9JS+BaVKqC6QQQQyXekNaC+g+LKNgkQ+2VhGAzm6hO40AhMR3zQ==", + "dev": true, + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^10.0.1", + "globals": "^14.0.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/eslintrc/node_modules/globals": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", + "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", + "dev": true, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@eslint/js": { + "version": "9.13.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.13.0.tgz", + "integrity": "sha512-IFLyoY4d72Z5y/6o/BazFBezupzI/taV8sGumxTAVw3lXG9A6md1Dc34T9s1FoD/an9pJH8RHbAxsaEbBed9lA==", + "dev": true, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/object-schema": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.4.tgz", + "integrity": "sha512-BsWiH1yFGjXXS2yvrf5LyuoSIIbPrGUWob917o+BTKuZ7qJdxX8aJLRxs1fS9n6r7vESrq1OUqb68dANcFXuQQ==", + "dev": true, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/plugin-kit": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.2.2.tgz", + "integrity": "sha512-CXtq5nR4Su+2I47WPOlWud98Y5Lv8Kyxp2ukhgFx/eW6Blm18VXJO5WuQylPugRo8nbluoi6GvvxBLqHcvqUUw==", + "dev": true, + "dependencies": { + "levn": "^0.4.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@floating-ui/core": { + "version": "1.6.8", + "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.6.8.tgz", + "integrity": "sha512-7XJ9cPU+yI2QeLS+FCSlqNFZJq8arvswefkZrYI1yQBbftw6FyrZOxYSh+9S7z7TpeWlRt9zJ5IhM1WIL334jA==", + "dependencies": { + "@floating-ui/utils": "^0.2.8" + } + }, + "node_modules/@floating-ui/dom": { + "version": "1.6.12", + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.6.12.tgz", + "integrity": "sha512-NP83c0HjokcGVEMeoStg317VD9W7eDlGK7457dMBANbKA6GJZdc7rjujdgqzTaz93jkGgc5P/jeWbaCHnMNc+w==", + "dependencies": { + "@floating-ui/core": "^1.6.0", + "@floating-ui/utils": "^0.2.8" + } + }, + "node_modules/@floating-ui/react-dom": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.1.2.tgz", + "integrity": "sha512-06okr5cgPzMNBy+Ycse2A6udMi4bqwW/zgBF/rwjcNqWkyr82Mcg8b0vjX8OJpZFy/FKjJmw6wV7t44kK6kW7A==", + "dependencies": { + "@floating-ui/dom": "^1.0.0" + }, + "peerDependencies": { + "react": ">=16.8.0", + "react-dom": ">=16.8.0" + } + }, + "node_modules/@floating-ui/utils": { + "version": "0.2.8", + "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.8.tgz", + "integrity": "sha512-kym7SodPp8/wloecOpcmSnWJsK7M0E5Wg8UcFA+uO4B9s5d0ywXOEro/8HM9x0rW+TljRzul/14UYz3TleT3ig==" + }, + "node_modules/@humanfs/core": { + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", + "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==", + "dev": true, + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/node": { + "version": "0.16.6", + "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.6.tgz", + "integrity": "sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==", + "dev": true, + "dependencies": { + "@humanfs/core": "^0.19.1", + "@humanwhocodes/retry": "^0.3.0" + }, + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/retry": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.3.1.tgz", + "integrity": "sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==", + "dev": true, + "engines": { + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", + "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", + "dependencies": { + "@jridgewell/set-array": "^1.2.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", + "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "optional": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/@radix-ui/number": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/number/-/number-1.1.0.tgz", + "integrity": "sha512-V3gRzhVNU1ldS5XhAPTom1fOIo4ccrjjJgmE+LI2h/WaFpHmx0MQApT+KZHnx8abG6Avtfcz4WoEciMnpFT3HQ==" + }, + "node_modules/@radix-ui/primitive": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.1.0.tgz", + "integrity": "sha512-4Z8dn6Upk0qk4P74xBhZ6Hd/w0mPEzOOLxy4xiPXOXqjF7jZS0VAKk7/x/H6FyY2zCkYJqePf1G5KmkmNJ4RBA==" + }, + "node_modules/@radix-ui/react-arrow": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-arrow/-/react-arrow-1.1.0.tgz", + "integrity": "sha512-FmlW1rCg7hBpEBwFbjHwCW6AmWLQM6g/v0Sn8XbP9NvmSZ2San1FpQeyPtufzOMSIx7Y4dzjlHoifhp+7NkZhw==", + "dependencies": { + "@radix-ui/react-primitive": "2.0.0" + }, + "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 + } + } + }, + "node_modules/@radix-ui/react-avatar": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-avatar/-/react-avatar-1.1.1.tgz", + "integrity": "sha512-eoOtThOmxeoizxpX6RiEsQZ2wj5r4+zoeqAwO0cBaFQGjJwIH3dIX0OCxNrCyrrdxG+vBweMETh3VziQG7c1kw==", + "dependencies": { + "@radix-ui/react-context": "1.1.1", + "@radix-ui/react-primitive": "2.0.0", + "@radix-ui/react-use-callback-ref": "1.1.0", + "@radix-ui/react-use-layout-effect": "1.1.0" + }, + "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 + } + } + }, + "node_modules/@radix-ui/react-checkbox": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-checkbox/-/react-checkbox-1.1.2.tgz", + "integrity": "sha512-/i0fl686zaJbDQLNKrkCbMyDm6FQMt4jg323k7HuqitoANm9sE23Ql8yOK3Wusk34HSLKDChhMux05FnP6KUkw==", + "dependencies": { + "@radix-ui/primitive": "1.1.0", + "@radix-ui/react-compose-refs": "1.1.0", + "@radix-ui/react-context": "1.1.1", + "@radix-ui/react-presence": "1.1.1", + "@radix-ui/react-primitive": "2.0.0", + "@radix-ui/react-use-controllable-state": "1.1.0", + "@radix-ui/react-use-previous": "1.1.0", + "@radix-ui/react-use-size": "1.1.0" + }, + "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 + } + } + }, + "node_modules/@radix-ui/react-collection": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-collection/-/react-collection-1.1.0.tgz", + "integrity": "sha512-GZsZslMJEyo1VKm5L1ZJY8tGDxZNPAoUeQUIbKeJfoi7Q4kmig5AsgLMYYuyYbfjd8fBmFORAIwYAkXMnXZgZw==", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.0", + "@radix-ui/react-context": "1.1.0", + "@radix-ui/react-primitive": "2.0.0", + "@radix-ui/react-slot": "1.1.0" + }, + "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 + } + } + }, + "node_modules/@radix-ui/react-collection/node_modules/@radix-ui/react-context": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.1.0.tgz", + "integrity": "sha512-OKrckBy+sMEgYM/sMmqmErVn0kZqrHPJze+Ql3DzYsDDp0hl0L62nx/2122/Bvps1qz645jlcu2tD9lrRSdf8A==", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-compose-refs": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.0.tgz", + "integrity": "sha512-b4inOtiaOnYf9KWyO3jAeeCG6FeyfY6ldiEPanbUjWd+xIk5wZeHa8yVwmrJ2vderhu/BQvzCrJI0lHd+wIiqw==", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-context": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.1.1.tgz", + "integrity": "sha512-UASk9zi+crv9WteK/NU4PLvOoL3OuE6BWVKNF6hPRBtYBDXQ2u5iu3O59zUlJiTVvkyuycnqrztsHVJwcK9K+Q==", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-direction": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-direction/-/react-direction-1.1.0.tgz", + "integrity": "sha512-BUuBvgThEiAXh2DWu93XsT+a3aWrGqolGlqqw5VU1kG7p/ZH2cuDlM1sRLNnY3QcBS69UIz2mcKhMxDsdewhjg==", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-dismissable-layer": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.1.1.tgz", + "integrity": "sha512-QSxg29lfr/xcev6kSz7MAlmDnzbP1eI/Dwn3Tp1ip0KT5CUELsxkekFEMVBEoykI3oV39hKT4TKZzBNMbcTZYQ==", + "dependencies": { + "@radix-ui/primitive": "1.1.0", + "@radix-ui/react-compose-refs": "1.1.0", + "@radix-ui/react-primitive": "2.0.0", + "@radix-ui/react-use-callback-ref": "1.1.0", + "@radix-ui/react-use-escape-keydown": "1.1.0" + }, + "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 + } + } + }, + "node_modules/@radix-ui/react-dropdown-menu": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-dropdown-menu/-/react-dropdown-menu-2.1.2.tgz", + "integrity": "sha512-GVZMR+eqK8/Kes0a36Qrv+i20bAPXSn8rCBTHx30w+3ECnR5o3xixAlqcVaYvLeyKUsm0aqyhWfmUcqufM8nYA==", + "dependencies": { + "@radix-ui/primitive": "1.1.0", + "@radix-ui/react-compose-refs": "1.1.0", + "@radix-ui/react-context": "1.1.1", + "@radix-ui/react-id": "1.1.0", + "@radix-ui/react-menu": "2.1.2", + "@radix-ui/react-primitive": "2.0.0", + "@radix-ui/react-use-controllable-state": "1.1.0" + }, + "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 + } + } + }, + "node_modules/@radix-ui/react-focus-guards": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-guards/-/react-focus-guards-1.1.1.tgz", + "integrity": "sha512-pSIwfrT1a6sIoDASCSpFwOasEwKTZWDw/iBdtnqKO7v6FeOzYJ7U53cPzYFVR3geGGXgVHaH+CdngrrAzqUGxg==", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-focus-scope": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-scope/-/react-focus-scope-1.1.0.tgz", + "integrity": "sha512-200UD8zylvEyL8Bx+z76RJnASR2gRMuxlgFCPAe/Q/679a/r0eK3MBVYMb7vZODZcffZBdob1EGnky78xmVvcA==", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.0", + "@radix-ui/react-primitive": "2.0.0", + "@radix-ui/react-use-callback-ref": "1.1.0" + }, + "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 + } + } + }, + "node_modules/@radix-ui/react-hover-card": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-hover-card/-/react-hover-card-1.1.2.tgz", + "integrity": "sha512-Y5w0qGhysvmqsIy6nQxaPa6mXNKznfoGjOfBgzOjocLxr2XlSjqBMYQQL+FfyogsMuX+m8cZyQGYhJxvxUzO4w==", + "dependencies": { + "@radix-ui/primitive": "1.1.0", + "@radix-ui/react-compose-refs": "1.1.0", + "@radix-ui/react-context": "1.1.1", + "@radix-ui/react-dismissable-layer": "1.1.1", + "@radix-ui/react-popper": "1.2.0", + "@radix-ui/react-portal": "1.1.2", + "@radix-ui/react-presence": "1.1.1", + "@radix-ui/react-primitive": "2.0.0", + "@radix-ui/react-use-controllable-state": "1.1.0" + }, + "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 + } + } + }, + "node_modules/@radix-ui/react-icons": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-icons/-/react-icons-1.3.1.tgz", + "integrity": "sha512-QvYompk0X+8Yjlo/Fv4McrzxohDdM5GgLHyQcPpcsPvlOSXCGFjdbuyGL5dzRbg0GpknAjQJJZzdiRK7iWVuFQ==", + "peerDependencies": { + "react": "^16.x || ^17.x || ^18.x || ^19.x" + } + }, + "node_modules/@radix-ui/react-id": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-id/-/react-id-1.1.0.tgz", + "integrity": "sha512-EJUrI8yYh7WOjNOqpoJaf1jlFIH2LvtgAl+YcFqNCa+4hj64ZXmPkAKOFs/ukjz3byN6bdb/AVUqHkI8/uWWMA==", + "dependencies": { + "@radix-ui/react-use-layout-effect": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-label": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-label/-/react-label-2.1.0.tgz", + "integrity": "sha512-peLblDlFw/ngk3UWq0VnYaOLy6agTZZ+MUO/WhVfm14vJGML+xH4FAl2XQGLqdefjNb7ApRg6Yn7U42ZhmYXdw==", + "dependencies": { + "@radix-ui/react-primitive": "2.0.0" + }, + "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 + } + } + }, + "node_modules/@radix-ui/react-menu": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-menu/-/react-menu-2.1.2.tgz", + "integrity": "sha512-lZ0R4qR2Al6fZ4yCCZzu/ReTFrylHFxIqy7OezIpWF4bL0o9biKo0pFIvkaew3TyZ9Fy5gYVrR5zCGZBVbO1zg==", + "dependencies": { + "@radix-ui/primitive": "1.1.0", + "@radix-ui/react-collection": "1.1.0", + "@radix-ui/react-compose-refs": "1.1.0", + "@radix-ui/react-context": "1.1.1", + "@radix-ui/react-direction": "1.1.0", + "@radix-ui/react-dismissable-layer": "1.1.1", + "@radix-ui/react-focus-guards": "1.1.1", + "@radix-ui/react-focus-scope": "1.1.0", + "@radix-ui/react-id": "1.1.0", + "@radix-ui/react-popper": "1.2.0", + "@radix-ui/react-portal": "1.1.2", + "@radix-ui/react-presence": "1.1.1", + "@radix-ui/react-primitive": "2.0.0", + "@radix-ui/react-roving-focus": "1.1.0", + "@radix-ui/react-slot": "1.1.0", + "@radix-ui/react-use-callback-ref": "1.1.0", + "aria-hidden": "^1.1.1", + "react-remove-scroll": "2.6.0" + }, + "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 + } + } + }, + "node_modules/@radix-ui/react-popover": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-popover/-/react-popover-1.1.2.tgz", + "integrity": "sha512-u2HRUyWW+lOiA2g0Le0tMmT55FGOEWHwPFt1EPfbLly7uXQExFo5duNKqG2DzmFXIdqOeNd+TpE8baHWJCyP9w==", + "dependencies": { + "@radix-ui/primitive": "1.1.0", + "@radix-ui/react-compose-refs": "1.1.0", + "@radix-ui/react-context": "1.1.1", + "@radix-ui/react-dismissable-layer": "1.1.1", + "@radix-ui/react-focus-guards": "1.1.1", + "@radix-ui/react-focus-scope": "1.1.0", + "@radix-ui/react-id": "1.1.0", + "@radix-ui/react-popper": "1.2.0", + "@radix-ui/react-portal": "1.1.2", + "@radix-ui/react-presence": "1.1.1", + "@radix-ui/react-primitive": "2.0.0", + "@radix-ui/react-slot": "1.1.0", + "@radix-ui/react-use-controllable-state": "1.1.0", + "aria-hidden": "^1.1.1", + "react-remove-scroll": "2.6.0" + }, + "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 + } + } + }, + "node_modules/@radix-ui/react-popper": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-popper/-/react-popper-1.2.0.tgz", + "integrity": "sha512-ZnRMshKF43aBxVWPWvbj21+7TQCvhuULWJ4gNIKYpRlQt5xGRhLx66tMp8pya2UkGHTSlhpXwmjqltDYHhw7Vg==", + "dependencies": { + "@floating-ui/react-dom": "^2.0.0", + "@radix-ui/react-arrow": "1.1.0", + "@radix-ui/react-compose-refs": "1.1.0", + "@radix-ui/react-context": "1.1.0", + "@radix-ui/react-primitive": "2.0.0", + "@radix-ui/react-use-callback-ref": "1.1.0", + "@radix-ui/react-use-layout-effect": "1.1.0", + "@radix-ui/react-use-rect": "1.1.0", + "@radix-ui/react-use-size": "1.1.0", + "@radix-ui/rect": "1.1.0" + }, + "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 + } + } + }, + "node_modules/@radix-ui/react-popper/node_modules/@radix-ui/react-context": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.1.0.tgz", + "integrity": "sha512-OKrckBy+sMEgYM/sMmqmErVn0kZqrHPJze+Ql3DzYsDDp0hl0L62nx/2122/Bvps1qz645jlcu2tD9lrRSdf8A==", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-portal": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-portal/-/react-portal-1.1.2.tgz", + "integrity": "sha512-WeDYLGPxJb/5EGBoedyJbT0MpoULmwnIPMJMSldkuiMsBAv7N1cRdsTWZWht9vpPOiN3qyiGAtbK2is47/uMFg==", + "dependencies": { + "@radix-ui/react-primitive": "2.0.0", + "@radix-ui/react-use-layout-effect": "1.1.0" + }, + "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 + } + } + }, + "node_modules/@radix-ui/react-presence": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-presence/-/react-presence-1.1.1.tgz", + "integrity": "sha512-IeFXVi4YS1K0wVZzXNrbaaUvIJ3qdY+/Ih4eHFhWA9SwGR9UDX7Ck8abvL57C4cv3wwMvUE0OG69Qc3NCcTe/A==", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.0", + "@radix-ui/react-use-layout-effect": "1.1.0" + }, + "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 + } + } + }, + "node_modules/@radix-ui/react-primitive": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.0.0.tgz", + "integrity": "sha512-ZSpFm0/uHa8zTvKBDjLFWLo8dkr4MBsiDLz0g3gMUwqgLHz9rTaRRGYDgvZPtBJgYCBKXkS9fzmoySgr8CO6Cw==", + "dependencies": { + "@radix-ui/react-slot": "1.1.0" + }, + "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 + } + } + }, + "node_modules/@radix-ui/react-roving-focus": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-roving-focus/-/react-roving-focus-1.1.0.tgz", + "integrity": "sha512-EA6AMGeq9AEeQDeSH0aZgG198qkfHSbvWTf1HvoDmOB5bBG/qTxjYMWUKMnYiV6J/iP/J8MEFSuB2zRU2n7ODA==", + "dependencies": { + "@radix-ui/primitive": "1.1.0", + "@radix-ui/react-collection": "1.1.0", + "@radix-ui/react-compose-refs": "1.1.0", + "@radix-ui/react-context": "1.1.0", + "@radix-ui/react-direction": "1.1.0", + "@radix-ui/react-id": "1.1.0", + "@radix-ui/react-primitive": "2.0.0", + "@radix-ui/react-use-callback-ref": "1.1.0", + "@radix-ui/react-use-controllable-state": "1.1.0" + }, + "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 + } + } + }, + "node_modules/@radix-ui/react-roving-focus/node_modules/@radix-ui/react-context": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.1.0.tgz", + "integrity": "sha512-OKrckBy+sMEgYM/sMmqmErVn0kZqrHPJze+Ql3DzYsDDp0hl0L62nx/2122/Bvps1qz645jlcu2tD9lrRSdf8A==", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-scroll-area": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-scroll-area/-/react-scroll-area-1.2.0.tgz", + "integrity": "sha512-q2jMBdsJ9zB7QG6ngQNzNwlvxLQqONyL58QbEGwuyRZZb/ARQwk3uQVbCF7GvQVOtV6EU/pDxAw3zRzJZI3rpQ==", + "dependencies": { + "@radix-ui/number": "1.1.0", + "@radix-ui/primitive": "1.1.0", + "@radix-ui/react-compose-refs": "1.1.0", + "@radix-ui/react-context": "1.1.1", + "@radix-ui/react-direction": "1.1.0", + "@radix-ui/react-presence": "1.1.1", + "@radix-ui/react-primitive": "2.0.0", + "@radix-ui/react-use-callback-ref": "1.1.0", + "@radix-ui/react-use-layout-effect": "1.1.0" + }, + "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 + } + } + }, + "node_modules/@radix-ui/react-select": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-select/-/react-select-2.1.2.tgz", + "integrity": "sha512-rZJtWmorC7dFRi0owDmoijm6nSJH1tVw64QGiNIZ9PNLyBDtG+iAq+XGsya052At4BfarzY/Dhv9wrrUr6IMZA==", + "dependencies": { + "@radix-ui/number": "1.1.0", + "@radix-ui/primitive": "1.1.0", + "@radix-ui/react-collection": "1.1.0", + "@radix-ui/react-compose-refs": "1.1.0", + "@radix-ui/react-context": "1.1.1", + "@radix-ui/react-direction": "1.1.0", + "@radix-ui/react-dismissable-layer": "1.1.1", + "@radix-ui/react-focus-guards": "1.1.1", + "@radix-ui/react-focus-scope": "1.1.0", + "@radix-ui/react-id": "1.1.0", + "@radix-ui/react-popper": "1.2.0", + "@radix-ui/react-portal": "1.1.2", + "@radix-ui/react-primitive": "2.0.0", + "@radix-ui/react-slot": "1.1.0", + "@radix-ui/react-use-callback-ref": "1.1.0", + "@radix-ui/react-use-controllable-state": "1.1.0", + "@radix-ui/react-use-layout-effect": "1.1.0", + "@radix-ui/react-use-previous": "1.1.0", + "@radix-ui/react-visually-hidden": "1.1.0", + "aria-hidden": "^1.1.1", + "react-remove-scroll": "2.6.0" + }, + "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 + } + } + }, + "node_modules/@radix-ui/react-slot": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.1.0.tgz", + "integrity": "sha512-FUCf5XMfmW4dtYl69pdS4DbxKy8nj4M7SafBgPllysxmdachynNflAdp/gCsnYWNDnge6tI9onzMp5ARYc1KNw==", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-tabs": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-tabs/-/react-tabs-1.1.1.tgz", + "integrity": "sha512-3GBUDmP2DvzmtYLMsHmpA1GtR46ZDZ+OreXM/N+kkQJOPIgytFWWTfDQmBQKBvaFS0Vno0FktdbVzN28KGrMdw==", + "dependencies": { + "@radix-ui/primitive": "1.1.0", + "@radix-ui/react-context": "1.1.1", + "@radix-ui/react-direction": "1.1.0", + "@radix-ui/react-id": "1.1.0", + "@radix-ui/react-presence": "1.1.1", + "@radix-ui/react-primitive": "2.0.0", + "@radix-ui/react-roving-focus": "1.1.0", + "@radix-ui/react-use-controllable-state": "1.1.0" + }, + "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 + } + } + }, + "node_modules/@radix-ui/react-toast": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-toast/-/react-toast-1.2.2.tgz", + "integrity": "sha512-Z6pqSzmAP/bFJoqMAston4eSNa+ud44NSZTiZUmUen+IOZ5nBY8kzuU5WDBVyFXPtcW6yUalOHsxM/BP6Sv8ww==", + "dependencies": { + "@radix-ui/primitive": "1.1.0", + "@radix-ui/react-collection": "1.1.0", + "@radix-ui/react-compose-refs": "1.1.0", + "@radix-ui/react-context": "1.1.1", + "@radix-ui/react-dismissable-layer": "1.1.1", + "@radix-ui/react-portal": "1.1.2", + "@radix-ui/react-presence": "1.1.1", + "@radix-ui/react-primitive": "2.0.0", + "@radix-ui/react-use-callback-ref": "1.1.0", + "@radix-ui/react-use-controllable-state": "1.1.0", + "@radix-ui/react-use-layout-effect": "1.1.0", + "@radix-ui/react-visually-hidden": "1.1.0" + }, + "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 + } + } + }, + "node_modules/@radix-ui/react-tooltip": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-tooltip/-/react-tooltip-1.1.3.tgz", + "integrity": "sha512-Z4w1FIS0BqVFI2c1jZvb/uDVJijJjJ2ZMuPV81oVgTZ7g3BZxobplnMVvXtFWgtozdvYJ+MFWtwkM5S2HnAong==", + "dependencies": { + "@radix-ui/primitive": "1.1.0", + "@radix-ui/react-compose-refs": "1.1.0", + "@radix-ui/react-context": "1.1.1", + "@radix-ui/react-dismissable-layer": "1.1.1", + "@radix-ui/react-id": "1.1.0", + "@radix-ui/react-popper": "1.2.0", + "@radix-ui/react-portal": "1.1.2", + "@radix-ui/react-presence": "1.1.1", + "@radix-ui/react-primitive": "2.0.0", + "@radix-ui/react-slot": "1.1.0", + "@radix-ui/react-use-controllable-state": "1.1.0", + "@radix-ui/react-visually-hidden": "1.1.0" + }, + "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 + } + } + }, + "node_modules/@radix-ui/react-use-callback-ref": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.1.0.tgz", + "integrity": "sha512-CasTfvsy+frcFkbXtSJ2Zu9JHpN8TYKxkgJGWbjiZhFivxaeW7rMeZt7QELGVLaYVfFMsKHjb7Ak0nMEe+2Vfw==", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-controllable-state": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.1.0.tgz", + "integrity": "sha512-MtfMVJiSr2NjzS0Aa90NPTnvTSg6C/JLCV7ma0W6+OMV78vd8OyRpID+Ng9LxzsPbLeuBnWBA1Nq30AtBIDChw==", + "dependencies": { + "@radix-ui/react-use-callback-ref": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-escape-keydown": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-escape-keydown/-/react-use-escape-keydown-1.1.0.tgz", + "integrity": "sha512-L7vwWlR1kTTQ3oh7g1O0CBF3YCyyTj8NmhLR+phShpyA50HCfBFKVJTpshm9PzLiKmehsrQzTYTpX9HvmC9rhw==", + "dependencies": { + "@radix-ui/react-use-callback-ref": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-layout-effect": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.1.0.tgz", + "integrity": "sha512-+FPE0rOdziWSrH9athwI1R0HDVbWlEhd+FR+aSDk4uWGmSJ9Z54sdZVDQPZAinJhJXwfT+qnj969mCsT2gfm5w==", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-previous": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-previous/-/react-use-previous-1.1.0.tgz", + "integrity": "sha512-Z/e78qg2YFnnXcW88A4JmTtm4ADckLno6F7OXotmkQfeuCVaKuYzqAATPhVzl3delXE7CxIV8shofPn3jPc5Og==", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-rect": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-rect/-/react-use-rect-1.1.0.tgz", + "integrity": "sha512-0Fmkebhr6PiseyZlYAOtLS+nb7jLmpqTrJyv61Pe68MKYW6OWdRE2kI70TaYY27u7H0lajqM3hSMMLFq18Z7nQ==", + "dependencies": { + "@radix-ui/rect": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-size": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-size/-/react-use-size-1.1.0.tgz", + "integrity": "sha512-XW3/vWuIXHa+2Uwcc2ABSfcCledmXhhQPlGbfcRXbiUQI5Icjcg19BGCZVKKInYbvUCut/ufbbLLPFC5cbb1hw==", + "dependencies": { + "@radix-ui/react-use-layout-effect": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-visually-hidden": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-visually-hidden/-/react-visually-hidden-1.1.0.tgz", + "integrity": "sha512-N8MDZqtgCgG5S3aV60INAB475osJousYpZ4cTJ2cFbMpdHS5Y6loLTH8LPtkj2QN0x93J30HT/M3qJXM0+lyeQ==", + "dependencies": { + "@radix-ui/react-primitive": "2.0.0" + }, + "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 + } + } + }, + "node_modules/@radix-ui/rect": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/rect/-/rect-1.1.0.tgz", + "integrity": "sha512-A9+lCBZoaMJlVKcRBz2YByCG+Cp2t6nAnMnNba+XiWxnj6r4JUFqfsgwocMBZU9LPtdxC6wB56ySYpc7LQIoJg==" + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.24.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.24.3.tgz", + "integrity": "sha512-ufb2CH2KfBWPJok95frEZZ82LtDl0A6QKTa8MoM+cWwDZvVGl5/jNb79pIhRvAalUu+7LD91VYR0nwRD799HkQ==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.24.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.24.3.tgz", + "integrity": "sha512-iAHpft/eQk9vkWIV5t22V77d90CRofgR2006UiCjHcHJFVI1E0oBkQIAbz+pLtthFw3hWEmVB4ilxGyBf48i2Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.24.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.24.3.tgz", + "integrity": "sha512-QPW2YmkWLlvqmOa2OwrfqLJqkHm7kJCIMq9kOz40Zo9Ipi40kf9ONG5Sz76zszrmIZZ4hgRIkez69YnTHgEz1w==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.24.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.24.3.tgz", + "integrity": "sha512-KO0pN5x3+uZm1ZXeIfDqwcvnQ9UEGN8JX5ufhmgH5Lz4ujjZMAnxQygZAVGemFWn+ZZC0FQopruV4lqmGMshow==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.24.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.24.3.tgz", + "integrity": "sha512-CsC+ZdIiZCZbBI+aRlWpYJMSWvVssPuWqrDy/zi9YfnatKKSLFCe6fjna1grHuo/nVaHG+kiglpRhyBQYRTK4A==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.24.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.24.3.tgz", + "integrity": "sha512-F0nqiLThcfKvRQhZEzMIXOQG4EeX61im61VYL1jo4eBxv4aZRmpin6crnBJQ/nWnCsjH5F6J3W6Stdm0mBNqBg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.24.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.24.3.tgz", + "integrity": "sha512-KRSFHyE/RdxQ1CSeOIBVIAxStFC/hnBgVcaiCkQaVC+EYDtTe4X7z5tBkFyRoBgUGtB6Xg6t9t2kulnX6wJc6A==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.24.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.24.3.tgz", + "integrity": "sha512-h6Q8MT+e05zP5BxEKz0vi0DhthLdrNEnspdLzkoFqGwnmOzakEHSlXfVyA4HJ322QtFy7biUAVFPvIDEDQa6rw==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.24.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.24.3.tgz", + "integrity": "sha512-fKElSyXhXIJ9pqiYRqisfirIo2Z5pTTve5K438URf08fsypXrEkVmShkSfM8GJ1aUyvjakT+fn2W7Czlpd/0FQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.24.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.24.3.tgz", + "integrity": "sha512-YlddZSUk8G0px9/+V9PVilVDC6ydMz7WquxozToozSnfFK6wa6ne1ATUjUvjin09jp34p84milxlY5ikueoenw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { + "version": "4.24.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.24.3.tgz", + "integrity": "sha512-yNaWw+GAO8JjVx3s3cMeG5Esz1cKVzz8PkTJSfYzE5u7A+NvGmbVFEHP+BikTIyYWuz0+DX9kaA3pH9Sqxp69g==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.24.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.24.3.tgz", + "integrity": "sha512-lWKNQfsbpv14ZCtM/HkjCTm4oWTKTfxPmr7iPfp3AHSqyoTz5AgLemYkWLwOBWc+XxBbrU9SCokZP0WlBZM9lA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.24.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.24.3.tgz", + "integrity": "sha512-HoojGXTC2CgCcq0Woc/dn12wQUlkNyfH0I1ABK4Ni9YXyFQa86Fkt2Q0nqgLfbhkyfQ6003i3qQk9pLh/SpAYw==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.24.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.24.3.tgz", + "integrity": "sha512-mnEOh4iE4USSccBOtcrjF5nj+5/zm6NcNhbSEfR3Ot0pxBwvEn5QVUXcuOwwPkapDtGZ6pT02xLoPaNv06w7KQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.24.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.24.3.tgz", + "integrity": "sha512-rMTzawBPimBQkG9NKpNHvquIUTQPzrnPxPbCY1Xt+mFkW7pshvyIS5kYgcf74goxXOQk0CP3EoOC1zcEezKXhw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.24.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.24.3.tgz", + "integrity": "sha512-2lg1CE305xNvnH3SyiKwPVsTVLCg4TmNCF1z7PSHX2uZY2VbUpdkgAllVoISD7JO7zu+YynpWNSKAtOrX3AiuA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.24.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.24.3.tgz", + "integrity": "sha512-9SjYp1sPyxJsPWuhOCX6F4jUMXGbVVd5obVpoVEi8ClZqo52ViZewA6eFz85y8ezuOA+uJMP5A5zo6Oz4S5rVQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.24.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.24.3.tgz", + "integrity": "sha512-HGZgRFFYrMrP3TJlq58nR1xy8zHKId25vhmm5S9jETEfDf6xybPxsavFTJaufe2zgOGYJBskGlj49CwtEuFhWQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@swc/core": { + "version": "1.7.42", + "resolved": "https://registry.npmjs.org/@swc/core/-/core-1.7.42.tgz", + "integrity": "sha512-iQrRk3SKndQZ4ptJv1rzeQSiCYQIhMjiO97QXOlCcCoaazOLKPnLnXzU4Kv0FuBFyYfG2FE94BoR0XI2BN02qw==", + "dev": true, + "hasInstallScript": true, + "dependencies": { + "@swc/counter": "^0.1.3", + "@swc/types": "^0.1.13" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/swc" + }, + "optionalDependencies": { + "@swc/core-darwin-arm64": "1.7.42", + "@swc/core-darwin-x64": "1.7.42", + "@swc/core-linux-arm-gnueabihf": "1.7.42", + "@swc/core-linux-arm64-gnu": "1.7.42", + "@swc/core-linux-arm64-musl": "1.7.42", + "@swc/core-linux-x64-gnu": "1.7.42", + "@swc/core-linux-x64-musl": "1.7.42", + "@swc/core-win32-arm64-msvc": "1.7.42", + "@swc/core-win32-ia32-msvc": "1.7.42", + "@swc/core-win32-x64-msvc": "1.7.42" + }, + "peerDependencies": { + "@swc/helpers": "*" + }, + "peerDependenciesMeta": { + "@swc/helpers": { + "optional": true + } + } + }, + "node_modules/@swc/core-darwin-arm64": { + "version": "1.7.42", + "resolved": "https://registry.npmjs.org/@swc/core-darwin-arm64/-/core-darwin-arm64-1.7.42.tgz", + "integrity": "sha512-fWhaCs2+8GDRIcjExVDEIfbptVrxDqG8oHkESnXgymmvqTWzWei5SOnPNMS8Q+MYsn/b++Y2bDxkcwmq35Bvxg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-darwin-x64": { + "version": "1.7.42", + "resolved": "https://registry.npmjs.org/@swc/core-darwin-x64/-/core-darwin-x64-1.7.42.tgz", + "integrity": "sha512-ZaVHD2bijrlkCyD7NDzLmSK849Jgcx+6DdL4x1dScoz1slJ8GTvLtEu0JOUaaScQwA+cVlhmrmlmi9ssjbRLGQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-arm-gnueabihf": { + "version": "1.7.42", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.7.42.tgz", + "integrity": "sha512-iF0BJj7hVTbY/vmbvyzVTh/0W80+Q4fbOYschdUM3Bsud39TA+lSaPOefOHywkNH58EQ1z3EAxYcJOWNES7GFQ==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-arm64-gnu": { + "version": "1.7.42", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.7.42.tgz", + "integrity": "sha512-xGu8j+DOLYTLkVmsfZPJbNPW1EkiWgSucT0nOlz77bLxImukt/0+HVm2hOwHSKuArQ8C3cjahAMY3b/s4VH2ww==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-arm64-musl": { + "version": "1.7.42", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.7.42.tgz", + "integrity": "sha512-qtW3JNO7i1yHEko59xxz+jY38+tYmB96JGzj6XzygMbYJYZDYbrOpXQvKbMGNG3YeTDan7Fp2jD0dlKf7NgDPA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-x64-gnu": { + "version": "1.7.42", + "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.7.42.tgz", + "integrity": "sha512-F9WY1TN+hhhtiEzZjRQziNLt36M5YprMeOBHjsLVNqwgflzleSI7ulgnlQECS8c8zESaXj3ksGduAoJYtPC1cA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-x64-musl": { + "version": "1.7.42", + "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.7.42.tgz", + "integrity": "sha512-7YMdOaYKLMQ8JGfnmRDwidpLFs/6ka+80zekeM0iCVO48yLrJR36G0QGXzMjKsXI0BPhq+mboZRRENK4JfQnEA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-win32-arm64-msvc": { + "version": "1.7.42", + "resolved": "https://registry.npmjs.org/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.7.42.tgz", + "integrity": "sha512-C5CYWaIZEyqPl5W/EwcJ/mLBJFHVoUEa/IwWi0b4q2fCXcSCktQGwKXOQ+d67GneiZoiq0HasgcdMmMpGS9YRQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-win32-ia32-msvc": { + "version": "1.7.42", + "resolved": "https://registry.npmjs.org/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.7.42.tgz", + "integrity": "sha512-3j47seZ5pO62mbrqvPe1iwhe2BXnM5q7iB+n2xgA38PCGYt0mnaJafqmpCXm/uYZOCMqSNynaoOWCMMZm4sqtA==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-win32-x64-msvc": { + "version": "1.7.42", + "resolved": "https://registry.npmjs.org/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.7.42.tgz", + "integrity": "sha512-FXl9MdeUogZLGDcLr6QIRdDVkpG0dkN4MLM4dwQ5kcAk+XfKPrQibX6M2kcfhsCx+jtBqtK7hRFReRXPWJZGbA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/counter": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@swc/counter/-/counter-0.1.3.tgz", + "integrity": "sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==", + "dev": true + }, + "node_modules/@swc/types": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/@swc/types/-/types-0.1.13.tgz", + "integrity": "sha512-JL7eeCk6zWCbiYQg2xQSdLXQJl8Qoc9rXmG2cEKvHe3CKwMHwHGpfOb8frzNLmbycOo6I51qxnLnn9ESf4I20Q==", + "dev": true, + "dependencies": { + "@swc/counter": "^0.1.3" + } + }, + "node_modules/@tanstack/eslint-plugin-router": { + "version": "1.77.7", + "resolved": "https://registry.npmjs.org/@tanstack/eslint-plugin-router/-/eslint-plugin-router-1.77.7.tgz", + "integrity": "sha512-22lpivV3EA+S25dlZehXfl7pbuNkrbzOsS1FylZuXYCG7pq659N42LBovf5YlD8byYTwfAVjBFB01ylFjuG/Bw==", + "dev": true, + "dependencies": { + "@typescript-eslint/utils": "^8.12.1" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0" + } + }, + "node_modules/@tanstack/history": { + "version": "1.61.1", + "resolved": "https://registry.npmjs.org/@tanstack/history/-/history-1.61.1.tgz", + "integrity": "sha512-2CqERleeqO3hkhJmyJm37tiL3LYgeOpmo8szqdjgtnnG0z7ZpvzkZz6HkfOr9Ca/ha7mhAiouSvLYuLkM37AMg==", + "peer": true, + "engines": { + "node": ">=12" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + } + }, + "node_modules/@tanstack/query-core": { + "version": "5.59.16", + "resolved": "https://registry.npmjs.org/@tanstack/query-core/-/query-core-5.59.16.tgz", + "integrity": "sha512-crHn+G3ltqb5JG0oUv6q+PMz1m1YkjpASrXTU+sYWW9pLk0t2GybUHNRqYPZWhxgjPaVGC4yp92gSFEJgYEsPw==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + } + }, + "node_modules/@tanstack/react-query": { + "version": "5.59.16", + "resolved": "https://registry.npmjs.org/@tanstack/react-query/-/react-query-5.59.16.tgz", + "integrity": "sha512-MuyWheG47h6ERd4PKQ6V8gDyBu3ThNG22e1fRVwvq6ap3EqsFhyuxCAwhNP/03m/mLg+DAb0upgbPaX6VB+CkQ==", + "dependencies": { + "@tanstack/query-core": "5.59.16" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + }, + "peerDependencies": { + "react": "^18 || ^19" + } + }, + "node_modules/@tanstack/react-router": { + "version": "1.78.0", + "resolved": "https://registry.npmjs.org/@tanstack/react-router/-/react-router-1.78.0.tgz", + "integrity": "sha512-yVIi6EJ3HzQxfdeWzfytSYBEELaHgvVL8xUoKWHeShcey4ChegGF0oSXhZ6dTiu8ODu0CkHKInTjgzjrlMO14Q==", + "peer": true, + "dependencies": { + "@tanstack/history": "1.61.1", + "@tanstack/react-store": "^0.5.6", + "tiny-invariant": "^1.3.3", + "tiny-warning": "^1.0.3" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + }, + "peerDependencies": { + "@tanstack/router-generator": "1.78.0", + "react": ">=18", + "react-dom": ">=18" + }, + "peerDependenciesMeta": { + "@tanstack/router-generator": { + "optional": true + } + } + }, + "node_modules/@tanstack/react-store": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/@tanstack/react-store/-/react-store-0.5.6.tgz", + "integrity": "sha512-SitIpS5jTj28DajjLpWbIX+YetmJL+6PRY0DKKiCGBKfYIqj3ryODQYF3jB3SNoR9ifUA/jFkqbJdBKFtWd+AQ==", + "peer": true, + "dependencies": { + "@tanstack/store": "0.5.5", + "use-sync-external-store": "^1.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + }, + "peerDependencies": { + "react": "^17.0.0 || ^18.0.0", + "react-dom": "^17.0.0 || ^18.0.0" + } + }, + "node_modules/@tanstack/react-table": { + "version": "8.20.5", + "resolved": "https://registry.npmjs.org/@tanstack/react-table/-/react-table-8.20.5.tgz", + "integrity": "sha512-WEHopKw3znbUZ61s9i0+i9g8drmDo6asTWbrQh8Us63DAk/M0FkmIqERew6P71HI75ksZ2Pxyuf4vvKh9rAkiA==", + "dependencies": { + "@tanstack/table-core": "8.20.5" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + }, + "peerDependencies": { + "react": ">=16.8", + "react-dom": ">=16.8" + } + }, + "node_modules/@tanstack/router-devtools": { + "version": "1.78.0", + "resolved": "https://registry.npmjs.org/@tanstack/router-devtools/-/router-devtools-1.78.0.tgz", + "integrity": "sha512-9NTBXKL3jqHEMPTyy/f4ibDxKL5aEyGMt+SxE4fJUeaG8cZeko8cZwcRuV+a2/5OBrvxzEBMa4enmKY8PvW19Q==", + "dev": true, + "dependencies": { + "clsx": "^2.1.1", + "goober": "^2.1.16" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + }, + "peerDependencies": { + "@tanstack/react-router": "^1.78.0", + "react": ">=18", + "react-dom": ">=18" + } + }, + "node_modules/@tanstack/router-generator": { + "version": "1.78.0", + "resolved": "https://registry.npmjs.org/@tanstack/router-generator/-/router-generator-1.78.0.tgz", + "integrity": "sha512-hrP3M/oh+Lvli6oVH2bItXFHsWKHkL758efPKIyfmvp7Fk9Lm+eL0AVcxF8w9KzS+jtlzw0aPYVV7KH7Vu0URA==", + "devOptional": true, + "dependencies": { + "@tanstack/virtual-file-routes": "^1.64.0", + "prettier": "^3.3.3", + "tsx": "^4.19.2", + "zod": "^3.23.8" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + } + }, + "node_modules/@tanstack/router-plugin": { + "version": "1.78.0", + "resolved": "https://registry.npmjs.org/@tanstack/router-plugin/-/router-plugin-1.78.0.tgz", + "integrity": "sha512-ep3FYZzH/DYxZE/Pg4VyiYUqNfvoNXzmvw0hdHliTOxgsJdOs71LKcJokzeLdNijQOgud+CDurTWTknrRBOgeA==", + "dev": true, + "dependencies": { + "@babel/core": "^7.26.0", + "@babel/generator": "^7.26.0", + "@babel/parser": "^7.26.1", + "@babel/plugin-syntax-jsx": "^7.25.9", + "@babel/plugin-syntax-typescript": "^7.25.9", + "@babel/template": "^7.25.9", + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.26.0", + "@tanstack/router-generator": "^1.78.0", + "@tanstack/virtual-file-routes": "^1.64.0", + "@types/babel__core": "^7.20.5", + "@types/babel__generator": "^7.6.8", + "@types/babel__template": "^7.4.4", + "@types/babel__traverse": "^7.20.6", + "babel-dead-code-elimination": "^1.0.6", + "chokidar": "^3.6.0", + "unplugin": "^1.12.2", + "zod": "^3.23.8" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + }, + "peerDependencies": { + "@rsbuild/core": ">=1.0.2", + "vite": ">=5.0.0", + "webpack": ">=5.92.0" + }, + "peerDependenciesMeta": { + "@rsbuild/core": { + "optional": true + }, + "vite": { + "optional": true + }, + "webpack": { + "optional": true + } + } + }, + "node_modules/@tanstack/router-zod-adapter": { + "version": "1.78.0", + "resolved": "https://registry.npmjs.org/@tanstack/router-zod-adapter/-/router-zod-adapter-1.78.0.tgz", + "integrity": "sha512-AoRY57TJo3ZruHgqBGxTHxTREkLBOV/8LFOommUZ3VXys/zn+ovoJRU+El6YgF7XIeJl1gJQ2WFuOInkuHYOgg==", + "engines": { + "node": ">=12" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + }, + "peerDependencies": { + "@tanstack/react-router": ">=1.43.2", + "zod": ">=3" + } + }, + "node_modules/@tanstack/store": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/@tanstack/store/-/store-0.5.5.tgz", + "integrity": "sha512-EOSrgdDAJExbvRZEQ/Xhh9iZchXpMN+ga1Bnk8Nmygzs8TfiE6hbzThF+Pr2G19uHL6+DTDTHhJ8VQiOd7l4tA==", + "peer": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + } + }, + "node_modules/@tanstack/table-core": { + "version": "8.20.5", + "resolved": "https://registry.npmjs.org/@tanstack/table-core/-/table-core-8.20.5.tgz", + "integrity": "sha512-P9dF7XbibHph2PFRz8gfBKEXEY/HJPOhym8CHmjF8y3q5mWpKx9xtZapXQUWCgkqvsK0R46Azuz+VaxD4Xl+Tg==", + "engines": { + "node": ">=12" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + } + }, + "node_modules/@tanstack/virtual-file-routes": { + "version": "1.64.0", + "resolved": "https://registry.npmjs.org/@tanstack/virtual-file-routes/-/virtual-file-routes-1.64.0.tgz", + "integrity": "sha512-soW+gE9QTmMaqXM17r7y1p8NiQVIIECjdTaYla8BKL5Flj030m3KuxEQoiG1XgjtA0O7ayznFz2YvPcXIy3qDg==", + "devOptional": true, + "engines": { + "node": ">=12" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + } + }, + "node_modules/@types/babel__core": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", + "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "node_modules/@types/babel__generator": { + "version": "7.6.8", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.8.tgz", + "integrity": "sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__template": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", + "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__traverse": { + "version": "7.20.6", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.6.tgz", + "integrity": "sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.20.7" + } + }, + "node_modules/@types/d3-array": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/@types/d3-array/-/d3-array-3.2.1.tgz", + "integrity": "sha512-Y2Jn2idRrLzUfAKV2LyRImR+y4oa2AntrgID95SHJxuMUrkNXmanDSed71sRNZysveJVt1hLLemQZIady0FpEg==" + }, + "node_modules/@types/d3-color": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/@types/d3-color/-/d3-color-3.1.3.tgz", + "integrity": "sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A==" + }, + "node_modules/@types/d3-ease": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-ease/-/d3-ease-3.0.2.tgz", + "integrity": "sha512-NcV1JjO5oDzoK26oMzbILE6HW7uVXOHLQvHshBUW4UMdZGfiY6v5BeQwh9a9tCzv+CeefZQHJt5SRgK154RtiA==" + }, + "node_modules/@types/d3-interpolate": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/d3-interpolate/-/d3-interpolate-3.0.4.tgz", + "integrity": "sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA==", + "dependencies": { + "@types/d3-color": "*" + } + }, + "node_modules/@types/d3-path": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@types/d3-path/-/d3-path-3.1.0.tgz", + "integrity": "sha512-P2dlU/q51fkOc/Gfl3Ul9kicV7l+ra934qBFXCFhrZMOL6du1TM0pm1ThYvENukyOn5h9v+yMJ9Fn5JK4QozrQ==" + }, + "node_modules/@types/d3-scale": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/@types/d3-scale/-/d3-scale-4.0.8.tgz", + "integrity": "sha512-gkK1VVTr5iNiYJ7vWDI+yUFFlszhNMtVeneJ6lUTKPjprsvLLI9/tgEGiXJOnlINJA8FyA88gfnQsHbybVZrYQ==", + "dependencies": { + "@types/d3-time": "*" + } + }, + "node_modules/@types/d3-shape": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/@types/d3-shape/-/d3-shape-3.1.6.tgz", + "integrity": "sha512-5KKk5aKGu2I+O6SONMYSNflgiP0WfZIQvVUMan50wHsLG1G94JlxEVnCpQARfTtzytuY0p/9PXXZb3I7giofIA==", + "dependencies": { + "@types/d3-path": "*" + } + }, + "node_modules/@types/d3-time": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/d3-time/-/d3-time-3.0.3.tgz", + "integrity": "sha512-2p6olUZ4w3s+07q3Tm2dbiMZy5pCDfYwtLXXHUnVzXgQlZ/OyPtUz6OL382BkOuGlLXqfT+wqv8Fw2v8/0geBw==" + }, + "node_modules/@types/d3-timer": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-timer/-/d3-timer-3.0.2.tgz", + "integrity": "sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw==" + }, + "node_modules/@types/estree": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", + "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==", + "dev": true + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "dev": true + }, + "node_modules/@types/node": { + "version": "22.8.6", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.8.6.tgz", + "integrity": "sha512-tosuJYKrIqjQIlVCM4PEGxOmyg3FCPa/fViuJChnGeEIhjA46oy8FMVoF9su1/v8PNs2a8Q0iFNyOx0uOF91nw==", + "dev": true, + "dependencies": { + "undici-types": "~6.19.8" + } + }, + "node_modules/@types/prop-types": { + "version": "15.7.13", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.13.tgz", + "integrity": "sha512-hCZTSvwbzWGvhqxp/RqVqwU999pBf2vp7hzIjiYOsl8wqOmUxkQ6ddw1cV3l8811+kdUFus/q4d1Y3E3SyEifA==", + "devOptional": true + }, + "node_modules/@types/react": { + "version": "18.3.12", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.12.tgz", + "integrity": "sha512-D2wOSq/d6Agt28q7rSI3jhU7G6aiuzljDGZ2hTZHIkrTLUI+AF3WMeKkEZ9nN2fkBAlcktT6vcZjDFiIhMYEQw==", + "devOptional": true, + "dependencies": { + "@types/prop-types": "*", + "csstype": "^3.0.2" + } + }, + "node_modules/@types/react-dom": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.1.tgz", + "integrity": "sha512-qW1Mfv8taImTthu4KoXgDfLuk4bydU6Q/TkADnDWWHwi4NX4BR+LWfTp2sVmTqRrsHvyDDTelgelxJ+SsejKKQ==", + "devOptional": true, + "dependencies": { + "@types/react": "*" + } + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "8.12.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.12.2.tgz", + "integrity": "sha512-gQxbxM8mcxBwaEmWdtLCIGLfixBMHhQjBqR8sVWNTPpcj45WlYL2IObS/DNMLH1DBP0n8qz+aiiLTGfopPEebw==", + "dev": true, + "dependencies": { + "@eslint-community/regexpp": "^4.10.0", + "@typescript-eslint/scope-manager": "8.12.2", + "@typescript-eslint/type-utils": "8.12.2", + "@typescript-eslint/utils": "8.12.2", + "@typescript-eslint/visitor-keys": "8.12.2", + "graphemer": "^1.4.0", + "ignore": "^5.3.1", + "natural-compare": "^1.4.0", + "ts-api-utils": "^1.3.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^8.0.0 || ^8.0.0-alpha.0", + "eslint": "^8.57.0 || ^9.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "8.12.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.12.2.tgz", + "integrity": "sha512-MrvlXNfGPLH3Z+r7Tk+Z5moZAc0dzdVjTgUgwsdGweH7lydysQsnSww3nAmsq8blFuRD5VRlAr9YdEFw3e6PBw==", + "dev": true, + "dependencies": { + "@typescript-eslint/scope-manager": "8.12.2", + "@typescript-eslint/types": "8.12.2", + "@typescript-eslint/typescript-estree": "8.12.2", + "@typescript-eslint/visitor-keys": "8.12.2", + "debug": "^4.3.4" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "8.12.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.12.2.tgz", + "integrity": "sha512-gPLpLtrj9aMHOvxJkSbDBmbRuYdtiEbnvO25bCMza3DhMjTQw0u7Y1M+YR5JPbMsXXnSPuCf5hfq0nEkQDL/JQ==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "8.12.2", + "@typescript-eslint/visitor-keys": "8.12.2" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "8.12.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.12.2.tgz", + "integrity": "sha512-bwuU4TAogPI+1q/IJSKuD4shBLc/d2vGcRT588q+jzayQyjVK2X6v/fbR4InY2U2sgf8MEvVCqEWUzYzgBNcGQ==", + "dev": true, + "dependencies": { + "@typescript-eslint/typescript-estree": "8.12.2", + "@typescript-eslint/utils": "8.12.2", + "debug": "^4.3.4", + "ts-api-utils": "^1.3.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/types": { + "version": "8.12.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.12.2.tgz", + "integrity": "sha512-VwDwMF1SZ7wPBUZwmMdnDJ6sIFk4K4s+ALKLP6aIQsISkPv8jhiw65sAK6SuWODN/ix+m+HgbYDkH+zLjrzvOA==", + "dev": true, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "8.12.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.12.2.tgz", + "integrity": "sha512-mME5MDwGe30Pq9zKPvyduyU86PH7aixwqYR2grTglAdB+AN8xXQ1vFGpYaUSJ5o5P/5znsSBeNcs5g5/2aQwow==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "8.12.2", + "@typescript-eslint/visitor-keys": "8.12.2", + "debug": "^4.3.4", + "fast-glob": "^3.3.2", + "is-glob": "^4.0.3", + "minimatch": "^9.0.4", + "semver": "^7.6.0", + "ts-api-utils": "^1.3.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "8.12.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.12.2.tgz", + "integrity": "sha512-UTTuDIX3fkfAz6iSVa5rTuSfWIYZ6ATtEocQ/umkRSyC9O919lbZ8dcH7mysshrCdrAM03skJOEYaBugxN+M6A==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.4.0", + "@typescript-eslint/scope-manager": "8.12.2", + "@typescript-eslint/types": "8.12.2", + "@typescript-eslint/typescript-estree": "8.12.2" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "8.12.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.12.2.tgz", + "integrity": "sha512-PChz8UaKQAVNHghsHcPyx1OMHoFRUEA7rJSK/mDhdq85bk+PLsUHUBqTQTFt18VJZbmxBovM65fezlheQRsSDA==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "8.12.2", + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@vitejs/plugin-react-swc": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react-swc/-/plugin-react-swc-3.7.1.tgz", + "integrity": "sha512-vgWOY0i1EROUK0Ctg1hwhtC3SdcDjZcdit4Ups4aPkDcB1jYhmo+RMYWY87cmXMhvtD5uf8lV89j2w16vkdSVg==", + "dev": true, + "dependencies": { + "@swc/core": "^1.7.26" + }, + "peerDependencies": { + "vite": "^4 || ^5" + } + }, + "node_modules/acorn": { + "version": "8.14.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz", + "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ansi-regex": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", + "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/any-promise": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", + "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==" + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/arg": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", + "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==" + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "node_modules/aria-hidden": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/aria-hidden/-/aria-hidden-1.2.4.tgz", + "integrity": "sha512-y+CcFFwelSXpLZk/7fMB2mUbGtX9lKycf1MWJ7CaTIERyitVlyQx6C+sxcROU2BAJ24OiZyK+8wj2i8AlBoS3A==", + "dependencies": { + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/array-buffer-byte-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz", + "integrity": "sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.5", + "is-array-buffer": "^3.0.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array-includes": { + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.8.tgz", + "integrity": "sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.4", + "is-string": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.findlast": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/array.prototype.findlast/-/array.prototype.findlast-1.2.5.tgz", + "integrity": "sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flat": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz", + "integrity": "sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-shim-unscopables": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flatmap": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz", + "integrity": "sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-shim-unscopables": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.tosorted": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.4.tgz", + "integrity": "sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.3", + "es-errors": "^1.3.0", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/arraybuffer.prototype.slice": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz", + "integrity": "sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==", + "dev": true, + "dependencies": { + "array-buffer-byte-length": "^1.0.1", + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "es-abstract": "^1.22.3", + "es-errors": "^1.2.1", + "get-intrinsic": "^1.2.3", + "is-array-buffer": "^3.0.4", + "is-shared-array-buffer": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/autoprefixer": { + "version": "10.4.20", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.20.tgz", + "integrity": "sha512-XY25y5xSv/wEoqzDyXXME4AFfkZI0P23z6Fs3YgymDnKJkCGOnkL0iTxCa85UTqaSgfcqyf3UA6+c7wUvx/16g==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/autoprefixer" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "browserslist": "^4.23.3", + "caniuse-lite": "^1.0.30001646", + "fraction.js": "^4.3.7", + "normalize-range": "^0.1.2", + "picocolors": "^1.0.1", + "postcss-value-parser": "^4.2.0" + }, + "bin": { + "autoprefixer": "bin/autoprefixer" + }, + "engines": { + "node": "^10 || ^12 || >=14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/available-typed-arrays": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", + "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", + "dev": true, + "dependencies": { + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/babel-dead-code-elimination": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/babel-dead-code-elimination/-/babel-dead-code-elimination-1.0.6.tgz", + "integrity": "sha512-JxFi9qyRJpN0LjEbbjbN8g0ux71Qppn9R8Qe3k6QzHg2CaKsbUQtbn307LQGiDLGjV6JCtEFqfxzVig9MyDCHQ==", + "dev": true, + "dependencies": { + "@babel/core": "^7.23.7", + "@babel/parser": "^7.23.6", + "@babel/traverse": "^7.23.7", + "@babel/types": "^7.23.6" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "node_modules/binary-extensions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.24.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.2.tgz", + "integrity": "sha512-ZIc+Q62revdMcqC6aChtW4jz3My3klmCO1fEmINZY/8J3EpBg5/A/D0AKmBveUh6pgoeycoMkVMko84tuYS+Gg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "caniuse-lite": "^1.0.30001669", + "electron-to-chromium": "^1.5.41", + "node-releases": "^2.0.18", + "update-browserslist-db": "^1.1.1" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/call-bind": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", + "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", + "dev": true, + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/camelcase-css": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", + "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", + "engines": { + "node": ">= 6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001676", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001676.tgz", + "integrity": "sha512-Qz6zwGCiPghQXGJvgQAem79esjitvJ+CxSbSQkW9H/UX5hg8XM88d4lp2W+MEQ81j+Hip58Il+jGVdazk1z9cw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ] + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/class-variance-authority": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/class-variance-authority/-/class-variance-authority-0.7.0.tgz", + "integrity": "sha512-jFI8IQw4hczaL4ALINxqLEXQbWcNjoSkloa4IaufXCJr6QawJyw7tuRysRsrE8w2p/4gGaxKIt/hX3qz/IbD1A==", + "dependencies": { + "clsx": "2.0.0" + }, + "funding": { + "url": "https://joebell.co.uk" + } + }, + "node_modules/class-variance-authority/node_modules/clsx": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.0.0.tgz", + "integrity": "sha512-rQ1+kcj+ttHG0MKVGBUXwayCCF1oh39BF5COIpRzuCEv8Mwjv0XucrI2ExNTOn9IlLifGClWQcU9BrZORvtw6Q==", + "engines": { + "node": ">=6" + } + }, + "node_modules/clsx": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", + "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", + "engines": { + "node": ">=6" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/commander": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", + "engines": { + "node": ">= 6" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/csstype": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", + "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==" + }, + "node_modules/d3-array": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.2.4.tgz", + "integrity": "sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==", + "dependencies": { + "internmap": "1 - 2" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-color": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-3.1.0.tgz", + "integrity": "sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-ease": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-3.0.1.tgz", + "integrity": "sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-format": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-3.1.0.tgz", + "integrity": "sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA==", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-interpolate": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz", + "integrity": "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==", + "dependencies": { + "d3-color": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-path": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-3.1.0.tgz", + "integrity": "sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-scale": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-4.0.2.tgz", + "integrity": "sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==", + "dependencies": { + "d3-array": "2.10.0 - 3", + "d3-format": "1 - 3", + "d3-interpolate": "1.2.0 - 3", + "d3-time": "2.1.1 - 3", + "d3-time-format": "2 - 4" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-shape": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-3.2.0.tgz", + "integrity": "sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==", + "dependencies": { + "d3-path": "^3.1.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-time": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-3.1.0.tgz", + "integrity": "sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==", + "dependencies": { + "d3-array": "2 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-time-format": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-4.1.0.tgz", + "integrity": "sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==", + "dependencies": { + "d3-time": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-timer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-3.0.1.tgz", + "integrity": "sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==", + "engines": { + "node": ">=12" + } + }, + "node_modules/data-view-buffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.1.tgz", + "integrity": "sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/data-view-byte-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.1.tgz", + "integrity": "sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/data-view-byte-offset": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.0.tgz", + "integrity": "sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/date-fns": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-3.6.0.tgz", + "integrity": "sha512-fRHTG8g/Gif+kSh50gaGEdToemgfj74aRX3swtiouboip5JDLAyDE9F11nHMIcvOaXeOC6D7SpNhi7uFyB7Uww==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/kossnocorp" + } + }, + "node_modules/date-fns-tz": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/date-fns-tz/-/date-fns-tz-3.2.0.tgz", + "integrity": "sha512-sg8HqoTEulcbbbVXeg84u5UnlsQa8GS5QXMqjjYIhS4abEVVKIUwe0/l/UhrZdKaL/W5eWZNlbTeEIiOXTcsBQ==", + "peerDependencies": { + "date-fns": "^3.0.0 || ^4.0.0" + } + }, + "node_modules/debug": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", + "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decimal.js-light": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/decimal.js-light/-/decimal.js-light-2.5.1.tgz", + "integrity": "sha512-qIMFpTMZmny+MMIitAB6D7iVPEorVw6YQRWkvarTkT4tBeSLLiHzcwj6q0MmYSFCiVpiqPJTJEYIrpcPzVEIvg==" + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true + }, + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "dev": true, + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/define-properties": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "dev": true, + "dependencies": { + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/detect-node-es": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/detect-node-es/-/detect-node-es-1.1.0.tgz", + "integrity": "sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==" + }, + "node_modules/didyoumean": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", + "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==" + }, + "node_modules/dlv": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", + "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==" + }, + "node_modules/doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/dom-helpers": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.1.tgz", + "integrity": "sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==", + "dependencies": { + "@babel/runtime": "^7.8.7", + "csstype": "^3.0.2" + } + }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==" + }, + "node_modules/electron-to-chromium": { + "version": "1.5.50", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.50.tgz", + "integrity": "sha512-eMVObiUQ2LdgeO1F/ySTXsvqvxb6ZH2zPGaMYsWzRDdOddUa77tdmI0ltg+L16UpbWdhPmuF3wIQYyQq65WfZw==", + "dev": true + }, + "node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==" + }, + "node_modules/es-abstract": { + "version": "1.23.3", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.3.tgz", + "integrity": "sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==", + "dev": true, + "dependencies": { + "array-buffer-byte-length": "^1.0.1", + "arraybuffer.prototype.slice": "^1.0.3", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", + "data-view-buffer": "^1.0.1", + "data-view-byte-length": "^1.0.1", + "data-view-byte-offset": "^1.0.0", + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-set-tostringtag": "^2.0.3", + "es-to-primitive": "^1.2.1", + "function.prototype.name": "^1.1.6", + "get-intrinsic": "^1.2.4", + "get-symbol-description": "^1.0.2", + "globalthis": "^1.0.3", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.0.3", + "has-symbols": "^1.0.3", + "hasown": "^2.0.2", + "internal-slot": "^1.0.7", + "is-array-buffer": "^3.0.4", + "is-callable": "^1.2.7", + "is-data-view": "^1.0.1", + "is-negative-zero": "^2.0.3", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.3", + "is-string": "^1.0.7", + "is-typed-array": "^1.1.13", + "is-weakref": "^1.0.2", + "object-inspect": "^1.13.1", + "object-keys": "^1.1.1", + "object.assign": "^4.1.5", + "regexp.prototype.flags": "^1.5.2", + "safe-array-concat": "^1.1.2", + "safe-regex-test": "^1.0.3", + "string.prototype.trim": "^1.2.9", + "string.prototype.trimend": "^1.0.8", + "string.prototype.trimstart": "^1.0.8", + "typed-array-buffer": "^1.0.2", + "typed-array-byte-length": "^1.0.1", + "typed-array-byte-offset": "^1.0.2", + "typed-array-length": "^1.0.6", + "unbox-primitive": "^1.0.2", + "which-typed-array": "^1.1.15" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", + "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.2.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-iterator-helpers": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.1.0.tgz", + "integrity": "sha512-/SurEfycdyssORP/E+bj4sEu1CWw4EmLDsHynHwSXQ7utgbrMRWW195pTrCjFgFCddf/UkYm3oqKPRq5i8bJbw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.3", + "es-errors": "^1.3.0", + "es-set-tostringtag": "^2.0.3", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "globalthis": "^1.0.4", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.0.3", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.7", + "iterator.prototype": "^1.1.3", + "safe-array-concat": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.0.0.tgz", + "integrity": "sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==", + "dev": true, + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz", + "integrity": "sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.2.4", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-shim-unscopables": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz", + "integrity": "sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==", + "dev": true, + "dependencies": { + "hasown": "^2.0.0" + } + }, + "node_modules/es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, + "dependencies": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/esbuild": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.23.1.tgz", + "integrity": "sha512-VVNz/9Sa0bs5SELtn3f7qhJCDPCF5oMEl5cO9/SSinpE9hbPVvxbd572HH5AKiP7WD8INO53GgfDDhRjkylHEg==", + "devOptional": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.23.1", + "@esbuild/android-arm": "0.23.1", + "@esbuild/android-arm64": "0.23.1", + "@esbuild/android-x64": "0.23.1", + "@esbuild/darwin-arm64": "0.23.1", + "@esbuild/darwin-x64": "0.23.1", + "@esbuild/freebsd-arm64": "0.23.1", + "@esbuild/freebsd-x64": "0.23.1", + "@esbuild/linux-arm": "0.23.1", + "@esbuild/linux-arm64": "0.23.1", + "@esbuild/linux-ia32": "0.23.1", + "@esbuild/linux-loong64": "0.23.1", + "@esbuild/linux-mips64el": "0.23.1", + "@esbuild/linux-ppc64": "0.23.1", + "@esbuild/linux-riscv64": "0.23.1", + "@esbuild/linux-s390x": "0.23.1", + "@esbuild/linux-x64": "0.23.1", + "@esbuild/netbsd-x64": "0.23.1", + "@esbuild/openbsd-arm64": "0.23.1", + "@esbuild/openbsd-x64": "0.23.1", + "@esbuild/sunos-x64": "0.23.1", + "@esbuild/win32-arm64": "0.23.1", + "@esbuild/win32-ia32": "0.23.1", + "@esbuild/win32-x64": "0.23.1" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint": { + "version": "9.13.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.13.0.tgz", + "integrity": "sha512-EYZK6SX6zjFHST/HRytOdA/zE72Cq/bfw45LSyuwrdvcclb/gqV8RRQxywOBEWO2+WDpva6UZa4CcDeJKzUCFA==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.11.0", + "@eslint/config-array": "^0.18.0", + "@eslint/core": "^0.7.0", + "@eslint/eslintrc": "^3.1.0", + "@eslint/js": "9.13.0", + "@eslint/plugin-kit": "^0.2.0", + "@humanfs/node": "^0.16.5", + "@humanwhocodes/module-importer": "^1.0.1", + "@humanwhocodes/retry": "^0.3.1", + "@types/estree": "^1.0.6", + "@types/json-schema": "^7.0.15", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^8.1.0", + "eslint-visitor-keys": "^4.1.0", + "espree": "^10.2.0", + "esquery": "^1.5.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^8.0.0", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3", + "text-table": "^0.2.0" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://eslint.org/donate" + }, + "peerDependencies": { + "jiti": "*" + }, + "peerDependenciesMeta": { + "jiti": { + "optional": true + } + } + }, + "node_modules/eslint-plugin-react": { + "version": "7.37.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.37.2.tgz", + "integrity": "sha512-EsTAnj9fLVr/GZleBLFbj/sSuXeWmp1eXIN60ceYnZveqEaUCyW4X+Vh4WTdUhCkW4xutXYqTXCUSyqD4rB75w==", + "dev": true, + "dependencies": { + "array-includes": "^3.1.8", + "array.prototype.findlast": "^1.2.5", + "array.prototype.flatmap": "^1.3.2", + "array.prototype.tosorted": "^1.1.4", + "doctrine": "^2.1.0", + "es-iterator-helpers": "^1.1.0", + "estraverse": "^5.3.0", + "hasown": "^2.0.2", + "jsx-ast-utils": "^2.4.1 || ^3.0.0", + "minimatch": "^3.1.2", + "object.entries": "^1.1.8", + "object.fromentries": "^2.0.8", + "object.values": "^1.2.0", + "prop-types": "^15.8.1", + "resolve": "^2.0.0-next.5", + "semver": "^6.3.1", + "string.prototype.matchall": "^4.0.11", + "string.prototype.repeat": "^1.0.0" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7" + } + }, + "node_modules/eslint-plugin-react-hooks": { + "version": "5.1.0-rc-fb9a90fa48-20240614", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-5.1.0-rc-fb9a90fa48-20240614.tgz", + "integrity": "sha512-xsiRwaDNF5wWNC4ZHLut+x/YcAxksUd9Rizt7LaEn3bV8VyYRpXnRJQlLOfYaVy9esk4DFP4zPPnoNVjq5Gc0w==", + "dev": true, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0" + } + }, + "node_modules/eslint-plugin-react-refresh": { + "version": "0.4.14", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.4.14.tgz", + "integrity": "sha512-aXvzCTK7ZBv1e7fahFuR3Z/fyQQSIQ711yPgYRj+Oj64tyTgO4iQIDmYXDBqvSWQ/FA4OSCsXOStlF+noU0/NA==", + "dev": true, + "peerDependencies": { + "eslint": ">=7" + } + }, + "node_modules/eslint-plugin-unused-imports": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/eslint-plugin-unused-imports/-/eslint-plugin-unused-imports-4.1.4.tgz", + "integrity": "sha512-YptD6IzQjDardkl0POxnnRBhU1OEePMV0nd6siHaRBbd+lyh6NAhFEobiznKU7kTsSsDeSD62Pe7kAM1b7dAZQ==", + "dev": true, + "peerDependencies": { + "@typescript-eslint/eslint-plugin": "^8.0.0-0 || ^7.0.0 || ^6.0.0 || ^5.0.0", + "eslint": "^9.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "@typescript-eslint/eslint-plugin": { + "optional": true + } + } + }, + "node_modules/eslint-scope": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.2.0.tgz", + "integrity": "sha512-PHlWUfG6lvPc3yvP5A4PNyBL1W8fkDUccmI21JUu/+GKZBoH/W5u6usENXUrWFRsyoW5ACUjFGgAFQp5gUlb/A==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz", + "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==", + "dev": true, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/espree": { + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-10.3.0.tgz", + "integrity": "sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==", + "dev": true, + "dependencies": { + "acorn": "^8.14.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^4.2.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esquery": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", + "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", + "dev": true, + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==" + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "node_modules/fast-equals": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/fast-equals/-/fast-equals-5.0.1.tgz", + "integrity": "sha512-WF1Wi8PwwSY7/6Kx0vKXtw8RwuSGoM1bvDaJbu7MxDlR1vovZjIAKrnzyrThgAjm6JDTu0fVgWXDlMGspodfoQ==", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/fast-glob": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", + "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true + }, + "node_modules/fastq": { + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", + "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/file-entry-cache": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", + "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", + "dev": true, + "dependencies": { + "flat-cache": "^4.0.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat-cache": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", + "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", + "dev": true, + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.4" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/flatted": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz", + "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==", + "dev": true + }, + "node_modules/for-each": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", + "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "dev": true, + "dependencies": { + "is-callable": "^1.1.3" + } + }, + "node_modules/foreground-child": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.0.tgz", + "integrity": "sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==", + "dependencies": { + "cross-spawn": "^7.0.0", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/fraction.js": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz", + "integrity": "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==", + "dev": true, + "engines": { + "node": "*" + }, + "funding": { + "type": "patreon", + "url": "https://github.com/sponsors/rawify" + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/function.prototype.name": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz", + "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "functions-have-names": "^1.2.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-intrinsic": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", + "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", + "dev": true, + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-nonce": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-nonce/-/get-nonce-1.0.1.tgz", + "integrity": "sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==", + "engines": { + "node": ">=6" + } + }, + "node_modules/get-symbol-description": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.2.tgz", + "integrity": "sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.5", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-tsconfig": { + "version": "4.8.1", + "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.8.1.tgz", + "integrity": "sha512-k9PN+cFBmaLWtVz29SkUoqU5O0slLuHJXt/2P+tMVFT+phsSGXGkp9t3rQIqdz0e+06EHNGs3oM6ZX1s2zHxRg==", + "devOptional": true, + "dependencies": { + "resolve-pkg-maps": "^1.0.0" + }, + "funding": { + "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" + } + }, + "node_modules/glob": { + "version": "10.4.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", + "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/glob/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/glob/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/globals": { + "version": "15.11.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-15.11.0.tgz", + "integrity": "sha512-yeyNSjdbyVaWurlwCpcA6XNBrHTMIeDdj0/hnvX/OLJ9ekOXYbLsLinH/MucQyGvNnXhidTdNhTtJaffL2sMfw==", + "dev": true, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globalthis": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", + "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", + "dev": true, + "dependencies": { + "define-properties": "^1.2.1", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/goober": { + "version": "2.1.16", + "resolved": "https://registry.npmjs.org/goober/-/goober-2.1.16.tgz", + "integrity": "sha512-erjk19y1U33+XAMe1VTvIONHYoSqE4iS7BYUZfHaqeohLmnC0FdxEh7rQU+6MZ4OajItzjZFSRtVANrQwNq6/g==", + "dev": true, + "peerDependencies": { + "csstype": "^3.0.10" + } + }, + "node_modules/gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dev": true + }, + "node_modules/has-bigints": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", + "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "dev": true, + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", + "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "dev": true, + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/internal-slot": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.7.tgz", + "integrity": "sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==", + "dev": true, + "dependencies": { + "es-errors": "^1.3.0", + "hasown": "^2.0.0", + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/internmap": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/internmap/-/internmap-2.0.3.tgz", + "integrity": "sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==", + "engines": { + "node": ">=12" + } + }, + "node_modules/invariant": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", + "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", + "dependencies": { + "loose-envify": "^1.0.0" + } + }, + "node_modules/is-array-buffer": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.4.tgz", + "integrity": "sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-async-function": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.0.0.tgz", + "integrity": "sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-bigint": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", + "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", + "dev": true, + "dependencies": { + "has-bigints": "^1.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-boolean-object": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", + "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-core-module": { + "version": "2.15.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.15.1.tgz", + "integrity": "sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==", + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-data-view": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.1.tgz", + "integrity": "sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==", + "dev": true, + "dependencies": { + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-date-object": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", + "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-finalizationregistry": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.0.2.tgz", + "integrity": "sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-generator-function": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", + "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-map": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", + "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-negative-zero": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", + "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-number-object": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", + "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-regex": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-set": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz", + "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-shared-array-buffer": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz", + "integrity": "sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-string": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", + "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-symbol": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "dev": true, + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-typed-array": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.13.tgz", + "integrity": "sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==", + "dev": true, + "dependencies": { + "which-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakmap": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", + "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakref": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", + "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakset": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.3.tgz", + "integrity": "sha512-LvIm3/KWzS9oRFHugab7d+M/GcBXuXX5xZkzPmN+NxihdQlZUQ4dWuSV1xR/sq6upL1TJEDrfBgRepHFdBtSNQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "get-intrinsic": "^1.2.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" + }, + "node_modules/iterator.prototype": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.3.tgz", + "integrity": "sha512-FW5iMbeQ6rBGm/oKgzq2aW4KvAGpxPzYES8N4g4xNXUKpL1mclMvOe+76AcLDTvD+Ze+sOpVhgdAQEKF4L9iGQ==", + "dev": true, + "dependencies": { + "define-properties": "^1.2.1", + "get-intrinsic": "^1.2.1", + "has-symbols": "^1.0.3", + "reflect.getprototypeof": "^1.0.4", + "set-function-name": "^2.0.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/jackspeak": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", + "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, + "node_modules/jiti": { + "version": "1.21.6", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.6.tgz", + "integrity": "sha512-2yTgeWTWzMWkHu6Jp9NKgePDaYHbntiwvYuuJLbbN9vl7DC9DvXKOB2BC3ZZ92D3cvV/aflH0osDfwpHepQ53w==", + "bin": { + "jiti": "bin/jiti.js" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsesc": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.0.2.tgz", + "integrity": "sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==", + "dev": true, + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsx-ast-utils": { + "version": "3.3.5", + "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz", + "integrity": "sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==", + "dev": true, + "dependencies": { + "array-includes": "^3.1.6", + "array.prototype.flat": "^1.3.1", + "object.assign": "^4.1.4", + "object.values": "^1.1.6" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/lilconfig": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", + "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==", + "engines": { + "node": ">=10" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==" + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true + }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/lucide-react": { + "version": "0.447.0", + "resolved": "https://registry.npmjs.org/lucide-react/-/lucide-react-0.447.0.tgz", + "integrity": "sha512-SZ//hQmvi+kDKrNepArVkYK7/jfeZ5uFNEnYmd45RKZcbGD78KLnrcNXmgeg6m+xNHFvTG+CblszXCy4n6DN4w==", + "peerDependencies": { + "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0-rc" + } + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + }, + "node_modules/mz": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", + "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", + "dependencies": { + "any-promise": "^1.0.0", + "object-assign": "^4.0.1", + "thenify-all": "^1.0.0" + } + }, + "node_modules/nanoid": { + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", + "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true + }, + "node_modules/node-releases": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.18.tgz", + "integrity": "sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==", + "dev": true + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-hash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", + "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", + "engines": { + "node": ">= 6" + } + }, + "node_modules/object-inspect": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.2.tgz", + "integrity": "sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.assign": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz", + "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "has-symbols": "^1.0.3", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.entries": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.8.tgz", + "integrity": "sha512-cmopxi8VwRIAw/fkijJohSfpef5PdN0pMQJN6VC/ZKvn0LIknWD8KtgY6KlQdEc4tIjcQ3HxSMmnvtzIscdaYQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.fromentries": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz", + "integrity": "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.values": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.0.tgz", + "integrity": "sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/openapi-fetch": { + "version": "0.12.5", + "resolved": "https://registry.npmjs.org/openapi-fetch/-/openapi-fetch-0.12.5.tgz", + "integrity": "sha512-FnAMWLt0MNL6ComcL4q/YbB1tUgyz5YnYtwA1+zlJ5xcucmK5RlWsgH1ynxmEeu8fGJkYjm8armU/HVpORc9lw==", + "dependencies": { + "openapi-typescript-helpers": "^0.0.15" + } + }, + "node_modules/openapi-typescript-helpers": { + "version": "0.0.15", + "resolved": "https://registry.npmjs.org/openapi-typescript-helpers/-/openapi-typescript-helpers-0.0.15.tgz", + "integrity": "sha512-opyTPaunsklCBpTK8JGef6mfPhLSnyy5a0IN9vKtx3+4aExf+KxEqYwIy3hqkedXIB97u357uLMJsOnm3GVjsw==" + }, + "node_modules/optionator": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", + "dev": true, + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/package-json-from-dist": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", + "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==" + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + }, + "node_modules/path-scurry": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/path-scurry/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==" + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==" + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pirates": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", + "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", + "engines": { + "node": ">= 6" + } + }, + "node_modules/possible-typed-array-names": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz", + "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/postcss": { + "version": "8.4.47", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.47.tgz", + "integrity": "sha512-56rxCq7G/XfB4EkXq9Egn5GCqugWvDFjafDOThIdMBsI15iqPqR5r15TfSr1YPYeEI19YeaXMCbY6u88Y76GLQ==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "nanoid": "^3.3.7", + "picocolors": "^1.1.0", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-import": { + "version": "15.1.0", + "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz", + "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==", + "dependencies": { + "postcss-value-parser": "^4.0.0", + "read-cache": "^1.0.0", + "resolve": "^1.1.7" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "postcss": "^8.0.0" + } + }, + "node_modules/postcss-import/node_modules/resolve": { + "version": "1.22.8", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/postcss-js": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz", + "integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==", + "dependencies": { + "camelcase-css": "^2.0.1" + }, + "engines": { + "node": "^12 || ^14 || >= 16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": "^8.4.21" + } + }, + "node_modules/postcss-load-config": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.2.tgz", + "integrity": "sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "lilconfig": "^3.0.0", + "yaml": "^2.3.4" + }, + "engines": { + "node": ">= 14" + }, + "peerDependencies": { + "postcss": ">=8.0.9", + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "postcss": { + "optional": true + }, + "ts-node": { + "optional": true + } + } + }, + "node_modules/postcss-load-config/node_modules/lilconfig": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.2.tgz", + "integrity": "sha512-eop+wDAvpItUys0FWkHIKeC9ybYrTGbU41U5K7+bttZZeohvnY7M9dZ5kB21GNWiFT2q1OoPTvncPCgSOVO5ow==", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antonk52" + } + }, + "node_modules/postcss-nested": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.2.0.tgz", + "integrity": "sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "postcss-selector-parser": "^6.1.1" + }, + "engines": { + "node": ">=12.0" + }, + "peerDependencies": { + "postcss": "^8.2.14" + } + }, + "node_modules/postcss-selector-parser": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", + "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==" + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/prettier": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.3.3.tgz", + "integrity": "sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew==", + "devOptional": true, + "bin": { + "prettier": "bin/prettier.cjs" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "node_modules/prop-types": { + "version": "15.8.1", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", + "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", + "dependencies": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.1" + } + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/react": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", + "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", + "dependencies": { + "loose-envify": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-day-picker": { + "version": "8.10.1", + "resolved": "https://registry.npmjs.org/react-day-picker/-/react-day-picker-8.10.1.tgz", + "integrity": "sha512-TMx7fNbhLk15eqcMt+7Z7S2KF7mfTId/XJDjKE8f+IUcFn0l08/kI4FiYTL/0yuOLmEcbR4Fwe3GJf/NiiMnPA==", + "funding": { + "type": "individual", + "url": "https://github.com/sponsors/gpbl" + }, + "peerDependencies": { + "date-fns": "^2.28.0 || ^3.0.0", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/react-dom": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", + "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", + "dependencies": { + "loose-envify": "^1.1.0", + "scheduler": "^0.23.2" + }, + "peerDependencies": { + "react": "^18.3.1" + } + }, + "node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" + }, + "node_modules/react-remove-scroll": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/react-remove-scroll/-/react-remove-scroll-2.6.0.tgz", + "integrity": "sha512-I2U4JVEsQenxDAKaVa3VZ/JeJZe0/2DxPWL8Tj8yLKctQJQiZM52pn/GWFpSp8dftjM3pSAHVJZscAnC/y+ySQ==", + "dependencies": { + "react-remove-scroll-bar": "^2.3.6", + "react-style-singleton": "^2.2.1", + "tslib": "^2.1.0", + "use-callback-ref": "^1.3.0", + "use-sidecar": "^1.1.2" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/react-remove-scroll-bar": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/react-remove-scroll-bar/-/react-remove-scroll-bar-2.3.6.tgz", + "integrity": "sha512-DtSYaao4mBmX+HDo5YWYdBWQwYIQQshUV/dVxFxK+KM26Wjwp1gZ6rv6OC3oujI6Bfu6Xyg3TwK533AQutsn/g==", + "dependencies": { + "react-style-singleton": "^2.2.1", + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/react-smooth": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/react-smooth/-/react-smooth-4.0.1.tgz", + "integrity": "sha512-OE4hm7XqR0jNOq3Qmk9mFLyd6p2+j6bvbPJ7qlB7+oo0eNcL2l7WQzG6MBnT3EXY6xzkLMUBec3AfewJdA0J8w==", + "dependencies": { + "fast-equals": "^5.0.1", + "prop-types": "^15.8.1", + "react-transition-group": "^4.4.5" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/react-style-singleton": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/react-style-singleton/-/react-style-singleton-2.2.1.tgz", + "integrity": "sha512-ZWj0fHEMyWkHzKYUr2Bs/4zU6XLmq9HsgBURm7g5pAVfyn49DgUiNgY2d4lXRlYSiCif9YBGpQleewkcqddc7g==", + "dependencies": { + "get-nonce": "^1.0.0", + "invariant": "^2.2.4", + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/react-transition-group": { + "version": "4.4.5", + "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.5.tgz", + "integrity": "sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==", + "dependencies": { + "@babel/runtime": "^7.5.5", + "dom-helpers": "^5.0.1", + "loose-envify": "^1.4.0", + "prop-types": "^15.6.2" + }, + "peerDependencies": { + "react": ">=16.6.0", + "react-dom": ">=16.6.0" + } + }, + "node_modules/read-cache": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", + "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", + "dependencies": { + "pify": "^2.3.0" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/recharts": { + "version": "2.13.2", + "resolved": "https://registry.npmjs.org/recharts/-/recharts-2.13.2.tgz", + "integrity": "sha512-UDLGFmnsBluDIPpQb9uty0ejb+jiVI71vkki8vVsR6ZCJdgjBfKQoQfft4re99CKlTy9qjQApxCLG6TrxJkeAg==", + "dependencies": { + "clsx": "^2.0.0", + "eventemitter3": "^4.0.1", + "lodash": "^4.17.21", + "react-is": "^18.3.1", + "react-smooth": "^4.0.0", + "recharts-scale": "^0.4.4", + "tiny-invariant": "^1.3.1", + "victory-vendor": "^36.6.8" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "react": "^16.0.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.0.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/recharts-scale": { + "version": "0.4.5", + "resolved": "https://registry.npmjs.org/recharts-scale/-/recharts-scale-0.4.5.tgz", + "integrity": "sha512-kivNFO+0OcUNu7jQquLXAxz1FIwZj8nrj+YkOKc5694NbjCvcT6aSZiIzNzd2Kul4o4rTto8QVR9lMNtxD4G1w==", + "dependencies": { + "decimal.js-light": "^2.4.1" + } + }, + "node_modules/recharts/node_modules/react-is": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==" + }, + "node_modules/reflect.getprototypeof": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.6.tgz", + "integrity": "sha512-fmfw4XgoDke3kdI6h4xcUz1dG8uaiv5q9gcEwLS4Pnth2kxT+GZ7YehS1JTMGBQmtV7Y4GFGbs2re2NqhdozUg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.1", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4", + "globalthis": "^1.0.3", + "which-builtin-type": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/regenerator-runtime": { + "version": "0.14.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", + "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==" + }, + "node_modules/regexp.prototype.flags": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.3.tgz", + "integrity": "sha512-vqlC04+RQoFalODCbCumG2xIOvapzVMHwsyIGM/SIE8fRhFFsXeH8/QQ+s0T0kDAhKc4k30s73/0ydkHQz6HlQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-errors": "^1.3.0", + "set-function-name": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve": { + "version": "2.0.0-next.5", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz", + "integrity": "sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==", + "dev": true, + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/resolve-pkg-maps": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", + "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", + "devOptional": true, + "funding": { + "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rollup": { + "version": "4.24.3", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.24.3.tgz", + "integrity": "sha512-HBW896xR5HGmoksbi3JBDtmVzWiPAYqp7wip50hjQ67JbDz61nyoMPdqu1DvVW9asYb2M65Z20ZHsyJCMqMyDg==", + "dev": true, + "dependencies": { + "@types/estree": "1.0.6" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.24.3", + "@rollup/rollup-android-arm64": "4.24.3", + "@rollup/rollup-darwin-arm64": "4.24.3", + "@rollup/rollup-darwin-x64": "4.24.3", + "@rollup/rollup-freebsd-arm64": "4.24.3", + "@rollup/rollup-freebsd-x64": "4.24.3", + "@rollup/rollup-linux-arm-gnueabihf": "4.24.3", + "@rollup/rollup-linux-arm-musleabihf": "4.24.3", + "@rollup/rollup-linux-arm64-gnu": "4.24.3", + "@rollup/rollup-linux-arm64-musl": "4.24.3", + "@rollup/rollup-linux-powerpc64le-gnu": "4.24.3", + "@rollup/rollup-linux-riscv64-gnu": "4.24.3", + "@rollup/rollup-linux-s390x-gnu": "4.24.3", + "@rollup/rollup-linux-x64-gnu": "4.24.3", + "@rollup/rollup-linux-x64-musl": "4.24.3", + "@rollup/rollup-win32-arm64-msvc": "4.24.3", + "@rollup/rollup-win32-ia32-msvc": "4.24.3", + "@rollup/rollup-win32-x64-msvc": "4.24.3", + "fsevents": "~2.3.2" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/safe-array-concat": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.2.tgz", + "integrity": "sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "get-intrinsic": "^1.2.4", + "has-symbols": "^1.0.3", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">=0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-regex-test": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.3.tgz", + "integrity": "sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "is-regex": "^1.1.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/scheduler": { + "version": "0.23.2", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz", + "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==", + "dependencies": { + "loose-envify": "^1.1.0" + } + }, + "node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/set-function-length": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "dev": true, + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-function-name": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", + "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", + "dev": true, + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "engines": { + "node": ">=8" + } + }, + "node_modules/side-channel": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", + "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4", + "object-inspect": "^1.13.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/string-width-cjs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string.prototype.matchall": { + "version": "4.0.11", + "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.11.tgz", + "integrity": "sha512-NUdh0aDavY2og7IbBPenWqR9exH+E26Sv8e0/eTe1tltDGZL+GtBkDAnnyBtmekfK6/Dq3MkcGtzXFEd1LQrtg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.7", + "regexp.prototype.flags": "^1.5.2", + "set-function-name": "^2.0.2", + "side-channel": "^1.0.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.repeat": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/string.prototype.repeat/-/string.prototype.repeat-1.0.0.tgz", + "integrity": "sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==", + "dev": true, + "dependencies": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5" + } + }, + "node_modules/string.prototype.trim": { + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz", + "integrity": "sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.0", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimend": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.8.tgz", + "integrity": "sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimstart": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", + "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/sucrase": { + "version": "3.35.0", + "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.0.tgz", + "integrity": "sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.2", + "commander": "^4.0.0", + "glob": "^10.3.10", + "lines-and-columns": "^1.1.6", + "mz": "^2.7.0", + "pirates": "^4.0.1", + "ts-interface-checker": "^0.1.9" + }, + "bin": { + "sucrase": "bin/sucrase", + "sucrase-node": "bin/sucrase-node" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/tailwind-merge": { + "version": "2.5.4", + "resolved": "https://registry.npmjs.org/tailwind-merge/-/tailwind-merge-2.5.4.tgz", + "integrity": "sha512-0q8cfZHMu9nuYP/b5Shb7Y7Sh1B7Nnl5GqNr1U+n2p6+mybvRtayrQ+0042Z5byvTA8ihjlP8Odo8/VnHbZu4Q==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/dcastil" + } + }, + "node_modules/tailwindcss": { + "version": "3.4.14", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.14.tgz", + "integrity": "sha512-IcSvOcTRcUtQQ7ILQL5quRDg7Xs93PdJEk1ZLbhhvJc7uj/OAhYOnruEiwnGgBvUtaUAJ8/mhSw1o8L2jCiENA==", + "dependencies": { + "@alloc/quick-lru": "^5.2.0", + "arg": "^5.0.2", + "chokidar": "^3.5.3", + "didyoumean": "^1.2.2", + "dlv": "^1.1.3", + "fast-glob": "^3.3.0", + "glob-parent": "^6.0.2", + "is-glob": "^4.0.3", + "jiti": "^1.21.0", + "lilconfig": "^2.1.0", + "micromatch": "^4.0.5", + "normalize-path": "^3.0.0", + "object-hash": "^3.0.0", + "picocolors": "^1.0.0", + "postcss": "^8.4.23", + "postcss-import": "^15.1.0", + "postcss-js": "^4.0.1", + "postcss-load-config": "^4.0.1", + "postcss-nested": "^6.0.1", + "postcss-selector-parser": "^6.0.11", + "resolve": "^1.22.2", + "sucrase": "^3.32.0" + }, + "bin": { + "tailwind": "lib/cli.js", + "tailwindcss": "lib/cli.js" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/tailwindcss-animate": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/tailwindcss-animate/-/tailwindcss-animate-1.0.7.tgz", + "integrity": "sha512-bl6mpH3T7I3UFxuvDEXLxy/VuFxBk5bbzplh7tXI68mwMokNYd1t9qPBHlnyTwfa4JGC4zP516I1hYYtQ/vspA==", + "peerDependencies": { + "tailwindcss": ">=3.0.0 || insiders" + } + }, + "node_modules/tailwindcss/node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/tailwindcss/node_modules/resolve": { + "version": "1.22.8", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "dev": true + }, + "node_modules/thenify": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", + "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", + "dependencies": { + "any-promise": "^1.0.0" + } + }, + "node_modules/thenify-all": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", + "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", + "dependencies": { + "thenify": ">= 3.1.0 < 4" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/tiny-invariant": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.3.tgz", + "integrity": "sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==" + }, + "node_modules/tiny-warning": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/tiny-warning/-/tiny-warning-1.0.3.tgz", + "integrity": "sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==", + "peer": true + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/ts-api-utils": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.4.0.tgz", + "integrity": "sha512-032cPxaEKwM+GT3vA5JXNzIaizx388rhsSW79vGRNGXfRRAdEAn2mvk36PvK5HnOchyWZ7afLEXqYCvPCrzuzQ==", + "dev": true, + "engines": { + "node": ">=16" + }, + "peerDependencies": { + "typescript": ">=4.2.0" + } + }, + "node_modules/ts-interface-checker": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", + "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==" + }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==" + }, + "node_modules/tsx": { + "version": "4.19.2", + "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.19.2.tgz", + "integrity": "sha512-pOUl6Vo2LUq/bSa8S5q7b91cgNSjctn9ugq/+Mvow99qW6x/UZYwzxy/3NmqoT66eHYfCVvFvACC58UBPFf28g==", + "devOptional": true, + "dependencies": { + "esbuild": "~0.23.0", + "get-tsconfig": "^4.7.5" + }, + "bin": { + "tsx": "dist/cli.mjs" + }, + "engines": { + "node": ">=18.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + } + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/typed-array-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz", + "integrity": "sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/typed-array-byte-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz", + "integrity": "sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-byte-offset": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz", + "integrity": "sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==", + "dev": true, + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-length": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.6.tgz", + "integrity": "sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13", + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typescript": { + "version": "5.6.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.6.3.tgz", + "integrity": "sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/typescript-eslint": { + "version": "8.12.2", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.12.2.tgz", + "integrity": "sha512-UbuVUWSrHVR03q9CWx+JDHeO6B/Hr9p4U5lRH++5tq/EbFq1faYZe50ZSBePptgfIKLEti0aPQ3hFgnPVcd8ZQ==", + "dev": true, + "dependencies": { + "@typescript-eslint/eslint-plugin": "8.12.2", + "@typescript-eslint/parser": "8.12.2", + "@typescript-eslint/utils": "8.12.2" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/unbox-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", + "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-bigints": "^1.0.2", + "has-symbols": "^1.0.3", + "which-boxed-primitive": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/undici-types": { + "version": "6.19.8", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", + "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==", + "dev": true + }, + "node_modules/unplugin": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/unplugin/-/unplugin-1.15.0.tgz", + "integrity": "sha512-jTPIs63W+DUEDW207ztbaoO7cQ4p5aVaB823LSlxpsFEU3Mykwxf3ZGC/wzxFJeZlASZYgVrWeo7LgOrqJZ8RA==", + "dev": true, + "dependencies": { + "acorn": "^8.14.0", + "webpack-virtual-modules": "^0.6.2" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "webpack-sources": "^3" + }, + "peerDependenciesMeta": { + "webpack-sources": { + "optional": true + } + } + }, + "node_modules/update-browserslist-db": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.1.tgz", + "integrity": "sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.0" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/use-callback-ref": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/use-callback-ref/-/use-callback-ref-1.3.2.tgz", + "integrity": "sha512-elOQwe6Q8gqZgDA8mrh44qRTQqpIHDcZ3hXTLjBe1i4ph8XpNJnO+aQf3NaG+lriLopI4HMx9VjQLfPQ6vhnoA==", + "dependencies": { + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/use-sidecar": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/use-sidecar/-/use-sidecar-1.1.2.tgz", + "integrity": "sha512-epTbsLuzZ7lPClpz2TyryBfztm7m+28DlEv2ZCQ3MDr5ssiwyOwGH/e5F9CkfWjJ1t4clvI58yF822/GUkjjhw==", + "dependencies": { + "detect-node-es": "^1.1.0", + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "^16.9.0 || ^17.0.0 || ^18.0.0", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/use-sync-external-store": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.2.2.tgz", + "integrity": "sha512-PElTlVMwpblvbNqQ82d2n6RjStvdSoNe9FG28kNfz3WiXilJm4DdNkEzRhCZuIDwY8U08WVihhGR5iRqAwfDiw==", + "peer": true, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + }, + "node_modules/victory-vendor": { + "version": "36.9.2", + "resolved": "https://registry.npmjs.org/victory-vendor/-/victory-vendor-36.9.2.tgz", + "integrity": "sha512-PnpQQMuxlwYdocC8fIJqVXvkeViHYzotI+NJrCuav0ZYFoq912ZHBk3mCeuj+5/VpodOjPe1z0Fk2ihgzlXqjQ==", + "dependencies": { + "@types/d3-array": "^3.0.3", + "@types/d3-ease": "^3.0.0", + "@types/d3-interpolate": "^3.0.1", + "@types/d3-scale": "^4.0.2", + "@types/d3-shape": "^3.1.0", + "@types/d3-time": "^3.0.0", + "@types/d3-timer": "^3.0.0", + "d3-array": "^3.1.6", + "d3-ease": "^3.0.1", + "d3-interpolate": "^3.0.1", + "d3-scale": "^4.0.2", + "d3-shape": "^3.1.0", + "d3-time": "^3.0.0", + "d3-timer": "^3.0.1" + } + }, + "node_modules/vite": { + "version": "5.4.10", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.10.tgz", + "integrity": "sha512-1hvaPshuPUtxeQ0hsVH3Mud0ZanOLwVTneA1EgbAM5LhaZEqyPWGRQ7BtaMvUrTDeEaC8pxtj6a6jku3x4z6SQ==", + "dev": true, + "dependencies": { + "esbuild": "^0.21.3", + "postcss": "^8.4.43", + "rollup": "^4.20.0" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || >=20.0.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "sass-embedded": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.4.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + } + } + }, + "node_modules/vite/node_modules/@esbuild/aix-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", + "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/android-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", + "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/android-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", + "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/android-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", + "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/darwin-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", + "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/darwin-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", + "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/freebsd-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", + "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/freebsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", + "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", + "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", + "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", + "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-loong64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", + "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-mips64el": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", + "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", + "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-riscv64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", + "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-s390x": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", + "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", + "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/netbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", + "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/openbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", + "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/sunos-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", + "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/win32-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", + "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/win32-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", + "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/win32-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", + "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/esbuild": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", + "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.21.5", + "@esbuild/android-arm": "0.21.5", + "@esbuild/android-arm64": "0.21.5", + "@esbuild/android-x64": "0.21.5", + "@esbuild/darwin-arm64": "0.21.5", + "@esbuild/darwin-x64": "0.21.5", + "@esbuild/freebsd-arm64": "0.21.5", + "@esbuild/freebsd-x64": "0.21.5", + "@esbuild/linux-arm": "0.21.5", + "@esbuild/linux-arm64": "0.21.5", + "@esbuild/linux-ia32": "0.21.5", + "@esbuild/linux-loong64": "0.21.5", + "@esbuild/linux-mips64el": "0.21.5", + "@esbuild/linux-ppc64": "0.21.5", + "@esbuild/linux-riscv64": "0.21.5", + "@esbuild/linux-s390x": "0.21.5", + "@esbuild/linux-x64": "0.21.5", + "@esbuild/netbsd-x64": "0.21.5", + "@esbuild/openbsd-x64": "0.21.5", + "@esbuild/sunos-x64": "0.21.5", + "@esbuild/win32-arm64": "0.21.5", + "@esbuild/win32-ia32": "0.21.5", + "@esbuild/win32-x64": "0.21.5" + } + }, + "node_modules/webpack-virtual-modules": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/webpack-virtual-modules/-/webpack-virtual-modules-0.6.2.tgz", + "integrity": "sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==", + "dev": true + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/which-boxed-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "dev": true, + "dependencies": { + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-builtin-type": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.1.4.tgz", + "integrity": "sha512-bppkmBSsHFmIMSl8BO9TbsyzsvGjVoppt8xUiGzwiu/bhDCGxnpOKCxgqj6GuyHE0mINMDecBFPlOm2hzY084w==", + "dev": true, + "dependencies": { + "function.prototype.name": "^1.1.6", + "has-tostringtag": "^1.0.2", + "is-async-function": "^2.0.0", + "is-date-object": "^1.0.5", + "is-finalizationregistry": "^1.0.2", + "is-generator-function": "^1.0.10", + "is-regex": "^1.1.4", + "is-weakref": "^1.0.2", + "isarray": "^2.0.5", + "which-boxed-primitive": "^1.0.2", + "which-collection": "^1.0.2", + "which-typed-array": "^1.1.15" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-collection": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz", + "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==", + "dev": true, + "dependencies": { + "is-map": "^2.0.3", + "is-set": "^2.0.3", + "is-weakmap": "^2.0.2", + "is-weakset": "^2.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-typed-array": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.15.tgz", + "integrity": "sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==", + "dev": true, + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/wrap-ansi-cjs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true + }, + "node_modules/yaml": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.6.0.tgz", + "integrity": "sha512-a6ae//JvKDEra2kdi1qzCyrJW/WZCgFi8ydDV+eXExl95t+5R+ijnqHJbz9tmMh8FUjx3iv2fCQ4dclAQlO2UQ==", + "bin": { + "yaml": "bin.mjs" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/zod": { + "version": "3.23.8", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.23.8.tgz", + "integrity": "sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g==", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + } + } +} diff --git a/ui-v2/package.json b/ui-v2/package.json new file mode 100644 index 000000000000..708e21f2b9b1 --- /dev/null +++ b/ui-v2/package.json @@ -0,0 +1,69 @@ +{ + "name": "prefect-ui", + "private": true, + "version": "0.0.0", + "type": "module", + "scripts": { + "dev": "vite", + "build": "tsc -b && vite build", + "lint": "eslint .", + "format:check": "biome format", + "format": "biome format --write", + "preview": "vite preview", + "service-sync": "uv run ../scripts/generate_oss_openapi_schema.py && npx openapi-typescript oss_schema.json -o src/api/prefect.tsx && rm oss_schema.json" + }, + "dependencies": { + "@radix-ui/react-avatar": "^1.1.1", + "@radix-ui/react-checkbox": "^1.1.2", + "@radix-ui/react-dropdown-menu": "^2.1.2", + "@radix-ui/react-hover-card": "^1.1.2", + "@radix-ui/react-icons": "^1.3.0", + "@radix-ui/react-label": "^2.1.0", + "@radix-ui/react-popover": "^1.1.2", + "@radix-ui/react-scroll-area": "^1.2.0", + "@radix-ui/react-select": "^2.1.2", + "@radix-ui/react-slot": "^1.1.0", + "@radix-ui/react-tabs": "^1.1.1", + "@radix-ui/react-toast": "^1.2.2", + "@radix-ui/react-tooltip": "^1.1.3", + "@tanstack/react-query": "^5.56.2", + "@tanstack/react-table": "^8.20.5", + "@tanstack/router-zod-adapter": "^1.58.16", + "class-variance-authority": "^0.7.0", + "clsx": "^2.1.1", + "date-fns": "^3.6.0", + "date-fns-tz": "^3.2.0", + "lucide-react": "^0.447.0", + "openapi-fetch": "^0.12.2", + "react": "^18.3.1", + "react-day-picker": "^8.10.1", + "react-dom": "^18.3.1", + "recharts": "^2.12.7", + "tailwind-merge": "^2.5.2", + "tailwindcss-animate": "^1.0.7", + "zod": "^3.23.8" + }, + "devDependencies": { + "@biomejs/biome": "1.9.4", + "@eslint/js": "^9.12.0", + "@tanstack/eslint-plugin-router": "^1.77.7", + "@tanstack/router-devtools": "^1.58.15", + "@tanstack/router-plugin": "^1.58.12", + "@types/node": "^22.7.4", + "@types/react": "^18.3.3", + "@types/react-dom": "^18.3.0", + "@vitejs/plugin-react-swc": "^3.5.0", + "autoprefixer": "^10.4.20", + "eslint": "^9.12.0", + "eslint-plugin-react": "^7.37.1", + "eslint-plugin-react-hooks": "^5.1.0-rc.0", + "eslint-plugin-react-refresh": "^0.4.9", + "eslint-plugin-unused-imports": "^4.1.4", + "globals": "^15.10.0", + "postcss": "^8.4.47", + "tailwindcss": "^3.4.13", + "typescript": "^5.5.3", + "typescript-eslint": "^8.8.1", + "vite": "^5.4.1" + } +} diff --git a/ui-v2/postcss.config.js b/ui-v2/postcss.config.js new file mode 100644 index 000000000000..7b75c83aff1c --- /dev/null +++ b/ui-v2/postcss.config.js @@ -0,0 +1,6 @@ +export default { + plugins: { + tailwindcss: {}, + autoprefixer: {}, + }, +}; diff --git a/ui-v2/public/ico/android-chrome-192x192.png b/ui-v2/public/ico/android-chrome-192x192.png new file mode 100644 index 000000000000..f307ca127650 Binary files /dev/null and b/ui-v2/public/ico/android-chrome-192x192.png differ diff --git a/ui-v2/public/ico/android-chrome-512x512.png b/ui-v2/public/ico/android-chrome-512x512.png new file mode 100644 index 000000000000..bfeb13ea3fb0 Binary files /dev/null and b/ui-v2/public/ico/android-chrome-512x512.png differ diff --git a/ui-v2/public/ico/apple-touch-icon.png b/ui-v2/public/ico/apple-touch-icon.png new file mode 100644 index 000000000000..a0eb8e95b771 Binary files /dev/null and b/ui-v2/public/ico/apple-touch-icon.png differ diff --git a/ui-v2/public/ico/browserconfig.xml b/ui-v2/public/ico/browserconfig.xml new file mode 100644 index 000000000000..b3930d0f0471 --- /dev/null +++ b/ui-v2/public/ico/browserconfig.xml @@ -0,0 +1,9 @@ + + + + + + #da532c + + + diff --git a/ui-v2/public/ico/favicon-16x16-dark.png b/ui-v2/public/ico/favicon-16x16-dark.png new file mode 100644 index 000000000000..6af87c17996f Binary files /dev/null and b/ui-v2/public/ico/favicon-16x16-dark.png differ diff --git a/ui-v2/public/ico/favicon-16x16.png b/ui-v2/public/ico/favicon-16x16.png new file mode 100644 index 000000000000..737a0f1b249e Binary files /dev/null and b/ui-v2/public/ico/favicon-16x16.png differ diff --git a/ui-v2/public/ico/favicon-32x32-dark.png b/ui-v2/public/ico/favicon-32x32-dark.png new file mode 100644 index 000000000000..859cb6c4c339 Binary files /dev/null and b/ui-v2/public/ico/favicon-32x32-dark.png differ diff --git a/ui-v2/public/ico/favicon-32x32.png b/ui-v2/public/ico/favicon-32x32.png new file mode 100644 index 000000000000..945c47af30c5 Binary files /dev/null and b/ui-v2/public/ico/favicon-32x32.png differ diff --git a/ui-v2/public/ico/favicon-dark.ico b/ui-v2/public/ico/favicon-dark.ico new file mode 100644 index 000000000000..665f48ad1189 Binary files /dev/null and b/ui-v2/public/ico/favicon-dark.ico differ diff --git a/ui-v2/public/ico/favicon.ico b/ui-v2/public/ico/favicon.ico new file mode 100644 index 000000000000..832e9fd18e32 Binary files /dev/null and b/ui-v2/public/ico/favicon.ico differ diff --git a/ui-v2/public/ico/mstile-150x150.png b/ui-v2/public/ico/mstile-150x150.png new file mode 100644 index 000000000000..5c87e11377cd Binary files /dev/null and b/ui-v2/public/ico/mstile-150x150.png differ diff --git a/ui-v2/public/ico/safari-pinned-tab.svg b/ui-v2/public/ico/safari-pinned-tab.svg new file mode 100644 index 000000000000..b0059fae09bd --- /dev/null +++ b/ui-v2/public/ico/safari-pinned-tab.svg @@ -0,0 +1,28 @@ + + + + +Created by potrace 1.14, written by Peter Selinger 2001-2017 + + + + + diff --git a/ui-v2/public/ico/site.webmanifest b/ui-v2/public/ico/site.webmanifest new file mode 100644 index 000000000000..f2443d9c0ae5 --- /dev/null +++ b/ui-v2/public/ico/site.webmanifest @@ -0,0 +1,19 @@ +{ + "name": "", + "short_name": "", + "icons": [ + { + "src": "/ico/android-chrome-192x192.png", + "sizes": "192x192", + "type": "image/png" + }, + { + "src": "/ico/android-chrome-512x512.png", + "sizes": "512x512", + "type": "image/png" + } + ], + "theme_color": "#ffffff", + "background_color": "#ffffff", + "display": "standalone" +} diff --git a/ui-v2/src/api/prefect.tsx b/ui-v2/src/api/prefect.tsx new file mode 100644 index 000000000000..f49fc08bb2ba --- /dev/null +++ b/ui-v2/src/api/prefect.tsx @@ -0,0 +1,15901 @@ +/** + * This file was auto-generated by openapi-typescript. + * Do not make direct changes to the file. + */ + +export interface paths { + "/health": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** Health Check */ + get: operations["health_check_health_get"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/version": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** Server Version */ + get: operations["server_version_version_get"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/flows/": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** + * Create Flow + * @description Gracefully creates a new flow from the provided schema. If a flow with the + * same name already exists, the existing flow is returned. + */ + post: operations["create_flow_flows__post"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/flows/{id}": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Read Flow + * @description Get a flow by id. + */ + get: operations["read_flow_flows__id__get"]; + put?: never; + post?: never; + /** + * Delete Flow + * @description Delete a flow by id. + */ + delete: operations["delete_flow_flows__id__delete"]; + options?: never; + head?: never; + /** + * Update Flow + * @description Updates a flow. + */ + patch: operations["update_flow_flows__id__patch"]; + trace?: never; + }; + "/flows/count": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** + * Count Flows + * @description Count flows. + */ + post: operations["count_flows_flows_count_post"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/flows/name/{name}": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Read Flow By Name + * @description Get a flow by name. + */ + get: operations["read_flow_by_name_flows_name__name__get"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/flows/filter": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** + * Read Flows + * @description Query for flows. + */ + post: operations["read_flows_flows_filter_post"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/flows/paginate": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** + * Paginate Flows + * @description Pagination query for flows. + */ + post: operations["paginate_flows_flows_paginate_post"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/flow_runs/": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** + * Create Flow Run + * @description Create a flow run. If a flow run with the same flow_id and + * idempotency key already exists, the existing flow run will be returned. + * + * If no state is provided, the flow run will be created in a PENDING state. + */ + post: operations["create_flow_run_flow_runs__post"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/flow_runs/{id}": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Read Flow Run + * @description Get a flow run by id. + */ + get: operations["read_flow_run_flow_runs__id__get"]; + put?: never; + post?: never; + /** + * Delete Flow Run + * @description Delete a flow run by id. + */ + delete: operations["delete_flow_run_flow_runs__id__delete"]; + options?: never; + head?: never; + /** + * Update Flow Run + * @description Updates a flow run. + */ + patch: operations["update_flow_run_flow_runs__id__patch"]; + trace?: never; + }; + "/flow_runs/count": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** + * Count Flow Runs + * @description Query for flow runs. + */ + post: operations["count_flow_runs_flow_runs_count_post"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/flow_runs/lateness": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** + * Average Flow Run Lateness + * @description Query for average flow-run lateness in seconds. + */ + post: operations["average_flow_run_lateness_flow_runs_lateness_post"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/flow_runs/history": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** + * Flow Run History + * @description Query for flow run history data across a given range and interval. + */ + post: operations["flow_run_history_flow_runs_history_post"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/flow_runs/{id}/graph": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Read Flow Run Graph V1 + * @description Get a task run dependency map for a given flow run. + */ + get: operations["read_flow_run_graph_v1_flow_runs__id__graph_get"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/flow_runs/{id}/graph-v2": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Read Flow Run Graph V2 + * @description Get a graph of the tasks and subflow runs for the given flow run + */ + get: operations["read_flow_run_graph_v2_flow_runs__id__graph_v2_get"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/flow_runs/{id}/resume": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** + * Resume Flow Run + * @description Resume a paused flow run. + */ + post: operations["resume_flow_run_flow_runs__id__resume_post"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/flow_runs/filter": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** + * Read Flow Runs + * @description Query for flow runs. + */ + post: operations["read_flow_runs_flow_runs_filter_post"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/flow_runs/{id}/set_state": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** + * Set Flow Run State + * @description Set a flow run state, invoking any orchestration rules. + */ + post: operations["set_flow_run_state_flow_runs__id__set_state_post"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/flow_runs/{id}/input": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** + * Create Flow Run Input + * @description Create a key/value input for a flow run. + */ + post: operations["create_flow_run_input_flow_runs__id__input_post"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/flow_runs/{id}/input/filter": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** + * Filter Flow Run Input + * @description Filter flow run inputs by key prefix + */ + post: operations["filter_flow_run_input_flow_runs__id__input_filter_post"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/flow_runs/{id}/input/{key}": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Read Flow Run Input + * @description Create a value from a flow run input + */ + get: operations["read_flow_run_input_flow_runs__id__input__key__get"]; + put?: never; + post?: never; + /** + * Delete Flow Run Input + * @description Delete a flow run input + */ + delete: operations["delete_flow_run_input_flow_runs__id__input__key__delete"]; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/flow_runs/paginate": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** + * Paginate Flow Runs + * @description Pagination query for flow runs. + */ + post: operations["paginate_flow_runs_flow_runs_paginate_post"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/flow_runs/{id}/logs/download": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Download Logs + * @description Download all flow run logs as a CSV file, collecting all logs until there are no more logs to retrieve. + */ + get: operations["download_logs_flow_runs__id__logs_download_get"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/task_runs/": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** + * Create Task Run + * @description Create a task run. If a task run with the same flow_run_id, + * task_key, and dynamic_key already exists, the existing task + * run will be returned. + * + * If no state is provided, the task run will be created in a PENDING state. + */ + post: operations["create_task_run_task_runs__post"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/task_runs/{id}": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Read Task Run + * @description Get a task run by id. + */ + get: operations["read_task_run_task_runs__id__get"]; + put?: never; + post?: never; + /** + * Delete Task Run + * @description Delete a task run by id. + */ + delete: operations["delete_task_run_task_runs__id__delete"]; + options?: never; + head?: never; + /** + * Update Task Run + * @description Updates a task run. + */ + patch: operations["update_task_run_task_runs__id__patch"]; + trace?: never; + }; + "/task_runs/count": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** + * Count Task Runs + * @description Count task runs. + */ + post: operations["count_task_runs_task_runs_count_post"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/task_runs/history": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** + * Task Run History + * @description Query for task run history data across a given range and interval. + */ + post: operations["task_run_history_task_runs_history_post"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/task_runs/filter": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** + * Read Task Runs + * @description Query for task runs. + */ + post: operations["read_task_runs_task_runs_filter_post"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/task_runs/{id}/set_state": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** + * Set Task Run State + * @description Set a task run state, invoking any orchestration rules. + */ + post: operations["set_task_run_state_task_runs__id__set_state_post"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/flow_run_states/{id}": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Read Flow Run State + * @description Get a flow run state by id. + */ + get: operations["read_flow_run_state_flow_run_states__id__get"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/flow_run_states/": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Read Flow Run States + * @description Get states associated with a flow run. + */ + get: operations["read_flow_run_states_flow_run_states__get"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/task_run_states/{id}": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Read Task Run State + * @description Get a task run state by id. + */ + get: operations["read_task_run_state_task_run_states__id__get"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/task_run_states/": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Read Task Run States + * @description Get states associated with a task run. + */ + get: operations["read_task_run_states_task_run_states__get"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/flow_run_notification_policies/": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** + * Create Flow Run Notification Policy + * @description Creates a new flow run notification policy. + */ + post: operations["create_flow_run_notification_policy_flow_run_notification_policies__post"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/flow_run_notification_policies/{id}": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Read Flow Run Notification Policy + * @description Get a flow run notification policy by id. + */ + get: operations["read_flow_run_notification_policy_flow_run_notification_policies__id__get"]; + put?: never; + post?: never; + /** + * Delete Flow Run Notification Policy + * @description Delete a flow run notification policy by id. + */ + delete: operations["delete_flow_run_notification_policy_flow_run_notification_policies__id__delete"]; + options?: never; + head?: never; + /** + * Update Flow Run Notification Policy + * @description Updates an existing flow run notification policy. + */ + patch: operations["update_flow_run_notification_policy_flow_run_notification_policies__id__patch"]; + trace?: never; + }; + "/flow_run_notification_policies/filter": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** + * Read Flow Run Notification Policies + * @description Query for flow run notification policies. + */ + post: operations["read_flow_run_notification_policies_flow_run_notification_policies_filter_post"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/deployments/": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** + * Create Deployment + * @description Gracefully creates a new deployment from the provided schema. If a deployment with + * the same name and flow_id already exists, the deployment is updated. + * + * If the deployment has an active schedule, flow runs will be scheduled. + * When upserting, any scheduled runs from the existing deployment will be deleted. + */ + post: operations["create_deployment_deployments__post"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/deployments/{id}": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Read Deployment + * @description Get a deployment by id. + */ + get: operations["read_deployment_deployments__id__get"]; + put?: never; + post?: never; + /** + * Delete Deployment + * @description Delete a deployment by id. + */ + delete: operations["delete_deployment_deployments__id__delete"]; + options?: never; + head?: never; + /** Update Deployment */ + patch: operations["update_deployment_deployments__id__patch"]; + trace?: never; + }; + "/deployments/name/{flow_name}/{deployment_name}": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Read Deployment By Name + * @description Get a deployment using the name of the flow and the deployment. + */ + get: operations["read_deployment_by_name_deployments_name__flow_name___deployment_name__get"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/deployments/filter": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** + * Read Deployments + * @description Query for deployments. + */ + post: operations["read_deployments_deployments_filter_post"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/deployments/paginate": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** + * Paginate Deployments + * @description Pagination query for flow runs. + */ + post: operations["paginate_deployments_deployments_paginate_post"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/deployments/get_scheduled_flow_runs": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** + * Get Scheduled Flow Runs For Deployments + * @description Get scheduled runs for a set of deployments. Used by a runner to poll for work. + */ + post: operations["get_scheduled_flow_runs_for_deployments_deployments_get_scheduled_flow_runs_post"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/deployments/count": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** + * Count Deployments + * @description Count deployments. + */ + post: operations["count_deployments_deployments_count_post"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/deployments/{id}/schedule": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** + * Schedule Deployment + * @description Schedule runs for a deployment. For backfills, provide start/end times in the past. + * + * This function will generate the minimum number of runs that satisfy the min + * and max times, and the min and max counts. Specifically, the following order + * will be respected. + * + * - Runs will be generated starting on or after the `start_time` + * - No more than `max_runs` runs will be generated + * - No runs will be generated after `end_time` is reached + * - At least `min_runs` runs will be generated + * - Runs will be generated until at least `start_time + min_time` is reached + */ + post: operations["schedule_deployment_deployments__id__schedule_post"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/deployments/{id}/resume_deployment": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** + * Resume Deployment + * @description Set a deployment schedule to active. Runs will be scheduled immediately. + */ + post: operations["resume_deployment_deployments__id__resume_deployment_post"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/deployments/{id}/pause_deployment": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** + * Pause Deployment + * @description Set a deployment schedule to inactive. Any auto-scheduled runs still in a Scheduled + * state will be deleted. + */ + post: operations["pause_deployment_deployments__id__pause_deployment_post"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/deployments/{id}/create_flow_run": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** + * Create Flow Run From Deployment + * @description Create a flow run from a deployment. + * + * Any parameters not provided will be inferred from the deployment's parameters. + * If tags are not provided, the deployment's tags will be used. + * + * If no state is provided, the flow run will be created in a SCHEDULED state. + */ + post: operations["create_flow_run_from_deployment_deployments__id__create_flow_run_post"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/deployments/{id}/work_queue_check": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Work Queue Check For Deployment + * @deprecated + * @description Get list of work-queues that are able to pick up the specified deployment. + * + * This endpoint is intended to be used by the UI to provide users warnings + * about deployments that are unable to be executed because there are no work + * queues that will pick up their runs, based on existing filter criteria. It + * may be deprecated in the future because there is not a strict relationship + * between work queues and deployments. + */ + get: operations["work_queue_check_for_deployment_deployments__id__work_queue_check_get"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/deployments/{id}/schedules": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** Read Deployment Schedules */ + get: operations["read_deployment_schedules_deployments__id__schedules_get"]; + put?: never; + /** Create Deployment Schedules */ + post: operations["create_deployment_schedules_deployments__id__schedules_post"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/deployments/{id}/schedules/{schedule_id}": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + post?: never; + /** Delete Deployment Schedule */ + delete: operations["delete_deployment_schedule_deployments__id__schedules__schedule_id__delete"]; + options?: never; + head?: never; + /** Update Deployment Schedule */ + patch: operations["update_deployment_schedule_deployments__id__schedules__schedule_id__patch"]; + trace?: never; + }; + "/saved_searches/": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + /** + * Create Saved Search + * @description Gracefully creates a new saved search from the provided schema. + * + * If a saved search with the same name already exists, the saved search's fields are + * replaced. + */ + put: operations["create_saved_search_saved_searches__put"]; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/saved_searches/{id}": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Read Saved Search + * @description Get a saved search by id. + */ + get: operations["read_saved_search_saved_searches__id__get"]; + put?: never; + post?: never; + /** + * Delete Saved Search + * @description Delete a saved search by id. + */ + delete: operations["delete_saved_search_saved_searches__id__delete"]; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/saved_searches/filter": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** + * Read Saved Searches + * @description Query for saved searches. + */ + post: operations["read_saved_searches_saved_searches_filter_post"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/logs/": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** + * Create Logs + * @description Create new logs from the provided schema. + */ + post: operations["create_logs_logs__post"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/logs/filter": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** + * Read Logs + * @description Query for logs. + */ + post: operations["read_logs_logs_filter_post"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/concurrency_limits/": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** Create Concurrency Limit */ + post: operations["create_concurrency_limit_concurrency_limits__post"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/concurrency_limits/{id}": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Read Concurrency Limit + * @description Get a concurrency limit by id. + * + * The `active slots` field contains a list of TaskRun IDs currently using a + * concurrency slot for the specified tag. + */ + get: operations["read_concurrency_limit_concurrency_limits__id__get"]; + put?: never; + post?: never; + /** Delete Concurrency Limit */ + delete: operations["delete_concurrency_limit_concurrency_limits__id__delete"]; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/concurrency_limits/tag/{tag}": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Read Concurrency Limit By Tag + * @description Get a concurrency limit by tag. + * + * The `active slots` field contains a list of TaskRun IDs currently using a + * concurrency slot for the specified tag. + */ + get: operations["read_concurrency_limit_by_tag_concurrency_limits_tag__tag__get"]; + put?: never; + post?: never; + /** Delete Concurrency Limit By Tag */ + delete: operations["delete_concurrency_limit_by_tag_concurrency_limits_tag__tag__delete"]; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/concurrency_limits/filter": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** + * Read Concurrency Limits + * @description Query for concurrency limits. + * + * For each concurrency limit the `active slots` field contains a list of TaskRun IDs + * currently using a concurrency slot for the specified tag. + */ + post: operations["read_concurrency_limits_concurrency_limits_filter_post"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/concurrency_limits/tag/{tag}/reset": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** Reset Concurrency Limit By Tag */ + post: operations["reset_concurrency_limit_by_tag_concurrency_limits_tag__tag__reset_post"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/concurrency_limits/increment": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** Increment Concurrency Limits V1 */ + post: operations["increment_concurrency_limits_v1_concurrency_limits_increment_post"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/concurrency_limits/decrement": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** Decrement Concurrency Limits V1 */ + post: operations["decrement_concurrency_limits_v1_concurrency_limits_decrement_post"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/v2/concurrency_limits/": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** Create Concurrency Limit V2 */ + post: operations["create_concurrency_limit_v2_v2_concurrency_limits__post"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/v2/concurrency_limits/{id_or_name}": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** Read Concurrency Limit V2 */ + get: operations["read_concurrency_limit_v2_v2_concurrency_limits__id_or_name__get"]; + put?: never; + post?: never; + /** Delete Concurrency Limit V2 */ + delete: operations["delete_concurrency_limit_v2_v2_concurrency_limits__id_or_name__delete"]; + options?: never; + head?: never; + /** Update Concurrency Limit V2 */ + patch: operations["update_concurrency_limit_v2_v2_concurrency_limits__id_or_name__patch"]; + trace?: never; + }; + "/v2/concurrency_limits/filter": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** Read All Concurrency Limits V2 */ + post: operations["read_all_concurrency_limits_v2_v2_concurrency_limits_filter_post"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/v2/concurrency_limits/increment": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** Bulk Increment Active Slots */ + post: operations["bulk_increment_active_slots_v2_concurrency_limits_increment_post"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/v2/concurrency_limits/decrement": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** Bulk Decrement Active Slots */ + post: operations["bulk_decrement_active_slots_v2_concurrency_limits_decrement_post"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/block_types/": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** + * Create Block Type + * @description Create a new block type + */ + post: operations["create_block_type_block_types__post"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/block_types/{id}": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Read Block Type By Id + * @description Get a block type by ID. + */ + get: operations["read_block_type_by_id_block_types__id__get"]; + put?: never; + post?: never; + /** Delete Block Type */ + delete: operations["delete_block_type_block_types__id__delete"]; + options?: never; + head?: never; + /** + * Update Block Type + * @description Update a block type. + */ + patch: operations["update_block_type_block_types__id__patch"]; + trace?: never; + }; + "/block_types/slug/{slug}": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Read Block Type By Slug + * @description Get a block type by name. + */ + get: operations["read_block_type_by_slug_block_types_slug__slug__get"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/block_types/filter": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** + * Read Block Types + * @description Gets all block types. Optionally limit return with limit and offset. + */ + post: operations["read_block_types_block_types_filter_post"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/block_types/slug/{slug}/block_documents": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** Read Block Documents For Block Type */ + get: operations["read_block_documents_for_block_type_block_types_slug__slug__block_documents_get"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/block_types/slug/{slug}/block_documents/name/{block_document_name}": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** Read Block Document By Name For Block Type */ + get: operations["read_block_document_by_name_for_block_type_block_types_slug__slug__block_documents_name__block_document_name__get"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/block_types/install_system_block_types": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** Install System Block Types */ + post: operations["install_system_block_types_block_types_install_system_block_types_post"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/block_documents/": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** + * Create Block Document + * @description Create a new block document. + */ + post: operations["create_block_document_block_documents__post"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/block_documents/filter": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** + * Read Block Documents + * @description Query for block documents. + */ + post: operations["read_block_documents_block_documents_filter_post"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/block_documents/count": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** + * Count Block Documents + * @description Count block documents. + */ + post: operations["count_block_documents_block_documents_count_post"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/block_documents/{id}": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** Read Block Document By Id */ + get: operations["read_block_document_by_id_block_documents__id__get"]; + put?: never; + post?: never; + /** Delete Block Document */ + delete: operations["delete_block_document_block_documents__id__delete"]; + options?: never; + head?: never; + /** Update Block Document Data */ + patch: operations["update_block_document_data_block_documents__id__patch"]; + trace?: never; + }; + "/work_pools/": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** + * Create Work Pool + * @description Creates a new work pool. If a work pool with the same + * name already exists, an error will be raised. + */ + post: operations["create_work_pool_work_pools__post"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/work_pools/{name}": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Read Work Pool + * @description Read a work pool by name + */ + get: operations["read_work_pool_work_pools__name__get"]; + put?: never; + post?: never; + /** + * Delete Work Pool + * @description Delete a work pool + */ + delete: operations["delete_work_pool_work_pools__name__delete"]; + options?: never; + head?: never; + /** + * Update Work Pool + * @description Update a work pool + */ + patch: operations["update_work_pool_work_pools__name__patch"]; + trace?: never; + }; + "/work_pools/filter": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** + * Read Work Pools + * @description Read multiple work pools + */ + post: operations["read_work_pools_work_pools_filter_post"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/work_pools/count": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** + * Count Work Pools + * @description Count work pools + */ + post: operations["count_work_pools_work_pools_count_post"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/work_pools/{name}/get_scheduled_flow_runs": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** + * Get Scheduled Flow Runs + * @description Load scheduled runs for a worker + */ + post: operations["get_scheduled_flow_runs_work_pools__name__get_scheduled_flow_runs_post"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/work_pools/{work_pool_name}/queues": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** + * Create Work Queue + * @description Creates a new work pool queue. If a work pool queue with the same + * name already exists, an error will be raised. + */ + post: operations["create_work_queue_work_pools__work_pool_name__queues_post"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/work_pools/{work_pool_name}/queues/{name}": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Read Work Queue + * @description Read a work pool queue + */ + get: operations["read_work_queue_work_pools__work_pool_name__queues__name__get"]; + put?: never; + post?: never; + /** + * Delete Work Queue + * @description Delete a work pool queue + */ + delete: operations["delete_work_queue_work_pools__work_pool_name__queues__name__delete"]; + options?: never; + head?: never; + /** + * Update Work Queue + * @description Update a work pool queue + */ + patch: operations["update_work_queue_work_pools__work_pool_name__queues__name__patch"]; + trace?: never; + }; + "/work_pools/{work_pool_name}/queues/filter": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** + * Read Work Queues + * @description Read all work pool queues + */ + post: operations["read_work_queues_work_pools__work_pool_name__queues_filter_post"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/work_pools/{work_pool_name}/workers/heartbeat": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** Worker Heartbeat */ + post: operations["worker_heartbeat_work_pools__work_pool_name__workers_heartbeat_post"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/work_pools/{work_pool_name}/workers/filter": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** + * Read Workers + * @description Read all worker processes + */ + post: operations["read_workers_work_pools__work_pool_name__workers_filter_post"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/work_pools/{work_pool_name}/workers/{name}": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + post?: never; + /** + * Delete Worker + * @description Delete a work pool's worker + */ + delete: operations["delete_worker_work_pools__work_pool_name__workers__name__delete"]; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/task_workers/filter": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** + * Read Task Workers + * @description Read active task workers. Optionally filter by task keys. + */ + post: operations["read_task_workers_task_workers_filter_post"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/work_queues/": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** + * Create Work Queue + * @description Creates a new work queue. + * + * If a work queue with the same name already exists, an error + * will be raised. + */ + post: operations["create_work_queue_work_queues__post"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/work_queues/{id}": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Read Work Queue + * @description Get a work queue by id. + */ + get: operations["read_work_queue_work_queues__id__get"]; + put?: never; + post?: never; + /** + * Delete Work Queue + * @description Delete a work queue by id. + */ + delete: operations["delete_work_queue_work_queues__id__delete"]; + options?: never; + head?: never; + /** + * Update Work Queue + * @description Updates an existing work queue. + */ + patch: operations["update_work_queue_work_queues__id__patch"]; + trace?: never; + }; + "/work_queues/name/{name}": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Read Work Queue By Name + * @description Get a work queue by id. + */ + get: operations["read_work_queue_by_name_work_queues_name__name__get"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/work_queues/{id}/get_runs": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** + * Read Work Queue Runs + * @description Get flow runs from the work queue. + */ + post: operations["read_work_queue_runs_work_queues__id__get_runs_post"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/work_queues/filter": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** + * Read Work Queues + * @description Query for work queues. + */ + post: operations["read_work_queues_work_queues_filter_post"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/work_queues/{id}/status": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Read Work Queue Status + * @description Get the status of a work queue. + */ + get: operations["read_work_queue_status_work_queues__id__status_get"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/artifacts/": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** Create Artifact */ + post: operations["create_artifact_artifacts__post"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/artifacts/{id}": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Read Artifact + * @description Retrieve an artifact from the database. + */ + get: operations["read_artifact_artifacts__id__get"]; + put?: never; + post?: never; + /** + * Delete Artifact + * @description Delete an artifact from the database. + */ + delete: operations["delete_artifact_artifacts__id__delete"]; + options?: never; + head?: never; + /** + * Update Artifact + * @description Update an artifact in the database. + */ + patch: operations["update_artifact_artifacts__id__patch"]; + trace?: never; + }; + "/artifacts/{key}/latest": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Read Latest Artifact + * @description Retrieve the latest artifact from the artifact table. + */ + get: operations["read_latest_artifact_artifacts__key__latest_get"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/artifacts/filter": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** + * Read Artifacts + * @description Retrieve artifacts from the database. + */ + post: operations["read_artifacts_artifacts_filter_post"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/artifacts/latest/filter": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** + * Read Latest Artifacts + * @description Retrieve artifacts from the database. + */ + post: operations["read_latest_artifacts_artifacts_latest_filter_post"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/artifacts/count": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** + * Count Artifacts + * @description Count artifacts from the database. + */ + post: operations["count_artifacts_artifacts_count_post"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/artifacts/latest/count": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** + * Count Latest Artifacts + * @description Count artifacts from the database. + */ + post: operations["count_latest_artifacts_artifacts_latest_count_post"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/block_schemas/": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** Create Block Schema */ + post: operations["create_block_schema_block_schemas__post"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/block_schemas/{id}": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Read Block Schema By Id + * @description Get a block schema by id. + */ + get: operations["read_block_schema_by_id_block_schemas__id__get"]; + put?: never; + post?: never; + /** + * Delete Block Schema + * @description Delete a block schema by id. + */ + delete: operations["delete_block_schema_block_schemas__id__delete"]; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/block_schemas/filter": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** + * Read Block Schemas + * @description Read all block schemas, optionally filtered by type + */ + post: operations["read_block_schemas_block_schemas_filter_post"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/block_schemas/checksum/{checksum}": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** Read Block Schema By Checksum */ + get: operations["read_block_schema_by_checksum_block_schemas_checksum__checksum__get"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/block_capabilities/": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** Read Available Block Capabilities */ + get: operations["read_available_block_capabilities_block_capabilities__get"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/collections/views/{view}": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Read View Content + * @description Reads the content of a view from the prefect-collection-registry. + */ + get: operations["read_view_content_collections_views__view__get"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/variables/": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** Create Variable */ + post: operations["create_variable_variables__post"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/variables/{id}": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** Read Variable */ + get: operations["read_variable_variables__id__get"]; + put?: never; + post?: never; + /** Delete Variable */ + delete: operations["delete_variable_variables__id__delete"]; + options?: never; + head?: never; + /** Update Variable */ + patch: operations["update_variable_variables__id__patch"]; + trace?: never; + }; + "/variables/name/{name}": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** Read Variable By Name */ + get: operations["read_variable_by_name_variables_name__name__get"]; + put?: never; + post?: never; + /** Delete Variable By Name */ + delete: operations["delete_variable_by_name_variables_name__name__delete"]; + options?: never; + head?: never; + /** Update Variable By Name */ + patch: operations["update_variable_by_name_variables_name__name__patch"]; + trace?: never; + }; + "/variables/filter": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** Read Variables */ + post: operations["read_variables_variables_filter_post"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/variables/count": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** Count Variables */ + post: operations["count_variables_variables_count_post"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/csrf-token": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Create Csrf Token + * @description Create or update a CSRF token for a client + */ + get: operations["create_csrf_token_csrf_token_get"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/events": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** + * Create Events + * @description Record a batch of Events + */ + post: operations["create_events_events_post"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/events/filter": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** + * Read Events + * @description Queries for Events matching the given filter criteria in the given Account. Returns + * the first page of results, and the URL to request the next page (if there are more + * results). + */ + post: operations["read_events_events_filter_post"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/events/filter/next": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Read Account Events Page + * @description Returns the next page of Events for a previous query against the given Account, and + * the URL to request the next page (if there are more results). + */ + get: operations["read_account_events_page_events_filter_next_get"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/events/count-by/{countable}": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** + * Count Account Events + * @description Returns distinct objects and the count of events associated with them. Objects + * that can be counted include the day the event occurred, the type of event, or + * the IDs of the resources associated with the event. + */ + post: operations["count_account_events_events_count_by__countable__post"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/automations/": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** Create Automation */ + post: operations["create_automation_automations__post"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/automations/{id}": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** Read Automation */ + get: operations["read_automation_automations__id__get"]; + /** Update Automation */ + put: operations["update_automation_automations__id__put"]; + post?: never; + /** Delete Automation */ + delete: operations["delete_automation_automations__id__delete"]; + options?: never; + head?: never; + /** Patch Automation */ + patch: operations["patch_automation_automations__id__patch"]; + trace?: never; + }; + "/automations/filter": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** Read Automations */ + post: operations["read_automations_automations_filter_post"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/automations/count": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** Count Automations */ + post: operations["count_automations_automations_count_post"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/automations/related-to/{resource_id}": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** Read Automations Related To Resource */ + get: operations["read_automations_related_to_resource_automations_related_to__resource_id__get"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/automations/owned-by/{resource_id}": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + post?: never; + /** Delete Automations Owned By Resource */ + delete: operations["delete_automations_owned_by_resource_automations_owned_by__resource_id__delete"]; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/templates/validate": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** Validate Template */ + post: operations["validate_template_templates_validate_post"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/ui/flows/count-deployments": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** + * Count Deployments By Flow + * @description Get deployment counts by flow id. + */ + post: operations["count_deployments_by_flow_ui_flows_count_deployments_post"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/ui/flows/next-runs": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** + * Next Runs By Flow + * @description Get the next flow run by flow id. + */ + post: operations["next_runs_by_flow_ui_flows_next_runs_post"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/ui/flow_runs/history": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** Read Flow Run History */ + post: operations["read_flow_run_history_ui_flow_runs_history_post"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/ui/flow_runs/count-task-runs": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** + * Count Task Runs By Flow Run + * @description Get task run counts by flow run id. + */ + post: operations["count_task_runs_by_flow_run_ui_flow_runs_count_task_runs_post"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/ui/schemas/validate": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** Validate Obj */ + post: operations["validate_obj_ui_schemas_validate_post"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/ui/task_runs/dashboard/counts": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** Read Dashboard Task Run Counts */ + post: operations["read_dashboard_task_run_counts_ui_task_runs_dashboard_counts_post"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/ui/task_runs/count": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** Read Task Run Counts By State */ + post: operations["read_task_run_counts_by_state_ui_task_runs_count_post"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/settings": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Read Settings + * @description Get the current Prefect REST API settings. + * + * Secret setting values will be obfuscated. + */ + get: operations["read_settings_admin_settings_get"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/version": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Read Version + * @description Returns the Prefect version number + */ + get: operations["read_version_admin_version_get"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/database/clear": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** + * Clear Database + * @description Clear all database tables without dropping them. + */ + post: operations["clear_database_admin_database_clear_post"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/database/drop": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** + * Drop Database + * @description Drop all database objects. + */ + post: operations["drop_database_admin_database_drop_post"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/database/create": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** + * Create Database + * @description Create all database objects. + */ + post: operations["create_database_admin_database_create_post"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/hello": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Hello + * @description Say hello! + */ + get: operations["hello_hello_get"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/ready": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** Perform Readiness Check */ + get: operations["perform_readiness_check_ready_get"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; +} +export type webhooks = Record; +export interface components { + schemas: { + /** Artifact */ + Artifact: { + /** + * Id + * Format: uuid + */ + id?: string; + /** Created */ + created?: string | null; + /** Updated */ + updated?: string | null; + /** + * Key + * @description An optional unique reference key for this artifact. + */ + key?: string | null; + /** + * Type + * @description An identifier that describes the shape of the data field. e.g. 'result', 'table', 'markdown' + */ + type?: string | null; + /** + * Description + * @description A markdown-enabled description of the artifact. + */ + description?: string | null; + /** + * Data + * @description Data associated with the artifact, e.g. a result.; structure depends on the artifact type. + */ + data?: Record | unknown | null; + /** + * Metadata + * @description User-defined artifact metadata. Content must be string key and value pairs. + */ + metadata_?: { + [key: string]: string; + } | null; + /** + * Flow Run Id + * @description The flow run associated with the artifact. + */ + flow_run_id?: string | null; + /** + * Task Run Id + * @description The task run associated with the artifact. + */ + task_run_id?: string | null; + }; + /** ArtifactCollection */ + ArtifactCollection: { + /** + * Id + * Format: uuid + */ + id?: string; + /** Created */ + created?: string | null; + /** Updated */ + updated?: string | null; + /** + * Key + * @description An optional unique reference key for this artifact. + */ + key: string; + /** + * Latest Id + * Format: uuid + * @description The latest artifact ID associated with the key. + */ + latest_id: string; + /** + * Type + * @description An identifier that describes the shape of the data field. e.g. 'result', 'table', 'markdown' + */ + type?: string | null; + /** + * Description + * @description A markdown-enabled description of the artifact. + */ + description?: string | null; + /** + * Data + * @description Data associated with the artifact, e.g. a result.; structure depends on the artifact type. + */ + data?: Record | unknown | null; + /** + * Metadata + * @description User-defined artifact metadata. Content must be string key and value pairs. + */ + metadata_?: { + [key: string]: string; + } | null; + /** + * Flow Run Id + * @description The flow run associated with the artifact. + */ + flow_run_id?: string | null; + /** + * Task Run Id + * @description The task run associated with the artifact. + */ + task_run_id?: string | null; + }; + /** + * ArtifactCollectionFilter + * @description Filter artifact collections. Only artifact collections matching all criteria will be returned + */ + ArtifactCollectionFilter: { + /** + * @description Operator for combining filter criteria. Defaults to 'and_'. + * @default and_ + */ + operator: components["schemas"]["Operator"]; + /** @description Filter criteria for `Artifact.id` */ + latest_id?: + | components["schemas"]["ArtifactCollectionFilterLatestId"] + | null; + /** @description Filter criteria for `Artifact.key` */ + key?: components["schemas"]["ArtifactCollectionFilterKey"] | null; + /** @description Filter criteria for `Artifact.flow_run_id` */ + flow_run_id?: + | components["schemas"]["ArtifactCollectionFilterFlowRunId"] + | null; + /** @description Filter criteria for `Artifact.task_run_id` */ + task_run_id?: + | components["schemas"]["ArtifactCollectionFilterTaskRunId"] + | null; + /** @description Filter criteria for `Artifact.type` */ + type?: components["schemas"]["ArtifactCollectionFilterType"] | null; + }; + /** + * ArtifactCollectionFilterFlowRunId + * @description Filter by `ArtifactCollection.flow_run_id`. + */ + ArtifactCollectionFilterFlowRunId: { + /** + * Any + * @description A list of flow run IDs to include + */ + any_?: string[] | null; + }; + /** + * ArtifactCollectionFilterKey + * @description Filter by `ArtifactCollection.key`. + */ + ArtifactCollectionFilterKey: { + /** + * Any + * @description A list of artifact keys to include + */ + any_?: string[] | null; + /** + * Like + * @description A string to match artifact keys against. This can include SQL wildcard characters like `%` and `_`. + */ + like_?: string | null; + /** + * Exists + * @description If `true`, only include artifacts with a non-null key. If `false`, only include artifacts with a null key. Should return all rows in the ArtifactCollection table if specified. + */ + exists_?: boolean | null; + }; + /** + * ArtifactCollectionFilterLatestId + * @description Filter by `ArtifactCollection.latest_id`. + */ + ArtifactCollectionFilterLatestId: { + /** + * Any + * @description A list of artifact ids to include + */ + any_?: string[] | null; + }; + /** + * ArtifactCollectionFilterTaskRunId + * @description Filter by `ArtifactCollection.task_run_id`. + */ + ArtifactCollectionFilterTaskRunId: { + /** + * Any + * @description A list of task run IDs to include + */ + any_?: string[] | null; + }; + /** + * ArtifactCollectionFilterType + * @description Filter by `ArtifactCollection.type`. + */ + ArtifactCollectionFilterType: { + /** + * Any + * @description A list of artifact types to include + */ + any_?: string[] | null; + /** + * Not Any + * @description A list of artifact types to exclude + */ + not_any_?: string[] | null; + }; + /** + * ArtifactCollectionSort + * @description Defines artifact collection sorting options. + * @enum {string} + */ + ArtifactCollectionSort: + | "CREATED_DESC" + | "UPDATED_DESC" + | "ID_DESC" + | "KEY_DESC" + | "KEY_ASC"; + /** + * ArtifactCreate + * @description Data used by the Prefect REST API to create an artifact. + */ + ArtifactCreate: { + /** + * Key + * @description An optional unique reference key for this artifact. + */ + key?: string | null; + /** + * Type + * @description An identifier that describes the shape of the data field. e.g. 'result', 'table', 'markdown' + */ + type?: string | null; + /** + * Description + * @description A markdown-enabled description of the artifact. + */ + description?: string | null; + /** + * Data + * @description Data associated with the artifact, e.g. a result.; structure depends on the artifact type. + */ + data?: Record | unknown | null; + /** + * Metadata + * @description User-defined artifact metadata. Content must be string key and value pairs. + */ + metadata_?: { + [key: string]: string; + } | null; + /** + * Flow Run Id + * @description The flow run associated with the artifact. + */ + flow_run_id?: string | null; + /** + * Task Run Id + * @description The task run associated with the artifact. + */ + task_run_id?: string | null; + }; + /** + * ArtifactFilter + * @description Filter artifacts. Only artifacts matching all criteria will be returned + */ + ArtifactFilter: { + /** + * @description Operator for combining filter criteria. Defaults to 'and_'. + * @default and_ + */ + operator: components["schemas"]["Operator"]; + /** @description Filter criteria for `Artifact.id` */ + id?: components["schemas"]["ArtifactFilterId"] | null; + /** @description Filter criteria for `Artifact.key` */ + key?: components["schemas"]["ArtifactFilterKey"] | null; + /** @description Filter criteria for `Artifact.flow_run_id` */ + flow_run_id?: components["schemas"]["ArtifactFilterFlowRunId"] | null; + /** @description Filter criteria for `Artifact.task_run_id` */ + task_run_id?: components["schemas"]["ArtifactFilterTaskRunId"] | null; + /** @description Filter criteria for `Artifact.type` */ + type?: components["schemas"]["ArtifactFilterType"] | null; + }; + /** + * ArtifactFilterFlowRunId + * @description Filter by `Artifact.flow_run_id`. + */ + ArtifactFilterFlowRunId: { + /** + * Any + * @description A list of flow run IDs to include + */ + any_?: string[] | null; + }; + /** + * ArtifactFilterId + * @description Filter by `Artifact.id`. + */ + ArtifactFilterId: { + /** + * Any + * @description A list of artifact ids to include + */ + any_?: string[] | null; + }; + /** + * ArtifactFilterKey + * @description Filter by `Artifact.key`. + */ + ArtifactFilterKey: { + /** + * Any + * @description A list of artifact keys to include + */ + any_?: string[] | null; + /** + * Like + * @description A string to match artifact keys against. This can include SQL wildcard characters like `%` and `_`. + */ + like_?: string | null; + /** + * Exists + * @description If `true`, only include artifacts with a non-null key. If `false`, only include artifacts with a null key. + */ + exists_?: boolean | null; + }; + /** + * ArtifactFilterTaskRunId + * @description Filter by `Artifact.task_run_id`. + */ + ArtifactFilterTaskRunId: { + /** + * Any + * @description A list of task run IDs to include + */ + any_?: string[] | null; + }; + /** + * ArtifactFilterType + * @description Filter by `Artifact.type`. + */ + ArtifactFilterType: { + /** + * Any + * @description A list of artifact types to include + */ + any_?: string[] | null; + /** + * Not Any + * @description A list of artifact types to exclude + */ + not_any_?: string[] | null; + }; + /** + * ArtifactSort + * @description Defines artifact sorting options. + * @enum {string} + */ + ArtifactSort: + | "CREATED_DESC" + | "UPDATED_DESC" + | "ID_DESC" + | "KEY_DESC" + | "KEY_ASC"; + /** + * ArtifactUpdate + * @description Data used by the Prefect REST API to update an artifact. + */ + ArtifactUpdate: { + /** Data */ + data?: Record | unknown | null; + /** Description */ + description?: string | null; + /** Metadata */ + metadata_?: { + [key: string]: string; + } | null; + }; + /** Automation */ + Automation: { + /** + * Name + * @description The name of this automation + */ + name: string; + /** + * Description + * @description A longer description of this automation + * @default + */ + description: string; + /** + * Enabled + * @description Whether this automation will be evaluated + * @default true + */ + enabled: boolean; + /** + * Trigger + * @description The criteria for which events this Automation covers and how it will respond to the presence or absence of those events + */ + trigger: + | components["schemas"]["EventTrigger"] + | components["schemas"]["CompoundTrigger-Output"] + | components["schemas"]["SequenceTrigger-Output"]; + /** + * Actions + * @description The actions to perform when this Automation triggers + */ + actions: ( + | components["schemas"]["DoNothing"] + | components["schemas"]["RunDeployment"] + | components["schemas"]["PauseDeployment"] + | components["schemas"]["ResumeDeployment"] + | components["schemas"]["CancelFlowRun"] + | components["schemas"]["ChangeFlowRunState"] + | components["schemas"]["PauseWorkQueue"] + | components["schemas"]["ResumeWorkQueue"] + | components["schemas"]["SendNotification"] + | components["schemas"]["CallWebhook"] + | components["schemas"]["PauseAutomation"] + | components["schemas"]["ResumeAutomation"] + | components["schemas"]["SuspendFlowRun"] + | components["schemas"]["ResumeFlowRun"] + | components["schemas"]["PauseWorkPool"] + | components["schemas"]["ResumeWorkPool"] + )[]; + /** + * Actions On Trigger + * @description The actions to perform when an Automation goes into a triggered state + */ + actions_on_trigger?: ( + | components["schemas"]["DoNothing"] + | components["schemas"]["RunDeployment"] + | components["schemas"]["PauseDeployment"] + | components["schemas"]["ResumeDeployment"] + | components["schemas"]["CancelFlowRun"] + | components["schemas"]["ChangeFlowRunState"] + | components["schemas"]["PauseWorkQueue"] + | components["schemas"]["ResumeWorkQueue"] + | components["schemas"]["SendNotification"] + | components["schemas"]["CallWebhook"] + | components["schemas"]["PauseAutomation"] + | components["schemas"]["ResumeAutomation"] + | components["schemas"]["SuspendFlowRun"] + | components["schemas"]["ResumeFlowRun"] + | components["schemas"]["PauseWorkPool"] + | components["schemas"]["ResumeWorkPool"] + )[]; + /** + * Actions On Resolve + * @description The actions to perform when an Automation goes into a resolving state + */ + actions_on_resolve?: ( + | components["schemas"]["DoNothing"] + | components["schemas"]["RunDeployment"] + | components["schemas"]["PauseDeployment"] + | components["schemas"]["ResumeDeployment"] + | components["schemas"]["CancelFlowRun"] + | components["schemas"]["ChangeFlowRunState"] + | components["schemas"]["PauseWorkQueue"] + | components["schemas"]["ResumeWorkQueue"] + | components["schemas"]["SendNotification"] + | components["schemas"]["CallWebhook"] + | components["schemas"]["PauseAutomation"] + | components["schemas"]["ResumeAutomation"] + | components["schemas"]["SuspendFlowRun"] + | components["schemas"]["ResumeFlowRun"] + | components["schemas"]["PauseWorkPool"] + | components["schemas"]["ResumeWorkPool"] + )[]; + /** + * Id + * Format: uuid + */ + id?: string; + /** Created */ + created?: string | null; + /** Updated */ + updated?: string | null; + }; + /** AutomationCreate */ + AutomationCreate: { + /** + * Name + * @description The name of this automation + */ + name: string; + /** + * Description + * @description A longer description of this automation + * @default + */ + description: string; + /** + * Enabled + * @description Whether this automation will be evaluated + * @default true + */ + enabled: boolean; + /** + * Trigger + * @description The criteria for which events this Automation covers and how it will respond to the presence or absence of those events + */ + trigger: + | components["schemas"]["EventTrigger"] + | components["schemas"]["CompoundTrigger-Input"] + | components["schemas"]["SequenceTrigger-Input"]; + /** + * Actions + * @description The actions to perform when this Automation triggers + */ + actions: ( + | components["schemas"]["DoNothing"] + | components["schemas"]["RunDeployment"] + | components["schemas"]["PauseDeployment"] + | components["schemas"]["ResumeDeployment"] + | components["schemas"]["CancelFlowRun"] + | components["schemas"]["ChangeFlowRunState"] + | components["schemas"]["PauseWorkQueue"] + | components["schemas"]["ResumeWorkQueue"] + | components["schemas"]["SendNotification"] + | components["schemas"]["CallWebhook"] + | components["schemas"]["PauseAutomation"] + | components["schemas"]["ResumeAutomation"] + | components["schemas"]["SuspendFlowRun"] + | components["schemas"]["ResumeFlowRun"] + | components["schemas"]["PauseWorkPool"] + | components["schemas"]["ResumeWorkPool"] + )[]; + /** + * Actions On Trigger + * @description The actions to perform when an Automation goes into a triggered state + */ + actions_on_trigger?: ( + | components["schemas"]["DoNothing"] + | components["schemas"]["RunDeployment"] + | components["schemas"]["PauseDeployment"] + | components["schemas"]["ResumeDeployment"] + | components["schemas"]["CancelFlowRun"] + | components["schemas"]["ChangeFlowRunState"] + | components["schemas"]["PauseWorkQueue"] + | components["schemas"]["ResumeWorkQueue"] + | components["schemas"]["SendNotification"] + | components["schemas"]["CallWebhook"] + | components["schemas"]["PauseAutomation"] + | components["schemas"]["ResumeAutomation"] + | components["schemas"]["SuspendFlowRun"] + | components["schemas"]["ResumeFlowRun"] + | components["schemas"]["PauseWorkPool"] + | components["schemas"]["ResumeWorkPool"] + )[]; + /** + * Actions On Resolve + * @description The actions to perform when an Automation goes into a resolving state + */ + actions_on_resolve?: ( + | components["schemas"]["DoNothing"] + | components["schemas"]["RunDeployment"] + | components["schemas"]["PauseDeployment"] + | components["schemas"]["ResumeDeployment"] + | components["schemas"]["CancelFlowRun"] + | components["schemas"]["ChangeFlowRunState"] + | components["schemas"]["PauseWorkQueue"] + | components["schemas"]["ResumeWorkQueue"] + | components["schemas"]["SendNotification"] + | components["schemas"]["CallWebhook"] + | components["schemas"]["PauseAutomation"] + | components["schemas"]["ResumeAutomation"] + | components["schemas"]["SuspendFlowRun"] + | components["schemas"]["ResumeFlowRun"] + | components["schemas"]["PauseWorkPool"] + | components["schemas"]["ResumeWorkPool"] + )[]; + /** + * Owner Resource + * @description The resource to which this automation belongs + */ + owner_resource?: string | null; + }; + /** AutomationFilter */ + AutomationFilter: { + /** + * @description Operator for combining filter criteria. Defaults to 'and_'. + * @default and_ + */ + operator: components["schemas"]["Operator"]; + /** @description Filter criteria for `Automation.name` */ + name?: components["schemas"]["AutomationFilterName"] | null; + /** @description Filter criteria for `Automation.created` */ + created?: components["schemas"]["AutomationFilterCreated"] | null; + }; + /** + * AutomationFilterCreated + * @description Filter by `Automation.created`. + */ + AutomationFilterCreated: { + /** + * Before + * @description Only include automations created before this datetime + */ + before_?: string | null; + }; + /** + * AutomationFilterName + * @description Filter by `Automation.created`. + */ + AutomationFilterName: { + /** + * Any + * @description Only include automations with names that match any of these strings + */ + any_?: string[] | null; + }; + /** AutomationPartialUpdate */ + AutomationPartialUpdate: { + /** + * Enabled + * @description Whether this automation will be evaluated + * @default true + */ + enabled: boolean; + }; + /** + * AutomationSort + * @description Defines automations sorting options. + * @enum {string} + */ + AutomationSort: "CREATED_DESC" | "UPDATED_DESC" | "NAME_ASC" | "NAME_DESC"; + /** AutomationUpdate */ + AutomationUpdate: { + /** + * Name + * @description The name of this automation + */ + name: string; + /** + * Description + * @description A longer description of this automation + * @default + */ + description: string; + /** + * Enabled + * @description Whether this automation will be evaluated + * @default true + */ + enabled: boolean; + /** + * Trigger + * @description The criteria for which events this Automation covers and how it will respond to the presence or absence of those events + */ + trigger: + | components["schemas"]["EventTrigger"] + | components["schemas"]["CompoundTrigger-Input"] + | components["schemas"]["SequenceTrigger-Input"]; + /** + * Actions + * @description The actions to perform when this Automation triggers + */ + actions: ( + | components["schemas"]["DoNothing"] + | components["schemas"]["RunDeployment"] + | components["schemas"]["PauseDeployment"] + | components["schemas"]["ResumeDeployment"] + | components["schemas"]["CancelFlowRun"] + | components["schemas"]["ChangeFlowRunState"] + | components["schemas"]["PauseWorkQueue"] + | components["schemas"]["ResumeWorkQueue"] + | components["schemas"]["SendNotification"] + | components["schemas"]["CallWebhook"] + | components["schemas"]["PauseAutomation"] + | components["schemas"]["ResumeAutomation"] + | components["schemas"]["SuspendFlowRun"] + | components["schemas"]["ResumeFlowRun"] + | components["schemas"]["PauseWorkPool"] + | components["schemas"]["ResumeWorkPool"] + )[]; + /** + * Actions On Trigger + * @description The actions to perform when an Automation goes into a triggered state + */ + actions_on_trigger?: ( + | components["schemas"]["DoNothing"] + | components["schemas"]["RunDeployment"] + | components["schemas"]["PauseDeployment"] + | components["schemas"]["ResumeDeployment"] + | components["schemas"]["CancelFlowRun"] + | components["schemas"]["ChangeFlowRunState"] + | components["schemas"]["PauseWorkQueue"] + | components["schemas"]["ResumeWorkQueue"] + | components["schemas"]["SendNotification"] + | components["schemas"]["CallWebhook"] + | components["schemas"]["PauseAutomation"] + | components["schemas"]["ResumeAutomation"] + | components["schemas"]["SuspendFlowRun"] + | components["schemas"]["ResumeFlowRun"] + | components["schemas"]["PauseWorkPool"] + | components["schemas"]["ResumeWorkPool"] + )[]; + /** + * Actions On Resolve + * @description The actions to perform when an Automation goes into a resolving state + */ + actions_on_resolve?: ( + | components["schemas"]["DoNothing"] + | components["schemas"]["RunDeployment"] + | components["schemas"]["PauseDeployment"] + | components["schemas"]["ResumeDeployment"] + | components["schemas"]["CancelFlowRun"] + | components["schemas"]["ChangeFlowRunState"] + | components["schemas"]["PauseWorkQueue"] + | components["schemas"]["ResumeWorkQueue"] + | components["schemas"]["SendNotification"] + | components["schemas"]["CallWebhook"] + | components["schemas"]["PauseAutomation"] + | components["schemas"]["ResumeAutomation"] + | components["schemas"]["SuspendFlowRun"] + | components["schemas"]["ResumeFlowRun"] + | components["schemas"]["PauseWorkPool"] + | components["schemas"]["ResumeWorkPool"] + )[]; + }; + /** + * BlockDocument + * @description An ORM representation of a block document. + */ + BlockDocument: { + /** + * Id + * Format: uuid + */ + id?: string; + /** Created */ + created?: string | null; + /** Updated */ + updated?: string | null; + /** + * Name + * @description The block document's name. Not required for anonymous block documents. + */ + name?: string | null; + /** + * Data + * @description The block document's data + */ + data?: Record; + /** + * Block Schema Id + * Format: uuid + * @description A block schema ID + */ + block_schema_id: string; + /** @description The associated block schema */ + block_schema?: components["schemas"]["BlockSchema"] | null; + /** + * Block Type Id + * Format: uuid + * @description A block type ID + */ + block_type_id: string; + /** + * Block Type Name + * @description The associated block type's name + */ + block_type_name?: string | null; + /** @description The associated block type */ + block_type?: components["schemas"]["BlockType"] | null; + /** + * Block Document References + * @description Record of the block document's references + */ + block_document_references?: { + [key: string]: Record; + }; + /** + * Is Anonymous + * @description Whether the block is anonymous (anonymous blocks are usually created by Prefect automatically) + * @default false + */ + is_anonymous: boolean; + }; + /** + * BlockDocumentCreate + * @description Data used by the Prefect REST API to create a block document. + */ + BlockDocumentCreate: { + /** + * Name + * @description The block document's name. Not required for anonymous block documents. + */ + name?: string | null; + /** + * Data + * @description The block document's data + */ + data?: Record; + /** + * Block Schema Id + * Format: uuid + * @description A block schema ID + */ + block_schema_id: string; + /** + * Block Type Id + * Format: uuid + * @description A block type ID + */ + block_type_id: string; + /** + * Is Anonymous + * @description Whether the block is anonymous (anonymous blocks are usually created by Prefect automatically) + * @default false + */ + is_anonymous: boolean; + }; + /** + * BlockDocumentFilter + * @description Filter BlockDocuments. Only BlockDocuments matching all criteria will be returned + */ + BlockDocumentFilter: { + /** + * @description Operator for combining filter criteria. Defaults to 'and_'. + * @default and_ + */ + operator: components["schemas"]["Operator"]; + /** @description Filter criteria for `BlockDocument.id` */ + id?: components["schemas"]["BlockDocumentFilterId"] | null; + /** + * @description Filter criteria for `BlockDocument.is_anonymous`. Defaults to excluding anonymous blocks. + * @default { + * "eq_": false + * } + */ + is_anonymous: + | components["schemas"]["BlockDocumentFilterIsAnonymous"] + | null; + /** @description Filter criteria for `BlockDocument.block_type_id` */ + block_type_id?: + | components["schemas"]["BlockDocumentFilterBlockTypeId"] + | null; + /** @description Filter criteria for `BlockDocument.name` */ + name?: components["schemas"]["BlockDocumentFilterName"] | null; + }; + /** + * BlockDocumentFilterBlockTypeId + * @description Filter by `BlockDocument.block_type_id`. + */ + BlockDocumentFilterBlockTypeId: { + /** + * Any + * @description A list of block type ids to include + */ + any_?: string[] | null; + }; + /** + * BlockDocumentFilterId + * @description Filter by `BlockDocument.id`. + */ + BlockDocumentFilterId: { + /** + * Any + * @description A list of block ids to include + */ + any_?: string[] | null; + }; + /** + * BlockDocumentFilterIsAnonymous + * @description Filter by `BlockDocument.is_anonymous`. + */ + BlockDocumentFilterIsAnonymous: { + /** + * Eq + * @description Filter block documents for only those that are or are not anonymous. + */ + eq_?: boolean | null; + }; + /** + * BlockDocumentFilterName + * @description Filter by `BlockDocument.name`. + */ + BlockDocumentFilterName: { + /** + * Any + * @description A list of block names to include + */ + any_?: string[] | null; + /** + * Like + * @description A string to match block names against. This can include SQL wildcard characters like `%` and `_`. + */ + like_?: string | null; + }; + /** + * BlockDocumentSort + * @description Defines block document sorting options. + * @enum {string} + */ + BlockDocumentSort: "NAME_DESC" | "NAME_ASC" | "BLOCK_TYPE_AND_NAME_ASC"; + /** + * BlockDocumentUpdate + * @description Data used by the Prefect REST API to update a block document. + */ + BlockDocumentUpdate: { + /** + * Block Schema Id + * @description A block schema ID + */ + block_schema_id?: string | null; + /** + * Data + * @description The block document's data + */ + data?: Record; + /** + * Merge Existing Data + * @default true + */ + merge_existing_data: boolean; + }; + /** + * BlockSchema + * @description An ORM representation of a block schema. + */ + BlockSchema: { + /** + * Id + * Format: uuid + */ + id?: string; + /** Created */ + created?: string | null; + /** Updated */ + updated?: string | null; + /** + * Checksum + * @description The block schema's unique checksum + */ + checksum: string; + /** + * Fields + * @description The block schema's field schema + */ + fields?: Record; + /** + * Block Type Id + * @description A block type ID + */ + block_type_id: string | null; + /** @description The associated block type */ + block_type?: components["schemas"]["BlockType"] | null; + /** + * Capabilities + * @description A list of Block capabilities + */ + capabilities?: string[]; + /** + * Version + * @description Human readable identifier for the block schema + * @default non-versioned + */ + version: string; + }; + /** + * BlockSchemaCreate + * @description Data used by the Prefect REST API to create a block schema. + */ + BlockSchemaCreate: { + /** + * Fields + * @description The block schema's field schema + */ + fields?: Record; + /** + * Block Type Id + * Format: uuid + * @description A block type ID + */ + block_type_id: string; + /** + * Capabilities + * @description A list of Block capabilities + */ + capabilities?: string[]; + /** + * Version + * @description Human readable identifier for the block schema + * @default non-versioned + */ + version: string; + }; + /** + * BlockSchemaFilter + * @description Filter BlockSchemas + */ + BlockSchemaFilter: { + /** + * @description Operator for combining filter criteria. Defaults to 'and_'. + * @default and_ + */ + operator: components["schemas"]["Operator"]; + /** @description Filter criteria for `BlockSchema.block_type_id` */ + block_type_id?: + | components["schemas"]["BlockSchemaFilterBlockTypeId"] + | null; + /** @description Filter criteria for `BlockSchema.capabilities` */ + block_capabilities?: + | components["schemas"]["BlockSchemaFilterCapabilities"] + | null; + /** @description Filter criteria for `BlockSchema.id` */ + id?: components["schemas"]["BlockSchemaFilterId"] | null; + /** @description Filter criteria for `BlockSchema.version` */ + version?: components["schemas"]["BlockSchemaFilterVersion"] | null; + }; + /** + * BlockSchemaFilterBlockTypeId + * @description Filter by `BlockSchema.block_type_id`. + */ + BlockSchemaFilterBlockTypeId: { + /** + * Any + * @description A list of block type ids to include + */ + any_?: string[] | null; + }; + /** + * BlockSchemaFilterCapabilities + * @description Filter by `BlockSchema.capabilities` + */ + BlockSchemaFilterCapabilities: { + /** + * All + * @description A list of block capabilities. Block entities will be returned only if an associated block schema has a superset of the defined capabilities. + */ + all_?: string[] | null; + }; + /** + * BlockSchemaFilterId + * @description Filter by BlockSchema.id + */ + BlockSchemaFilterId: { + /** + * Any + * @description A list of IDs to include + */ + any_?: string[] | null; + }; + /** + * BlockSchemaFilterVersion + * @description Filter by `BlockSchema.capabilities` + */ + BlockSchemaFilterVersion: { + /** + * Any + * @description A list of block schema versions. + */ + any_?: string[] | null; + }; + /** + * BlockType + * @description An ORM representation of a block type + */ + BlockType: { + /** + * Id + * Format: uuid + */ + id?: string; + /** Created */ + created?: string | null; + /** Updated */ + updated?: string | null; + /** + * Name + * @description A block type's name + */ + name: string; + /** + * Slug + * @description A block type's slug + */ + slug: string; + /** + * Logo Url + * @description Web URL for the block type's logo + */ + logo_url?: string | null; + /** + * Documentation Url + * @description Web URL for the block type's documentation + */ + documentation_url?: string | null; + /** + * Description + * @description A short blurb about the corresponding block's intended use + */ + description?: string | null; + /** + * Code Example + * @description A code snippet demonstrating use of the corresponding block + */ + code_example?: string | null; + /** + * Is Protected + * @description Protected block types cannot be modified via API. + * @default false + */ + is_protected: boolean; + }; + /** + * BlockTypeCreate + * @description Data used by the Prefect REST API to create a block type. + */ + BlockTypeCreate: { + /** + * Name + * @description A block type's name + */ + name: string; + /** + * Slug + * @description A block type's slug + */ + slug: string; + /** + * Logo Url + * @description Web URL for the block type's logo + */ + logo_url?: string | null; + /** + * Documentation Url + * @description Web URL for the block type's documentation + */ + documentation_url?: string | null; + /** + * Description + * @description A short blurb about the corresponding block's intended use + */ + description?: string | null; + /** + * Code Example + * @description A code snippet demonstrating use of the corresponding block + */ + code_example?: string | null; + }; + /** + * BlockTypeFilter + * @description Filter BlockTypes + */ + BlockTypeFilter: { + /** @description Filter criteria for `BlockType.name` */ + name?: components["schemas"]["BlockTypeFilterName"] | null; + /** @description Filter criteria for `BlockType.slug` */ + slug?: components["schemas"]["BlockTypeFilterSlug"] | null; + }; + /** + * BlockTypeFilterName + * @description Filter by `BlockType.name` + */ + BlockTypeFilterName: { + /** + * Like + * @description A case-insensitive partial match. For example, passing 'marvin' will match 'marvin', 'sad-Marvin', and 'marvin-robot'. + */ + like_?: string | null; + }; + /** + * BlockTypeFilterSlug + * @description Filter by `BlockType.slug` + */ + BlockTypeFilterSlug: { + /** + * Any + * @description A list of slugs to match + */ + any_?: string[] | null; + }; + /** + * BlockTypeUpdate + * @description Data used by the Prefect REST API to update a block type. + */ + BlockTypeUpdate: { + /** Logo Url */ + logo_url?: string | null; + /** Documentation Url */ + documentation_url?: string | null; + /** Description */ + description?: string | null; + /** Code Example */ + code_example?: string | null; + }; + /** Body_average_flow_run_lateness_flow_runs_lateness_post */ + Body_average_flow_run_lateness_flow_runs_lateness_post: { + flows?: components["schemas"]["FlowFilter"] | null; + flow_runs?: components["schemas"]["FlowRunFilter"] | null; + task_runs?: components["schemas"]["TaskRunFilter"] | null; + deployments?: components["schemas"]["DeploymentFilter"] | null; + work_pools?: components["schemas"]["WorkPoolFilter"] | null; + work_pool_queues?: components["schemas"]["WorkQueueFilter"] | null; + }; + /** Body_bulk_decrement_active_slots_v2_concurrency_limits_decrement_post */ + Body_bulk_decrement_active_slots_v2_concurrency_limits_decrement_post: { + /** Slots */ + slots: number; + /** Names */ + names: string[]; + /** Occupancy Seconds */ + occupancy_seconds?: number | null; + /** + * Create If Missing + * @default true + */ + create_if_missing: boolean; + }; + /** Body_bulk_increment_active_slots_v2_concurrency_limits_increment_post */ + Body_bulk_increment_active_slots_v2_concurrency_limits_increment_post: { + /** Slots */ + slots: number; + /** Names */ + names: string[]; + /** + * Mode + * @default concurrency + * @enum {string} + */ + mode: "concurrency" | "rate_limit"; + /** Create If Missing */ + create_if_missing?: boolean | null; + }; + /** Body_clear_database_admin_database_clear_post */ + Body_clear_database_admin_database_clear_post: { + /** + * Confirm + * @description Pass confirm=True to confirm you want to modify the database. + * @default false + */ + confirm: boolean; + }; + /** Body_count_account_events_events_count_by__countable__post */ + Body_count_account_events_events_count_by__countable__post: { + filter: components["schemas"]["EventFilter"]; + /** @default day */ + time_unit: components["schemas"]["TimeUnit"]; + /** + * Time Interval + * @default 1 + */ + time_interval: number; + }; + /** Body_count_artifacts_artifacts_count_post */ + Body_count_artifacts_artifacts_count_post: { + artifacts?: components["schemas"]["ArtifactFilter"]; + flow_runs?: components["schemas"]["FlowRunFilter"]; + task_runs?: components["schemas"]["TaskRunFilter"]; + flows?: components["schemas"]["FlowFilter"]; + deployments?: components["schemas"]["DeploymentFilter"]; + }; + /** Body_count_block_documents_block_documents_count_post */ + Body_count_block_documents_block_documents_count_post: { + block_documents?: components["schemas"]["BlockDocumentFilter"] | null; + block_types?: components["schemas"]["BlockTypeFilter"] | null; + block_schemas?: components["schemas"]["BlockSchemaFilter"] | null; + }; + /** Body_count_deployments_by_flow_ui_flows_count_deployments_post */ + Body_count_deployments_by_flow_ui_flows_count_deployments_post: { + /** Flow Ids */ + flow_ids: string[]; + }; + /** Body_count_deployments_deployments_count_post */ + Body_count_deployments_deployments_count_post: { + flows?: components["schemas"]["FlowFilter"]; + flow_runs?: components["schemas"]["FlowRunFilter"]; + task_runs?: components["schemas"]["TaskRunFilter"]; + deployments?: components["schemas"]["DeploymentFilter"]; + work_pools?: components["schemas"]["WorkPoolFilter"]; + work_pool_queues?: components["schemas"]["WorkQueueFilter"]; + }; + /** Body_count_flow_runs_flow_runs_count_post */ + Body_count_flow_runs_flow_runs_count_post: { + flows?: components["schemas"]["FlowFilter"]; + flow_runs?: components["schemas"]["FlowRunFilter"]; + task_runs?: components["schemas"]["TaskRunFilter"]; + deployments?: components["schemas"]["DeploymentFilter"]; + work_pools?: components["schemas"]["WorkPoolFilter"]; + work_pool_queues?: components["schemas"]["WorkQueueFilter"]; + }; + /** Body_count_flows_flows_count_post */ + Body_count_flows_flows_count_post: { + flows?: components["schemas"]["FlowFilter"]; + flow_runs?: components["schemas"]["FlowRunFilter"]; + task_runs?: components["schemas"]["TaskRunFilter"]; + deployments?: components["schemas"]["DeploymentFilter"]; + work_pools?: components["schemas"]["WorkPoolFilter"]; + }; + /** Body_count_latest_artifacts_artifacts_latest_count_post */ + Body_count_latest_artifacts_artifacts_latest_count_post: { + artifacts?: components["schemas"]["ArtifactCollectionFilter"]; + flow_runs?: components["schemas"]["FlowRunFilter"]; + task_runs?: components["schemas"]["TaskRunFilter"]; + flows?: components["schemas"]["FlowFilter"]; + deployments?: components["schemas"]["DeploymentFilter"]; + }; + /** Body_count_task_runs_by_flow_run_ui_flow_runs_count_task_runs_post */ + Body_count_task_runs_by_flow_run_ui_flow_runs_count_task_runs_post: { + /** Flow Run Ids */ + flow_run_ids: string[]; + }; + /** Body_count_task_runs_task_runs_count_post */ + Body_count_task_runs_task_runs_count_post: { + flows?: components["schemas"]["FlowFilter"]; + flow_runs?: components["schemas"]["FlowRunFilter"]; + task_runs?: components["schemas"]["TaskRunFilter"]; + deployments?: components["schemas"]["DeploymentFilter"]; + }; + /** Body_count_variables_variables_count_post */ + Body_count_variables_variables_count_post: { + variables?: components["schemas"]["VariableFilter"] | null; + }; + /** Body_count_work_pools_work_pools_count_post */ + Body_count_work_pools_work_pools_count_post: { + work_pools?: components["schemas"]["WorkPoolFilter"] | null; + }; + /** Body_create_database_admin_database_create_post */ + Body_create_database_admin_database_create_post: { + /** + * Confirm + * @description Pass confirm=True to confirm you want to modify the database. + * @default false + */ + confirm: boolean; + }; + /** Body_create_flow_run_input_flow_runs__id__input_post */ + Body_create_flow_run_input_flow_runs__id__input_post: { + /** + * Key + * @description The input key + */ + key: string; + /** + * Value + * Format: binary + * @description The value of the input + */ + value: string; + /** + * Sender + * @description The sender of the input + */ + sender?: string | null; + }; + /** Body_decrement_concurrency_limits_v1_concurrency_limits_decrement_post */ + Body_decrement_concurrency_limits_v1_concurrency_limits_decrement_post: { + /** + * Names + * @description The tags to release a slot for + */ + names: string[]; + /** + * Task Run Id + * Format: uuid + * @description The ID of the task run releasing the slot + */ + task_run_id: string; + }; + /** Body_drop_database_admin_database_drop_post */ + Body_drop_database_admin_database_drop_post: { + /** + * Confirm + * @description Pass confirm=True to confirm you want to modify the database. + * @default false + */ + confirm: boolean; + }; + /** Body_filter_flow_run_input_flow_runs__id__input_filter_post */ + Body_filter_flow_run_input_flow_runs__id__input_filter_post: { + /** + * Prefix + * @description The input key prefix + */ + prefix: string; + /** + * Limit + * @description The maximum number of results to return + * @default 1 + */ + limit: number; + /** + * Exclude Keys + * @description Exclude inputs with these keys + * @default [] + */ + exclude_keys: string[]; + }; + /** Body_flow_run_history_flow_runs_history_post */ + Body_flow_run_history_flow_runs_history_post: { + /** + * History Start + * Format: date-time + * @description The history's start time. + */ + history_start: string; + /** + * History End + * Format: date-time + * @description The history's end time. + */ + history_end: string; + /** + * History Interval + * Format: time-delta + * @description The size of each history interval, in seconds. Must be at least 1 second. + */ + history_interval: number; + flows?: components["schemas"]["FlowFilter"]; + flow_runs?: components["schemas"]["FlowRunFilter"]; + task_runs?: components["schemas"]["TaskRunFilter"]; + deployments?: components["schemas"]["DeploymentFilter"]; + work_pools?: components["schemas"]["WorkPoolFilter"]; + work_queues?: components["schemas"]["WorkQueueFilter"]; + }; + /** Body_get_scheduled_flow_runs_for_deployments_deployments_get_scheduled_flow_runs_post */ + Body_get_scheduled_flow_runs_for_deployments_deployments_get_scheduled_flow_runs_post: { + /** + * Deployment Ids + * @description The deployment IDs to get scheduled runs for + */ + deployment_ids: string[]; + /** + * Scheduled Before + * Format: date-time + * @description The maximum time to look for scheduled flow runs + */ + scheduled_before?: string; + /** + * Limit + * @description Defaults to PREFECT_API_DEFAULT_LIMIT if not provided. + */ + limit?: number; + }; + /** Body_get_scheduled_flow_runs_work_pools__name__get_scheduled_flow_runs_post */ + Body_get_scheduled_flow_runs_work_pools__name__get_scheduled_flow_runs_post: { + /** + * Work Queue Names + * @description The names of work pool queues + */ + work_queue_names?: string[]; + /** + * Scheduled Before + * Format: date-time + * @description The maximum time to look for scheduled flow runs + */ + scheduled_before?: string; + /** + * Scheduled After + * Format: date-time + * @description The minimum time to look for scheduled flow runs + */ + scheduled_after?: string; + /** + * Limit + * @description Defaults to PREFECT_API_DEFAULT_LIMIT if not provided. + */ + limit?: number; + }; + /** Body_increment_concurrency_limits_v1_concurrency_limits_increment_post */ + Body_increment_concurrency_limits_v1_concurrency_limits_increment_post: { + /** + * Names + * @description The tags to acquire a slot for + */ + names: string[]; + /** + * Task Run Id + * Format: uuid + * @description The ID of the task run acquiring the slot + */ + task_run_id: string; + }; + /** Body_next_runs_by_flow_ui_flows_next_runs_post */ + Body_next_runs_by_flow_ui_flows_next_runs_post: { + /** Flow Ids */ + flow_ids: string[]; + }; + /** Body_paginate_deployments_deployments_paginate_post */ + Body_paginate_deployments_deployments_paginate_post: { + /** + * Page + * @default 1 + */ + page: number; + flows?: components["schemas"]["FlowFilter"]; + flow_runs?: components["schemas"]["FlowRunFilter"]; + task_runs?: components["schemas"]["TaskRunFilter"]; + deployments?: components["schemas"]["DeploymentFilter"]; + work_pools?: components["schemas"]["WorkPoolFilter"]; + work_pool_queues?: components["schemas"]["WorkQueueFilter"]; + /** @default NAME_ASC */ + sort: components["schemas"]["DeploymentSort"]; + /** + * Limit + * @description Defaults to PREFECT_API_DEFAULT_LIMIT if not provided. + */ + limit?: number; + }; + /** Body_paginate_flow_runs_flow_runs_paginate_post */ + Body_paginate_flow_runs_flow_runs_paginate_post: { + /** @default ID_DESC */ + sort: components["schemas"]["FlowRunSort"]; + /** + * Page + * @default 1 + */ + page: number; + flows?: components["schemas"]["FlowFilter"] | null; + flow_runs?: components["schemas"]["FlowRunFilter"] | null; + task_runs?: components["schemas"]["TaskRunFilter"] | null; + deployments?: components["schemas"]["DeploymentFilter"] | null; + work_pools?: components["schemas"]["WorkPoolFilter"] | null; + work_pool_queues?: components["schemas"]["WorkQueueFilter"] | null; + /** + * Limit + * @description Defaults to PREFECT_API_DEFAULT_LIMIT if not provided. + */ + limit?: number; + }; + /** Body_paginate_flows_flows_paginate_post */ + Body_paginate_flows_flows_paginate_post: { + /** + * Page + * @default 1 + */ + page: number; + flows?: components["schemas"]["FlowFilter"] | null; + flow_runs?: components["schemas"]["FlowRunFilter"] | null; + task_runs?: components["schemas"]["TaskRunFilter"] | null; + deployments?: components["schemas"]["DeploymentFilter"] | null; + work_pools?: components["schemas"]["WorkPoolFilter"] | null; + /** @default NAME_ASC */ + sort: components["schemas"]["FlowSort"]; + /** + * Limit + * @description Defaults to PREFECT_API_DEFAULT_LIMIT if not provided. + */ + limit?: number; + }; + /** Body_read_all_concurrency_limits_v2_v2_concurrency_limits_filter_post */ + Body_read_all_concurrency_limits_v2_v2_concurrency_limits_filter_post: { + /** + * Offset + * @default 0 + */ + offset: number; + /** + * Limit + * @description Defaults to PREFECT_API_DEFAULT_LIMIT if not provided. + */ + limit?: number; + }; + /** Body_read_artifacts_artifacts_filter_post */ + Body_read_artifacts_artifacts_filter_post: { + /** @default ID_DESC */ + sort: components["schemas"]["ArtifactSort"]; + /** + * Offset + * @default 0 + */ + offset: number; + artifacts?: components["schemas"]["ArtifactFilter"]; + flow_runs?: components["schemas"]["FlowRunFilter"]; + task_runs?: components["schemas"]["TaskRunFilter"]; + flows?: components["schemas"]["FlowFilter"]; + deployments?: components["schemas"]["DeploymentFilter"]; + /** + * Limit + * @description Defaults to PREFECT_API_DEFAULT_LIMIT if not provided. + */ + limit?: number; + }; + /** Body_read_automations_automations_filter_post */ + Body_read_automations_automations_filter_post: { + /** @default NAME_ASC */ + sort: components["schemas"]["AutomationSort"]; + /** + * Offset + * @default 0 + */ + offset: number; + automations?: components["schemas"]["AutomationFilter"] | null; + /** + * Limit + * @description Defaults to PREFECT_API_DEFAULT_LIMIT if not provided. + */ + limit?: number; + }; + /** Body_read_block_documents_block_documents_filter_post */ + Body_read_block_documents_block_documents_filter_post: { + block_documents?: components["schemas"]["BlockDocumentFilter"] | null; + block_types?: components["schemas"]["BlockTypeFilter"] | null; + block_schemas?: components["schemas"]["BlockSchemaFilter"] | null; + /** + * Include Secrets + * @description Whether to include sensitive values in the block document. + * @default false + */ + include_secrets: boolean; + /** @default NAME_ASC */ + sort: components["schemas"]["BlockDocumentSort"] | null; + /** + * Offset + * @default 0 + */ + offset: number; + /** + * Limit + * @description Defaults to PREFECT_API_DEFAULT_LIMIT if not provided. + */ + limit?: number; + }; + /** Body_read_block_schemas_block_schemas_filter_post */ + Body_read_block_schemas_block_schemas_filter_post: { + block_schemas?: components["schemas"]["BlockSchemaFilter"] | null; + /** + * Offset + * @default 0 + */ + offset: number; + /** + * Limit + * @description Defaults to PREFECT_API_DEFAULT_LIMIT if not provided. + */ + limit?: number; + }; + /** Body_read_block_types_block_types_filter_post */ + Body_read_block_types_block_types_filter_post: { + block_types?: components["schemas"]["BlockTypeFilter"] | null; + block_schemas?: components["schemas"]["BlockSchemaFilter"] | null; + /** + * Offset + * @default 0 + */ + offset: number; + /** + * Limit + * @description Defaults to PREFECT_API_DEFAULT_LIMIT if not provided. + */ + limit?: number; + }; + /** Body_read_concurrency_limits_concurrency_limits_filter_post */ + Body_read_concurrency_limits_concurrency_limits_filter_post: { + /** + * Offset + * @default 0 + */ + offset: number; + /** + * Limit + * @description Defaults to PREFECT_API_DEFAULT_LIMIT if not provided. + */ + limit?: number; + }; + /** Body_read_dashboard_task_run_counts_ui_task_runs_dashboard_counts_post */ + Body_read_dashboard_task_run_counts_ui_task_runs_dashboard_counts_post: { + task_runs: components["schemas"]["TaskRunFilter"]; + flows?: components["schemas"]["FlowFilter"] | null; + flow_runs?: components["schemas"]["FlowRunFilter"] | null; + deployments?: components["schemas"]["DeploymentFilter"] | null; + work_pools?: components["schemas"]["WorkPoolFilter"] | null; + work_queues?: components["schemas"]["WorkQueueFilter"] | null; + }; + /** Body_read_deployments_deployments_filter_post */ + Body_read_deployments_deployments_filter_post: { + /** + * Offset + * @default 0 + */ + offset: number; + flows?: components["schemas"]["FlowFilter"]; + flow_runs?: components["schemas"]["FlowRunFilter"]; + task_runs?: components["schemas"]["TaskRunFilter"]; + deployments?: components["schemas"]["DeploymentFilter"]; + work_pools?: components["schemas"]["WorkPoolFilter"]; + work_pool_queues?: components["schemas"]["WorkQueueFilter"]; + /** @default NAME_ASC */ + sort: components["schemas"]["DeploymentSort"]; + /** + * Limit + * @description Defaults to PREFECT_API_DEFAULT_LIMIT if not provided. + */ + limit?: number; + }; + /** Body_read_events_events_filter_post */ + Body_read_events_events_filter_post: { + /** @description Additional optional filter criteria to narrow down the set of Events */ + filter?: components["schemas"]["EventFilter"] | null; + /** + * Limit + * @description The number of events to return with each page + * @default 50 + */ + limit: number; + }; + /** Body_read_flow_run_history_ui_flow_runs_history_post */ + Body_read_flow_run_history_ui_flow_runs_history_post: { + /** @default EXPECTED_START_TIME_DESC */ + sort: components["schemas"]["FlowRunSort"]; + /** + * Limit + * @default 1000 + */ + limit: number; + /** + * Offset + * @default 0 + */ + offset: number; + flows?: components["schemas"]["FlowFilter"]; + flow_runs?: components["schemas"]["FlowRunFilter"]; + task_runs?: components["schemas"]["TaskRunFilter"]; + deployments?: components["schemas"]["DeploymentFilter"]; + work_pools?: components["schemas"]["WorkPoolFilter"]; + }; + /** Body_read_flow_run_notification_policies_flow_run_notification_policies_filter_post */ + Body_read_flow_run_notification_policies_flow_run_notification_policies_filter_post: { + flow_run_notification_policy_filter?: components["schemas"]["FlowRunNotificationPolicyFilter"]; + /** + * Offset + * @default 0 + */ + offset: number; + /** + * Limit + * @description Defaults to PREFECT_API_DEFAULT_LIMIT if not provided. + */ + limit?: number; + }; + /** Body_read_flow_runs_flow_runs_filter_post */ + Body_read_flow_runs_flow_runs_filter_post: { + /** @default ID_DESC */ + sort: components["schemas"]["FlowRunSort"]; + /** + * Offset + * @default 0 + */ + offset: number; + flows?: components["schemas"]["FlowFilter"] | null; + flow_runs?: components["schemas"]["FlowRunFilter"] | null; + task_runs?: components["schemas"]["TaskRunFilter"] | null; + deployments?: components["schemas"]["DeploymentFilter"] | null; + work_pools?: components["schemas"]["WorkPoolFilter"] | null; + work_pool_queues?: components["schemas"]["WorkQueueFilter"] | null; + /** + * Limit + * @description Defaults to PREFECT_API_DEFAULT_LIMIT if not provided. + */ + limit?: number; + }; + /** Body_read_flows_flows_filter_post */ + Body_read_flows_flows_filter_post: { + /** + * Offset + * @default 0 + */ + offset: number; + flows?: components["schemas"]["FlowFilter"]; + flow_runs?: components["schemas"]["FlowRunFilter"]; + task_runs?: components["schemas"]["TaskRunFilter"]; + deployments?: components["schemas"]["DeploymentFilter"]; + work_pools?: components["schemas"]["WorkPoolFilter"]; + /** @default NAME_ASC */ + sort: components["schemas"]["FlowSort"]; + /** + * Limit + * @description Defaults to PREFECT_API_DEFAULT_LIMIT if not provided. + */ + limit?: number; + }; + /** Body_read_latest_artifacts_artifacts_latest_filter_post */ + Body_read_latest_artifacts_artifacts_latest_filter_post: { + /** @default ID_DESC */ + sort: components["schemas"]["ArtifactCollectionSort"]; + /** + * Offset + * @default 0 + */ + offset: number; + artifacts?: components["schemas"]["ArtifactCollectionFilter"]; + flow_runs?: components["schemas"]["FlowRunFilter"]; + task_runs?: components["schemas"]["TaskRunFilter"]; + flows?: components["schemas"]["FlowFilter"]; + deployments?: components["schemas"]["DeploymentFilter"]; + /** + * Limit + * @description Defaults to PREFECT_API_DEFAULT_LIMIT if not provided. + */ + limit?: number; + }; + /** Body_read_logs_logs_filter_post */ + Body_read_logs_logs_filter_post: { + /** + * Offset + * @default 0 + */ + offset: number; + logs?: components["schemas"]["LogFilter"]; + /** @default TIMESTAMP_ASC */ + sort: components["schemas"]["LogSort"]; + /** + * Limit + * @description Defaults to PREFECT_API_DEFAULT_LIMIT if not provided. + */ + limit?: number; + }; + /** Body_read_saved_searches_saved_searches_filter_post */ + Body_read_saved_searches_saved_searches_filter_post: { + /** + * Offset + * @default 0 + */ + offset: number; + /** + * Limit + * @description Defaults to PREFECT_API_DEFAULT_LIMIT if not provided. + */ + limit?: number; + }; + /** Body_read_task_run_counts_by_state_ui_task_runs_count_post */ + Body_read_task_run_counts_by_state_ui_task_runs_count_post: { + flows?: components["schemas"]["FlowFilter"] | null; + flow_runs?: components["schemas"]["FlowRunFilter"] | null; + task_runs?: components["schemas"]["TaskRunFilter"] | null; + deployments?: components["schemas"]["DeploymentFilter"] | null; + }; + /** Body_read_task_runs_task_runs_filter_post */ + Body_read_task_runs_task_runs_filter_post: { + /** @default ID_DESC */ + sort: components["schemas"]["TaskRunSort"]; + /** + * Offset + * @default 0 + */ + offset: number; + flows?: components["schemas"]["FlowFilter"] | null; + flow_runs?: components["schemas"]["FlowRunFilter"] | null; + task_runs?: components["schemas"]["TaskRunFilter"] | null; + deployments?: components["schemas"]["DeploymentFilter"] | null; + /** + * Limit + * @description Defaults to PREFECT_API_DEFAULT_LIMIT if not provided. + */ + limit?: number; + }; + /** Body_read_task_workers_task_workers_filter_post */ + Body_read_task_workers_task_workers_filter_post: { + /** @description The task worker filter */ + task_worker_filter?: components["schemas"]["TaskWorkerFilter"] | null; + }; + /** Body_read_variables_variables_filter_post */ + Body_read_variables_variables_filter_post: { + /** + * Offset + * @default 0 + */ + offset: number; + variables?: components["schemas"]["VariableFilter"] | null; + /** @default NAME_ASC */ + sort: components["schemas"]["VariableSort"]; + /** + * Limit + * @description Defaults to PREFECT_API_DEFAULT_LIMIT if not provided. + */ + limit?: number; + }; + /** Body_read_work_pools_work_pools_filter_post */ + Body_read_work_pools_work_pools_filter_post: { + work_pools?: components["schemas"]["WorkPoolFilter"] | null; + /** + * Offset + * @default 0 + */ + offset: number; + /** + * Limit + * @description Defaults to PREFECT_API_DEFAULT_LIMIT if not provided. + */ + limit?: number; + }; + /** Body_read_work_queue_runs_work_queues__id__get_runs_post */ + Body_read_work_queue_runs_work_queues__id__get_runs_post: { + /** + * Scheduled Before + * Format: date-time + * @description Only flow runs scheduled to start before this time will be returned. + */ + scheduled_before?: string; + /** + * Agent Id + * @description An optional unique identifier for the agent making this query. If provided, the Prefect REST API will track the last time this agent polled the work queue. + */ + agent_id?: string | null; + /** + * Limit + * @description Defaults to PREFECT_API_DEFAULT_LIMIT if not provided. + */ + limit?: number; + }; + /** Body_read_work_queues_work_pools__work_pool_name__queues_filter_post */ + Body_read_work_queues_work_pools__work_pool_name__queues_filter_post: { + work_queues?: components["schemas"]["WorkQueueFilter"]; + /** + * Offset + * @default 0 + */ + offset: number; + /** + * Limit + * @description Defaults to PREFECT_API_DEFAULT_LIMIT if not provided. + */ + limit?: number; + }; + /** Body_read_work_queues_work_queues_filter_post */ + Body_read_work_queues_work_queues_filter_post: { + /** + * Offset + * @default 0 + */ + offset: number; + work_queues?: components["schemas"]["WorkQueueFilter"]; + /** + * Limit + * @description Defaults to PREFECT_API_DEFAULT_LIMIT if not provided. + */ + limit?: number; + }; + /** Body_read_workers_work_pools__work_pool_name__workers_filter_post */ + Body_read_workers_work_pools__work_pool_name__workers_filter_post: { + workers?: components["schemas"]["WorkerFilter"] | null; + /** + * Offset + * @default 0 + */ + offset: number; + /** + * Limit + * @description Defaults to PREFECT_API_DEFAULT_LIMIT if not provided. + */ + limit?: number; + }; + /** Body_reset_concurrency_limit_by_tag_concurrency_limits_tag__tag__reset_post */ + Body_reset_concurrency_limit_by_tag_concurrency_limits_tag__tag__reset_post: { + /** + * Slot Override + * @description Manual override for active concurrency limit slots. + */ + slot_override?: string[] | null; + }; + /** Body_resume_flow_run_flow_runs__id__resume_post */ + Body_resume_flow_run_flow_runs__id__resume_post: { + /** Run Input */ + run_input?: Record | null; + }; + /** Body_schedule_deployment_deployments__id__schedule_post */ + Body_schedule_deployment_deployments__id__schedule_post: { + /** + * Start Time + * Format: date-time + * @description The earliest date to schedule + */ + start_time?: string; + /** + * End Time + * Format: date-time + * @description The latest date to schedule + */ + end_time?: string; + /** + * Min Time + * Format: time-delta + * @description Runs will be scheduled until at least this long after the `start_time` + */ + min_time?: number; + /** + * Min Runs + * @description The minimum number of runs to schedule + */ + min_runs?: number; + /** + * Max Runs + * @description The maximum number of runs to schedule + */ + max_runs?: number; + }; + /** Body_set_flow_run_state_flow_runs__id__set_state_post */ + Body_set_flow_run_state_flow_runs__id__set_state_post: { + /** @description The intended state. */ + state: components["schemas"]["StateCreate"]; + /** + * Force + * @description If false, orchestration rules will be applied that may alter or prevent the state transition. If True, orchestration rules are not applied. + * @default false + */ + force: boolean; + }; + /** Body_set_task_run_state_task_runs__id__set_state_post */ + Body_set_task_run_state_task_runs__id__set_state_post: { + /** @description The intended state. */ + state: components["schemas"]["StateCreate"]; + /** + * Force + * @description If false, orchestration rules will be applied that may alter or prevent the state transition. If True, orchestration rules are not applied. + * @default false + */ + force: boolean; + }; + /** Body_task_run_history_task_runs_history_post */ + Body_task_run_history_task_runs_history_post: { + /** + * History Start + * Format: date-time + * @description The history's start time. + */ + history_start: string; + /** + * History End + * Format: date-time + * @description The history's end time. + */ + history_end: string; + /** + * History Interval + * Format: time-delta + * @description The size of each history interval, in seconds. Must be at least 1 second. + */ + history_interval: number; + flows?: components["schemas"]["FlowFilter"]; + flow_runs?: components["schemas"]["FlowRunFilter"]; + task_runs?: components["schemas"]["TaskRunFilter"]; + deployments?: components["schemas"]["DeploymentFilter"]; + }; + /** Body_validate_obj_ui_schemas_validate_post */ + Body_validate_obj_ui_schemas_validate_post: { + /** Json Schema */ + json_schema: Record; + /** Values */ + values: Record; + }; + /** Body_worker_heartbeat_work_pools__work_pool_name__workers_heartbeat_post */ + Body_worker_heartbeat_work_pools__work_pool_name__workers_heartbeat_post: { + /** + * Name + * @description The worker process name + */ + name: string; + /** + * Heartbeat Interval Seconds + * @description The worker's heartbeat interval in seconds + */ + heartbeat_interval_seconds?: number | null; + }; + /** + * CallWebhook + * @description Call a webhook when an Automation is triggered. + */ + CallWebhook: { + /** + * Type + * @default call-webhook + * @constant + * @enum {string} + */ + type: "call-webhook"; + /** + * Block Document Id + * Format: uuid + * @description The identifier of the webhook block to use + */ + block_document_id: string; + /** + * Payload + * @description An optional templatable payload to send when calling the webhook. + * @default + */ + payload: string; + }; + /** + * CancelFlowRun + * @description Cancels a flow run associated with the trigger + */ + CancelFlowRun: { + /** + * Type + * @default cancel-flow-run + * @constant + * @enum {string} + */ + type: "cancel-flow-run"; + }; + /** + * ChangeFlowRunState + * @description Changes the state of a flow run associated with the trigger + */ + ChangeFlowRunState: { + /** + * Type + * @default change-flow-run-state + * @constant + * @enum {string} + */ + type: "change-flow-run-state"; + /** + * Name + * @description The name of the state to change the flow run to + */ + name?: string | null; + /** @description The type of the state to change the flow run to */ + state: components["schemas"]["StateType"]; + /** + * Message + * @description An optional message to associate with the state change + */ + message?: string | null; + }; + /** + * CompoundTrigger + * @description A composite trigger that requires some number of triggers to have + * fired within the given time period + */ + "CompoundTrigger-Input": { + /** + * Type + * @default compound + * @constant + * @enum {string} + */ + type: "compound"; + /** + * Id + * Format: uuid + * @description The unique ID of this trigger + */ + id?: string; + /** Triggers */ + triggers: ( + | components["schemas"]["EventTrigger"] + | components["schemas"]["CompoundTrigger-Input"] + | components["schemas"]["SequenceTrigger-Input"] + )[]; + /** Within */ + within: number | null; + /** Require */ + require: number | ("any" | "all"); + }; + /** + * CompoundTrigger + * @description A composite trigger that requires some number of triggers to have + * fired within the given time period + */ + "CompoundTrigger-Output": { + /** + * Type + * @default compound + * @constant + * @enum {string} + */ + type: "compound"; + /** + * Id + * Format: uuid + * @description The unique ID of this trigger + */ + id?: string; + /** Triggers */ + triggers: ( + | components["schemas"]["EventTrigger"] + | components["schemas"]["CompoundTrigger-Output"] + | components["schemas"]["SequenceTrigger-Output"] + )[]; + /** Within */ + within: number | null; + /** Require */ + require: number | ("any" | "all"); + }; + /** + * ConcurrencyLimit + * @description An ORM representation of a concurrency limit. + */ + ConcurrencyLimit: { + /** + * Id + * Format: uuid + */ + id?: string; + /** Created */ + created?: string | null; + /** Updated */ + updated?: string | null; + /** + * Tag + * @description A tag the concurrency limit is applied to. + */ + tag: string; + /** + * Concurrency Limit + * @description The concurrency limit. + */ + concurrency_limit: number; + /** + * Active Slots + * @description A list of active run ids using a concurrency slot + */ + active_slots?: string[]; + }; + /** + * ConcurrencyLimitCreate + * @description Data used by the Prefect REST API to create a concurrency limit. + */ + ConcurrencyLimitCreate: { + /** + * Tag + * @description A tag the concurrency limit is applied to. + */ + tag: string; + /** + * Concurrency Limit + * @description The concurrency limit. + */ + concurrency_limit: number; + }; + /** + * ConcurrencyLimitStrategy + * @description Enumeration of concurrency collision strategies. + * @enum {string} + */ + ConcurrencyLimitStrategy: "ENQUEUE" | "CANCEL_NEW"; + /** + * ConcurrencyLimitV2 + * @description An ORM representation of a v2 concurrency limit. + */ + ConcurrencyLimitV2: { + /** + * Id + * Format: uuid + */ + id?: string; + /** Created */ + created?: string | null; + /** Updated */ + updated?: string | null; + /** + * Active + * @description Whether the concurrency limit is active. + * @default true + */ + active: boolean; + /** + * Name + * @description The name of the concurrency limit. + */ + name: string; + /** + * Limit + * @description The concurrency limit. + */ + limit: number; + /** + * Active Slots + * @description The number of active slots. + * @default 0 + */ + active_slots: number; + /** + * Denied Slots + * @description The number of denied slots. + * @default 0 + */ + denied_slots: number; + /** + * Slot Decay Per Second + * @description The decay rate for active slots when used as a rate limit. + * @default 0 + */ + slot_decay_per_second: number; + /** + * Avg Slot Occupancy Seconds + * @description The average amount of time a slot is occupied. + * @default 2 + */ + avg_slot_occupancy_seconds: number; + }; + /** + * ConcurrencyLimitV2Create + * @description Data used by the Prefect REST API to create a v2 concurrency limit. + */ + ConcurrencyLimitV2Create: { + /** + * Active + * @description Whether the concurrency limit is active. + * @default true + */ + active: boolean; + /** + * Name + * @description The name of the concurrency limit. + */ + name: string; + /** + * Limit + * @description The concurrency limit. + */ + limit: number; + /** + * Active Slots + * @description The number of active slots. + * @default 0 + */ + active_slots: number; + /** + * Denied Slots + * @description The number of denied slots. + * @default 0 + */ + denied_slots: number; + /** + * Slot Decay Per Second + * @description The decay rate for active slots when used as a rate limit. + * @default 0 + */ + slot_decay_per_second: number; + }; + /** + * ConcurrencyLimitV2Update + * @description Data used by the Prefect REST API to update a v2 concurrency limit. + */ + ConcurrencyLimitV2Update: { + /** Active */ + active?: boolean | null; + /** Name */ + name?: string | null; + /** Limit */ + limit?: number | null; + /** Active Slots */ + active_slots?: number | null; + /** Denied Slots */ + denied_slots?: number | null; + /** Slot Decay Per Second */ + slot_decay_per_second?: number | null; + }; + /** + * ConcurrencyOptions + * @description Class for storing the concurrency config in database. + */ + ConcurrencyOptions: { + collision_strategy: components["schemas"]["ConcurrencyLimitStrategy"]; + }; + /** + * Constant + * @description Represents constant input value to a task run. + */ + Constant: { + /** + * Input Type + * @default constant + * @constant + * @enum {string} + */ + input_type: "constant"; + /** Type */ + type: string; + }; + /** CountByState */ + CountByState: { + /** + * Completed + * @default 0 + */ + COMPLETED: number; + /** + * Pending + * @default 0 + */ + PENDING: number; + /** + * Running + * @default 0 + */ + RUNNING: number; + /** + * Failed + * @default 0 + */ + FAILED: number; + /** + * Cancelled + * @default 0 + */ + CANCELLED: number; + /** + * Crashed + * @default 0 + */ + CRASHED: number; + /** + * Paused + * @default 0 + */ + PAUSED: number; + /** + * Cancelling + * @default 0 + */ + CANCELLING: number; + /** + * Scheduled + * @default 0 + */ + SCHEDULED: number; + }; + /** + * Countable + * @enum {string} + */ + Countable: "day" | "time" | "event" | "resource"; + /** CreatedBy */ + CreatedBy: { + /** + * Id + * @description The id of the creator of the object. + */ + id?: string | null; + /** + * Type + * @description The type of the creator of the object. + */ + type?: string | null; + /** + * Display Value + * @description The display value for the creator. + */ + display_value?: string | null; + }; + /** + * CronSchedule + * @description Cron schedule + * + * NOTE: If the timezone is a DST-observing one, then the schedule will adjust + * itself appropriately. Cron's rules for DST are based on schedule times, not + * intervals. This means that an hourly cron schedule will fire on every new + * schedule hour, not every elapsed hour; for example, when clocks are set back + * this will result in a two-hour pause as the schedule will fire *the first + * time* 1am is reached and *the first time* 2am is reached, 120 minutes later. + * Longer schedules, such as one that fires at 9am every morning, will + * automatically adjust for DST. + * + * Args: + * cron (str): a valid cron string + * timezone (str): a valid timezone string in IANA tzdata format (for example, + * America/New_York). + * day_or (bool, optional): Control how croniter handles `day` and `day_of_week` + * entries. Defaults to True, matching cron which connects those values using + * OR. If the switch is set to False, the values are connected using AND. This + * behaves like fcron and enables you to e.g. define a job that executes each + * 2nd friday of a month by setting the days of month and the weekday. + */ + CronSchedule: { + /** Cron */ + cron: string; + /** Timezone */ + timezone?: string | null; + /** + * Day Or + * @description Control croniter behavior for handling day and day_of_week entries. + * @default true + */ + day_or: boolean; + }; + /** CsrfToken */ + CsrfToken: { + /** + * Id + * Format: uuid + */ + id?: string; + /** Created */ + created?: string | null; + /** Updated */ + updated?: string | null; + /** + * Token + * @description The CSRF token + */ + token: string; + /** + * Client + * @description The client id associated with the CSRF token + */ + client: string; + /** + * Expiration + * Format: date-time + * @description The expiration time of the CSRF token + */ + expiration: string; + }; + /** DependencyResult */ + DependencyResult: { + /** + * Id + * Format: uuid + */ + id: string; + /** Name */ + name: string; + /** Upstream Dependencies */ + upstream_dependencies: components["schemas"]["TaskRunResult"][]; + state: components["schemas"]["State"] | null; + /** Expected Start Time */ + expected_start_time: string | null; + /** Start Time */ + start_time: string | null; + /** End Time */ + end_time: string | null; + /** Total Run Time */ + total_run_time: number | null; + /** Estimated Run Time */ + estimated_run_time: number | null; + /** Untrackable Result */ + untrackable_result: boolean; + }; + /** + * DeploymentCreate + * @description Data used by the Prefect REST API to create a deployment. + */ + DeploymentCreate: { + /** + * Name + * @description The name of the deployment. + */ + name: string; + /** + * Flow Id + * Format: uuid + * @description The ID of the flow associated with the deployment. + */ + flow_id: string; + /** + * Paused + * @description Whether or not the deployment is paused. + * @default false + */ + paused: boolean; + /** + * Schedules + * @description A list of schedules for the deployment. + */ + schedules?: components["schemas"]["DeploymentScheduleCreate"][]; + /** + * Concurrency Limit + * @description The deployment's concurrency limit. + */ + concurrency_limit?: number | null; + /** @description The deployment's concurrency options. */ + concurrency_options?: components["schemas"]["ConcurrencyOptions"] | null; + /** + * Enforce Parameter Schema + * @description Whether or not the deployment should enforce the parameter schema. + * @default true + */ + enforce_parameter_schema: boolean; + /** + * Parameter Openapi Schema + * @description The parameter schema of the flow, including defaults. + */ + parameter_openapi_schema?: Record | null; + /** + * Parameters + * @description Parameters for flow runs scheduled by the deployment. + */ + parameters?: Record; + /** + * Tags + * @description A list of deployment tags. + */ + tags?: string[]; + /** Pull Steps */ + pull_steps?: Record[] | null; + /** Work Queue Name */ + work_queue_name?: string | null; + /** + * Work Pool Name + * @description The name of the deployment's work pool. + */ + work_pool_name?: string | null; + /** Storage Document Id */ + storage_document_id?: string | null; + /** Infrastructure Document Id */ + infrastructure_document_id?: string | null; + /** Description */ + description?: string | null; + /** Path */ + path?: string | null; + /** Version */ + version?: string | null; + /** Entrypoint */ + entrypoint?: string | null; + /** + * Job Variables + * @description Overrides for the flow's infrastructure configuration. + */ + job_variables?: Record; + }; + /** + * DeploymentFilter + * @description Filter for deployments. Only deployments matching all criteria will be returned. + */ + DeploymentFilter: { + /** + * @description Operator for combining filter criteria. Defaults to 'and_'. + * @default and_ + */ + operator: components["schemas"]["Operator"]; + /** @description Filter criteria for `Deployment.id` */ + id?: components["schemas"]["DeploymentFilterId"] | null; + /** @description Filter criteria for `Deployment.name` */ + name?: components["schemas"]["DeploymentFilterName"] | null; + /** @description Filter criteria for `Deployment.name` or `Flow.name` */ + flow_or_deployment_name?: + | components["schemas"]["DeploymentOrFlowNameFilter"] + | null; + /** @description Filter criteria for `Deployment.paused` */ + paused?: components["schemas"]["DeploymentFilterPaused"] | null; + /** @description Filter criteria for `Deployment.tags` */ + tags?: components["schemas"]["DeploymentFilterTags"] | null; + /** @description Filter criteria for `Deployment.work_queue_name` */ + work_queue_name?: + | components["schemas"]["DeploymentFilterWorkQueueName"] + | null; + /** + * @deprecated + * @description DEPRECATED: Prefer `Deployment.concurrency_limit_id` over `Deployment.concurrency_limit`. If provided, will be ignored for backwards-compatibility. Will be removed after December 2024. + */ + concurrency_limit?: + | components["schemas"]["DeploymentFilterConcurrencyLimit"] + | null; + }; + /** + * DeploymentFilterConcurrencyLimit + * @description DEPRECATED: Prefer `Deployment.concurrency_limit_id` over `Deployment.concurrency_limit`. + */ + DeploymentFilterConcurrencyLimit: { + /** + * Ge + * @description Only include deployments with a concurrency limit greater than or equal to this value + */ + ge_?: number | null; + /** + * Le + * @description Only include deployments with a concurrency limit less than or equal to this value + */ + le_?: number | null; + /** + * Is Null + * @description If true, only include deployments without a concurrency limit + */ + is_null_?: boolean | null; + }; + /** + * DeploymentFilterId + * @description Filter by `Deployment.id`. + */ + DeploymentFilterId: { + /** + * Any + * @description A list of deployment ids to include + */ + any_?: string[] | null; + }; + /** + * DeploymentFilterName + * @description Filter by `Deployment.name`. + */ + DeploymentFilterName: { + /** + * Any + * @description A list of deployment names to include + */ + any_?: string[] | null; + /** + * Like + * @description A case-insensitive partial match. For example, passing 'marvin' will match 'marvin', 'sad-Marvin', and 'marvin-robot'. + */ + like_?: string | null; + }; + /** + * DeploymentFilterPaused + * @description Filter by `Deployment.paused`. + */ + DeploymentFilterPaused: { + /** + * Eq + * @description Only returns where deployment is/is not paused + */ + eq_?: boolean | null; + }; + /** + * DeploymentFilterTags + * @description Filter by `Deployment.tags`. + */ + DeploymentFilterTags: { + /** + * @description Operator for combining filter criteria. Defaults to 'and_'. + * @default and_ + */ + operator: components["schemas"]["Operator"]; + /** + * All + * @description A list of tags. Deployments will be returned only if their tags are a superset of the list + */ + all_?: string[] | null; + /** + * Is Null + * @description If true, only include deployments without tags + */ + is_null_?: boolean | null; + }; + /** + * DeploymentFilterWorkQueueName + * @description Filter by `Deployment.work_queue_name`. + */ + DeploymentFilterWorkQueueName: { + /** + * Any + * @description A list of work queue names to include + */ + any_?: string[] | null; + }; + /** + * DeploymentFlowRunCreate + * @description Data used by the Prefect REST API to create a flow run from a deployment. + */ + DeploymentFlowRunCreate: { + /** @description The state of the flow run to create */ + state?: components["schemas"]["StateCreate"] | null; + /** + * Name + * @description The name of the flow run. Defaults to a random slug if not specified. + */ + name?: string; + /** Parameters */ + parameters?: Record; + /** + * Enforce Parameter Schema + * @description Whether or not to enforce the parameter schema on this run. + */ + enforce_parameter_schema?: boolean | null; + /** Context */ + context?: Record; + /** Infrastructure Document Id */ + infrastructure_document_id?: string | null; + /** @description The empirical policy for the flow run. */ + empirical_policy?: components["schemas"]["FlowRunPolicy"]; + /** + * Tags + * @description A list of tags for the flow run. + */ + tags?: string[]; + /** + * Idempotency Key + * @description An optional idempotency key. If a flow run with the same idempotency key has already been created, the existing flow run will be returned. + */ + idempotency_key?: string | null; + /** Parent Task Run Id */ + parent_task_run_id?: string | null; + /** Work Queue Name */ + work_queue_name?: string | null; + /** Job Variables */ + job_variables?: Record | null; + }; + /** + * DeploymentOrFlowNameFilter + * @description Filter by `Deployment.name` or `Flow.name` with a single input string for ilike filtering. + */ + DeploymentOrFlowNameFilter: { + /** + * Like + * @description A case-insensitive partial match on deployment or flow names. For example, passing 'example' might match deployments or flows with 'example' in their names. + */ + like_?: string | null; + }; + /** DeploymentPaginationResponse */ + DeploymentPaginationResponse: { + /** Results */ + results: components["schemas"]["DeploymentResponse"][]; + /** Count */ + count: number; + /** Limit */ + limit: number; + /** Pages */ + pages: number; + /** Page */ + page: number; + }; + /** DeploymentResponse */ + DeploymentResponse: { + /** + * Id + * Format: uuid + */ + id?: string; + /** Created */ + created?: string | null; + /** Updated */ + updated?: string | null; + /** + * Name + * @description The name of the deployment. + */ + name: string; + /** + * Version + * @description An optional version for the deployment. + */ + version?: string | null; + /** + * Description + * @description A description for the deployment. + */ + description?: string | null; + /** + * Flow Id + * Format: uuid + * @description The flow id associated with the deployment. + */ + flow_id: string; + /** + * Paused + * @description Whether or not the deployment is paused. + * @default false + */ + paused: boolean; + /** + * Schedules + * @description A list of schedules for the deployment. + */ + schedules?: components["schemas"]["DeploymentSchedule"][]; + /** + * Concurrency Limit + * @deprecated + * @description DEPRECATED: Prefer `global_concurrency_limit`. Will always be None for backwards compatibility. Will be removed after December 2024. + */ + concurrency_limit?: number | null; + /** @description The global concurrency limit object for enforcing the maximum number of flow runs that can be active at once. */ + global_concurrency_limit?: + | components["schemas"]["GlobalConcurrencyLimitResponse"] + | null; + /** @description The concurrency options for the deployment. */ + concurrency_options?: components["schemas"]["ConcurrencyOptions"] | null; + /** + * Job Variables + * @description Overrides to apply to the base infrastructure block at runtime. + */ + job_variables?: Record; + /** + * Parameters + * @description Parameters for flow runs scheduled by the deployment. + */ + parameters?: Record; + /** + * Tags + * @description A list of tags for the deployment + */ + tags?: string[]; + /** + * Work Queue Name + * @description The work queue for the deployment. If no work queue is set, work will not be scheduled. + */ + work_queue_name?: string | null; + /** + * Last Polled + * @description The last time the deployment was polled for status updates. + */ + last_polled?: string | null; + /** + * Parameter Openapi Schema + * @description The parameter schema of the flow, including defaults. + */ + parameter_openapi_schema?: Record | null; + /** + * Path + * @description The path to the working directory for the workflow, relative to remote storage or an absolute path. + */ + path?: string | null; + /** + * Pull Steps + * @description Pull steps for cloning and running this deployment. + */ + pull_steps?: Record[] | null; + /** + * Entrypoint + * @description The path to the entrypoint for the workflow, relative to the `path`. + */ + entrypoint?: string | null; + /** + * Storage Document Id + * @description The block document defining storage used for this flow. + */ + storage_document_id?: string | null; + /** + * Infrastructure Document Id + * @description The block document defining infrastructure to use for flow runs. + */ + infrastructure_document_id?: string | null; + /** @description Optional information about the creator of this deployment. */ + created_by?: components["schemas"]["CreatedBy"] | null; + /** @description Optional information about the updater of this deployment. */ + updated_by?: components["schemas"]["UpdatedBy"] | null; + /** + * Work Pool Name + * @description The name of the deployment's work pool. + */ + work_pool_name?: string | null; + /** + * @description Whether the deployment is ready to run flows. + * @default NOT_READY + */ + status: components["schemas"]["DeploymentStatus"] | null; + /** + * Enforce Parameter Schema + * @description Whether or not the deployment should enforce the parameter schema. + * @default true + */ + enforce_parameter_schema: boolean; + }; + /** DeploymentSchedule */ + DeploymentSchedule: { + /** + * Id + * Format: uuid + */ + id?: string; + /** Created */ + created?: string | null; + /** Updated */ + updated?: string | null; + /** + * Deployment Id + * @description The deployment id associated with this schedule. + */ + deployment_id?: string | null; + /** + * Schedule + * @description The schedule for the deployment. + */ + schedule: + | components["schemas"]["IntervalSchedule"] + | components["schemas"]["CronSchedule"] + | components["schemas"]["RRuleSchedule"]; + /** + * Active + * @description Whether or not the schedule is active. + * @default true + */ + active: boolean; + /** + * Max Scheduled Runs + * @description The maximum number of scheduled runs for the schedule. + */ + max_scheduled_runs?: number | null; + }; + /** DeploymentScheduleCreate */ + DeploymentScheduleCreate: { + /** + * Active + * @description Whether or not the schedule is active. + * @default true + */ + active: boolean; + /** + * Schedule + * @description The schedule for the deployment. + */ + schedule: + | components["schemas"]["IntervalSchedule"] + | components["schemas"]["CronSchedule"] + | components["schemas"]["RRuleSchedule"]; + /** + * Max Scheduled Runs + * @description The maximum number of scheduled runs for the schedule. + */ + max_scheduled_runs?: number | null; + }; + /** DeploymentScheduleUpdate */ + DeploymentScheduleUpdate: { + /** + * Active + * @description Whether or not the schedule is active. + */ + active?: boolean | null; + /** + * Schedule + * @description The schedule for the deployment. + */ + schedule?: + | components["schemas"]["IntervalSchedule"] + | components["schemas"]["CronSchedule"] + | components["schemas"]["RRuleSchedule"] + | null; + /** + * Max Scheduled Runs + * @description The maximum number of scheduled runs for the schedule. + */ + max_scheduled_runs?: number | null; + }; + /** + * DeploymentSort + * @description Defines deployment sorting options. + * @enum {string} + */ + DeploymentSort: "CREATED_DESC" | "UPDATED_DESC" | "NAME_ASC" | "NAME_DESC"; + /** + * DeploymentStatus + * @description Enumeration of deployment statuses. + * @enum {string} + */ + DeploymentStatus: "READY" | "NOT_READY"; + /** + * DeploymentUpdate + * @description Data used by the Prefect REST API to update a deployment. + */ + DeploymentUpdate: { + /** Version */ + version?: string | null; + /** Description */ + description?: string | null; + /** + * Paused + * @description Whether or not the deployment is paused. + * @default false + */ + paused: boolean; + /** + * Schedules + * @description A list of schedules for the deployment. + */ + schedules?: components["schemas"]["DeploymentScheduleCreate"][]; + /** + * Concurrency Limit + * @description The deployment's concurrency limit. + */ + concurrency_limit?: number | null; + /** @description The deployment's concurrency options. */ + concurrency_options?: components["schemas"]["ConcurrencyOptions"] | null; + /** + * Parameters + * @description Parameters for flow runs scheduled by the deployment. + */ + parameters?: Record | null; + /** + * Tags + * @description A list of deployment tags. + */ + tags?: string[]; + /** Work Queue Name */ + work_queue_name?: string | null; + /** + * Work Pool Name + * @description The name of the deployment's work pool. + */ + work_pool_name?: string | null; + /** Path */ + path?: string | null; + /** + * Job Variables + * @description Overrides for the flow's infrastructure configuration. + */ + job_variables?: Record | null; + /** Entrypoint */ + entrypoint?: string | null; + /** Storage Document Id */ + storage_document_id?: string | null; + /** Infrastructure Document Id */ + infrastructure_document_id?: string | null; + /** + * Enforce Parameter Schema + * @description Whether or not the deployment should enforce the parameter schema. + */ + enforce_parameter_schema?: boolean | null; + }; + /** + * DoNothing + * @description Do nothing when an Automation is triggered + */ + DoNothing: { + /** + * Type + * @default do-nothing + * @constant + * @enum {string} + */ + type: "do-nothing"; + }; + /** Edge */ + Edge: { + /** + * Id + * Format: uuid + */ + id: string; + }; + /** + * Event + * @description The client-side view of an event that has happened to a Resource + */ + Event: { + /** + * Occurred + * Format: date-time + * @description When the event happened from the sender's perspective + */ + occurred: string; + /** + * Event + * @description The name of the event that happened + */ + event: string; + /** @description The primary Resource this event concerns */ + resource: components["schemas"]["Resource"]; + /** + * Related + * @description A list of additional Resources involved in this event + */ + related?: components["schemas"]["RelatedResource"][]; + /** + * Payload + * @description An open-ended set of data describing what happened + */ + payload?: Record; + /** + * Id + * Format: uuid + * @description The client-provided identifier of this event + */ + id: string; + /** + * Follows + * @description The ID of an event that is known to have occurred prior to this one. If set, this may be used to establish a more precise ordering of causally-related events when they occur close enough together in time that the system may receive them out-of-order. + */ + follows?: string | null; + }; + /** EventAnyResourceFilter */ + EventAnyResourceFilter: { + /** + * Id + * @description Only include events for resources with these IDs + */ + id?: string[] | null; + /** + * Id Prefix + * @description Only include events for resources with IDs starting with these prefixes + */ + id_prefix?: string[] | null; + /** @description Only include events for related resources with these labels */ + labels?: components["schemas"]["ResourceSpecification"] | null; + }; + /** + * EventCount + * @description The count of events with the given filter value + */ + EventCount: { + /** + * Value + * @description The value to use for filtering + */ + value: string; + /** + * Label + * @description The value to display for this count + */ + label: string; + /** + * Count + * @description The count of matching events + */ + count: number; + /** + * Start Time + * Format: date-time + * @description The start time of this group of events + */ + start_time: string; + /** + * End Time + * Format: date-time + * @description The end time of this group of events + */ + end_time: string; + }; + /** EventFilter */ + EventFilter: { + /** @description Filter criteria for when the events occurred */ + occurred?: components["schemas"]["EventOccurredFilter"]; + /** @description Filter criteria for the event name */ + event?: components["schemas"]["EventNameFilter"] | null; + /** @description Filter criteria for any resource involved in the event */ + any_resource?: components["schemas"]["EventAnyResourceFilter"] | null; + /** @description Filter criteria for the resource of the event */ + resource?: components["schemas"]["EventResourceFilter"] | null; + /** @description Filter criteria for the related resources of the event */ + related?: components["schemas"]["EventRelatedFilter"] | null; + /** @description Filter criteria for the events' ID */ + id?: components["schemas"]["EventIDFilter"]; + /** + * @description The order to return filtered events + * @default DESC + */ + order: components["schemas"]["EventOrder"]; + }; + /** EventIDFilter */ + EventIDFilter: { + /** + * Id + * @description Only include events with one of these IDs + */ + id?: string[] | null; + }; + /** EventNameFilter */ + EventNameFilter: { + /** + * Prefix + * @description Only include events matching one of these prefixes + */ + prefix?: string[] | null; + /** + * Exclude Prefix + * @description Exclude events matching one of these prefixes + */ + exclude_prefix?: string[] | null; + /** + * Name + * @description Only include events matching one of these names exactly + */ + name?: string[] | null; + /** + * Exclude Name + * @description Exclude events matching one of these names exactly + */ + exclude_name?: string[] | null; + }; + /** EventOccurredFilter */ + EventOccurredFilter: { + /** + * Since + * Format: date-time + * @description Only include events after this time (inclusive) + */ + since?: string; + /** + * Until + * Format: date-time + * @description Only include events prior to this time (inclusive) + */ + until?: string; + }; + /** + * EventOrder + * @enum {string} + */ + EventOrder: "ASC" | "DESC"; + /** + * EventPage + * @description A single page of events returned from the API, with an optional link to the + * next page of results + */ + EventPage: { + /** + * Events + * @description The Events matching the query + */ + events: components["schemas"]["ReceivedEvent"][]; + /** + * Total + * @description The total number of matching Events + */ + total: number; + /** + * Next Page + * @description The URL for the next page of results, if there are more + */ + next_page: string | null; + }; + /** EventRelatedFilter */ + EventRelatedFilter: { + /** + * Id + * @description Only include events for related resources with these IDs + */ + id?: string[] | null; + /** + * Role + * @description Only include events for related resources in these roles + */ + role?: string[] | null; + /** + * Resources In Roles + * @description Only include events with specific related resources in specific roles + */ + resources_in_roles?: [string, string][] | null; + /** @description Only include events for related resources with these labels */ + labels?: components["schemas"]["ResourceSpecification"] | null; + }; + /** EventResourceFilter */ + EventResourceFilter: { + /** + * Id + * @description Only include events for resources with these IDs + */ + id?: string[] | null; + /** + * Id Prefix + * @description Only include events for resources with IDs starting with these prefixes. + */ + id_prefix?: string[] | null; + /** @description Only include events for resources with these labels */ + labels?: components["schemas"]["ResourceSpecification"] | null; + /** + * Distinct + * @description Only include events for distinct resources + * @default false + */ + distinct: boolean; + }; + /** + * EventTrigger + * @description A trigger that fires based on the presence or absence of events within a given + * period of time. + */ + EventTrigger: { + /** + * Type + * @default event + * @constant + * @enum {string} + */ + type: "event"; + /** + * Id + * Format: uuid + * @description The unique ID of this trigger + */ + id?: string; + /** @description Labels for resources which this trigger will match. */ + match?: components["schemas"]["ResourceSpecification"]; + /** @description Labels for related resources which this trigger will match. */ + match_related?: components["schemas"]["ResourceSpecification"]; + /** + * After + * @description The event(s) which must first been seen to fire this trigger. If empty, then fire this trigger immediately. Events may include trailing wildcards, like `prefect.flow-run.*` + */ + after?: string[]; + /** + * Expect + * @description The event(s) this trigger is expecting to see. If empty, this trigger will match any event. Events may include trailing wildcards, like `prefect.flow-run.*` + */ + expect?: string[]; + /** + * For Each + * @description Evaluate the trigger separately for each distinct value of these labels on the resource. By default, labels refer to the primary resource of the triggering event. You may also refer to labels from related resources by specifying `related::